ml-connector
Sage 300UPS

Sage 300 and UPS integration

Sage 300 runs procurement and inventory for mid-market manufacturers. UPS handles the physical shipments. Connecting the two lets you create UPS shipments directly from Sage 300 purchase orders, track inbound inventory in real time, and post freight and handling costs back into Sage 300's general ledger so your landed cost and AP accounts stay in sync with what UPS charged. ml-connector translates between the two authentication models and moves the data on a schedule you control.

How Sage 300 works

Sage 300 is an on-premise ERP system running on Windows IIS with a SQL Server backend. It exposes AP vendors, POs, receipts, invoices, GL accounts, and inventory items through REST and OData APIs with a base URL set per customer (e.g., https://sage300.customerdomain.com/Sage300WebApi/v1.0/-/COMPANY/MODULE/resource). Every call requires HTTP Basic Authentication with a custom API user created in Administrative Services; the built-in Admin user has no API access. Sage 300 has no webhooks or change-data-capture system, so all integration is pull-based polling using OData date/time filters and pagination.

How UPS works

UPS provides shipment creation, tracking, address validation, and pickup scheduling through REST JSON APIs in both sandbox and production environments. Authentication is OAuth 2.0 client credentials with a client_id and client_secret, and an optional UPS account number sent via the x-merchant-id header to isolate which account a shipment belongs to. Tokens last approximately 4 hours and are subject to a rate limit of about 250 token requests per day. UPS offers track alert webhooks (valid for 14 days and limited to 100 tracking numbers per subscription) and a Quantum View polling feed for shipment visibility. UPS has no billing or invoice API.

What moves between them

The main flow is Sage 300 outbound to UPS. Purchase orders from Sage 300 are polled on a schedule you set and mapped to UPS shipment create requests, carrying the PO line items, vendor addresses, and weight data. UPS tracking and shipment status flow back into Sage 300 purchase receipt batches and GL journal batches so you can reconcile received inventory and freight costs. The x-merchant-id header ensures that each customer's shipments route to the correct UPS account.

How ml-connector handles it

ml-connector stores both credential sets encrypted and presents the Basic Auth header (with uppercase username and password per Sage 300 requirements) on every Sage 300 call. For UPS, it exchanges the client credentials for an OAuth token, caches it for 4 hours, and refreshes when a call returns 401. It polls Sage 300 purchase orders using OData date/time filters on the DocumentDate field, then creates corresponding UPS shipments with the PO line items mapped to shipment line items. When UPS track alerts are available, ml-connector subscribes to them for up to 100 tracking numbers at a time and refreshes every 14 days; as a fallback, it also polls UPS Quantum View. Shipment costs and weights are mapped back to Sage 300 GL accounts and purchase receipt batches, tagged by the Sage 300 GL segment structure so costs land on the correct cost center. Because Sage 300 is pull-only and UPS rate limits token requests, ml-connector staggers the sync across multiple time windows per day and tracks UPS token usage to stay under the 250-request daily limit.

A real-world example

A distributor runs Sage 300 for purchase orders and inventory, and uses UPS as its primary carrier for inbound vendor shipments. Before the integration, the operations team created shipments in UPS by hand using details from Sage 300 purchase orders, then manually recorded tracking numbers and freight costs back in Sage 300 when invoices arrived. Month-end inventory counts were delayed because shipped POs were not marked received until the freight invoice showed up. With Sage 300 and UPS connected, each new PO automatically flows to UPS as a shipment request; tracking and delivery status post back to Sage 300 in real time so inventory is updated as soon as a shipment is picked up; and freight costs are posted to GL accounts automatically. The inventory count can now start as soon as goods are received, not when the invoice arrives.

What you can do

  • Create UPS shipments from Sage 300 purchase orders, carrying line items, weights, addresses, and account context.
  • Track inbound shipments in real time and post delivery status back into Sage 300 purchase receipt batches.
  • Post UPS freight and handling charges to Sage 300 GL accounts mapped by cost center and GL segment.
  • Authenticate Sage 300 with HTTP Basic Auth and UPS with OAuth 2.0, storing both credential sets encrypted.
  • Poll Sage 300 on a schedule you set using OData filters, with automatic token refresh and a full audit trail on every shipment.

Questions

How does the integration handle the self-hosted Sage 300 API and UPS's OAuth token requirements?
ml-connector accepts the full Sage 300 IIS base URL per customer and stores the Basic Auth credentials encrypted alongside the UPS OAuth client_id and client_secret. It refreshes the UPS token every 4 hours and retries with a fresh token if a call returns 401. Because Sage 300 requires uppercase username and password in the Basic Auth header, ml-connector uppercases both before encoding.
How are UPS shipments mapped back to Sage 300 purchase receipts and GL accounts?
UPS tracking numbers and freight costs are matched to the original Sage 300 PO lines using the shipment reference, then posted to Sage 300 purchase receipt batches and GL journal batches. The GL posting uses the GL segment structure to allocate the cost to the correct cost center so landed cost and freight expenses appear in the right place on the balance sheet.
Does the integration use UPS webhooks or polling, and how does it handle the 14-day track alert limit?
ml-connector subscribes to UPS track alerts where available (up to 100 tracking numbers per subscription) and refreshes every 14 days before expiry. For shipments beyond the 100-number limit or when track alerts are not active, it falls back to polling UPS Quantum View on your sync schedule. Both paths post status back to Sage 300 automatically.

Related integrations

Connect Sage 300 and UPS

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

Get started