You're using FreshBooks for subscriptions, Stripe Billing for one-time charges, and Zoho Invoice for project work. Each platform works fine in isolation. Together, they're a reconciliation nightmare: three invoice number sequences, three tax code mappings, three settlement dates, and zero visibility into which customer actually paid what. By month four, your finance team is spending 12 hours a week stitching invoice totals back to your general ledger. Consolidating to a single invoicing platform is the right move. But migrating three years of invoice history without creating gaps in your audit trail, orphaning customer records, or misaligning tax jurisdictions requires a specific sequence. This playbook walks you through it. Step 1: Audit what you actually have across all three platforms Before you export anything, answer these questions for each platform: Invoice count and date range. How many invoices per year? Which platform holds your oldest records? Currency and tax code mix. Are invoices in SGD, MYR, IDR? How many distinct tax codes (SST, GST, no tax) across all three? Customer deduplication rules. Does the same customer exist under different names in two platforms? (Common in organizations where sales and support use different CRM aliases.) Voided, cancelled, or draft invoices. Most platforms count these differently. How many per platform, and are they reconciled to your GL? Payment linkage. Which invoices are marked paid, partially paid, or overdue? Does that match your bank reconciliation? Custom fields and metadata. Are there project codes, cost-center tags, or internal notes that won't map to your new platform? Document this in a simple spreadsheet: Platform | Invoice Count | Date Range | Tax Codes Used | Customer Count | Avg Invoice Value . This becomes your source of truth for the migration. Step 2: Export and validate totals against your general ledger Export your full invoice history (not just summaries—line items, too) from each platform in CSV or JSON. For each export: Sum total revenue per platform, per tax code. Example: FreshBooks MYR invoices with 6% SST should total ₹X. Stripe Billing SGD with 8% GST should total ₹Y. Reconcile to your GL. Pull your general ledger for the same date range. Does your Accounts Receivable account balance match the sum of all three platforms' invoice totals? If not, stop. You have unreconciled transactions—voided invoices, credit notes, or payment mismatches that need resolution before you migrate. Identify gaps. If FreshBooks shows ₹500K in invoices but only ₹450K landed in your bank account, you have either uncollected invoices (legitimate) or invoices that were reversed and not recorded consistently across platforms (a problem). Pro tip: Many finance teams discover at this stage that one platform was invoicing for work that was never actually delivered, or that payment records don't match invoice dates. Clean this up now—it's much cheaper to fix in a spreadsheet than to carry into your new system. Step 3: Map tax codes and test proration rules Your three platforms almost certainly handle tax differently. FreshBooks might use a single "SST" checkbox. Zoho might let you set tax per line item. Stripe Billing might calculate tax via API lookup. Before you migrate, decide on one canonical tax code structure in your new platform. Create a mapping document: FreshBooks "SST (6%)" → New platform "MY-SST-6" Stripe Billing "auto-GST" → New platform "SG-GST-8" Zoho "Exempt" → New platform "EXEMPT" Then test three real invoices from each platform through your new system: one with a mid-month proration, one with a credit note, one with a currency conversion. Verify that tax is calculated identically. If you're moving to a platform like Orin's invoicing module , test how it handles mixed-currency subscriptions and real-time tax lookups—especially if you invoice across Malaysia, Singapore, and Indonesia, where tax rates and thresholds vary by customer type. Step 4: Run parallel invoicing for 30 days Do not cut over all three platforms to one on a Friday. Instead, run both old and new in parallel for a calendar month. Here's the sequence: Week 1: Migrate historical data only. Import all past invoices into your new platform. Do not send anything to customers yet. Reconcile the totals again. Week 2–4: Generate all new invoices in both old and new platforms. Customer gets one invoice (from the old system), but you're quietly issuing the same invoice in the new platform and comparing line-for-line, tax code-for-tax code, due date-for-due-date. Week 5: Reconcile differences. If 98% of invoices match perfectly but 2% have rounding errors or missing fields, you've found your data integrity issues. Fix them before cutover. Week 6: Cutover. First new invoice goes out from the new platform only. Old platforms stop accepting new invoices (but remain readable for audit). The reason for parallel invoicing: tax code misconfiguration, currency rounding, or customer master data mismatche