The test of an accounting sync isn't the day it works. It's the day the internet drops halfway through a post, or a bookkeeper edits an invoice in QuickBooks, or the same invoice number already exists. TradesWork is built for those days: every invoice, payment, refund and void posts to QuickBooks Online once, in order, and anything QuickBooks refuses waits in a queue that tells you why.
What syncs, and what doesn't
| Record | What happens in QuickBooks | When |
|---|---|---|
| Invoice | Created when sent; updated in place when it changes later | Next sync after the change |
| Voided invoice | Voided in QuickBooks (skipped if it never posted) | Next sync |
| Payment | Applied to the open balance QuickBooks shows; any extra stays as a customer credit | As it happens |
| Refund | Posted as a refund receipt from your refund account, not a credit memo | As it happens |
| Customer | Matched by display name or email, or created; then left alone | First time it's needed |
| Price book items | Not synced; your lines map onto existing QuickBooks items | n/a |
| Deposits, payout matching, bills, payroll | Not synced | n/a |
Drafts with no money on them never post. Invoices dated before your cutover date are skipped, and so are invoices you imported from your old system. That last rule matters if you're switching: your history stays where it is, and QuickBooks only sees new work.
Why nothing posts twice
Most duplicate invoices in QuickBooks come from a sync that sent something, lost the reply, and sent it again. TradesWork closes that gap in plain, boring ways.
- 1
Record it with the sale
When an invoice, payment or refund is saved, a note that QuickBooks needs to hear about it is saved in the same step. If the save fails, there's no note. If it succeeds, the note can't be lost.
- 2
One open item per invoice
Edit an invoice five times before the next sync and QuickBooks gets one update with the latest version, not five.
- 3
Check before creating
Before creating anything, TradesWork checks its own link to the QuickBooks record, sends a fixed request id QuickBooks recognizes on a retry, and looks the invoice number up in QuickBooks.
- 4
Post in order
Changes go in the order they happened, chained per invoice. A payment never posts before its invoice, and a problem with one invoice holds back only that invoice.
If the invoice is already in QuickBooks under the same number, TradesWork links to it with the message "Invoice #N was already in QuickBooks: linked to it instead of creating a duplicate." If nothing changed since the last post, it says "No changes since the last post" and moves on.
After each invoice posts, the totals are compared. If QuickBooks disagrees, you'll see "QuickBooks shows $X for invoice #N but TradesWork has $Y." It's almost always sales tax, which is why the tax setting below matters.
The fix-it queue
Temporary problems retry on their own, waiting longer each time, up to 8 tries. If QuickBooks asks TradesWork to slow down, you'll see "QuickBooks asked us to slow down. Posting resumes automatically." Everything else goes to the fix-it queue on the QuickBooks page with a reason you can act on.
| What you'll see | Usual cause | Fix |
|---|---|---|
| Choose a default QuickBooks item… | Your company has no "Services" item | Pick a Default item and save |
| Choose a QuickBooks item for sales tax… | Tax mapping missing | Fill it in, or switch to a separate tax line |
| No QuickBooks customer is named "X"… | You chose Ask me first for unmatched customers | Create or rename the customer in QuickBooks, then Retry |
| QuickBooks already has an invoice #N for a different customer | Invoice numbers overlap with your old system | Raise where job numbers start, or renumber in QuickBooks |
| QuickBooks shows $X for invoice #N but TradesWork has $Y | Usually tax | Check the tax setting, then Retry |
| …its date is in a closed period | Your bookkeeper closed the month | Reopen the period in QuickBooks, then Retry |
| Invoice #N was deleted in QuickBooks | Someone deleted it there | Retry to post it again, or Mark handled |
Every item has two buttons. Retry puts it back in line and runs it now. Mark handled tells TradesWork you dealt with it in QuickBooks yourself; it records who did it and what the problem was, and won't post it. Saving your mapping settings automatically re-queues anything that failed because of setup, and editing an invoice that failed puts it back in line too.
QuickBooks itself sends one kind of notice back: when someone deletes or voids a record TradesWork posted. Intuit signs those notices,1 and TradesWork checks the signature and rejects anything it can't verify. The record returns to the queue as "deleted/voided in QuickBooks but is still open in TradesWork."
Mapping settings
All of this lives under Settings › Integrations › QuickBooks Online, in a section called What posts and how.
- Cutover date: "only sync invoices dated on or after." Required before anything posts.
- Unmatched customers: Create the customer in QuickBooks (default), or Ask me first (fix-it queue).
- Sales tax: a separate sales tax line (works with every company, including Automated Sales Tax), or a QuickBooks tax code with the TradesWork amount (not for Automated Sales Tax). TradesWork always calculates the tax; QuickBooks never recalculates it.
- Items: a default item, then one each for Services, Materials and Equipment, and optionally by price book category, which wins over the kind. Membership discounts post as one discount line.
- Payments go to: Undeposited Funds by default, so payments group into deposits that match your bank.
- Refunds: which account refunds are paid from, and which item they book against.
- Review hold: an option under Job Costing to hold invoices back from QuickBooks until they pass review.
Staying connected
QuickBooks connections run on sign-in tokens from Intuit. Intuit's developer FAQ says a refresh token lasts 100 days and the clock resets each time it's used,2 and Intuit has since announced a five-year maximum on top of that.3 Connections can also end when someone revokes access from the QuickBooks side. Plan on reconnecting now and then; it takes a minute. When the connection ends, the badge shows Reconnect needed and posting pauses. Press Reconnect QuickBooks, sign in again, and the queued changes post. Nothing is lost while you're disconnected.
Tokens are stored encrypted. A Sandbox tag appears if you've connected an Intuit test company rather than your real books.
Reconciling when you switch from ServiceTitan
The day you move, the question your accountant asks is "does open A/R still match?" Under Settings › Integrations › Import from ServiceTitan, Reconcile with QuickBooks answers it.
It reads your QuickBooks customers, invoices and payments (24 months by default, plus every open invoice regardless of age) and writes nothing to QuickBooks. Imported customers are matched by email, then phone, then name, ignoring LLC, Inc and similar. The report shows customers only on one side, invoices only on one side, balances that differ, and whether open A/R matches to the penny. Bring missing A/R and invoices from QuickBooks pulls over invoices TradesWork doesn't have yet, and those are tagged so the sync never posts them back.
This is a switching tool, not an ongoing sync. Outside a switch, data only flows from TradesWork to QuickBooks.
Free download · PDF + ExcelThe ServiceTitan Exit KitContract timeline, every export to run, a cut-over plan and the questions to ask before you give notice.How it compares to ServiceTitan
ServiceTitan supports far more accounting systems: QuickBooks Desktop, Xero, Sage Intacct, Acumatica and others.4 If you're on Desktop or Xero and not moving, TradesWork isn't a fit today.
On QuickBooks Online, the difference is in the error cases. ServiceTitan's help center documents a duplicate document number error (QuickBooks code 6140) where you search QuickBooks, then bypass or renumber the invoice and re-export.5 It also documents duplicate QuickBooks customers created when names differ by spacing, fixed by copying the QuickBooks "Display Name As" value into ServiceTitan.6 TradesWork checks the invoice number before creating, matches customers by name or email, and puts whatever's left in one queue.
Who this isn't for
If you need class or location tracking in QuickBooks, a separate QuickBooks file per business unit, or two-way sync where your bookkeeper's edits flow back, this sync doesn't do it. Supplier bills, payroll and deposit matching stay in QuickBooks. Timesheets export separately for payroll.
Footnotes
-
Intuit Developer, "Webhooks" (signature verification with the intuit-signature header). https://developer.intuit.com/app/developer/qbo/docs/develop/webhooks ↩
-
Intuit Developer, "Authorization FAQ." https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/faq ↩
-
Intuit Developer blog, "Important changes to refresh token policy." https://medium.com/intuitdev/important-changes-to-refresh-token-policy-8443779d40db ↩
-
ServiceTitan, "Accounting integrations." https://www.servicetitan.com/features/accounting/integrations ↩
-
ServiceTitan help center, QBO error 6140 duplicate document number. https://help.servicetitan.com/docs/qbo-error-cant-export-invoice-id-400-badrequest-validationexception-was-thrown-6140-duplicate-document-number-error ↩
-
ServiceTitan help center, "Duplicate Customers in QuickBooks after Exporting from ServiceTitan." https://help.servicetitan.com/docs/duplicate-customers-in-qb-after-exporting-from-servicetitan ↩
