ml-connector
Microsoft Dynamics 365 F&OShipBob

Microsoft Dynamics 365 F&O and ShipBob integration

Microsoft Dynamics 365 F&O runs your finance, inventory, and order management. ShipBob runs outbound fulfillment from its distributed warehouses. Connecting the two sends sales orders raised in Dynamics to ShipBob for pick, pack, and ship without re-keying, and brings shipment tracking, on-hand inventory, and fulfillment billing back into Dynamics so the order and the ledger stay accurate. ml-connector handles the very different APIs and auth on each side and moves the records on a cadence you control, with webhooks where ShipBob supports them.

How Microsoft Dynamics 365 F&O works

Microsoft Dynamics 365 F&O exposes products, released products, customers, sales orders, and general ledger entries through OData v4 REST endpoints at a tenant-specific URL such as contoso.operations.dynamics.com, so there is no shared hostname. It authenticates with OAuth2 client credentials issued by Microsoft Entra ID, scoped to the environment host. OData reads use server-driven paging up to 10,000 records with an odata.nextLink for the next page, and queries scope to one legal entity unless cross-company is set. Dynamics can push outbound Business Events, but those payloads carry only identifiers and need an OData callback, so most fulfillment sync is read by polling.

How ShipBob works

ShipBob exposes orders, products and variants, inventory, warehouse receiving orders, returns, shipments, and billing invoices through its REST API under the 2026-01 version path. It authenticates with OAuth2 authorization code, or a personal access token for a single merchant, and every write call must carry the shipbob_channel_id header that identifies the acting channel. Pagination is cursor based through a next-page response header rather than a body field. ShipBob pushes signed webhooks for events such as order.shipped, order.shipment.tracking.updated, order.shipment.delivered, and the billing and WRO topics, each verified with HMAC-SHA256.

What moves between them

Orders flow from Microsoft Dynamics 365 F&O into ShipBob: as sales orders are released in Dynamics, ml-connector creates them in ShipBob with the recipient address and line items, matched to ShipBob SKUs. Product SKUs flow the same direction so the ShipBob catalog mirrors released products in Dynamics. Fulfillment results flow back from ShipBob into Dynamics: shipment tracking numbers, carrier, and shipped status update the originating order, on-hand and available inventory by fulfillment center sync back to Dynamics, and ShipBob billing invoices are read for freight and fulfillment charges. ShipBob is treated as the fulfillment system of record, so ml-connector does not write financial postings back into ShipBob.

How ml-connector handles it

ml-connector stores both credential sets encrypted, requests a fresh Entra ID client credentials token for Dynamics when one expires, and refreshes the ShipBob OAuth access token using its 30 day refresh token, storing the rotated refresh token immediately. It accepts the full Dynamics environment host per customer, since there is no shared base URL, and sets the shipbob_channel_id header on every ShipBob call so writes are accepted and reads stay uniform. Dynamics item numbers map to ShipBob SKU reference ids and Dynamics sales orders map to ShipBob orders, with the order reference_id used as an external key so a re-run does not duplicate a shipment. ShipBob webhooks arrive signed with HMAC-SHA256 over the webhook id, timestamp, and raw body, so each delivery is verified before the matching Dynamics order is updated, and a scheduled OData poll backfills anything a webhook missed. Real edge cases are handled: Dynamics 429 service protection responses honor the Retry-After header, ShipBob shipping cost is read from invoice_amount nested in the shipment rather than a top-level order field, and weights and dimensions are converted to ounces and inches before products are created in ShipBob.

A real-world example

A direct-to-consumer brand of roughly 80 staff runs Microsoft Dynamics 365 F&O for inventory, finance, and order management, and outsources warehousing to ShipBob across several fulfillment centers. Before the integration, an operations clerk exported each day's orders from Dynamics and pasted them into ShipBob, then later keyed tracking numbers back so customer service could answer where is my order, and inventory in Dynamics drifted from what ShipBob actually held. With Microsoft Dynamics 365 F&O and ShipBob connected, released orders post to ShipBob automatically, tracking and delivery updates flow back onto the Dynamics order as shipments leave the warehouse, and inventory by fulfillment center stays in step. The manual copy and paste is gone and the ledger reflects real fulfillment activity.

What you can do

  • Create ShipBob orders from Microsoft Dynamics 365 F&O sales orders as they are released, matched to ShipBob SKUs.
  • Sync released product SKUs from Dynamics into the ShipBob catalog with weights in ounces and dimensions in inches.
  • Write ShipBob shipment tracking, carrier, and delivery status back onto the originating Dynamics order.
  • Sync ShipBob on-hand and available inventory by fulfillment center into Dynamics, and read ShipBob billing invoices for freight charges.
  • Verify ShipBob HMAC-SHA256 webhooks and poll Dynamics OData on a schedule, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 F&O and ShipBob?
Orders and product SKUs move from Dynamics into ShipBob, and fulfillment results move back from ShipBob into Dynamics. Tracking numbers, delivery status, inventory levels by fulfillment center, and billing invoices flow back onto the originating order. ShipBob is the fulfillment system of record, so ml-connector does not push financial postings into ShipBob.
Does ShipBob hold accounting data like vendor invoices or GL accounts?
No. ShipBob is a fulfillment platform, not an accounting system, so it has no vendor, GL account, or purchase invoice objects. What it does expose is orders, inventory, shipments, returns, and its own billing invoices for fulfillment and freight, and ml-connector reads that billing into Dynamics as charge data rather than as accounts payable documents.
How does the integration stay near real time and avoid duplicate orders?
ShipBob pushes signed webhooks such as order.shipped and order.shipment.tracking.updated, which ml-connector verifies with HMAC-SHA256 and applies to the matching Dynamics order immediately. A scheduled OData poll backfills anything a webhook missed, since Dynamics Business Events carry only identifiers. The order reference_id is used as an external key so re-running a sync does not create a duplicate shipment in ShipBob.

Related integrations

Connect Microsoft Dynamics 365 F&O and ShipBob

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

Get started