ml-connector
Sage IntacctFedEx

Sage Intacct and FedEx integration

Sage Intacct tracks your general ledger and accounts payable. FedEx moves your shipments and freight. Connecting the two ensures every outbound and inbound shipment cost appears in your accounting records on the correct GL account and cost center, without re-keying freight invoices by hand. Purchase order references and shipment tracking are aligned across both systems so you know the cost of getting goods to where they are needed.

How Sage Intacct works

Sage Intacct is a cloud-based ERP and accounting system accessed through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml via HTTPS POST with Content-Type application/xml. Authentication uses session-based credentials: senderId, senderPassword, companyId, userId, and userPassword are exchanged via a getAPISession call for a sessionid that caches for 50 minutes. The adapter exposes GL accounts, vendors, accounts payable bills and payments, and dimensions (cost centers). Intacct publishes no webhooks and does not push data, so all syncs are polling-driven on a schedule you define. HTTP 200 responses may carry application-level errors inside the XML body, so error parsing must look for errormessage tags rather than HTTP status alone. The XML gateway serializes all operations through a single connection, and forbidden XML control characters (C0 controls except tab, newline, carriage return) must be stripped before data arrives.

How FedEx works

FedEx exposes a REST API at https://apis.fedex.com (production) and https://apis-sandbox.fedex.com (sandbox) for shipment creation, tracking, rate quotes, freight LTL management, and commercial invoice generation. All requests use OAuth 2.0 client credentials (grant_type=client_credentials) with an API Key and API Secret issued by the FedEx Developer Portal, and responses are JSON. The platform enforces token rate limits (3 tokens per second for 5 seconds triggers a 403 for 10 minutes) and API transaction limits (1,400 transactions per 10 seconds per project), so token caching with a 1-hour TTL is required. Tracking events can be delivered via webhook (Advanced Integrated Visibility, a paid add-on), but shipment creation, rate quotes, and billing events are available only through polling via the Track API (free), which accepts up to 30 tracking numbers per request. FedEx account numbers are required for account-rated shipments. Freight invoices are read-only and available only through the FedEx Billing Online web portal, not via API. Sandbox is virtualized with static responses.

What moves between them

Shipment and tracking data flow from FedEx into Sage Intacct. ml-connector polls FedEx every hour (or on your schedule) to fetch recently created shipments, rate quotes, and tracking events. For each shipment, it extracts the freight cost, matches the shipment to a purchase order via PO references, and posts the shipping expense to the appropriate GL account and cost center in Intacct's general ledger. Shipment status (in transit, delivered, exception) is recorded in the audit trail so your finance team can reconcile freight costs when invoices arrive. No data is written back to FedEx.

How ml-connector handles it

ml-connector stores FedEx API Key and Secret encrypted, then uses OAuth 2.0 client credentials to obtain a bearer token at session start and caches it for up to one hour to avoid hitting the IP-level token rate limit (3 tokens per 5 seconds). It respects the transaction rate limit (1,400 per 10 seconds) by batching Track API calls and using the endpoint's 30-tracking-numbers-per-request bulk fetch. On the Intacct side, ml-connector stores senderId, senderPassword, companyId, userId, and userPassword encrypted and calls getAPISession to obtain a sessionid, then caches that for 50 minutes before refreshing. Every Intacct XML request must strip forbidden C0 control characters from input before sending. Shipment tracking numbers are keyed as transactionId for client-side deduplication in case a shipment is polled twice. When a shipment cost is posted to Intacct, ml-connector maps the FedEx account and service type (e.g., FedEx Ground, FedEx Express) to a pre-configured GL account and cost center code, so the finance team controls where freight lands in the ledger. If the GL account or cost center is missing, the record is held and logged for manual review rather than failing the entire batch. Retries use exponential backoff for both OAuth token refresh (401 responses) and transaction limits (HTTP 429). Every shipment, tracking event, and GL posting carries a full audit trail.

A real-world example

A mid-sized e-commerce business uses Sage Intacct for accounting and finance reporting, and ships orders to customers via FedEx Ground and FedEx Express every day. Before the integration, the operations team exported FedEx freight invoices weekly, summed them by service type and destination region, and sent a spreadsheet to the finance team to post the costs into Intacct GL accounts. The invoice matching took hours and manual verification, and errors in cost allocation delayed month-end close. With Sage Intacct and FedEx connected, every shipment's cost flows automatically into the correct GL account and cost center based on service type and destination. The finance team runs month-end close with freight costs already posted and reconciled against the FedEx invoice, cutting the manual entry step and improving accuracy.

What you can do

  • Post FedEx shipment costs to Sage Intacct GL accounts on a schedule, mapped by service type and destination cost center.
  • Match shipment tracking numbers and PO references between FedEx and Sage Intacct so costs are allocated to the correct purchase orders.
  • Handle FedEx OAuth token refresh and Intacct XML session caching to avoid rate limits and dropped requests.
  • Parse shipment status changes from FedEx tracking events and record them in the audit trail for reconciliation.
  • Retry failed GL postings with exponential backoff and hold unmatched accounts for manual review rather than dropping records.

Questions

Can ml-connector pull freight invoices directly from FedEx?
No. FedEx does not expose an invoice REST API; freight invoices are available only through the FedEx Billing Online web portal. ml-connector extracts shipment costs and tracking data via the Track API and the shipment creation endpoint, then posts those costs to Sage Intacct GL accounts on the schedule you define. When the FedEx freight invoice arrives, your finance team can reconcile it against the GL postings already in Intacct.
What happens if a GL account or cost center does not exist in Sage Intacct?
ml-connector holds the record and logs it for manual review instead of failing the entire batch. This allows you to add new cost centers to Intacct without disrupting the sync; the next time the scheduled run occurs, the same shipment record is retried and posted if the account now exists.
How does ml-connector handle FedEx's rate and token limits?
FedEx enforces a 3-tokens-per-second limit (triggers a 403 for 10 minutes if exceeded) and an API rate limit of 1,400 transactions per 10 seconds per project. ml-connector caches the OAuth bearer token for the full 1-hour TTL and batches Track API calls to use the 30-tracking-numbers-per-request bulk endpoint, reducing token consumption and API calls. If a rate limit is hit, ml-connector backs off and retries.

Related integrations

Connect Sage Intacct and FedEx

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

Get started