CASE FILE 03/14CLASS: SAMPLE BUILDDATA: REALISTIC, NOT CLIENTTYPE: Bookkeeping & reconciliation

Sample build: realistic data, built to show how I'd handle this work. Not client work.

Sample buildBookkeeping & reconciliation

QuickBooks Online to Xero migration: every balance proven at conversion

QuickBooks Online to Xero with 0 balance differences at conversion, after 24,198.79 of sales counted twice was found and fixed

Sample build · realistic data, built to show how I'd handle this work · not client work · every figure is computed from the files in the appendix

  • 0of 65 Xero balances differ from QBO
  • 742,980.26open receivables carried over
  • 24,198.79sales counted twice, found
  • 32/32controls pass

01Summary

  1. In this scenario a Melbourne joinery and shopfitting business moves from QBO to Xero at 30 September 2026: 86 accounts become 75, 480 customer and supplier records become 449 contacts, and 135 open receivables and 190 open payables are imported at their balance.
  2. QBO is cleaned first: 4 receipts counted twice through Undeposited Funds (24,198.79 of sales, 2,419.88 of GST), 14 uncategorised bank-feed lines and 3,412.50 of Opening Balance Equity are fixed with three journals.
  3. Xero's trial balance, rebuilt from the import files, matches the adjusted QBO trial balance on all 65 accounts with a balance. 8 of 10 go-live gates pass; 32 of 32 controls and 12 of 12 tests pass.

QBO is cleaned first: 4 receipts counted twice through Undeposited Funds (24,198.79 of sales, 2,419.88 of GST), 14 uncategorised bank-feed lines and 3,412.50 of Opening Balance Equity are fixed with three journals.

Key point, computed from the sample files

02The scenario

In this scenario a joinery and shopfitting business has run QuickBooks Online for years with the bank feed doing most of the coding. Customer payments sit in Undeposited Funds while the feed also books the same money as income, unknown payments go to Uncategorised, customers and suppliers have been keyed twice, and an old opening entry left a balance in Opening Balance Equity. The business wants to be in Xero from 1 October without losing or doubling a single balance.

Exhibit 1: Current-state process map: 5 manual steps across 3 roles
Current-state swimlaneOfficeQBOAccountantBank feed codesincome1Receipts sit inUndeposited Funds2Unknown lines toUncategorised3Customers keyedtwice4Year-end fixesonly5

Source: sample files

03Issues in the data

Exhibit 2: Issues in the scenario, counted from the sample data
4receipts counted twice, overstating sales by 24,198.79
14bank-feed lines left in Uncategorised Expense
31duplicate records, 9 of them a customer and supplier that are one business
8accounts defaulting to GST where the supply is GST free or input taxed

Source: sample files

04How I approached it

  • An engine (engine.py) that maps 86 QBO accounts to Xero by rule with a type check, reviews tax defaults, joins duplicate contacts, finds receipts counted twice and uncategorised lines, writes the journals and nine Xero import files, and rebuilds Xero's trial balance.
  • A workbook with 25 tabs and 8,038 formulas: QBO GL and roll-forward, account map, tax review, contacts, open AR and AP, bank rec, clean-up journals, conversion balances, the Xero TB check and the cutover gates.
  • Nine Xero import files: chart, contacts, items, sales invoices, credit notes, bills, supplier credits, bank items and conversion balances.
  • A 16-page report and a one-page executive summary.
Exhibit 3: Target design for the scenario
Future-state architectureQBO EXPORTSChart, GL, TBsCustomers, suppliers,itemsAged AR and AP, bankCLEAN IN QBOJ1 receipts countedtwiceJ2 UncategorisedJ3 Opening BalanceEquityXERO IMPORTSChart, contacts, itemsOpen items via 855clearingBank items, conversionbalancesPROVEXero TB vs QBO peraccount10 go-live gates

Source: my design and the sample files

05How this applies to your business

  1. Week 1: exports and checksQBO exports, the roll-forward check, data profiling and the findings list.
  2. Week 2: clean-up and designMapping, contact merges and the three journals agreed with the owner and your accountant, then posted in QBO.
  3. Conversion: 1 to 3 OctoberQBO locked at 30 September, imports loaded into Xero, the trial balance checked against the tie-out.
  4. October: first month in XeroBank items reconciled, customer statements checked against QBO ageing, the first Xero month end.
Exhibit 4: Responsibilities (R responsible, A accountable, C consulted, I informed)
ActivityBusiness ownerSpecialist (me)Your team
Export QBO data and lock the fileACR
Map accounts and contacts, build the importsIRC
Approve journals J1 to J3ACR
Confirm tax defaultsICR
Load Xero and run the tie-outARC
Hand Sep-quarter GST figures to the BAS agent or accountantARC

Source: sample plan

06Controls and checks

Exhibit 5: Control framework: 32 checks, status read from the files
CheckWhat it catchesStatus
GL balances: debits = credits (all lines)The ledger export is completePASS
30 Sep TB export: debits = creditsThe TB export is completePASS
TB roll-forward: accounts that differ30 Jun + Jul-Sep = 30 Sep for every accountPASS
Every QBO account has a valid Xero codeNothing falls off the chartPASS
Mapped account type fits the QBO typeNo balance sheet account lands in P&L or the other way roundPASS
Every GL line has a Xero codeMapping covers every linePASS
Every QBO record maps to a Xero contact that existsNo orphan records after the mergePASS
Xero contacts: QBO records coveredEach record lands on exactly one contactPASS
Items: sales codes validItems import without errorsPASS
Open AR total = QBO A/R control at 30 SepAged receivables tie to the ledgerPASS
Open AP total = QBO A/P control at 30 SepAged payables tie to the ledgerPASS
Open items whose contact matches the mapInvoices on duplicate records follow the mergePASS
Bank: book - statement - unreconciled (all accounts)Every bank difference is explained by a listed itemPASS
Undeposited Funds left after J1 = recent payments not yet bankedOnly real, recent receipts carry overPASS
J1 reverses income equal to the receipts counted twice (ex GST)Income is not overstated in XeroPASS
Pre-cutover journals balanceJournals are completePASS
Adjusted TB balancesStill balanced after the journalsPASS
Uncategorised Expense after J2 = owner itemsOnly unidentified spend stays in SuspensePASS
Opening Balance Equity after J3No QBO-only equity account reaches XeroPASS
Conversion balances total 0Xero accepts the conversion balancesPASS
Bank conversion balances = statement balancesThe first Xero reconciliation starts from the statementPASS
Xero TB vs adjusted QBO: accounts that differEvery Xero balance equals QBOPASS
Xero TB vs engine: accounts that differWorkbook and engine agreePASS
Conversion clearing (855) after importThe clearing method nets outPASS
Historical Adjustment (840) after importNothing left unexplainedPASS
Xero AR (610) = open receivablesAged receivables in Xero tie on day onePASS
Xero AP (800) = open payablesAged payables in Xero tie on day onePASS
Xero GST (820) = adjusted QBO GSTGST control carries over for your BAS agent or accountantPASS
Net assets: Xero = adjusted QBOBalance sheet agreesPASS
Year-to-date profit: Xero = adjusted QBOP&L for Jul-Sep agreesPASS
Exceptions: one per receipt counted twiceEvery clean-up item is on the registerPASS
Engine regression: account mappings that disagree with the answer keyRules map every account correctlyPASS

Source: sample files (Checks / Controls tab, test output or run log)

07What the files show

Exhibit 6: What the sample files show
  • 0of 65 Xero balances differ from QBO
  • 742,980.26open receivables carried over
  • 24,198.79sales counted twice, found
  • 32/32controls pass

Source: sample files, measured by script. Sample data, not a client result.

  • GL balances: debits = credits (all lines): PASS
  • 30 Sep TB export: debits = credits: PASS
  • TB roll-forward: accounts that differ: PASS
  • Every QBO account has a valid Xero code: PASS

08Risks and how the build handles them

Exhibit 7: Risks and mitigations
RiskMitigation built in
A receipt is counted twice in the moveUndeposited Funds is matched to bank-feed income by customer, amount and date; J1 clears the doubles before the final TB
GST is counted again on imported invoicesOpen items are imported BAS Excluded; control on the GST account equals QBO
Two businesses merged into one contactDifferent ABNs never merge; look-alike names are kept apart and listed
A balance is lost or doubledXero's TB is rebuilt from the import files and compared with QBO account by account; any difference fails a gate

Source: sample design

09Appendix: files

A. Screenshots of the deliverable

Dashboard tab: accounts, contacts, open items, clean-up findings, bank items, tie-out and gates, every figure a formula

Exhibit 8: Dashboard tab: accounts, contacts, open items, clean-up findings, bank items, tie-out and gates, every figure a formula

Source: sample files

Account Map tab: each QBO account with its Xero code, the rule that mapped it, a type check and its balance

Exhibit 9: Account Map tab: each QBO account with its Xero code, the rule that mapped it, a type check and its balance

Source: sample files

Undeposited Funds tab: receipts never grouped into a deposit, matched to bank-feed income of the same customer and amount

Exhibit 10: Undeposited Funds tab: receipts never grouped into a deposit, matched to bank-feed income of the same customer and amount

Source: sample files

Xero TB Check tab: the adjusted QBO balance against Xero rebuilt from the import files, account by account, with the difference

Exhibit 11: Xero TB Check tab: the adjusted QBO balance against Xero rebuilt from the import files, account by account, with the difference

Source: sample files

Cutover Checklist tab: ten go-live gates and the steps from locking QBO to the first Xero month end

Exhibit 12: Cutover Checklist tab: ten go-live gates and the steps from locking QBO to the first Xero month end

Source: sample files

Controls tab: 32 formula controls, all PASS

Exhibit 13: Controls tab: 32 formula controls, all PASS

Source: sample files

Report page: the conversion method, with open items and bank items through a clearing account that ends at nil

Exhibit 14: Report page: the conversion method, with open items and bank items through a clearing account that ends at nil

Source: sample files

Overview of the QBO to Xero sample build: Xero balances checked against QBO, open receivables and payables, contacts and the clean-up findings

Exhibit 15: Overview of the QBO to Xero sample build: Xero balances checked against QBO, open receivables and payables, contacts and the clean-up findings

Source: sample files

B. Downloadable files

FileWhat it isSize
QBO-to-Xero-Migration.xlsxWorkbook: data profile, QBO GL, TB roll-forward, account map, Xero chart, tax review, contacts, items, open AR and AP, bank rec, Undeposited Funds, Uncategorised, clean-up journals, adjusted TB, conversion balances, Xero TB check, cutover checklist, exceptions, controls and test log398.9 KB
QBO-to-Xero-Report.pdfReport (16 pages): data profile, findings, options, chart and contact mapping, clean-up journals, conversion method, tie-out, gates, controls, tests, risks672.2 KB
Executive-Summary.pdfOne-page executive summary135.4 KB
engine.pyEngine: account and tax mapping, contact matching, Undeposited Funds and Uncategorised finders, journals, Xero import files, simulated Xero TB and the regression test27.3 KB
QBO-to-Xero-data-and-code.zipInputs as exported from QBO (CSV), engine output, the nine Xero import files, and the scripts that rebuild the workbook and the report182.6 KB

Sample build: realistic data, built to show how I'd handle this work. Names are placeholders and no client data is used.

Have a similar problem in your business?

Hire me on Upwork (opens in a new tab)