ml-connector
QuickBooks OnlineShipStation

QuickBooks Online and ShipStation integration

QuickBooks Online tracks your company's invoices, bills, customers, and accounts. ShipStation manages your orders across multiple sales channels and generates shipping labels. Connecting the two keeps your accounting records in sync with what you actually shipped. Orders placed in your sales channels flow into ShipStation, and ml-connector automatically creates or updates QuickBooks customers and sales records so your accounts receivable and revenue recognize what went out the door, complete with shipping costs posted to the right accounts.

How QuickBooks Online works

QuickBooks Online exposes vendors, customers, employees, items, accounts, bills, invoices, payments, journal entries, and purchase orders through the QuickBooks Online Accounting API (v3) over REST with a SQL-like query language. It uses OAuth 2.0 Authorization Code flow, with access tokens expiring in 1 hour and refresh tokens rotating every 24-26 hours. QuickBooks publishes webhooks for Create, Update, Delete, Merge, and Void operations on 25 entity types including Invoice, Customer, Bill, and Payment, though webhook payloads contain only the entity ID and operation type, requiring a follow-up GET request to fetch the full record. All creates and updates require exact object representation with a SyncToken for concurrency control.

How ShipStation works

ShipStation aggregates orders from multiple sales channels and manages shipments through a REST API available in V1 (for order CRUD and customer/product management) and V2 (for label creation, batch operations, inventory, and purchase orders). It uses API Key authentication via header (V2) or HTTP Basic Auth (V1), with rate limits of 40 requests per minute on V1 and 200 per minute on V2. ShipStation sends webhooks for new orders (ORDER_NOTIFY), shipments (SHIP_NOTIFY, FULFILLMENT_SHIPPED), and item-level events, but payloads are pointers only and require authenticated follow-up GET requests. Order edits and inventory changes require polling since webhooks do not cover updates, and once an order is shipped or cancelled it cannot be modified via API.

What moves between them

Orders created in ShipStation fire ORDER_NOTIFY webhooks. ml-connector receives the webhook, fetches the full order details via ShipStation API, creates a corresponding QuickBooks customer (if not already present), and posts an invoice with line items for order charges and a separate line for shipping cost. Shipment notifications (SHIP_NOTIFY, FULFILLMENT_SHIPPED) trigger updates to the QuickBooks invoice status. Reference data such as products and shipping methods are polled periodically and mapped to QuickBooks items and accounts. All syncs flow from ShipStation into QuickBooks; QuickBooks invoices and payments are not written back to ShipStation.

How ml-connector handles it

ml-connector stores ShipStation API keys encrypted and presents them on every request via the API-Key header for V2 (or Basic Auth for V1). It stores QuickBooks OAuth credentials encrypted and refreshes the access token when it expires or returns 401. Because ShipStation webhook payloads contain only resource pointers, ml-connector fetches full order and shipment data via authenticated GET requests immediately after receiving each webhook. Customer creation is implicit in ShipStation (via orderUsername in the order payload), so ml-connector creates QuickBooks customers with email and name extracted from the order. Shipping costs are routed to a configurable QuickBooks account per shipping method so they are recognized separately from product revenue. ml-connector detects ShipStation rate limit responses (429 headers with X-Rate-Limit-Remaining and X-Rate-Limit-Reset) and backs off before retrying. QuickBooks requires SyncToken on every update, so ml-connector fetches the current invoice SyncToken before posting updates. Orders that are shipped or cancelled in ShipStation cannot be modified via API, so ml-connector treats those as terminal and does not attempt further syncs. Every order, customer, and invoice carries a full audit trail with timestamps and error details, so if a downstream QuickBooks POST fails, the record can be replayed once the issue is resolved.

A real-world example

A mid-sized e-commerce business selling through Shopify, Amazon, and their own website uses ShipStation as the order and fulfillment hub. Before the integration, their accounting team received ShipStation shipment reports daily, manually entered each order as an invoice in QuickBooks, and allocated shipping costs to the correct accounts. Reconciliation at month-end took two days because orders in ShipStation, actual shipments, and QuickBooks invoices were not automatically aligned. With QuickBooks Online and ShipStation connected, each order that ships automatically creates an invoice in QuickBooks with the customer, line items, and shipping cost posted to the revenue and shipping accounts. The team no longer re-enters data, and month-end reconciliation is complete within hours.

What you can do

  • Create QuickBooks customers automatically from ShipStation orders, using email and order details from the webhook.
  • Post ShipStation orders as QuickBooks invoices with line items for products and a separate line for shipping, allocated to the correct accounts.
  • Update QuickBooks invoice status when ShipStation marks orders as shipped or fulfilled, keeping the two systems in sync.
  • Authenticate ShipStation with API Key headers and QuickBooks with OAuth 2.0, handling token refresh and rate limits transparently.
  • Maintain a full audit trail of every order, customer, and invoice, with error replay so failed syncs can be retried without re-processing successful ones.

Questions

What data flows from ShipStation into QuickBooks Online?
Orders and shipments from ShipStation become customers and invoices in QuickBooks Online. When a new order is created in ShipStation, ml-connector creates a QuickBooks customer (if not already present) and posts an invoice with product line items and a separate line for shipping cost. Shipment confirmations update the invoice status in QuickBooks. Reference data such as products and shipping methods are polled periodically and mapped to QuickBooks items and accounts.
Does ml-connector handle ShipStation's API Key authentication and QuickBooks OAuth?
Yes. ml-connector stores both credential sets encrypted, presents the ShipStation API Key on every request, and refreshes the QuickBooks OAuth token when it expires or is rejected. It also monitors ShipStation rate limit headers (X-Rate-Limit-Remaining, X-Rate-Limit-Reset) and backs off before retrying, so neither system is overwhelmed.
How does ml-connector handle ShipStation webhook payloads that contain only pointers?
ShipStation webhooks for orders and shipments include only the resource URL and type, so ml-connector immediately fetches the full order or shipment data via an authenticated GET request. This ensures the invoice posted to QuickBooks has complete and current information, including customer details, line items, and shipping cost.

Related integrations

Connect QuickBooks Online and ShipStation

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

Get started