QuickBooks Online holds more than invoices. It holds your audit trail, tax liability, and the proof of every dollar that moved through your business. When you migrate, losing even one invoice or flattening a multi-leg transaction into a single line item means auditors will find it later—and it will cost more to fix then than now. Most migration horror stories start the same way: someone exports a CSV, imports it into the new platform, and discovers months later that tax codes vanished, rounding errors cascade across 600 invoices, or custom dimensions (cost centres, project IDs, customer classes) were silently dropped. The data technically 'moved,' but it moved broken. This playbook covers the exact export scheme, field mapping rules, and validation gates that keep your invoice history complete and audit-ready. Export strategy: Which data to pull and when QuickBooks Online stores invoice data across three interconnected places. Most people export only the invoices table and lose the context that makes them auditable. Start by exporting in this order: Chart of Accounts (COA). Export with account numbers, names, account types, and custom fields. This is your foundation—every transaction ties back here. Include account-level tax mapping. Customers and vendors with all custom fields, billing addresses, tax IDs (NPWP, UEN, NRIC for payroll), and any custom dimensions tied to them. These are reference data; if they're incomplete, downstream invoices will fail validation. Tax codes and rates (often hidden in settings). Document the exact tax percentage, account assignment, and any conditional logic (e.g., tax exempt if customer type = nonprofit). This is where most migrations break. Invoices and line items as separate exports if possible. Line-item-level data (quantity, unit price, tax code, custom fields, memo) is what auditors actually inspect. A single flattened invoice row loses this granularity. Payments and credits linked to invoices. An invoice without its payment record creates a ghost receivable. Journal entries that touch revenue or receivables. If you've manually adjusted invoice amounts, those entries matter. In QuickBooks Online, use the Reports module: go to Accounting Reports and export to CSV. Do not use the built-in PDF export—it truncates data. For fine-grained control, use the QuickBooks Online API (if your target platform supports direct integration) or a third-party migration tool like Altus or Excelify that handles schema mapping automatically. When to use a migration tool versus manual export Use a third-party migration tool if: You have more than 5,000 invoices. You use multi-currency transactions and need rounding rules preserved. You have custom fields or dimensions QuickBooks stores outside the standard schema. You need real-time validation of tax codes, account codes, and customer references before import. Your target platform (Xero, FreshBooks, Wave, or Orin's invoicing module ) requires field mapping that isn't one-to-one. Manual export/import is viable only if: You have fewer than 1,000 active invoices. You operate in a single currency. Your invoicing is straightforward (no recurring billing, revenue recognition complexity, or custom dimensions). You have the time to validate every row post-import. Even then, budget 3–4 weeks of part-time work if you do it manually. A tool cuts that to 2–3 days and catches errors automatically. Field mapping and schema alignment This is where invoices die in migration. QuickBooks Online's schema does not map one-to-one to any other platform. Core fields that must map: Invoice number: Often a sequential integer in QB. Your target may require a custom format (INV-2024-001). Document the current numbering scheme and whether you're renumbering post-migration. If you renumber, old invoice links from emails, contracts, or customer records break. Most auditors want continuity; renumber only if you have a business reason. Invoice date versus due date: Both matter for revenue recognition and aging reports. QB stores both; confirm your target does too. If your new platform only stores one, you've lost tax timing. Customer ID: QB uses internal numeric IDs; your new platform may use email or a custom slug. Map the QB ID to whatever unique key your target uses, and keep a lookup table in case you need to reverse-reference old QB records. Line-item account code: Each invoice line ties to a revenue account. QB stores this implicitly (tied to the item/service). Export it explicitly. If your new platform can't accept account codes at the line level, you'll have to flatten invoices into aggregate amounts—losing transaction-level audit trails. Tax code and rate: This is the highest-risk field. QB's tax code names and rates are arbitrary (often just '10% GST' or 'Tax1'). Your new platform has its own tax code library, often aligned to local compliance (e.g., LHDN's MyInvois in Malaysia). Do not assume QB's tax code names will import correctly. You must map QB's tax code