ml-connector
Sage X3ShipBob

Sage X3 and ShipBob integration

Sage X3 runs your finance and operations. ShipBob runs your fulfillment. Connecting them keeps your ERP in sync with what has shipped and what remains in your fulfillment centers. When an order ships from ShipBob, the shipment event reaches Sage X3 automatically. Inventory levels flow both directions so your ERP sees the stock held in fulfillment centers and ShipBob knows what to pick and pack. ml-connector handles the different authentication methods on each side and orchestrates the data movement on a schedule you control.

How Sage X3 works

Sage X3 exposes customers, sales orders, products, inventory, shipments, and general ledger accounts through REST (api1) and GraphQL (Xtrem) APIs. Authentication uses OAuth2 client credentials for GraphQL or HTTP Basic Authentication for the REST legacy path, both validated against a customer-specific server URL and port. Sage X3 does not support outbound webhooks or event push notifications, so data is read by polling with delta detection via the updatedDate field on records. Access tokens expire in 5 minutes, and refresh tokens are valid for 30 days. The platform requires explicit server configuration from the customer admin and supports both on-premise and cloud deployments.

How ShipBob works

ShipBob exposes orders, shipments, products, inventory, returns, and billing records through a REST API at https://api.shipbob.com. All calls require OAuth2 bearer tokens with a 1-hour lifetime, a refresh token good for 30 days, and a shipbob_channel_id header to identify the calling application. ShipBob uses webhooks exclusively for real-time events, including order.shipped, order.shipment.tracking.updated, return.created, and wro.created (warehouse receiving orders). Webhook signatures are verified with HMAC-SHA256. Write operations are restricted to records belonging to the authenticated channel.

What moves between them

ShipBob shipment and return events flow into Sage X3 via webhooks. When an order ships or a return is initiated, ml-connector receives the webhook, maps the ShipBob shipment details (tracking number, carrier, date shipped) into a Sage X3 sales shipment record, and updates the original sales order with shipment status. Inventory levels sync bidirectionally on a scheduled basis: Sage X3 polls ShipBob for current inventory balances in each fulfillment center and updates the corresponding warehouse stock in X3, while Sage X3 publishes product and quantity changes to ShipBob so the fulfillment platform knows what inventory is available to pick and pack.

How ml-connector handles it

ml-connector stores OAuth2 credentials for both systems encrypted and refreshes ShipBob bearer tokens before expiry (1-hour lifetime) and Sage X3 bearer tokens before they expire (5-minute lifetime). On the ShipBob side, it registers a webhook endpoint with ShipBob and validates incoming webhook signatures with the stored HMAC secret using HMAC-SHA256 v1 envelope verification. ShipBob requires the shipbob_channel_id header on all calls, so ml-connector includes it on every API request. On the Sage X3 side, it polls the updatedDate field to detect sales orders and products that have changed since the last sync and only retrieves the deltas. ShipBob inventory is keyed by product SKU and location (fulfillment center), and ml-connector maps those to Sage X3 warehouse and product to update stock on-hand. Returns from ShipBob are posted as sales credit memos in Sage X3 with the original order reference. ShipBob has no published hard rate limits, so ml-connector respects exponential backoff on 429 responses and retries failed webhook deliveries. Every shipment, return, and inventory change carries a full audit trail.

A real-world example

A mid-sized e-commerce retailer uses Sage X3 for order management, finance, and inventory planning, and uses ShipBob for multi-center fulfillment across two regional warehouses. Before the integration, the operations team manually downloaded shipment confirmations from ShipBob daily and entered tracking numbers and ship dates into Sage X3 sales orders, then ran weekly inventory counts to reconcile ShipBob's fulfillment center stock against X3 inventory records. With Sage X3 and ShipBob connected, each shipment from ShipBob updates the X3 order automatically with tracking and status, and inventory balances from both fulfillment centers sync into X3 in real time. The manual shipment entry step is gone, month-end inventory counts are faster, and the operations team can focus on customer exceptions instead of data re-keying.

What you can do

  • Receive ShipBob shipment and return events via webhooks and post them into Sage X3 as shipment records with tracking numbers and dates.
  • Sync inventory levels from ShipBob fulfillment centers into Sage X3 warehouses so your ERP reflects on-hand stock in fulfillment.
  • Authenticate both systems using OAuth2 bearer tokens, handle token refresh before expiry on both sides, and validate ShipBob webhook signatures with HMAC-SHA256.
  • Poll Sage X3 for sales order and product changes using delta detection with the updatedDate field, so only changed records are retrieved.
  • Track every shipment, return, and inventory change with a full audit trail and replay failed records if a downstream system call fails.

Questions

Which direction does data move between Sage X3 and ShipBob?
ShipBob shipment and return events flow into Sage X3 to update order status and create credit memos. Inventory levels sync bidirectionally: ShipBob fulfillment center balances flow into Sage X3 warehouses, and Sage X3 product and quantity changes flow to ShipBob so the fulfillment platform knows what is available to pick.
Why does ml-connector need to poll Sage X3 if ShipBob uses webhooks?
Sage X3 does not support outbound webhooks or event push notifications, so ml-connector must poll the Sage X3 REST or GraphQL API on a schedule using the updatedDate field to detect changes since the last sync. ShipBob, by contrast, pushes real-time events via webhooks, which ml-connector receives and validates with HMAC-SHA256.
How does ml-connector handle token expiry on both sides?
ShipBob access tokens expire in 1 hour and refresh tokens last 30 days, so ml-connector refreshes the token before each request if expiry is near. Sage X3 tokens expire in 5 minutes, so ml-connector refreshes them even more frequently. Both systems are configured to refresh from the stored refresh token, and if a refresh fails, ml-connector surfaces an alert.

Related integrations

Connect Sage X3 and ShipBob

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

Get started