Microsoft Dynamics 365 F&O and ShipStation integration
Microsoft Dynamics 365 F&O runs finance, procurement, and supply chain. ShipStation aggregates orders, compares carrier rates, and prints shipping labels for e-commerce and distribution merchants. Connecting the two pushes a confirmed sales order from D365 into ShipStation as an order ready to pick and ship, then carries the resulting tracking number, carrier, service, and ship date back onto the originating order. ShipStation is a shipping platform with no general ledger, invoices, or payments of its own, so the integration is built around what ShipStation actually does: hold orders, generate labels, and report shipments. ml-connector reconciles the different APIs and auth on each side and keeps order fulfillment and shipment status in step.
What moves between them
The primary flow runs from Microsoft Dynamics 365 F&O into ShipStation. ml-connector reads sales orders that are confirmed and ready to ship, maps the customer, ship-to address, and line items, and posts them to the ShipStation V1 orders/createorder endpoint using a stable orderKey derived from the D365 sales order number so reposts update rather than duplicate. Shipment data then flows the other direction: when ShipStation prints a label it emits a SHIP_NOTIFY webhook, and ml-connector follows the resource_url to read the shipment and writes the tracking number, carrier, service, and ship date back onto the matching D365 order. Because ShipStation has no webhook for order edits, ml-connector also polls orders filtered by modifyDate on a schedule. ShipStation holds no financial records, so no invoices, payments, or GL entries move between the systems.
How ml-connector handles it
ml-connector stores both credential sets encrypted and runs an OAuth client-credentials flow against Microsoft Entra ID using the tenant ID, environment host, client ID, and secret to get a one-hour D365 bearer token, while ShipStation calls use base64 HTTP Basic auth for V1 and the API-Key header for V2. D365 is pull-first: ml-connector polls confirmed sales orders on a schedule and can also subscribe to the sales-order-confirmed Business Event, but since that payload is only a stub it calls back to OData for the full order before pushing. The D365 sales order number becomes the ShipStation orderKey, which is the natural dedup key on createorder, and the returned tracking number, carrier, and ship date map back onto the D365 order. Inbound, ShipStation V1 webhooks carry no signature, so the callback URL is protected with a shared-secret token and the body, which is only a resource_url pointer, is fetched with a second authenticated call before processing. Real edge cases handled: ShipStation has no order-update webhook so edits are caught by polling modifyDate; V1 datetimes are PST or PDT not UTC and are converted on ingest; orders in shipped or cancelled status are immutable and skipped on update; D365 returns HTTP 429 with Retry-After under service protection and ShipStation returns 429 at 40 requests per minute on V1, so ml-connector backs off and retries on each side; and the first OData call after an AOS restart can take 30 to 60 seconds. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized outdoor-gear distributor with around 180 employees runs Microsoft Dynamics 365 F&O for order entry, inventory, and finance, and ships roughly 800 parcels a day through ShipStation across UPS, USPS, and FedEx. Before the integration, warehouse staff rekeyed each confirmed order from D365 into ShipStation, then copied tracking numbers back into D365 by hand at the end of the day, which left customer service blind to shipment status until the next morning. With the two systems connected, every confirmed sales order lands in ShipStation automatically under an orderKey, labels print from the existing carrier rules, and the tracking number, carrier, and ship date flow back onto the D365 order as soon as the label is created. The double entry disappears and address-typing errors drop.
What you can do
- Push confirmed Microsoft Dynamics 365 F&O sales orders into ShipStation under a stable orderKey for fulfillment.
- Write the ShipStation tracking number, carrier, service, and ship date back onto the matching D365 sales order.
- Bridge Microsoft Entra ID client-credentials auth with ShipStation HTTP Basic and API-Key authentication.
- Follow the resource_url pointer on every ORDER_NOTIFY and SHIP_NOTIFY webhook to fetch the real record.
- Poll orders by modifyDate to catch edits ShipStation has no webhook for, with retries and a full audit trail.
Questions
- Which direction does data move between Microsoft Dynamics 365 F&O and ShipStation?
- Orders move from D365 into ShipStation, and shipment data moves from ShipStation back into D365. Confirmed sales orders are posted to ShipStation under an orderKey for picking and shipping, and the resulting tracking number, carrier, and ship date are written back onto the originating order. ShipStation has no general ledger or invoices, so no financial records move between the systems.
- Can ShipStation post invoices or charges into the Dynamics 365 F&O general ledger?
- No. ShipStation is a shipping and order management platform with no GL account, AP invoice, payment, or accounting dimension. What it does return is the shipment record with tracking number, carrier, service, and shipping cost, which ml-connector attaches to the D365 sales order. Posting journal entries or invoices stays in D365, which remains the system of record for finance.
- How does the integration handle ShipStation webhooks and order updates?
- ShipStation ORDER_NOTIFY and SHIP_NOTIFY webhooks deliver only a resource_url pointer, not the record, so ml-connector makes a second authenticated GET to that URL to fetch the actual order or shipment before processing. Because ShipStation has no webhook for order edits, ml-connector also polls orders filtered by modifyDate on a schedule to catch changes the webhooks miss. V1 timestamps are PST or PDT rather than UTC and are converted on ingest, and orderKey deduplicates repeat events.
Related integrations
More Microsoft Dynamics 365 F&O integrations
Other systems that connect to ShipStation
Connect Microsoft Dynamics 365 F&O and ShipStation
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started