ml-connector
Sage IntacctUPS

Sage Intacct and UPS integration

Sage Intacct runs accounting and vendor management. UPS runs shipping, tracking, and pickup scheduling. Connecting the two keeps your vendor invoices aligned with actual shipped goods and delivery status, so AR reconciliation is complete before payment is released. New shipments created in UPS flow back into Sage Intacct's AP and AR records, and tracking updates feed into your audit trail. ml-connector handles the very different API models on each side and moves the data on a schedule you control.

How Sage Intacct works

Sage Intacct is a cloud ERP and accounting system exposed through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. It authenticates via session-based credentials: senderId, senderPassword, companyId, userId, and userPassword. The initial getAPISession call exchanges these for a sessionid, which is cached for 50 minutes and automatically refreshed on the next call. HTTP responses always return 200 even on application-level errors; errors appear as errormessage tags inside the XML body and must be parsed separately. Sage Intacct publishes no webhooks, so all record flows are scheduler-driven or manual. Key entities include vendors, AP bills, AP payments, GL accounts, and dimensions.

How UPS works

UPS exposes shipment creation, rating, tracking, address validation, and pickup scheduling through REST JSON APIs deployed at https://onlinetools.ups.com/api for production and https://wwwcie.ups.com/api for sandbox. All calls require OAuth 2.0 Client Credentials using client_id and client_secret, with an optional x-merchant-id header for account routing. Tokens live approximately 4 hours and are limited to approximately 250 requests per day. UPS can push tracking updates via Track Alert API subscriptions (which expire after 14 days and must be renewed) or via polling through Quantum View, a shipment visibility feed. Key entities include shipments, ratings, tracking events, track alert subscriptions, and address validations. Billing and invoice APIs are not available.

What moves between them

The main flow runs from UPS into Sage Intacct. After a shipment is created or tracked in UPS, ml-connector reads the shipment data and tracking events and posts them into Sage Intacct as AR and AP reconciliation records, mapped to the matching GL accounts and vendor dimensions. UPS tracking subscriptions are renewed before expiry so tracking updates flow continuously. Vendor address validation flows both directions so shipments land on validated addresses already in Sage Intacct. Because Sage Intacct offers no webhooks, ml-connector polls on a schedule tied to your shipping calendar or receives Track Alert push notifications where subscriptions are enabled.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages Sage Intacct's session cache locally, refreshing the sessionid when it approaches the 50-minute expiry. On the UPS side it refreshes OAuth tokens after 3.5 hours to stay ahead of the 4-hour limit, and it renews Track Alert subscriptions 1 day before the 14-day window closes. When sending data to Sage Intacct, ml-connector serializes all outbound records into the required XML format and strips forbidden C0 control characters (except tab, newline, and carriage return). Because Sage Intacct returns HTTP 200 with errors embedded in the XML body, ml-connector parses the response for errormessage tags and retries failed operations using Intacct's uniqueid flag for server-side deduplication. UPS tracking subscriptions are limited to 100 tracking numbers per request, so large shipment batches are chunked. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized manufacturer and distributor runs Sage Intacct for accounting and vendor management, and uses UPS for all outbound shipments to customers and returns from field service. Before the integration, the finance team manually logged UPS tracking numbers into Sage Intacct after each shipment and exported AP bills from vendors without visibility into actual delivered goods. AR reconciliation was delayed because billing was not tied to proof of delivery, and month-end close required chasing UPS shipment status separately. With Sage Intacct and UPS connected, each shipment created in UPS flows into Sage Intacct with tracking status, allocated to the customer dimension and GL account for revenue recognition. Vendor addresses are validated in both systems, and AR reconciliation starts with delivery proof already attached to each invoice. The manual tracking log step is gone, and the finance team can close AR on time.

What you can do

  • Create and track UPS shipments in Sage Intacct as AR records linked to the correct GL accounts and customer dimensions.
  • Sync UPS tracking events back into Sage Intacct and maintain a full audit trail for each shipment and delivery.
  • Validate and align vendor and customer addresses between UPS and Sage Intacct so shipments land on approved addresses.
  • Refresh OAuth 2.0 tokens before expiry and maintain Sage Intacct's session cache automatically without manual intervention.
  • Handle Sage Intacct's XML serialization and server-side deduplication, and parse application-level errors buried inside HTTP 200 responses.

Questions

Which direction does data move between Sage Intacct and UPS?
The main flow is UPS into Sage Intacct. Shipments, ratings, and tracking events move from UPS into Sage Intacct as AR and AP reconciliation records. Vendor and customer address validation flows both directions so shipments route to validated addresses already in Sage Intacct. UPS has no billing or invoice API, so no financial records are written back to UPS.
How does ml-connector handle Sage Intacct's session-based XML gateway and UPS OAuth 2.0 tokens?
ml-connector maintains a local cache of Sage Intacct's sessionid and refreshes it automatically when it approaches 50 minutes. On the UPS side, tokens are refreshed after 3.5 hours to stay ahead of the 4-hour limit. Both refresh cycles run transparently; the integration presents a unified credential layer to your flows.
What happens when Sage Intacct returns an error inside a successful HTTP 200 response?
Sage Intacct embeds application-level errors as errormessage tags inside the XML body rather than using HTTP status codes. ml-connector parses the response for these tags, detects the error, retries the operation using Intacct's uniqueid flag for server-side deduplication, and tracks the full sequence in the audit trail so failed records can be replayed.

Related integrations

Connect Sage Intacct and UPS

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

Get started