ml-connector
AcumaticaUPS

Acumatica and UPS integration

Acumatica Cloud ERP runs orders, inventory, and finance. UPS runs shipping, rating, and package tracking. Connecting the two turns a released Acumatica shipment into a UPS label without re-keying addresses, and brings the 1Z tracking number and delivery status back onto the order. UPS has no vendor, invoice, or GL data, so the flow centers on what it actually does: print labels, quote rates, and report scans. ml-connector handles the very different APIs on each side and moves records on a schedule you control.

How Acumatica works

Acumatica Cloud ERP exposes sales orders, shipments, customers, stock items, and addresses through its Contract-Based REST API, served from a tenant-specific URL with an endpoint version in the path that must match the running ERP release or the call returns HTTP 404. It authenticates with OAuth 2.0 against the built-in identity server, or with legacy cookie sessions that expire after about twenty minutes of inactivity. Every field value in a request or response body is wrapped in a value object, and flat key-value pairs return HTTP 400. Acumatica can push change events through its Push Notifications system using a shared-secret header, and integrations commonly poll instead by filtering on LastModifiedDateTime.

How UPS works

UPS exposes shipping, rating, tracking, address validation, and pickup through its REST Developer APIs, using OAuth 2.0 client credentials to obtain a bearer token that lives for about four hours. It is a carrier API, not a finance system: there is no vendor master, no GL account, and no AP invoice object, and UPS publishes no billing or invoice download API at all. A shipment can carry reference numbers that tie a package back to an ERP document, and those packages can be looked up later by reference through the Track API. Near-real-time delivery events come from the paid Track Alert webhook service, which authenticates each POST with a credential header you set at subscription time rather than a signed payload; otherwise tracking is pulled from the Track API or the Quantum View visibility feed.

What moves between them

The main flow runs from Acumatica to UPS. When an Acumatica shipment is released, ml-connector reads its recipient address, packages, and service preference, calls the UPS Shipping API to create the label, and stamps the Acumatica sales order or shipment number onto the package as a UPS reference number. The returned 1Z tracking number and the base64 label are written back onto the Acumatica shipment. The return flow brings UPS tracking and delivery events into Acumatica: ml-connector polls the Track API, or receives Track Alert webhooks where the customer subscribes, and posts scan events and the actual delivery date and signature back onto the matching order so status reflects what UPS reports.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Acumatica side it accepts the full tenant URL and the exact endpoint version per customer, since a mismatched version returns 404, and it wraps every field value in the required value object. On the UPS side it requests a client-credentials bearer token and caches it for its full four-hour life, refreshing five minutes before expiry, because UPS caps token generation at roughly 250 requests per day and fetching one per call exhausts that budget fast; the 6-digit account number is sent as x-merchant-id at token time and as AccountNumber in requests so negotiated rates apply instead of retail. Acumatica recipient addresses can be run through the UPS Address Validation API before a label is created, which also classifies residential versus commercial so a surcharge does not surprise you later. Because UPS cannot be queried by ERP document, ml-connector relies on the reference number it stamped at ship time to match a tracking number back to its Acumatica order. Acumatica rate limits are license-tier dependent and UPS returns 429 with no retry-after header, so calls back off with exponential jitter, and because shipment creation is not idempotent ml-connector dedupes each request by job id and stores the returned tracking number before any resubmit. Track Alert subscriptions expire after fourteen days, so the connector renews them for shipments still in transit.

A real-world example

A mid-sized industrial parts distributor runs Acumatica Cloud ERP for orders, inventory, and finance, and ships every customer order through UPS. Before the integration, warehouse staff re-typed each shipment's address into UPS WorldShip, printed the label, then pasted the tracking number back into the Acumatica order by hand, and customer service had no delivery status without logging into UPS separately. With Acumatica and UPS connected, releasing a shipment creates the UPS label automatically with the order number attached as a reference, the 1Z tracking number lands on the order, and delivery scans flow back so service reps see status inside Acumatica. The manual re-keying and the swivel-chair lookups are gone.

What you can do

  • Create UPS shipping labels automatically from released Acumatica shipments, with no re-keyed addresses.
  • Stamp the Acumatica sales order or shipment number onto the package as a UPS reference number so packages map back to ERP documents.
  • Write the returned 1Z tracking number and label onto the matching Acumatica shipment.
  • Post UPS scan events and the actual delivery date and signature back into Acumatica order status.
  • Validate and classify recipient addresses through UPS before a label is created, and cache the UPS token to stay under the daily token cap.

Questions

Which direction does data move between Acumatica and UPS?
The main flow is Acumatica to UPS: released shipments become UPS labels, and the order number is stamped onto the package as a UPS reference number. The return flow brings UPS tracking numbers, scan events, and delivery confirmation back onto the matching Acumatica order. UPS holds no vendor, invoice, or GL data, so ml-connector never posts financial records into it.
Can ml-connector match a UPS package back to its Acumatica order?
Yes, by using the reference number it sets at ship time. UPS cannot be queried by ERP document directly, so ml-connector writes the Acumatica order or shipment number onto the package and then looks shipments up by that value through the Track API reference lookup. That reference is how a 1Z tracking number is tied back to the correct Acumatica shipment.
Does the integration use UPS webhooks or polling for delivery status?
Either, depending on the customer's UPS setup. Track Alert is a paid service that pushes delivery events to a callback URL, authenticated by a credential header you supply at subscription time rather than an HMAC signature, and its subscriptions expire after fourteen days so ml-connector renews them while a shipment is in transit. Where Track Alert is not enabled, ml-connector polls the Track API on a schedule, and on the Acumatica side it polls or receives Push Notifications since Acumatica change events use a shared-secret header rather than a signed payload.

Related integrations

Connect Acumatica and UPS

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

Get started