ml-connector
Microsoft Dynamics 365 Business CentralShipBob

Microsoft Dynamics 365 Business Central and ShipBob integration

Microsoft Dynamics 365 Business Central runs finance, inventory, and sales orders. ShipBob runs e-commerce fulfillment across distributed fulfillment centers. Connecting the two turns Business Central into the system of record while ShipBob handles pick, pack, and ship. Sales orders raised in Business Central flow to ShipBob for fulfillment, shipment tracking and on-hand inventory flow back into Business Central, and ShipBob's fulfillment invoices land as purchase invoices. ml-connector handles the very different APIs and auth on each side and moves the data on the cadence you set.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, customers, items, sales orders, sales invoices, purchase invoices, and GL accounts through the Business Central API v2.0, a REST API built on OData v4, scoped under a company on a tenant and environment URL. It authenticates with OAuth 2.0 client credentials (service-to-service) through Microsoft Entra ID, so unattended connectors need no user login. It supports push notifications through a subscription API for entities such as items, sales orders, sales invoices, and customers, but the notification carries only a change signal and no record data, so the resource is fetched after. Subscriptions expire after three days and must be renewed, and purchaseOrders has no webhook support, so polling with an OData lastModifiedDateTime filter covers anything not pushed.

How ShipBob works

ShipBob exposes products, orders, shipments, inventory, receiving orders, returns, and billing invoices through the ShipBob Developer API, a REST API with JSON bodies on a version-pinned path. It authenticates with OAuth 2.0 authorization code (or a personal access token for a single merchant); access tokens last one hour and refresh tokens last thirty days and rotate on each use. Every write call must carry a shipbob_channel_id header that identifies the app installation. ShipBob pushes events such as order.shipped, order.shipment.tracking.updated, and order.shipment.delivered to a registered endpoint, signed with HMAC-SHA256 over the webhook id, timestamp, and raw body. Pagination is cursor-based through a next-page response header, weights are in ounces, and dimensions are in inches.

What moves between them

Records move in both directions. Business Central items are pushed into ShipBob as products so the fulfillment catalog matches the ERP, and Business Central sales orders are created as ShipBob orders for fulfillment. When ShipBob ships an order, its order.shipped and tracking webhooks flow back so ml-connector records the carrier, tracking number, and shipped status on the matching Business Central sales order. ShipBob on-hand and available inventory per fulfillment center syncs back into Business Central item inventory on a schedule, and ShipBob billing invoices come into Business Central as purchase invoices for the fulfillment charges. ShipBob inventory and billing are treated as read-only sources, so ml-connector does not write stock counts or charges back into ShipBob.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Business Central side it requests an Entra service-to-service token with the businesscentral .default scope and refreshes it on a 401, and it accepts the tenant id and environment name per customer to build the company-scoped base URL. On the ShipBob side it runs the OAuth refresh-token flow, stores the rotated refresh token on every use, and attaches the shipbob_channel_id header to every call. Items map to ShipBob products by SKU, and the Business Central number or external id is matched against the ShipBob reference_id so a re-run updates rather than duplicates. Because Business Central notifications carry no payload, ml-connector fetches the changed sales order or item after each notification, and it renews each subscription before the three-day expiry with a cron job. ShipBob webhooks are verified by recomputing the HMAC-SHA256 signature before they are trusted. Weights and dimensions are converted to ounces and inches, and the shipping cost is read from the invoice_amount field nested in the shipment rather than a top-level order field. When a Business Central or ShipBob call returns 429 or a 5xx, ml-connector backs off and retries, and every record carries a full audit trail with error replay.

A real-world example

A direct-to-consumer brand with roughly forty staff runs Microsoft Dynamics 365 Business Central for finance, inventory, and order entry, and outsources warehousing to ShipBob across several fulfillment centers. Before the integration, staff exported each day's web orders, re-keyed them into ShipBob by hand, then copied tracking numbers back into Business Central and adjusted stock counts from ShipBob spreadsheets, which left inventory wrong and customers asking where their orders were. With Business Central and ShipBob connected, every sales order flows to ShipBob for fulfillment, tracking and shipped status post back automatically, and on-hand counts per fulfillment center sync into the ERP. Customer service can see real tracking in Business Central, inventory matches the warehouse, and the monthly ShipBob invoice arrives as a purchase invoice ready to review.

What you can do

  • Push Microsoft Dynamics 365 Business Central items into ShipBob as products, matched by SKU and reference id so re-runs update rather than duplicate.
  • Send Business Central sales orders to ShipBob for fulfillment with addresses, line items, and the selected shipping method.
  • Write carrier, tracking number, and shipped status back onto Business Central sales orders from ShipBob order.shipped and tracking webhooks.
  • Sync ShipBob on-hand and available inventory per fulfillment center into Business Central item inventory on a schedule.
  • Bring ShipBob fulfillment invoices into Business Central as purchase invoices, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and ShipBob?
It moves both ways. Items and sales orders flow from Business Central into ShipBob, while shipment tracking, on-hand inventory, and fulfillment invoices flow from ShipBob back into Business Central. ShipBob inventory and billing are read as sources, so ml-connector does not write stock counts or charges back into ShipBob.
How does the integration handle ShipBob's expiring tokens and channel header?
ShipBob OAuth access tokens last one hour and refresh tokens last thirty days and rotate on each use, so ml-connector runs the refresh flow and stores the new refresh token every time. It also attaches the required shipbob_channel_id header to every call, which ShipBob ignores on reads but requires on writes, keeping the request code uniform.
How are Business Central change notifications and ShipBob webhooks processed?
Business Central notifications signal that a record changed but carry no data, so ml-connector fetches the sales order or item after each notification and renews the three-day subscription on a cron before it expires. ShipBob webhooks are verified by recomputing the HMAC-SHA256 signature over the webhook id, timestamp, and raw body before the event is trusted.

Related integrations

Connect Microsoft Dynamics 365 Business Central and ShipBob

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

Get started