QuickBooks Desktop and Avalara integration
QuickBooks Desktop keeps the books, customers, and invoices on a Windows machine. Avalara AvaTax determines sales and use tax across jurisdictions. Connecting the two puts accurate, address-based tax on QuickBooks Desktop invoices without anyone looking up rates by hand. ml-connector reads each invoice from QuickBooks Desktop, sends it to AvaTax for calculation, and writes the returned tax back onto the document. It handles the SOAP and REST differences on each side and runs on the schedule the Web Connector polls.
What moves between them
The flow runs from QuickBooks Desktop into Avalara and the tax result back. On each Web Connector cycle, ml-connector reads invoices and sales orders created or modified since the last successful sync, plus the customer addresses they reference, and sends each as an AvaTax CreateTransaction of type SalesInvoice. AvaTax returns the calculated tax by jurisdiction, and ml-connector writes that tax back onto the QuickBooks Desktop invoice with an InvoiceMod. Customer ship-to addresses and item tax codes are aligned so AvaTax can place each line. QuickBooks Desktop stays the system of record; AvaTax is used only for calculation and the tax filing record.
How ml-connector handles it
ml-connector hosts the SOAP service the QuickBooks Web Connector points at, validates the session ticket on every call, and stores both credential sets encrypted. It sends Avalara the HTTP Basic header built from the account ID and license key, switching to the sandbox host for testing. Because QuickBooks Desktop has no webhooks, it polls with a ModifiedDateRangeFilter and walks the QBXML iterator (MaxReturned, iterator Start then Continue) to page large result sets while staying under the roughly sixty-second QBXML request timeout. Each invoice maps to an AvaTax SalesInvoice, the QuickBooks customer to the AvaTax customerCode, and each line item to its AvaTax tax code; the invoice number becomes the AvaTax document code so a retry updates the same uncommitted transaction instead of duplicating it. Writing tax back uses an InvoiceMod with the latest EditSequence, re-queried first to avoid error 3200. AvaTax rate limits return HTTP 429, so ml-connector backs off with jitter and retries, and every record carries a full audit trail and can be replayed if a write fails. QuickBooks must be open on the Windows machine for any of this to run.
A real-world example
A mid-sized regional building-supply distributor runs QuickBooks Desktop Enterprise on a Windows server and bills customers across several states. Before the integration, staff looked up sales tax rates by hand for each ship-to address, which meant wrong rates on cross-county deliveries and a scramble whenever a jurisdiction changed its rate or a customer claimed an exemption. With QuickBooks Desktop and Avalara connected, every new invoice is sent to AvaTax for an address-accurate calculation and the tax is written straight back onto the invoice, and the committed transactions become the basis for tax returns. The manual rate lookups stop and filing data ties back to what was billed.
What you can do
- Calculate jurisdiction-accurate sales tax on QuickBooks Desktop invoices through AvaTax CreateTransaction.
- Write the AvaTax tax result back onto each invoice using an InvoiceMod with the current EditSequence.
- Poll QuickBooks Desktop for new and changed invoices by modified-date filter since QuickBooks Desktop has no webhooks.
- Bridge the Web Connector session ticket on one side and Avalara HTTP Basic auth on the other.
- Use the invoice number as the AvaTax document code so retries update rather than duplicate a transaction.
Questions
- Which direction does data move between QuickBooks Desktop and Avalara?
- Invoices and the customer addresses they reference move from QuickBooks Desktop to Avalara for calculation, and the calculated tax moves back onto the QuickBooks Desktop invoice. QuickBooks Desktop stays the system of record. Avalara holds no vendors or GL accounts, so ml-connector only sends taxable transactions and reads back the tax.
- How does the integration reach QuickBooks Desktop if it has no cloud API?
- QuickBooks Desktop is reached through the QuickBooks Web Connector, which polls a SOAP service that ml-connector hosts while QuickBooks is open on the Windows machine. The service authenticates each session for a ticket, then queries and updates invoices over QBXML. There are no webhooks, so changes are found by polling with a modified-date filter on a schedule you set.
- What stops a retry from creating duplicate tax in Avalara?
- AvaTax uses the document code as its idempotency key, so ml-connector sends the QuickBooks invoice number as that code. Re-sending an uncommitted transaction with the same code updates it in place rather than creating a second one. Once a transaction is committed its code is reserved, so corrections go through void or adjust instead of a fresh post.
Related integrations
More QuickBooks Desktop integrations
Other systems that connect to Avalara
Connect QuickBooks Desktop and Avalara
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started