Shopify and Business Central
Shopify Business Central integration
Orders and customers from Shopify into Business Central. Items, variants, units of measure, prices and stock back to Shopify, with tracking numbers from posted shipments. Built to your Business Central setup, including the parts the standard API leaves out, then hosted and run for you.
What moves between Shopify and Business Central
Shopify takes the order. Business Central ships it, invoices it and books it. The integration carries nine flows, each with one direction and a fixed endpoint on both sides.
| Flow | Direction | Shopify Admin API | Business Central |
|---|---|---|---|
| Items and variants | to Shopify | productSet |
items, itemVariants |
| Units of measure | to Shopify | extra option on the product | item units of measure |
| Prices | to Shopify | price, catalogs, price lists | unitPrice, price lists via web service |
| Stock | to Shopify | inventorySetQuantities |
query via web service |
| Orders | to Business Central | orders/create webhook |
salesOrders, salesOrderLines |
| Customers and companies | both ways | customer, company | customers |
| Shipments and tracking | to Shopify | fulfillmentCreate |
posted sales shipment |
| Refunds and returns | to Business Central | refund | sales credit memo or return order |
| Payouts | to Business Central | Shopify Payments payout | journal lines per payout |
Items, variants, customers and sales orders run on the standard API v2.0. Price lists, stock per variant and location, and the tracking number are not in it, which shapes most of what follows. The general setup is on e-commerce ERP integration.
Which system owns what
| Data | System of record | Direction | Sync behavior |
|---|---|---|---|
| Item No., variant codes, units | Business Central | to Shopify | changed items, by lastModifiedDateTime |
| Titles, descriptions, images | Shopify | stays in Shopify | not overwritten from Business Central |
| Unit price and price lists | Business Central | to Shopify | price lists nightly, unit price on change |
| Stock per variant and location | Business Central | to Shopify | changed quantities every few minutes |
| Orders | Shopify until import, then Business Central | to Business Central | once, keyed on the Shopify order name |
| Customers and posting groups | Business Central | Shopify fills the address | match on number, then email |
| Shipment and tracking | Business Central or the WMS | to Shopify | one fulfillment per posted shipment |
| Refunds | where the refund starts | to Business Central | credit memo, with or without restock |
What Shopify and Business Central store differently
Options against one variant code. A Shopify product has up to three options and up to 2,048 variants. A Business Central item has item variants, each with a code of at most 10 characters and a description. There is no second or third option: color and size live together in one code such as NAVY-L. The integration keeps a table from option values to variant codes and reads each variant's ID from your tenant, because salesOrderLine takes itemVariantId as a GUID, not the code. A value that has no variant code yet goes on a checklist and is not dropped. More in variant mapping.
Units of measure. Business Central sells item 10482 per piece and per box of 6. Shopify has no unit of measure, so the box becomes a third option. Both variants draw on the same stock. With 14 pieces available, Shopify gets 14 for the piece and 2 for the box: 14 divided by 6 is 2, remainder 2. A sale of one box takes 6 pieces, so the piece variant has to drop to 8 at once and the box to 1. The integration recalculates every unit of an item after each order, instead of waiting for the next stock run. On the order the line gets unitOfMeasureCode BOX with quantity 2, which Business Central books as 12 pieces. Background in units of measure.
Stock is one number in the API. The inventory property on an item is a single read-only figure across all locations, and an item variant carries no quantity at all. Shopify keeps stock per variant per location. Stock for 1,500 items with 6 variants each in 2 locations is 18,000 quantities. They come from a query on item ledger entries, published as an OData web service. That is one page, since a page holds up to 20,000 records. Writing them to Shopify takes 18,000 divided by 250, which is 72 calls. After the first run only changed quantities are sent. See multi-location inventory.
Posting groups Shopify has never heard of. A Business Central customer needs a general business posting group, a VAT business posting group and a customer posting group. Shopify sends none of them, and the customers resource in the API does not accept them either. A template on the API Setup page fills empty fields when a customer is created. One template gives every web customer the same groups. A business customer in another EU country with reverse-charge VAT needs a different VAT group. The integration decides on country and VAT number from the billing address and sets the group through a custom API page. The general problem is in required fields the source never sends.
Addresses and references. Business Central's customer table holds Address in 100 characters, Address 2 in 50 and City in 30. The Shopify order name goes into External Document No., at most 35 characters. A Shopify B2B order with a PO number needs that field too, so one of the two moves to a custom field on the sales header.
The technical reality of this pair
| Limit | Shopify | Business Central online |
|---|---|---|
| Unit | query cost points per second | OData requests per user |
| Rate | 100 per second, 1,000 on Plus | 6,000 per 5 minutes, 5 at once |
| Over the limit | THROTTLED in an HTTP 200 |
429, or 503 after 8 minutes queued |
| Page size | 250 items per input array | 20,000 records per page |
| Change notices | webhooks, 8 retries over 4 hours | webhooks, subscription expires after 3 days |
| Releases | an API version every quarter | updates every month |
The numbers were checked on October 3, 2026 in Microsoft's operational limits and Shopify's rate-limit documentation. The cost model is explained in Shopify API rate limits.
Orders, worked through. An order with 3 lines costs 5 requests in Business Central: a customer lookup, the sales order header and 3 lines. A peak hour of 600 orders is 3,000 requests, or 250 in each 5-minute window. That is about 4 percent of the 6,000 budget. The tighter limit is 5 requests at a time per user. The integration runs under its own Microsoft Entra app registration, so it does not share that limit with other tools, and Microsoft requires no license for such a service-to-service app.
Webhooks on the Business Central side expire. A subscription lives three days and is renewed with the same handshake used to create it. Notifications arrive about 30 seconds after the change, and more than 1,000 changes in that window arrive as one collection notice with a filter. Shipments have no webhook, and the salesShipments resource has no tracking field. The integration polls posted shipments by date, reads the package tracking number from a published page and calls fulfillmentCreate with company, number and URL.
Tax is recalculated. On salesOrderLine, taxPercent and totalTaxAmount are read-only. Business Central calculates tax from its own VAT setup, not from Shopify's tax lines. When the two disagree by a cent, the integration flags the order before posting, so the payment still matches the invoice.
Where standard connectors stop
Microsoft ships its own Shopify connector with Business Central. Its documentation is precise about where its settings end.
- One price. It exports one price per variant, calculated through a sales quote for quantity 1. Quantity-based prices cannot be exported.
- No option matrix. It uses the variant code as the only option, so it cannot add a variant to a Shopify product that has two or more options.
- Units share stock. With units of measure as variants, each unit gets the same availability, and a sold box shows as still available until the next sync.
- Scheduled stock. Microsoft's tip is a job queue run every 15 to 30 minutes.
- Online only. The connector is not available for Business Central on-premises.
- B2B prices on Plus. Its B2B catalog price sync is documented as a Shopify Plus feature.
Standard connectors and iPaaS templates from other vendors add their own extension to Business Central and follow its fields. A built integration has none of these fixed settings: option tables, unit rules, price lists and stock queries follow how your tenant is set up. Comparison on technical grounds: custom integration vs iPaaS.
When it goes wrong
| What fails | What the integration does | What you see |
|---|---|---|
| Business Central answers 429 or 503 | order stays in the queue, retried after a growing pause | nothing, unless it lasts |
| Option value without a variant code | that order is held, the rest continue | the order and the value |
| Customer without posting groups | order held before posting | the customer and the missing group |
| Webhook subscription expired | created again, missed changes read by date | a log line |
Shopify THROTTLED on stock |
smaller batches, sent again | nothing |
| Tax differs from Shopify by a cent | order flagged before posting | the order and both amounts |
An order that still fails after its retries is kept with its original payload and sent again once the cause is fixed. A reconciliation run compares recent Shopify orders with the External Document No. values in Business Central, so an order whose webhook never arrived still gets in.
Before go-live the integration runs as a dry run against a Business Central sandbox, writing nothing, and you approve what it would do. After that every run has a diff per record in the dashboard. We host and monitor it and change it when Shopify or Microsoft changes an API. The system side is on Business Central integration, the platform side on Shopify integration, all flows on integrations. Sibling pages: Magento Business Central integration, Shopify NetSuite integration and Shopify SAP integration. Tell us how your Business Central is set up.
Frequently asked questions
Why not use Microsoft's Shopify connector?
It is a good fit when your Shopify catalog mirrors Business Central one to one. It exports one price per variant, calculated for quantity 1, cannot add variants to a Shopify product with two or more options, and runs only on Business Central online. When your catalog, price lists or locations do not fit those settings, a built integration follows your setup instead.
Does it work with Business Central on-premises?
Yes. The on-premises API v2.0 is the same, but it is disabled by default and your administrator turns it on. The address then contains your own server, port and server instance. Microsoft's Shopify connector is not available on-premises, which is a common reason for a built integration.
Do we need an extension in Business Central?
For items, customers and sales orders, no: they are in the standard API v2.0. Stock per variant and per location, price lists and the tracking number of a posted shipment are not. Those come from a page or query that is published as an OData web service, or from a small custom API page in your tenant.
Can B2B customers see their own prices in Shopify?
Yes. A Business Central customer becomes a Shopify company, and the price list of its customer price group becomes a catalog with a price list. Since April 2026 B2B is on all Shopify plans, with 3 active catalogs below Plus and 10,000 per store on Plus. See customer-specific pricing.
Does every web customer get their own customer card?
That is your choice per channel. B2B orders go to the company's own customer number. Consumer orders can go to one customer per country with the real address on the order, or to a customer card per email address. Either way the integration fills the three posting groups that the API itself does not accept.
What happens to orders while Business Central is being updated?
Business Central online is updated monthly. While the API answers 503 or 429, orders wait in the queue with their original payload and are sent once it answers again. Each order carries its Shopify name as External Document No., so a retry updates the order and does not create a second one.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase