ml-connector
Sage 100FedEx

Sage 100 and FedEx integration

Sage 100 holds your sales orders and customer master data. FedEx moves the packages and tracks them in transit. Connecting the two automates label creation and brings tracking status back into your sales order fulfillment records without manual re-entry. ml-connector bridges Sage 100's on-premises architecture with FedEx's REST API and runs on your schedule so shipments flow into FedEx automatically after an order is ready to pack.

How Sage 100 works

Sage 100 is an on-premises ERP system covering AR, AP, GL, inventory, purchasing, and sales orders. It exposes data through eBusiness Web Services (SOAP at a customer-hosted URL) for sales orders and customers, and through a local Windows agent wrapping the BOI COM layer for full AP, GL, PO, and vendor access. Authentication is username and password per call with no tokens or OAuth; Web Services access is off by default and must be individually enabled per user. The platform uses polling only - no webhooks or event streams - and requires a company code (3-char identifier) on every call. GL accounts use multi-segment format that varies by customer configuration. Concurrent write operations face COM record-locking limits and require retry with backoff.

How FedEx works

FedEx exposes shipment creation, tracking, rate quoting, freight management, and regulatory documents through REST APIs at https://apis.fedex.com. Authentication uses OAuth 2.0 Client Credentials with an API Key (client_id) and API Secret (client_secret) from the FedEx Developer Portal. Bearer tokens are issued on request and should be cached for the full 1-hour TTL to avoid hitting the token rate limit of 3 tokens per second. The API rate limit is 1,400 transactions per 10 seconds per project. FedEx can push tracking events via paid webhooks (Advanced Integrated Visibility) or accept polling via the Track API, which accepts up to 30 tracking numbers per request. Shipment creation returns a transactionId for client-side deduplication. No invoice or billing data is available via REST; those are web-portal only.

What moves between them

Sales orders flow from Sage 100 into FedEx as new shipments. When an order is marked ready to ship in Sage 100, ml-connector reads the order lines and customer address from Sage 100, creates a FedEx shipment, and generates a label. The FedEx tracking number is written back to the Sage 100 sales order for customer reference. Tracking events are polled from FedEx and update the order status in Sage 100 (picked up, in transit, delivered). The flow is initiated by a polling schedule aligned with your packing workflow, typically every 15 to 30 minutes during business hours.

How ml-connector handles it

ml-connector connects to Sage 100 through the local Windows agent, which wraps the BOI COM layer and exposes the on-premises data over HTTP. It polls for sales orders marked ready to ship by checking the DateLastUpdated field against the last sync timestamp. For each order, it reads the customer address from Sage 100's AR_Customer entity, formats it for FedEx's address validation rules, and sends a Create Shipment request to FedEx with the order lines as package weight and dimensions. FedEx returns a label and a tracking number, which ml-connector stores encrypted in its Postgres database and writes back to Sage 100 as a custom field or note on the sales order. ml-connector caches the FedEx OAuth token for its full 1-hour TTL to stay well within the 3 tokens-per-second auth limit. It polls FedEx's Track API every 10 minutes for in-transit updates on all active tracking numbers, parsing the tracking events and mirroring the shipment status back to Sage 100's order status field. If a FedEx call fails, it retries with exponential backoff; if Sage 100's SOAP call returns a COM lock error, it backs off and retries. Every shipment creation and tracking update is logged to the audit trail with the original Sage 100 order number and FedEx tracking number for troubleshooting and reconciliation.

A real-world example

A mid-sized distributor runs Sage 100 on-premises for order management and GL accounting, and ships packages to customers via FedEx. Before the integration, the fulfillment team manually exported order lists from Sage 100, entered each order into FedEx's web portal to create labels, and then manually updated order status in Sage 100 when tracking emails arrived. With Sage 100 and FedEx connected, orders marked ready to ship flow automatically into FedEx, labels are generated without portal login, and tracking status updates in Sage 100 on a rolling basis. The fulfillment team prints labels directly from FedEx's system and spends no time on re-entry or manual status chasing.

What you can do

  • Automatically create FedEx shipments and generate labels from Sage 100 sales orders marked ready to ship.
  • Poll Sage 100 sales orders and customer addresses via the on-premises BOI agent and write FedEx tracking numbers back to order records.
  • Update Sage 100 order status with real-time tracking events from FedEx, from pickup through delivery.
  • Cache FedEx OAuth tokens and rate-limit requests to stay within FedEx's transaction and token limits.
  • Maintain a complete audit trail of every shipment, label, and tracking update with Sage 100 order numbers and FedEx tracking numbers for reconciliation.

Questions

How does ml-connector connect to Sage 100 if it is on-premises?
ml-connector uses the local Windows agent, which wraps the BOI COM layer and exposes Sage 100 data over HTTP. The agent must be installed on a Windows server that can reach both Sage 100 and the internet. ml-connector polls the agent for sales orders and customer data, and writes tracking numbers back through the same secure channel.
What address fields from Sage 100 does FedEx require?
FedEx requires street address, city, state or province, postal code, and country. ml-connector maps those from Sage 100's AR_Customer entity. FedEx validates addresses on creation; if validation fails, ml-connector logs the error and the order is flagged for manual review.
How often does ml-connector check for new tracking updates from FedEx?
By default, ml-connector polls FedEx's Track API every 10 minutes for active shipments. You can adjust the polling interval based on your fulfillment volume and need for real-time tracking visibility. The polling respects FedEx's 1,400 transactions-per-10-seconds rate limit across all your integrations.

Related integrations

Connect Sage 100 and FedEx

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

Get started