You export 537 invoices from FreshBooks. Import them into Xero. Hit refresh. Three hours later, your accountant calls: twelve invoices are missing payment links, eight have tax rounding errors, and four invoice numbers collide with new records. You've just discovered that 'export' and 'reconciled' are not the same thing. Most businesses assume that bulk export handles the heavy lifting. It doesn't. A platform swap orphans data in three specific places: invoice sequence integrity (numbers jump or duplicate), tax calculation consistency (rounding discrepancies between platforms), and payment reconciliation (transactions that don't re-link to their source invoices). Each failure is invisible until your accountant or auditor flags it—which means you have weeks to fix it before year-end, not months. This playbook walks you through the reconciliation steps that catch these breaks before they become audit findings. The process takes 3–5 days for 500+ invoices if you automate it right, or 3–5 weeks if you don't. Why invoicing migrations orphan data in the first place Platform exports are designed to move data, not to certify it. FreshBooks exports to CSV with twelve columns; Xero imports six of them. QuickBooks has a different tax rounding rule than Wave. Stripe's payment reconciliation logic doesn't map 1:1 to manual invoice entries. The result: you have a complete record, but it's not reconciled . The three orphaning patterns: Invoice numbering breaks. Old platform uses sequential numbers (INV-001, INV-002). New platform has a different series, or allows gaps, or resets by year. You export numbers as strings, and the import treats them as metadata rather than immutable identifiers. Duplicates appear. Sequences jump. Tax calculation diverges. FreshBooks rounds to two decimals per line item. Xero rounds per invoice. Wave uses a different GST rule for prorated subscriptions. Your total is off by £0.03 on some invoices, £0.47 on others. It compounds across 500 records. Payments don't re-link. A payment in Stripe references the invoice number. That number now points to a different record, or doesn't exist in the new platform. The payment floats unreconciled in accounts receivable. Cash looks higher than it should. The single biggest failure mode: Treating the export as a backup rather than as raw data that needs validation. If you don't spot-check 10% of records before calling migration 'done,' you'll find discrepancies in weeks 3–4, when the cost to fix them is highest. Step 1: Audit invoice sequence integrity before import Before you even touch the new platform, validate your export. Download the CSV from your old platform. Sort by invoice number. Check for: Gaps in sequence. Do numbers jump from INV-087 to INV-092? Flag those five records in the source system. Are they draft, void, or deleted? If they're deleted, the gap is fine. If they're void, you need to preserve that status in the new platform (void invoices still matter for audit). Duplicates. Pipe the invoice numbers through a deduplication check. Are there two INV-156 records? This almost never happens in clean systems, but happens 2–3 times in 500-record migrations from platforms where you've been sloppy with bulk actions. Format inconsistency. Some rows say 'INV-156', others say 'INV-0156', others say '156'. Standardize these now, before import. Your new platform will either accept all three formats as equivalent (unlikely) or treat them as distinct records (most common). Create a simple before-state reference sheet : total count, earliest invoice date, latest invoice date, total revenue (sum of invoice amounts, not paid amounts). You'll use this to validate the after-state. Step 2: Map old invoice numbers to new records Import the invoices into your new platform. Run a query to pull all imported records. Sort by the invoice number field. Now cross-check: Count match? If you had 537 invoices in FreshBooks, you should have 537 in Xero. If not, some records failed to import. Don't assume they're minor. Pull the failed records and trace why (character encoding, unsupported field values, date format mismatch). Sequence match? Pull the earliest and latest invoice number from the new platform. Do they match your before-state? If your old platform had INV-001 and INV-537, your new platform should too. Revenue total match? Sum all invoice amounts in the new platform. Does it match your before-state total? If not, rows have been partially imported or amounts have been altered during the migration. Use a reconciliation sheet (a simple spreadsheet with three columns: old invoice number, new invoice ID in the system, status). For every old invoice, manually verify that it exists in the new platform under the same number. This is tedious for 500 records, but it's where you catch most breaks. Pro tip: If your new platform supports it (Xero does; FreshBooks does not), use an automated lookup. Create a formula that searches for each old invoice number in the new system.