ml-connector
QuickBooks DesktopShipBob

QuickBooks Desktop and ShipBob integration

QuickBooks Desktop handles accounting; ShipBob handles fulfillment. When you connect them, receiving at your fulfillment centers creates bills in QuickBooks, and shipments trigger invoices for fulfillment fees. ml-connector translates between QuickBooks Desktop's SOAP/QBXML transport and ShipBob's REST webhooks, so inventory movements flow back to your general ledger without manual posting.

How QuickBooks Desktop works

QuickBooks Desktop is a Windows-installed accounting system from Intuit that stores vendors, bills, purchase orders, invoices, customers, accounts, items, and employees. It exposes data through SOAP-based QBXML over HTTPS. Integration requires a customer-hosted Web Connector agent (QBWC) that polls a remote SOAP endpoint you specify on a configurable interval, typically 5 to 15 minutes. Authentication uses a session-token handshake: QBWC provides credentials and your SOAP service returns a session ticket (GUID) for all subsequent calls. QuickBooks must be open and logged into the company file for the Web Connector to process requests. Queries support ModifiedDateRangeFilter to detect recent changes and TxnDeletedQueryRq to track deletions. Modify operations require the current EditSequence (version counter) to prevent concurrent edit conflicts.

How ShipBob works

ShipBob is a cloud-based fulfillment platform with REST APIs covering orders, shipments, products, inventory, warehouse receiving orders (WROs), returns, and billing. The API base is at https://api.shipbob.com with version paths like /2026-01/. Authentication uses OAuth2 Authorization Code flow or Personal Access Token (PAT) for single-merchant setups, and all calls require an Authorization Bearer header plus a shipbob_channel_id header to identify the application channel. ShipBob integrations operate entirely through webhooks: the platform pushes events for order.shipped, order.shipment.tracking.updated, return.created, wro.created, wro.completed, and billing.charge.created. Webhook signatures use HMAC-SHA256 with headers webhook-id, webhook-timestamp, and webhook-signature for verification.

What moves between them

Data flows bidirectionally. When ShipBob receives inventory via a Warehouse Receiving Order (WRO), ml-connector converts the wro.completed event into a QBXML Bill for the inbound freight charges, posting it to the vendor matching the fulfillment center. When an order ships, the order.shipment.tracking.updated event triggers an Invoice in QuickBooks tied to the original sales order, with line items for fulfillment and shipping fees. Items and inventory counts sync from QuickBooks to ShipBob on a schedule before receiving, so SKUs and quantities are in agreement when receiving orders arrive. Deletions and voids in either system are tracked: QuickBooks TxnDeletedQueryRq results in ShipBob return or shipment cancellations where applicable.

How ml-connector handles it

ml-connector maintains two credential pairs: one for QuickBooks Desktop (QBWC session credentials and the SOAP endpoint URL, specific to each QuickBooks company file and Web Connector instance), and one for ShipBob (OAuth2 access token with refresh, or Personal Access Token, plus the channel_id). It registers as a ShipBob webhook subscriber for wro.completed, order.shipment.tracking.updated, and billing.charge.created events, verifying each webhook signature against the HMAC-SHA256 shared secret before processing. When a ShipBob webhook arrives, ml-connector translates the payload to QBXML, retrieves the current EditSequence for any related bill or invoice, and submits the request via your QBWC agent's SOAP endpoint. If QuickBooks is offline or the QBWC timeout is exceeded (approximately 60 seconds), the job is queued with exponential backoff. SKU matching uses the product identifier in ShipBob against the Item.Name or Item.Desc in QuickBooks; if no match is found, the transaction is flagged in the audit log for manual review. Every record carries timestamps and can be replayed if a downstream call fails.

A real-world example

A small e-commerce business sells handmade goods through Shopify and stores inventory at a ShipBob fulfillment center near their customers. They use QuickBooks Desktop at their warehouse office to manage accounts payable and general ledger. Before the integration, they received daily receiving reports from ShipBob, manually created bills for warehouse fees, and entered shipment costs into QuickBooks from weekly carrier invoices. After each order shipped, they updated the sales ledger with fulfillment revenue to balance their books. With ShipBob and QuickBooks Desktop connected, inventory arrivals automatically create bills for inbound fees, and shipments automatically post fulfillment revenue to invoices tied to the original orders. Month-end close is faster because the ledger is already complete.

What you can do

  • Create bills in QuickBooks Desktop when ShipBob warehouse receiving orders complete, posting inbound freight charges to the correct vendor and date.
  • Generate invoices in QuickBooks for shipments, allocating fulfillment and shipping fees to the original sales order.
  • Sync product and inventory counts from QuickBooks to ShipBob before receiving, ensuring SKUs and quantities match across both systems.
  • Translate ShipBob webhook events into QBXML over SOAP, converting REST payloads to the session-token handshake required by the Web Connector agent.
  • Track every record with timestamps and replay failed transactions if the QuickBooks Web Connector is offline or a session times out.

Questions

How does ml-connector handle QuickBooks Desktop's requirement for a customer-hosted Web Connector agent?
ml-connector connects to your QBWC agent via SOAP at the endpoint URL you register. QBWC polls ml-connector on your configured interval (typically 5 to 15 minutes), and ml-connector queues any pending QBXML requests for the agent to process. If QuickBooks is offline or a request times out after 60 seconds, the job is retried with backoff until success.
What happens if a ShipBob SKU does not match any item in QuickBooks?
ml-connector flags the transaction in its audit log with the unmatched SKU name and ShipBob product ID. The transaction is not created in QuickBooks. Once you add the item to QuickBooks, you can manually replay the transaction from the audit interface or configure a new mapping in the flow settings.
Can ml-connector sync inventory counts in real-time or does it require a schedule?
ShipBob has no inventory webhook events, so ml-connector syncs inventory on a schedule you define (e.g., daily at a set time) by polling ShipBob's REST API and updating QuickBooks items. The sync runs only before receiving operations to ensure counts are current when warehouse receiving orders arrive.

Related integrations

Connect QuickBooks Desktop and ShipBob

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

Get started