QuickBooks Desktop and Coupa integration
QuickBooks Desktop runs your accounting on Windows; Coupa runs your procurement in the cloud. When a purchase order is placed in Coupa, the matching bill should exist in QuickBooks Desktop with the right vendor and amount. Supplier master data must stay aligned between both systems. ml-connector moves that data across the very different transport layers - SOAP on the QuickBooks Desktop side, REST on Coupa - and lets you define the sync cadence.
What moves between them
Supplier and purchase order data flow from Coupa into QuickBooks Desktop. When a new supplier is created in Coupa, ml-connector maps it to a QuickBooks Desktop vendor and creates or updates the vendor record. When a purchase order is confirmed in Coupa, the corresponding bill is written to QuickBooks Desktop with the vendor, line items, and amounts. Invoices and payments from Coupa can also be received, depending on your procurement-to-payment workflow. The sync runs on a configurable schedule; Coupa webhooks are received and queued for processing, and QBWC polling ensures QuickBooks Desktop stays current even if webhook delivery is delayed. Data flows primarily from Coupa into QuickBooks Desktop because QuickBooks Desktop has no outbound push capability.
How ml-connector handles it
ml-connector runs your SOAP endpoint that QBWC calls at each poll interval. When QBWC provides credentials, your endpoint returns a valid session ticket; ml-connector uses that ticket for all QBXML queries in that session. On the Coupa side, ml-connector obtains an OAuth 2.0 bearer token and holds it until expiry, refreshing when a call returns 401. Supplier and purchase order changes detected via the last-seen timestamp on QBWC are fetched from Coupa via REST, then translated from Coupa's API structure into QBXML format for QuickBooks Desktop. Vendors are matched by external ID or name, and bills are created with the correct vendor reference and line-item amounts. Because QuickBooks Desktop uses an EditSequence version counter on every record, ml-connector re-queries before modifying to avoid version conflicts. Coupa webhook events are signed with HMAC-SHA256; ml-connector validates the signature before processing. Retries use exponential backoff (Coupa caps at 30 seconds). Because QBXML requests time out around 60 seconds, large queries are paginated. Every record is logged with a full audit trail so failed transactions can be replayed.
A real-world example
A mid-sized manufacturing company uses QuickBooks Desktop for accounting and Coupa for procurement across three plants. The purchasing team places and approves purchase orders in Coupa, but the accounting team still manually enters bills into QuickBooks Desktop when invoices arrive. Because QBWC must run on a Windows machine at the customer site during business hours, the company also struggles to keep vendor master data synchronized when a new supplier onboards in Coupa but is created differently in QuickBooks Desktop. With the integration in place, each approved purchase order automatically creates a matching bill in QuickBooks Desktop, and new suppliers registered in Coupa appear as vendors in QuickBooks Desktop within minutes, so the accounting team can focus on reconciliation rather than re-keying.
What you can do
- Create QuickBooks Desktop vendors and bills from Coupa suppliers and purchase orders.
- Map Coupa invoice and payment events into QuickBooks Desktop bills and bill payments.
- Sync supplier master data changes in both directions so vendor records match.
- Handle SOAP session-token authentication for QBWC and OAuth 2.0 for Coupa, with automatic token refresh.
- Poll on a schedule tied to your purchasing calendar, validate Coupa webhook signatures, and replay failed records with full audit trails.
Questions
- Why does ml-connector need a customer-hosted SOAP endpoint?
- QuickBooks Desktop integration is built on QBWC, the official integration tool from Intuit. QBWC is a Windows agent that polls your SOAP web service (not a SaaS endpoint) to ask whether there are new transactions to send or retrieve. ml-connector provides the service that QBWC calls, and QBWC must run on a Windows machine at the customer site where QuickBooks Desktop is installed and logged into the company file.
- Which direction does data move between QuickBooks Desktop and Coupa?
- Data flows primarily from Coupa into QuickBooks Desktop. Suppliers and purchase orders in Coupa are mapped to vendors and bills in QuickBooks Desktop. Invoices and payments from Coupa can also flow into QuickBooks Desktop bills and payments. Because QuickBooks Desktop has no outbound push API, reverse flows (QuickBooks Desktop updates back to Coupa) are not supported and must be handled through manual export or a separate Coupa API integration.
- How does ml-connector handle QuickBooks Desktop's EditSequence versioning and the SOAP session-token requirement?
- ml-connector obtains a session ticket from QBWC on each polling cycle and uses that ticket for all QBXML requests. Before updating any bill or vendor in QuickBooks Desktop, ml-connector re-queries to get the current EditSequence version counter, then sends the update with that version, preventing concurrent-edit conflicts. The session ticket expires after the polling cycle; a fresh ticket is obtained on the next QBWC poll.
Related integrations
More QuickBooks Desktop integrations
Other systems that connect to Coupa
Connect QuickBooks Desktop and Coupa
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started