ml-connector
QADCin7

QAD and Cin7 integration

QAD runs manufacturing and finance. Cin7 Core runs inventory and procurement for product-based businesses. Connecting the two keeps suppliers and purchasing in agreement across both systems. Purchase orders and supplier invoices entered or received in Cin7 Core flow into QAD against the matching GL accounts, so the procurement records do not have to be re-keyed. ml-connector handles the 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, 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, and supplier invoices post only after the matching goods receipt, so finance records are read by polling.

How Cin7 works

Cin7 Core, formerly DEAR Systems, exposes suppliers, purchases, sale orders, payments, customers, products, and a chart of accounts through a REST and JSON API at inventory.dearsystems.com. Every call sends two static header keys, api-auth-accountid and api-auth-applicationkey, rather than OAuth. A single Purchase endpoint covers the full procure-to-pay cycle through an Approach field set to ORDER, RECEIVE, or INVOICE, and records start as Draft until a separate Authorise call moves them on. The chart of accounts is read-only over the API. Cin7 Core can push outbound events through its Automation module, but those events carry no documented signature header, so polling is the reliable path.

What moves between them

The main flow runs from Cin7 Core into QAD. ml-connector reads Cin7 Core suppliers and Purchase records and creates the matching suppliers, purchase orders, and supplier invoices in QAD, mapping the Cin7 Core Approach value so an ORDER lands as a QAD purchase order and an INVOICE lands as a QAD supplier invoice. Because QAD enforces a three-way match, invoices are only posted after the related goods receipt exists, which Cin7 Core tracks through its RECEIVE approach. Chart of accounts codes and item codes are aligned in both directions so every purchase line references a GL account and item that already exists in QAD. The QAD chart of accounts is the system of record for finance, and the Cin7 Core chart of accounts is read-only over the API, so ml-connector never writes accounts back to Cin7 Core.

How ml-connector handles it

ml-connector stores both credential sets encrypted and sends the Cin7 Core api-auth-accountid and api-auth-applicationkey headers on every request, while on the QAD side it accepts the full tenant URL per customer since QAD publishes no shared base address and refreshes the QAD bearer token when a call returns 401. Because both QAD cloud and Cin7 Omni are pull-only, and Cin7 Core webhook events carry no verifiable signature, it polls Cin7 Core Purchase and Supplier endpoints on a schedule using page and limit parameters rather than relying on a push. Chart of accounts and item codes are mapped first, so every purchase line posted into QAD references an account and item that already exists there. Supplier invoices are held until the matching goods receipt is present, to respect the QAD three-way match. Cin7 Core has no idempotency header, so ml-connector uses the Purchase Reference field as a natural key to avoid duplicates, and when Cin7 Core returns HTTP 429 it reads the Retry-After header and backs off. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized contract manufacturer runs QAD Adaptive ERP for production planning, costing, and finance, and uses Cin7 Core to manage inventory, supplier purchase orders, and receiving in the warehouse. Before the integration, the buying team raised purchase orders and recorded supplier invoices in Cin7 Core, then the finance team re-keyed those same suppliers and bills into QAD by hand, which slowed month-end close and produced mismatches between received goods and posted invoices. With QAD and Cin7 Core connected, suppliers and purchase activity flow into QAD automatically, invoices post only after the goods receipt is in place, and each line lands on the right GL account. The duplicate data entry is gone and the accounts payable figures reconcile against receipts from the first day of close.

What you can do

  • Create QAD suppliers, purchase orders, and supplier invoices from Cin7 Core suppliers and Purchase records.
  • Map the Cin7 Core Approach value so orders, receipts, and invoices land in the correct QAD record type.
  • Hold supplier invoices until the matching goods receipt exists, to respect the QAD three-way match.
  • Authenticate Cin7 Core with its account-id and application-key headers and QAD with its tenant-specific token.
  • Poll Cin7 Core on a schedule with Reference-based dedup, Retry-After backoff, and a full audit trail on every record.

Questions

Which direction does data move between QAD and Cin7?
The main flow is Cin7 Core into QAD. Suppliers and purchase records move from Cin7 Core into QAD as suppliers, purchase orders, and supplier invoices, while chart of accounts and item codes are aligned in both directions. The Cin7 Core chart of accounts is read-only over the API, so ml-connector does not write accounts back into Cin7 Core.
How does the three-way match affect supplier invoices?
QAD matches a supplier invoice against the purchase order and the goods receipt before it can post. ml-connector holds each invoice read from Cin7 Core until the matching goods receipt is present, which Cin7 Core records through the RECEIVE approach on the same Purchase. This keeps accounts payable in QAD reconciled against what was actually received.
Why does the integration poll Cin7 instead of using webhooks?
Cin7 Core can send outbound events through its Automation module, but those events carry no documented signature header, so they cannot be verified reliably. QAD cloud is also pull-only and has no webhook system for connectors. For these reasons ml-connector polls the Cin7 Core endpoints on a schedule using page and limit parameters and backs off on HTTP 429 using the Retry-After header.

Related integrations

Connect QAD and Cin7

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

Get started