QAD and UPS integration
QAD Adaptive ERP runs manufacturing, procurement, and finance, while UPS handles parcel shipping and tracking. This connection creates UPS shipments and labels directly from QAD shipping and purchase order records, and writes the matching QAD PO or invoice number onto each package as a reference number so it traces back to its source document. UPS tracking events then flow into QAD so order and goods receipt records show real pickup, in-transit, and delivery status without manual lookups on the UPS site. ml-connector handles the very different APIs on each side and runs the sync on the schedule you set, with push delivery events where the UPS Track Alert subscription is enabled.
What moves between them
The outbound flow runs from QAD into UPS. When a QAD shipment or purchase order is ready to move, ml-connector calls the UPS Shipping API to create the shipment and label and writes the QAD PO or invoice number into the package reference numbers and the ShipmentCharge billing block. The return flow runs from UPS into QAD: tracking scan events, the current status, and the delivery date and signature flow back so the originating QAD order or goods receipt shows current transport status. UPS exposes no AP invoice, GL, or purchase order objects, so ml-connector never writes finance records into UPS and never expects them back; shipping charges return only as rating and shipment response totals, since UPS has no invoice API to pull.
How ml-connector handles it
ml-connector stores both credential sets encrypted and accepts the full QAD tenant URL per customer, since QAD cloud publishes no shared base address, validating entity paths against that instance. On the UPS side it requests a bearer token with the client_credentials grant, sending the client id and secret as HTTP Basic auth and the six-digit account number as x-merchant-id so negotiated rates apply, then caches that token for its full roughly four-hour life because UPS caps token requests near 250 per day. QAD cloud is pull-only, so QAD purchase orders and shipment records are read by polling on your schedule. For status coming back, ml-connector reads the UPS Track API by tracking number or reference and, where the Track Alert subscription is active, receives pushed events; because UPS signs no payload, it authenticates each delivery by matching the credential header against the secret it supplied at subscription time and serves the endpoint over HTTPS only. Track Alert subscriptions expire after fourteen days, so ml-connector re-subscribes before expiry for shipments still in transit. Shipment creation has no idempotency-key header and a duplicate POST creates a duplicate shipment, so ml-connector dedups on the BullMQ jobId and records the returned shipment identification number before any resubmit, backs off and retries on a 429, and keeps a full audit trail that can be replayed if a downstream call fails.
A real-world example
A mid-sized industrial parts distributor with about 250 employees runs QAD Adaptive ERP for procurement, inventory, and order fulfillment, and ships customer and inbound supplier orders through UPS Ground and air services. Before the integration, warehouse staff re-keyed each QAD order into UPS WorldShip by hand, then later searched the UPS website to find out whether inbound purchase order shipments had arrived, with no PO number attached to the UPS record. With QAD and UPS connected, UPS shipments are created straight from QAD orders with the PO number written onto every package as a reference, and tracking events flow back so buyers and customer service see live delivery status on the QAD order itself. The double entry is gone and a late or missed delivery is caught from inside QAD rather than discovered when a customer calls.
What you can do
- Create UPS shipments and labels directly from QAD shipping and purchase order records, with no re-keying in UPS WorldShip.
- Write the QAD PO or invoice number onto every UPS package as a reference number for end-to-end traceability.
- Pull UPS Track events and delivery details back into QAD so orders and goods receipts show live transport status.
- Authenticate UPS with the OAuth 2.0 client_credentials grant and cache the four-hour token to stay under the daily token cap.
- Validate every Track Alert webhook by its credential header, with jobId dedup, retries, and a full audit trail on each record.
Questions
- Which direction does data move between QAD and UPS?
- Shipment and purchase order data moves from QAD into UPS to create labels, and tracking status flows from UPS back into QAD. UPS is a carrier platform, so it has no AP invoices, GL accounts, or purchase order objects to send. ml-connector never writes finance records into UPS and shapes the integration around shipping and tracking instead.
- Can ml-connector reconcile UPS invoices against QAD?
- Not from an API, because UPS does not expose a billing or invoice download endpoint; it is a long-standing open feature request. Shipping charges are available only as totals in the Rating and Shipping responses, which ml-connector can capture against the originating QAD order. For full invoice reconciliation the UPS Billing Center web portal or a Quantum View feed is still required.
- How does ml-connector secure UPS Track Alert webhooks without a signature?
- UPS does not sign Track Alert payloads with an HMAC, so the only authenticity signal is the credential value you supply when the subscription is created, which UPS echoes back in the credential header on every delivery. ml-connector validates that header against the stored secret and accepts the endpoint over HTTPS only. Subscriptions expire after fourteen days, so it re-subscribes before expiry to avoid missing events on shipments still in transit.
Related integrations
More QAD integrations
Other systems that connect to UPS
Connect QAD and UPS
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started