Help › Bookkeeping
Import your data from QuickBooks
Updated
To move your QuickBooks records into HQ:
- Go to Ledger › Accounting › QB Import.
- Export each list or report from QuickBooks Online or Xero as a CSV or an Excel (.xlsx) file and upload it in the matching section with Upload file: Clients, Vendors, Products and services, Invoices, A/R aging at your start date, Bills, A/P aging at your start date, Journal Entries, Bill Payments. Each section names the export it reads and lists the columns it expects.
- Bring the chart of accounts in first with Import CSV on Ledger › Accounting › Chart of Accounts (it takes the QuickBooks account list as exported, numbers or not), then the lists, and each upload reports how many rows imported or were skipped, and lists every row it could not import with the reason.
HQ reads the files QuickBooks Online and Xero actually produce, not only tidy templates. Title lines above the column names, the customer or supplier name on a row of its own with that party's rows beneath it, subtotal lines, a grand total and the date-and-time footer QuickBooks prints are all skipped or followed, and amounts like $1,234.56, (1,234.56) and 1,234.56- are understood. The exports each section reads:
- Clients: QuickBooks Online Reports › Customer Contact List; Xero Contacts › Customers › Export. A customer written as Parent:Child keeps its whole name, and QuickBooks' single combined billing address goes in as the first address line.
- Vendors: QuickBooks Online Reports › Supplier (Vendor) Contact List; Xero Contacts › Suppliers › Export.
- Products and services: QuickBooks Online Sales › Products and services › Export (or the Product/Service List report); Xero Sales › Products and services › Export. Each becomes a saved invoice line on your price list, worded "Name - description", with its sales price and, when the income account matches one of yours, that account. An item whose name is already saved is skipped. Stock quantities and purchase costs are not read.
- Invoices: QuickBooks Online Reports › Open Invoices or A/R Aging Detail; Xero Sales › Invoices › Export. The Open balance column is what is still owed, so a part-paid invoice comes in with its payment recorded. Credit memos and payments in an aging report are not invoices, so they are left out, and the result says how many.
- Bills: QuickBooks Online Reports › Unpaid Bills or A/P Aging Detail; Xero Purchases › Bills › Export. Xero writes one row per invoice or bill line, and HQ reads each number once. Voided Xero bills are skipped, and a bill still in Draft is left out and named in the result, because it is not owed yet.
When an invoice file has a Status column, Invoices reads it to decide what each invoice is:
- Open, Sent, Unpaid, Due, Partial, Partially paid, Viewed and Overdue, the QuickBooks Online wordings that count the days ("Due in 14 days", "Due today", "Overdue 12 days", "Partially paid, $50.00 due in 10 days"), and Xero's Awaiting Payment and Authorised come in as issued and still owed, less whatever the Balance column shows as paid. A part-paid row needs that column (see below).
- Paid, Closed, Deposited and Not deposited come in as paid.
- Draft, and Xero's Awaiting Approval and Submitted, come in as drafts, which nobody owes yet.
- Void, Voided and Deleted come in as cancelled.
- A blank Status, or a file with no Status column, comes in as issued and owed.
Any other Status, such as an estimate's Pending or Accepted, is not imported. The row is listed with the reason and nothing is created for it, not even its customer. HQ doesn't guess, because an invoice dated before your conversion date becomes part of your opening balances (see below), and one your old books never counted as owed would put Accounts Receivable out of step with them. If the invoice really was sent to the customer, change its Status to Open (or Paid), or to Draft if it never was, and upload the file again. Invoices already imported are skipped, so the rest of the file doesn't come in twice.
A Xero contacts file lists customers and suppliers together. If the file has a column saying which (IsSupplier or IsCustomer), Vendors takes only the suppliers and Clients only the customers, and the result says how many were left out. If it has no such column, every contact is imported and the result tells you so; export again from Contacts › Suppliers (or Customers) in Xero to bring in one kind only.
Vendors takes a QuickBooks supplier (vendor) list or a Xero contacts export. Each supplier gets a vendor rule, and a vendor on Ledger › Expenses › Vendors carrying the email, phone, address and tax number (GST/HST number, Business ID No. or Tax ID) from the file. A supplier already on that page, from its bills, gains the details rather than a second entry. Uploading the list again fills in details the first file lacked, and a blank cell never clears one you already have. The upload reports how many suppliers' details changed.
Dates are read the same way for every row of a CSV. A date like 07/03/2025 could be 7 March or 3 July, so HQ looks at every date in the upload: any whose first number is over 12 means day first, and any whose second number is over 12 means month first. If none of them decides it, a Canadian book reads day first (as QuickBooks Online Canada exports) and a US book month first. A CSV that has both kinds is refused and nothing is imported; export it again with dates as YYYY-MM-DD.
A Bill Payments row dated after today is listed as an error, since a payment cannot have happened yet, and so is one whose date is blank or can't be read. HQ reads dates like 2026-05-15, 15/05/2026 (or 05/15/2026), 15/05/26 and May 15, 2026. A two-digit year is always read as 20xx. A future date is usually a mistyped year. Correct the row, typing the date as YYYY-MM-DD, and upload a file holding only that row. A file with one row has no other dates to show whether it is day first or month first, so a date like 06/03/2026 would be read by your book's country. Don't upload the other rows again. A bill payment you have not made yet belongs in Bill Pay, not in an import.
Bills and Journal Entries post to your books as they import, so a row dated in a period you have locked can't come in, unless it is a bill dated before your conversion date, which posts nothing. The row is listed as an error with the reason and nothing is recorded for it, not even a new supplier; the other rows in the file still import. A bill is listed the same way when your chart of accounts has no Accounts Payable account or no expense account for it, and so is a journal entry the books refuse for any other reason, such as a negative debit or credit. To bring a refused row in, reopen the period (or correct the row or the chart) and upload the same file again: the rows already in HQ are skipped, so only what is missing comes in.
Invoices, Bills and Bill Payments need your opening balances first, because their date is the day your books in HQ start, and that day is what tells HQ which rows the balances already hold. If you haven't posted them, the upload imports nothing and the section links to Opening Balances. Enter them as of the last day of your old books, then upload the same file again.
From your start date on, a row that records money this import has no entry for is listed as an error with its name, date and amount, and nothing is recorded for it, not even a new customer. The other rows in the file still import. Enter these in HQ instead, so their entries post:
- An invoice that is issued or paid: enter it in Invoicing and choose Mark sent, which posts it without emailing anyone, then record or match any payment. A draft or a voided invoice records no money, so it still imports.
- A bill marked paid: enter it on Ledger › Expenses and match it to its bank line. A bill still owed posts as it imports.
- A Bill Payments row: match the bill to its bank line on Ledger › Expenses. The row is refused when the payment or its bill is dated after your opening balances.
Journal Entries are matched by their date, accounts and amounts, because a journal file has no number HQ can rely on. Uploading a file again leaves out every entry that still matches, and the result names them, including any you typed in by hand on the same date for the same accounts and amounts. If one of those really is a separate entry, enter it in HQ by hand. An entry you changed after importing it, or whose account you merged into another, no longer matches its row, so uploading that row again posts it a second time: upload a file holding only the rows you still need. Two matching entries inside one file both come in when each has its own Transaction # or Num. Without one, neighbouring rows that share a date and a memo are read as a single entry, with the same total.
This tab imports lists: your customers, suppliers, and history. It's a different job from entering your starting balances, and the difference is what you're importing, not the file format (both routes accept CSV). For a trial balance and opening balances, use the Import from accountant documents button on the Opening Balances or Chart of Accounts screen; it takes your trial balance as a PDF, Excel (.xlsx), or CSV file. Note that QuickBooks Online exports a trial balance to Excel only, so that is the file to reach for.
Importing into a client's or an owner's books
A partner working inside a client, or a bookkeeper an owner has invited, imports into that business's books, never their own. A bookkeeper's access level decides which sections appear: Edit shows Clients, Vendors and Products and services; Full also shows Invoices, Bills, both agings at your start date, Journal Entries, and Bill Payments; View shows none. The business's activity log records who ran each import, what it imported and how many rows were added, skipped or in error. If a bookkeeper's access has ended, an upload from a page left open is refused, and HQ takes them back to their own account.
Payments your customers made
There is no Payments Received import, because no customer payment from QuickBooks has anywhere to go in HQ that the books don't already hold:
- Paid before your start date: it is already in your opening balances. Your trial balance's Accounts Receivable holds only what was still owed, and the invoice list's Balance column says the same about each invoice.
- Paid on or after your start date: import your bank statements for the months between your start date and today on Ledger › Banking, then match each deposit to its invoice. A payment that never went through the bank (cash you kept, say) is entered with Record payment on the invoice. Either way the payment posts its own entry.
Uploading a list of those payments as well as importing the bank statements would book the same money twice, once from each.
Open invoices from before your conversion date
Invoices dated before your conversion date are already inside your opening balances: your trial balance's Accounts Receivable holds what your customers still owe on them, and the sale and its sales tax are in the balances your accountant closed. So an imported invoice with that kind of date books no sale of its own, now or when it is paid. It stays an open item you can chase, receive payments on, apply a credit to or write off, and those post as usual, against the receivable your opening balances carry. The same goes for one you type in by hand and send.
Post your opening balances before you import the invoices; the import asks for them first. If you post the balances again at another date later, invoices already imported are taken in again, unless HQ has posted one or recorded a payment on it in the meantime; that invoice is left as it is for you and your accountant to decide. Export the invoice list with its Balance column (QuickBooks reports such as Open Invoices and A/R Aging Detail call it Open Balance, and that name works too): the import reads what is still owed on each invoice from it, so payments made in QuickBooks before your conversion date are already counted. There is nowhere to import them again, and you shouldn't enter them by hand either. Without a Balance column, an invoice marked Paid comes in paid in full and one marked Open or Overdue comes in as owed in full. One marked Partial or Partially paid is listed as an error and not imported, because nothing in the file says how much of it is still owed: export the list again with its Balance column and upload it again. The invoices already imported are skipped.
Two things are different for such an invoice. It can't be cancelled while your opening balances count it, or once anything has been paid, credited or written off against it: if the customer won't pay, use Write off, and if it needs correcting, use Issue credit note. One you imported by mistake, that your opening balances don't count, can be cancelled, and that posts nothing. And its date can't be moved across your conversion date. An invoice in another currency dated before your conversion date isn't accepted at all, since your opening balances are in your book's own currency.
On a cash-basis Profit and Loss, a payment received on one of these invoices shows no income, because the income was earned before your conversion date and is already in your opening balances.
Open bills from before your conversion date
A bill dated before your conversion date is also inside your opening balances: its expense and sales tax are in the balances your accountant closed, so an imported bill with that kind of date books no expense of its own. If the bill list's Balance shows something still owed, the bill is counted as still owed on your conversion date: it shows on AP Aging, can be scheduled, and its payment is matched to it like any other bill, against the Accounts Payable your opening balances carry. A row whose Balance is part of its Total comes in with the difference already paid, so don't import those QuickBooks payments again in Bill Payments. Export the bill list with its Balance column (Open Balance on the Unpaid Bills and A/P Aging Detail reports works too): without it HQ can't tell which bills were still owed, so none is counted and you mark each one yourself with Still owed at my start date. A bill marked Partial or Partially paid in a file with no Balance column is listed as an error and not imported, for the same reason as an invoice.
Post your opening balances before you import the bills; the import asks for them first. The bills counted as still owed can't add up to more than your opening balances' Accounts Payable figure: a bill that doesn't fit comes in as a reference record and the import lists it, so check the bill or your opening balances. A bill in another currency dated before your conversion date isn't accepted at all.
A list exported after your start date
An invoice list exported some time after your start date shows an invoice that was still owed on that day, but paid since, as Paid with a Balance of 0. It imports as paid, while your opening balances' Accounts Receivable still holds it, so the two disagree by that invoice. Bills do the same to Accounts Payable. When that happens, the invoice or bill import adds a note naming both figures.
The fix is the aging as at your start date, which lists exactly what was still owed that day. Run QuickBooks Online's Reports › Open Invoices (or A/R Aging Detail) as of the last day of your old books and upload it in A/R aging at your start date, below Invoices. For bills, run Reports › Unpaid Bills (or A/P Aging Detail) the same way and upload it in A/P aging at your start date, below Bills. Post your opening balances first.
What the upload does:
- An invoice or bill already in HQ that the aging lists is set back to open for the aging's open balance, even if your later list said Paid. Its later payment then comes in from your bank statement: match the deposit (or the bill payment) on Ledger › Banking, and that posts its own entry.
- One the aging lists that isn't in HQ yet is created, already counted in your opening balances.
- One that isn't on the aging really was paid before your start date, and stays as it is.
The aging is taken whole: either all of it comes in or none of it does. It is refused, with nothing changed, when:
- its open balances don't add up to your opening balances' Accounts Receivable (or Accounts Payable) to the cent. The message names both figures and the difference: check the aging is run as of your start date and lists every open invoice, or correct your opening balances.
- it says it is "As of" a different day from your opening balances. Run it again as of that day.
- a row is dated on or after your start date. That is not an aging as at your start date.
- your opening balances have no Accounts Receivable (or Accounts Payable) line. Post them first.
- an invoice or bill it lists already has something recorded against it in HQ since it came in: a payment, a bank match, an entry, a credit or a deposit, or it is cancelled or written off. The message lists each one by name, date and amount. Undo that first, or leave the item as it is.
- HQ counts an invoice or bill as still owed at your start date and the aging doesn't list it. The message names it; one of the two is wrong.
- with it, HQ's Accounts Receivable (or Accounts Payable) would no longer agree with the invoices (or bills) HQ holds as owed. The usual cause is a payment on one of them already recorded another way, such as an imported journal entry or one typed by hand. The message names the difference.
Payments and credit memos in the report are not invoices, so they are left out of the rows, and the result says how many. Their amounts are left out of the total too, so an aging that shows a customer's unapplied payment or credit at your start date won't add up to your Accounts Receivable and is refused. Apply the payment or credit to its invoice in your old books, or move it out of Accounts Receivable in your opening balances, then run the aging again. Uploading the same aging again changes nothing.
If you're moving your whole set of books over, Switch from another accounting system walks that path end to end.