ml-connector
QADShopify

QAD and Shopify integration

QAD runs manufacturing, inventory, and finance. Shopify runs your online store. Connecting the two keeps the catalog you sell, the customers who buy, and the orders they place in agreement across both systems. Shopify orders and customers flow into QAD as sales and customer records, while QAD items move out to Shopify as products with current stock levels. ml-connector handles the very different APIs on each side and moves the data on a schedule and on webhook triggers you control.

How QAD works

QAD Adaptive ERP exposes suppliers, purchase orders, supplier invoices, GL accounts, cost centers, items, customers, and goods receipts 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. Older on-premise sites run QAD Enterprise Edition with the QXtend SOAP framework instead. QAD has no public webhook system for cloud connectors, so records are read and written by polling on a schedule.

How Shopify works

Shopify exposes orders, customers, products, inventory, draft orders, and Shopify Payments payouts through the Admin API, which is GraphQL-first as of April 2025 with the REST API kept as legacy. Every call scopes to one store subdomain and authenticates with an OAuth 2.0 access token in the X-Shopify-Access-Token header; server-side integrations use an offline token that does not expire. Shopify pushes webhooks for events such as orders/create, orders/paid, and customers/update, signed with HMAC-SHA256. Shopify is not an ERP, so it has no GL, no AP or AR ledger, and no native supplier or purchase order object.

What moves between them

The main flow runs from Shopify into QAD. As orders are placed and paid, ml-connector reads each Shopify order, its line items, taxes, and customer, and posts it into QAD as a sales and customer record mapped to the matching QAD items and accounts. Shopify Payments payout and balance transaction data flows the same direction so settled cash can be reconciled against the orders that produced it. In the other direction, QAD items flow out to Shopify as products, and stock levels are pushed to Shopify inventory so the storefront reflects what QAD has on hand. Shopify payouts are read-only, so ml-connector never writes settlement records back to Shopify.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Shopify side it runs the OAuth authorization code flow once, keeps the resulting offline token, and calls the GraphQL Admin API against the store subdomain; on the QAD side it accepts the full tenant URL per customer, since QAD publishes no shared base address, and validates entity paths against that instance. Shopify pushes order and customer webhooks, so ml-connector verifies each HMAC-SHA256 signature, returns 401 on a bad one, deduplicates on the X-Shopify-Webhook-Id header, and queues the change as a write into QAD, which it polls rather than pushes because QAD cloud is pull-only. Shopify GIDs and SKUs are mapped to QAD customer and item keys first, so every order line references a record that already exists in QAD. Shopify GraphQL enforces a points-per-second cost budget and returns 429 when throttled, so ml-connector backs off one second and retries, and it uses bulk operations for large historical pulls past the 25,000-object cursor cap. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized consumer goods manufacturer makes and ships its own products, runs QAD Adaptive ERP for production, inventory, and finance, and sells direct to shoppers on a Shopify store. Before the integration, a clerk exported the day's Shopify orders to a spreadsheet and re-keyed them into QAD as sales, then manually updated Shopify stock counts whenever a production run finished, which left the storefront selling items QAD had already run out of. With QAD and Shopify connected, each paid order and new customer lands in QAD automatically, QAD inventory levels are pushed back to Shopify, and Shopify Payments payouts are matched to the orders behind them, so the books and the available stock stay current without manual entry.

What you can do

  • Post Shopify orders and customers into QAD as sales and customer records as they are placed and paid.
  • Push QAD items to Shopify as products and keep storefront inventory in step with QAD stock on hand.
  • Reconcile Shopify Payments payouts and balance transactions against the QAD records for the orders that produced them.
  • Authenticate Shopify with an OAuth 2.0 offline token and QAD with its tenant-specific session, both stored encrypted.
  • Verify Shopify order and customer webhooks, deduplicate them, and replay any failed write with a full audit trail.

Questions

Which direction does data move between QAD and Shopify?
The main flow is Shopify into QAD. Orders, customers, and Shopify Payments payout data move from Shopify into QAD, while QAD items and stock levels move out to Shopify as products and inventory. Shopify payouts are read-only, so ml-connector reads them for reconciliation but never writes settlement records back to Shopify.
Shopify is not an accounting system, so how does it post to QAD's general ledger?
Shopify has no chart of accounts, no AP or AR ledger, and no native supplier or purchase order object, so all general ledger mapping happens on the QAD side. ml-connector maps each Shopify order line, SKU, and tax amount to the matching QAD items and accounts, then posts the sales and customer records into QAD, where the ledger entries are produced. Shopify draft orders can stand in for quote or B2B order flows where needed.
How does the integration combine Shopify webhooks with QAD's lack of webhooks?
Shopify pushes signed webhooks for events such as orders/create, orders/paid, and customers/update. ml-connector verifies each HMAC-SHA256 signature, deduplicates on the webhook delivery ID, and queues the change. Because QAD cloud is pull-only and has no webhook system, that queued change is written to QAD on a schedule you control rather than as an instant push.

Related integrations

Connect QAD and Shopify

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

Get started