ml-connector
QADShipBob

QAD and ShipBob integration

QAD Adaptive ERP runs manufacturing, procurement, and finance. ShipBob runs e-commerce fulfillment across distributed warehouses. Connecting the two keeps the catalog, inbound stock, on-hand inventory, and fulfillment charges in agreement without re-keying. QAD items become ShipBob products, QAD purchase orders become ShipBob warehouse receiving orders, and ShipBob inventory, shipments, and billing invoices flow back into QAD. ml-connector handles the very different APIs on each side and moves the data on a schedule you control.

How QAD works

QAD Adaptive ERP exposes suppliers, purchase orders, supplier invoices, GL accounts, cost centers, items, goods receipts, AP payments, and customers through REST business document APIs, documented in Swagger inside each customer instance. The cloud product authenticates with a JWT session or OAuth2 bearer token against a tenant-specific URL, so there is no shared hostname and no public sandbox. Older on-premise sites run QAD Enterprise Edition with the QXtend SOAP framework instead. QAD cloud has no native webhook system for third-party connectors, so finance and inventory records are read by polling, and supplier invoices require a three-way match against posted goods receipts.

How ShipBob works

ShipBob exposes orders, products, inventory, warehouse receiving orders, shipments, returns, billing invoices, locations, and channels through its REST Developer API at a versioned path such as 2026-01. Authentication is OAuth2 authorization code for multi-merchant apps or a personal access token for a single merchant, and every write call must carry the shipbob_channel_id header that identifies the app channel. ShipBob pushes outbound webhooks signed with HMAC-SHA256 for shipment, return, billing, and receiving events, so those updates do not need polling. Pagination is header-based using the next-page header, and the merchant-controlled reference_id acts as an external key for orders and receiving orders.

What moves between them

Two directions. From QAD into ShipBob, item masters publish into the ShipBob product catalog, and purchase orders for stock headed to ShipBob warehouses become warehouse receiving orders so the inbound shipment is expected. From ShipBob into QAD, inventory levels per fulfillment center update QAD on-hand quantities, shipment confirmations with tracking record fulfillment against the originating QAD order, and ShipBob billing invoices post as supplier invoices in QAD AP. Reference data such as SKUs and fulfillment center identifiers is aligned so quantities and charges land on valid QAD items and accounts.

How ml-connector handles it

ml-connector stores both credential sets encrypted, presents the QAD tenant URL per customer since QAD publishes no shared base address, and refreshes the ShipBob OAuth access token when a call returns 401, replacing the rotating refresh token on each use. On every ShipBob write it sets the shipbob_channel_id header read from the channels endpoint, because writes are rejected without it. QAD item numbers are mapped to ShipBob SKUs first, so products, inbound receiving, and inventory all reconcile on the same part. Because QAD cloud is pull-only, ml-connector polls QAD items and purchase orders on a schedule, while ShipBob shipment, billing, and receiving events arrive over signed webhooks whose HMAC-SHA256 signature is verified before use. Posting a ShipBob billing invoice into QAD AP respects QAD's three-way match, so a receipt is recorded before the invoice. ShipBob weights are in ounces and dimensions in inches and are converted before they reach QAD, and ml-connector backs off when the ShipBob rate-limit header runs low. Inventory distribution across fulfillment centers is only read after a receiving order completes. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A direct-to-consumer brand of roughly 80 staff manufactures and assembles goods in QAD Adaptive ERP and outsources e-commerce fulfillment to ShipBob across several fulfillment centers. Before the integration, an operations clerk re-entered new SKUs into ShipBob by hand, emailed spreadsheets of inbound purchase orders to the warehouse team, and reconciled ShipBob fulfillment invoices against QAD by exporting reports each month. With QAD and ShipBob connected, items publish automatically, purchase orders create warehouse receiving orders so inbound stock is expected, and inventory, shipment confirmations, and ShipBob billing invoices flow back into QAD. Inventory in the ledger matches what is on the shelf, and fulfillment charges land in AP without the monthly spreadsheet chase.

What you can do

  • Publish QAD item masters into the ShipBob product catalog so SKUs stay consistent across both systems.
  • Turn QAD purchase orders into ShipBob warehouse receiving orders so inbound stock is expected at the right fulfillment center.
  • Read ShipBob inventory levels per fulfillment center back into QAD to keep on-hand quantities accurate.
  • Post ShipBob billing invoices into QAD AP through its three-way match, after the matching receipt is recorded.
  • Authenticate ShipBob with OAuth2 or a personal access token and the required channel id header, and QAD with its tenant-specific token.

Questions

Which direction does data move between QAD and ShipBob?
Both directions. QAD items publish into ShipBob as products, and QAD purchase orders become ShipBob warehouse receiving orders. ShipBob then sends inventory levels, shipment confirmations, and billing invoices back into QAD so on-hand counts and fulfillment charges stay current.
Does ShipBob require the channel id header on every call?
ShipBob requires the shipbob_channel_id header on every write call, and rejects writes without it. ml-connector reads the channel id from the ShipBob channels endpoint after OAuth completes and sets it on each write. The header is ignored on read-only calls but is included everywhere to keep behavior uniform.
How does the integration handle QAD's tenant-specific URL and lack of webhooks?
ml-connector accepts the full QAD instance URL per customer, since QAD publishes no shared base address. Because QAD cloud is pull-only, it polls QAD items and purchase orders on a schedule, while ShipBob fulfillment, return, and billing updates arrive over signed HMAC-SHA256 webhooks that are verified before posting into QAD.

Related integrations

Connect QAD and ShipBob

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

Get started