QuickBooks Desktop and Basware integration
QuickBooks Desktop runs the books for a single company file on a Windows machine. Basware handles invoice capture, coding, matching, and approval in the cloud. Connecting the two lets approved invoices in Basware land in QuickBooks Desktop as Bills without re-keying, while the QuickBooks vendor list and chart of accounts feed Basware so every invoice is coded to an account that actually exists. ml-connector handles the very different access models on each side and moves data on the cadence the Web Connector and your team allow.
What moves between them
The main flow runs from Basware into QuickBooks Desktop. When an invoice is coded and approved, ml-connector reads it from Basware and creates a Bill in QuickBooks Desktop against the matching vendor and GL account, then calls the Basware transfer response endpoint to confirm the handoff. QuickBooks vendor records and chart of accounts move the other way, imported into Basware so the coding panel only offers real accounts and suppliers. When a Bill is paid in QuickBooks, ml-connector reads the Bill Payment and posts a payment confirmation back to Basware. Cadence on the QuickBooks side follows the Web Connector polling interval, typically every five to fifteen minutes, since real time is not possible.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Basware side it requests an OAuth2 bearer token against the customer region base URL and re-mints it on expiry, and verifies the HMAC-SHA256 signature on any inbound webhook before acting. On the QuickBooks side it runs the SOAP service the Web Connector calls, validates the username, password, and ticket on every call, and returns QBXML request blobs for the agent to run against the open company file. Because QuickBooks Desktop has no idempotency key, ml-connector queries by RefNumber or stored TxnID before adding a Bill so a re-poll does not create a duplicate, and always re-reads the EditSequence before any update. GL accounts and cost centers are mapped first, so every Basware coding line resolves to a real QuickBooks account. Real edge cases handled: QuickBooks must be running for any sync to occur, the QBXML version must match the installed edition, Basware silently drops an unchanged record on re-import so a field must change to retrigger, and Basware continuation tokens must be forwarded as a request header. Failed calls back off and retry, and every record carries a full audit trail with error replay.
A real-world example
A regional construction firm of about three hundred staff keeps its books in QuickBooks Desktop Enterprise on a Windows server and processes a heavy volume of subcontractor and supplier invoices through Basware for capture, three way matching, and approval. Before the integration, an AP clerk printed approved invoices from Basware and hand keyed each one into QuickBooks as a Bill, then manually flagged paid invoices back in Basware, which left the two systems out of step for days and made month end slow. With QuickBooks Desktop and Basware connected, approved invoices post into QuickBooks as Bills automatically, the QuickBooks vendor and account lists keep Basware coding accurate, and payment confirmations flow back so Basware reflects what has actually been paid.
What you can do
- Create Bills in QuickBooks Desktop from coded and approved Basware invoices, mapped to the right vendor and GL account.
- Import the QuickBooks Desktop vendor master and chart of accounts into Basware so coding only uses real accounts and suppliers.
- Send payment confirmations from QuickBooks Desktop Bill Payments back into Basware to close the loop.
- Bridge Basware OAuth2 bearer tokens and HMAC signed webhooks to the QuickBooks Web Connector SOAP session.
- Deduplicate Bills by RefNumber or stored TxnID and respect EditSequence so polling never creates duplicates or stale updates.
Questions
- How does ml-connector reach QuickBooks Desktop when it has no cloud API?
- QuickBooks Desktop is reached through the QBXML SDK over SOAP using the free QuickBooks Web Connector, which runs on the same Windows machine and polls ml-connector on a set interval while QuickBooks is open. ml-connector hosts the SOAP service the Web Connector calls, validates the username, password, and session ticket on every request, and returns QBXML messages for the agent to run against the company file. QuickBooks must be open for any sync to happen, so syncs follow the polling interval rather than running in real time.
- Which direction does data move between QuickBooks Desktop and Basware?
- Coded and approved invoices flow from Basware into QuickBooks Desktop as Bills, and ml-connector confirms each transfer back to Basware. The QuickBooks vendor list and chart of accounts flow the other way into Basware so invoice coding stays valid. When a Bill is paid in QuickBooks, a payment confirmation is sent back to Basware to reflect the actual payment status.
- How are duplicate invoices avoided when QuickBooks Desktop has no idempotency key?
- QuickBooks Desktop does not deduplicate requests, so a second create would make a second Bill. ml-connector queries by RefNumber or a stored TxnID before adding a Bill, so a repeated poll skips records that already exist. For updates it re-reads the current EditSequence first, which prevents overwriting a concurrent edit and avoids the version error QuickBooks returns on a stale value.
Related integrations
More QuickBooks Desktop integrations
Other systems that connect to Basware
Connect QuickBooks Desktop and Basware
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started