How to connect QuickBooks to Google Sheets so the numbers tie out
Connect QuickBooks to Google Sheets without a figure that disagrees with the books: accrual or cash basis, closed periods and multi-currency.
On this page
- Key takeaways
- What we'll cover
- Why your figure disagrees with the books
- Reports or transactions
- Building it with CodeWords
- Closed periods and adjustments
- The chart of accounts, which changes
- Labelling the sheet so it is defensible
- What should not leave QuickBooks
- Operational reports people actually chase
- Making it survive
- Limits worth knowing about
- What to set up first
- Frequently asked questions
- Related reading
To connect QuickBooks to Google Sheets so the numbers tie out, pull figures from the QuickBooks reports endpoints, state the accounting basis and period on the sheet, and re-export recent closed periods on a schedule. An export can be defensibly correct and still disagree with the accounts, so the sheet must say which question it answered.
Accrual against cash basis, a period adjusted after export, and a transaction dated differently from when it was entered each produce a figure someone will challenge. Get this right and the export is trusted. Get it wrong once and nobody uses it again.
Key takeaways
- Use the QuickBooks reports endpoints for any figure that someone will compare with the accounts.
- State the basis (accrual or cash), the exact period dates, the export time and the currency at the top of every sheet.
- Re-export recent closed periods on a schedule, because accountants post adjustments into closed periods.
- Match accounts on identifiers, not names, because names change during tidy-ups.
- Aggregate before sharing, because transaction-level exports carry customer and supplier details.
What we'll cover
- Why your figure disagrees with the books
- Reports or transactions
- Building it with CodeWords
- Closed periods and adjustments
- The chart of accounts, which changes
- Labelling the sheet so it is defensible
- What should not leave QuickBooks
- Operational reports people actually chase
- Making it survive
- Limits worth knowing about
- What to set up first
- Frequently asked questions
Why your figure disagrees with the books
Your figure disagrees with the books for five reasons, and each one works as intended.
- Accrual against cash basis. The same period produces different revenue depending on the basis you request. An export that does not state the basis has answered an ambiguous question.
- Transaction date against entry date. An invoice dated last month and entered this month belongs to last month in the accounts and to this month in a naive query.
- Adjustment after export. Accountants post journals into closed periods, which changes historical figures.
- Deleted and voided transactions. They behave differently, and a query that ignores the difference counts items that no longer exist.
- Multi-currency. The exchange rate applied at transaction time differs from today's rate, so a converted total depends on which rate you used.
None of these is an error. Each is a question the export answered implicitly, so the job is to say which answer you took.
Reports or transactions
Use the reports endpoints for any figure that must match the accounts, and use transaction queries for operational detail.
| Route | Returns | Use it for |
|---|---|---|
| Reports endpoints | What QuickBooks itself reports (profit and loss, balance sheet, aged receivables), computed on the basis you request | Anything someone will compare with the accounts |
| Transaction queries | The detail behind the totals | Operational work, such as chasing invoices or checking what is outstanding |
Do not rebuild a profit and loss from transactions. The result will not tie out, and the time spent reconciling it is the reason the reports endpoints exist.
Building it with CodeWords
You build the QuickBooks-to-Sheets export in CodeWords by describing the report, period, basis and target sheet to Cody, the automation builder. CodeWords connects to 3,000+ integrations (CodeWords pricing page, 2026), and the connection is made once and reused.
- Open CodeWords and start a new automation.
- Describe what should happen in plain language to Cody: which report or query, which period and basis, and which sheet it lands in.
- Authorize the connection to QuickBooks, and grant access to the target spreadsheet.
- Describe the exceptions: a period that has been closed since the last run, an empty report, a figure outside a plausible range.
- Run it for a period with signed-off figures and check that it matches before trusting anything.
You describe the outcome; Cody builds it, connects it, and deploys it. The Free plan costs $0 and covers light use, Pro is $39 per month ($33 billed yearly) and Business is $100 per month (CodeWords pricing page, 2026). Details are on the pricing page.
Closed periods and adjustments
Closed periods change after the fact, and a sheet holding a snapshot goes stale without warning. A figure for March can differ in June because an adjustment was posted. This is normal and not a data integrity problem.
- Re-export closed periods on a schedule, or refresh a rolling window that covers any period still being adjusted.
- Record the export date beside the figure. "Revenue for March as at 10 April" is defensible, and "revenue for March" is not.
- Ask your accountant when periods close, and schedule the export after adjustments, not during them.
- Flag any change to a historical figure on re-export, because someone may already have circulated the old number.
The chart of accounts, which changes
The chart of accounts changes because accounts get renamed, merged and made inactive, usually during a tidy-up nobody mentions. Four habits protect the export.
- Match on account identifiers, not names. A renamed account otherwise shows up as a new line, not as an error.
- Report unexpected accounts instead of dropping them into an "other" bucket that quietly grows.
- Decide how sub-accounts roll up. Whether the export includes the parent, the children or both changes the total.
- Compare the account list with the previous run and report the difference. This five-line check catches most problems.
Labelling the sheet so it is defensible
Label the sheet with five lines at the top, because they end most disputes about a finance report and cost nothing.
- Basis: accrual or cash.
- Period: exact start and end dates, not a month name.
- Export date and time: so the figure can be reconciled with what the books said then.
- Source: the name of the report or query.
- Currency: and, for multi-currency, the rate convention used.
What should not leave QuickBooks
Financial exports travel further than intended, so decide what stays in QuickBooks.
- Customer contact details and addresses arrive with transaction data whether or not anyone needs them.
- Employee and payroll information does not belong in a shared spreadsheet.
- Supplier bank account details are among the most sensitive data in any business system.
- Aggregate where you can. A revenue-by-month sheet is shareable; a transaction-level export is not.
- Check who the sheet is shared with. A finance export on link-sharing is an exposure, and access widens over time without review.
Operational reports people actually chase
Six exports save real time each month, and none has to tie out the way a management report does. That makes them a low-risk place to start.
- Aged receivables with contact details, so whoever chases invoices has the list and phone numbers in one place.
- Invoices about to become overdue, which prevents the problem instead of reporting it.
- Unreconciled transactions, which accumulate quietly and are slow to clear in bulk at period end.
- Bills due this week, so nothing is paid late.
- Expenses without receipts attached, which saves argument at year end.
- Duplicate supplier invoices, matched on amount and reference, because double payment happens in most organisations and is found months later.
Making it survive
A durable export ties out every time it runs.
- Use the reports endpoints for anything that must tie out.
- Match accounts on identifiers, not names.
- Replace a named range instead of appending, so a re-export of an adjusted period corrects the figures and does not duplicate them.
- Handle the token refresh. This is where these integrations break after a few weeks.
- Report the outcome: which report, which period, which basis, and whether any historical figure changed since the last run.
Limits worth knowing about
- Rate limits apply, and reports over long periods can be slow to generate.
- Tokens expire and need a refresh flow that you test, not assume.
- Sandbox and production are separate, with separate credentials. Confirm which one a connection uses.
- Report shapes differ between report types, so a parser for one will not read another.
- Google Sheets has a cell limit, which a transaction-level export over a long period can reach.
What to set up first
Set up one report from the reports endpoints first. Profit and loss for the current period is the usual choice. Write the basis, period, export time and currency at the top of the sheet, and check it against a period your accountant has already signed off before you circulate it.
Two habits make the difference. Use the reports endpoints instead of recomputing from transactions, because a figure that does not tie out is worse than no figure. And re-export recent closed periods on a schedule, because adjustments change history.
Frequently asked questions
Why does my export disagree with QuickBooks?
The usual causes are accrual against cash basis, transaction date against entry date, or an adjustment posted into a closed period after you exported. All three are normal, so the sheet should state which basis and period it used.
Should I use the reports endpoints or query transactions?
Use reports for any figure that someone will compare with the accounts, because they return what QuickBooks itself reports. Use transaction queries for operational detail, where the individual records matter more than the total.
Why did last month's figure change?
An accountant posted an adjustment into the period. Accounting history is not fixed, and this is expected, not a fault. Re-export recent periods on a schedule and flag any change to a historical figure.
Why did a grouped total change shape?
A renamed or merged account is the likely cause. Match on account identifiers instead of names, and report unexpected accounts instead of letting them fall into an "other" bucket.
What should the sheet say about itself?
The sheet should state the basis, exact period dates, export timestamp, the report that produced it and the currency convention. These five lines cost nothing and settle most disputes about a finance report.
Is it safe to share a finance export?
Share it only deliberately. Transaction-level exports carry customer details and sometimes supplier bank details, and a sheet on link-sharing is an exposure. Aggregate the data when the reader needs only the summary.
Why does the integration stop working after a few weeks?
Token refresh is the usual cause. Access tokens expire, and a refresh flow that nobody tested fails in production. Exercise the refresh path during testing, before the first scheduled run that someone depends on.
What is worth exporting besides the management accounts?
Export aged receivables with contact details, invoices about to fall overdue, unreconciled transactions, bills due this week and expenses missing receipts. None has to tie out like a management report, so they carry lower risk.
How do I catch duplicate supplier invoices?
Match on supplier, amount and reference across a time window, and report the pairs. Duplicates occur in most organisations and usually surface months later during reconciliation, so a short weekly query is worth running.