ml-connector
QuickBooks DesktopAdobe Commerce

QuickBooks Desktop and Adobe Commerce integration

QuickBooks Desktop keeps the books. Adobe Commerce runs the online store. Connecting the two moves storefront orders, customers, and captured invoices into accounting without anyone re-typing them. Orders and invoices placed in Adobe Commerce become customers, sales invoices, and received payments in QuickBooks Desktop, and product SKUs stay aligned so each line posts to a real item. ml-connector handles the very different access on each side, since one is a REST API and the other is a SOAP and QBXML service reached through the Web Connector.

How QuickBooks Desktop works

QuickBooks Desktop is not a cloud product and has no hosted endpoint. It exposes data through the QBXML SDK, an XML over SOAP message format, reached by the QuickBooks Web Connector, a Windows application the customer installs that polls a remote SOAP service on a set interval while QuickBooks is open. Authentication is a session-token handshake: the Web Connector calls authenticate with a username and password, and the service returns a session ticket reused on every later call. Relevant entities include Customer, Invoice, ReceivePayment, Item, and Account, each driven by Add, Query, and Mod QBXML requests. There are no webhooks, so changes are found by polling with a ModifiedDateRangeFilter, and there is no built-in idempotency, so records must be checked before they are added.

How Adobe Commerce works

Adobe Commerce exposes its data through Commerce Web APIs, with REST as the primary surface for backend sync. PaaS instances authenticate with OAuth 1.0a integration credentials signed on each request, while the Cloud Service uses IMS OAuth 2.0 client credentials with tokens that expire in about 24 hours. Orders, invoices, customers, products, and credit memos are all available, with list endpoints paginated through searchCriteria parameters such as pageSize and currentPage and a total_count in each response. Adobe Commerce also supports synchronous outbound webhooks and Adobe I/O Events for push delivery, though those are an Adobe Commerce feature and not present in Magento Open Source.

What moves between them

The flow runs from Adobe Commerce into QuickBooks Desktop. ml-connector reads placed orders, their customers, and captured invoices from Adobe Commerce, then creates or updates the matching customer, posts a sales invoice, and records the received payment in QuickBooks Desktop, with product SKUs mapped to QuickBooks items so each line hits the right account. Credit memos from Adobe Commerce can post as the corresponding credit in QuickBooks. Because QuickBooks Desktop is the system of record for accounting, ml-connector treats it as the destination and does not push ledger entries back into the storefront. Reads from Adobe Commerce run on a schedule, or on webhook events where they are enabled, while writes into QuickBooks Desktop are queued for the next Web Connector cycle.

How ml-connector handles it

ml-connector stores both credential sets encrypted. For Adobe Commerce it signs OAuth 1.0a requests on PaaS or refreshes the IMS OAuth 2.0 token before its roughly 24-hour expiry on the Cloud Service, and it pages through orders and invoices using searchCriteria with total_count to know when it has read everything. On the QuickBooks side it implements the Web Connector SOAP methods, validates the session ticket on every call, and hands back QBXML Add requests for the Web Connector to relay into QuickBooks while the company file is open. Adobe Commerce increment_id values are stored against the QuickBooks TxnID and ListID so an order is never posted twice, since QuickBooks has no idempotency of its own. New customers are added before their invoices, and a stored EditSequence is re-queried before any Mod so concurrent edits are not overwritten. Large reads are split with searchCriteria paging on the Commerce side and QBXML iterators with MaxReturned on the QuickBooks side to stay under the roughly 60-second per-request timeout. Because there is no push from QuickBooks Desktop and the company file must be open for the Web Connector to run, sync is near-real-time on the inbound Commerce side and as frequent as the Web Connector interval on the QuickBooks side. Failed writes are retried and carry a full audit trail.

A real-world example

A mid-sized specialty retailer sells through an Adobe Commerce storefront and keeps its books in QuickBooks Desktop Enterprise on a Windows machine in the back office. Before the integration, a bookkeeper exported the day's web orders and typed each customer, invoice, and payment into QuickBooks by hand, which fell behind during busy weeks and left the sales accounts out of step with the store. With QuickBooks Desktop and Adobe Commerce connected, each placed order and captured invoice flows into QuickBooks as a customer, an invoice, and a received payment against the matching item, so the ledger reflects the storefront the same day and the manual entry step is gone.

What you can do

  • Create or update QuickBooks Desktop customers from Adobe Commerce buyers so each storefront order has a matching customer record.
  • Post Adobe Commerce orders and captured invoices into QuickBooks Desktop as sales invoices and received payments without re-keying.
  • Map Adobe Commerce product SKUs to QuickBooks Desktop items so every invoice line posts to the right account.
  • Bridge Adobe Commerce OAuth and the QuickBooks Web Connector session ticket, refreshing the IMS token before it expires.
  • Guard against duplicates by storing Adobe Commerce increment_id against the QuickBooks TxnID, with retries and a full audit trail.

Questions

Which direction does data move between QuickBooks Desktop and Adobe Commerce?
The flow runs from Adobe Commerce into QuickBooks Desktop. Orders, customers, and captured invoices move from the storefront into accounting as customers, sales invoices, and received payments. QuickBooks Desktop is the system of record for the ledger, so ml-connector does not push financial entries back into Adobe Commerce.
How does the integration reach QuickBooks Desktop if it has no cloud API?
QuickBooks Desktop is a local Windows product reached through the QuickBooks Web Connector, which polls a remote SOAP service on a set interval. ml-connector implements that SOAP service, authenticates with the Web Connector session ticket, and hands back QBXML Add requests for the Web Connector to relay into QuickBooks. QuickBooks must be running with the company file open for the Web Connector to process the work.
How are duplicate orders avoided when QuickBooks has no idempotency key?
QuickBooks Desktop does not deduplicate requests, so sending the same Add twice creates two records. ml-connector stores each Adobe Commerce increment_id against the QuickBooks TxnID or ListID returned on success and checks it before posting, so an order or invoice is only ever created once. BullMQ job dedup adds a second guard on the connector side.

Related integrations

Connect QuickBooks Desktop and Adobe Commerce

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started