ml-connector
QuickBooks DesktopShipStation

QuickBooks Desktop and ShipStation integration

QuickBooks Desktop holds your accounting records, customers, items, and invoices. ShipStation manages order fulfillment, carrier selection, and shipment tracking. Connecting them keeps your accounting records aligned with what actually shipped. New orders entered in ShipStation pull in customer and item details from QuickBooks Desktop, and return shipment confirmation so QuickBooks Desktop reflects the revenue. ml-connector handles the customer-hosted QBWC polling architecture and ShipStation's cloud REST APIs on the same schedule.

How QuickBooks Desktop works

QuickBooks Desktop is a Windows-only accounting product installed at the customer site. It exposes vendors, bills, customers, invoices, items, accounts, employees, and journal entries through QBXML, an XML-based query language sent over HTTPS via SOAP. Integration requires a QBWC (QuickBooks Web Connector) agent running on the same Windows machine where QuickBooks is open and logged into a company file. QBWC polls a remote SOAP endpoint at a configurable interval, performs a session-token handshake via the authenticate() method on each poll, and receives QBXML queries to execute. There are no webhooks; all change detection relies on polling with ModifiedDateRangeFilter and querying deleted transactions separately. The QuickBooks instance is single-company per QBWC session.

How ShipStation works

ShipStation is a cloud shipping and order management platform accessed entirely through REST APIs. It aggregates orders from multiple e-commerce channels and exposes orders, customers, shipments, and purchase orders. Authentication uses API Key headers (V2 uses a plain API-Key header; V1 uses HTTP Basic Auth with base64-encoded apiKey and apiSecret). ShipStation publishes outbound webhooks for order creation, shipment confirmation, and fulfillment events, though webhook payloads contain only resource URLs and require authenticated follow-up GET calls to fetch full order or shipment data. Change detection for orders also requires polling the GET /orders endpoint with a modifyDate filter, as ORDER_NOTIFY webhooks fire only on new orders, not edits. Rate limits are 200 requests per minute for V2 and 40 for V1. Shipments and orders become immutable once marked as shipped or cancelled.

What moves between them

Orders and shipment updates move bidirectionally. When new orders arrive in ShipStation, ml-connector resolves the customer and items against QuickBooks Desktop's customer and item lists to validate that the order references known entities and to pull invoice details. When ShipStation marks a shipment as complete, ml-connector posts the shipment confirmation back into QuickBooks Desktop as a linked transaction or invoice update, keyed by the order number. Item quantities in ShipStation orders are reconciled against QuickBooks Desktop inventory on a polling schedule tied to order receipt batches rather than per-order. Deletions and corrections flow as updates, not new transactions, using the order number as the deduplication key.

How ml-connector handles it

ml-connector runs a background poll that registers with QuickBooks Desktop's QBWC via the SOAP authenticate() method, receives a session token, and uses that token for all QBXML queries in that session. It queries for modified invoices, items, and customers in QuickBooks Desktop over a time window, and separately polls ShipStation's order list with a modifyDate filter and fetches full order payloads from webhook-delivered resource URLs. For each order in ShipStation, it looks up the customer and items in the QuickBooks Desktop query results. If the customer or item does not exist, the integration alerts rather than creating unknown entities. Once an order is validated, ml-connector fetches the shipment status via ShipStation's REST endpoint, and if the status is Shipped, it creates a QuickBooks Desktop invoice or journal entry to record the revenue and ship date. The challenge is that QuickBooks Desktop edits require the current EditSequence (a version counter), so ml-connector must re-query before updating, and QBXML requests time out at approximately 60 seconds, so large item lists are queried in pages. ShipStation's rate limit of 40 requests per minute on V1 means the integration spaces out polls and batches customer/item lookups to avoid throttling. Deduplication relies on the order number as the primary key in both systems.

A real-world example

A mid-sized e-commerce merchant fulfills orders from multiple online channels using ShipStation, and tracks inventory and revenue in QuickBooks Desktop. Before the integration, the fulfillment team entered each shipped order into QuickBooks Desktop by hand after packing it, which was error-prone and delayed revenue recognition. The finance team then spent hours at month-end reconciling revenue in QuickBooks Desktop against actual shipments from ShipStation. With the integration, each order that ships in ShipStation automatically flows into QuickBooks Desktop with the correct customer, items, amounts, and ship date, so the two systems stay in sync. Revenue is recognized on the ship date, not the data-entry date, and month-end reconciliation is now a quick audit of any orders that failed to sync.

What you can do

  • Pull customer and item details from QuickBooks Desktop to validate orders created in ShipStation, preventing orphaned or unknown-entity orders.
  • Post shipment confirmations from ShipStation into QuickBooks Desktop as revenue journal entries or invoice updates, keyed by order number.
  • Manage QBWC session tokens on a polling schedule and handle the EditSequence version counter when updating QuickBooks Desktop records.
  • Poll both QuickBooks Desktop and ShipStation on a schedule that respects rate limits and QBXML query timeouts, with automatic pagination for large item lists.
  • Detect and deduplicate orders by order number and maintain a full audit trail of every order sync, shipment confirmation, and validation failure.

Questions

How does the integration handle the customer-hosted QBWC requirement?
QuickBooks Desktop requires QBWC, a Windows agent running on the customer's machine with QuickBooks open and logged in. ml-connector acts as the remote SOAP endpoint that QBWC calls on a configurable poll interval. The integration registers with QBWC using a session-token handshake and receives a token for use in all subsequent QBXML queries during that session. This means the customer must set up QBWC once and keep QuickBooks running; ml-connector handles the server side.
Which direction does data flow between QuickBooks Desktop and ShipStation?
Orders and shipments flow both directions. When a new order arrives in ShipStation, ml-connector validates the customer and items against QuickBooks Desktop and pulls invoice details. When ShipStation marks a shipment as complete, ml-connector posts the confirmation back into QuickBooks Desktop as a revenue entry or invoice update, using the order number as the deduplication key. Item quantities in ShipStation are reconciled against QuickBooks Desktop inventory on a polling schedule.
What happens if an order in ShipStation references a customer or item that does not exist in QuickBooks Desktop?
ml-connector queries QuickBooks Desktop for the customer and item in the order and alerts if either is missing rather than creating unknown entities. The order is flagged for manual review, and the integration continues with the next order in the batch. This prevents silent corruption of QuickBooks Desktop with orphaned data and ensures accounting integrity.

Related integrations

Connect QuickBooks Desktop and ShipStation

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

Get started