If you run Microsoft Dynamics 365 Business Central and sell on Shopify, Microsoft already gives you an integration: the Shopify Connector. It comes preinstalled in new Business Central online environments. It syncs products, prices, stock, customers, B2B companies, orders, shipments, refunds and payouts, and it runs on the job queue.
So the real question isn't "how do we connect Shopify to Business Central?" It's "where does the built-in connector stop for *our* business, and what's the cheapest way to cover the gap?" This guide answers that from Microsoft's own documentation (checked September 25, 2026). It's written for merchants in the UK, the US, Germany/DACH, Australia and New Zealand, where Business Central is common. Outside the US, store prices usually include VAT or GST, which affects how the connector maps prices and taxes.
The short answer
- Configure the connector first. For a single-currency store selling standard products to consumers, the connector plus a well-set-up shop card usually covers everything.
- Extend it with AL when the gap is a business rule, such as which customer to use, which dimension to set, or how to calculate available stock. Microsoft provides events, public façade codeunits and extensible enums for exactly this.
- Build custom only when you need Shopify data or API calls the connector doesn't make, such as volume price breaks, list-type metafields, multi-option variant matrices managed from Business Central, or near-real-time flows the job queue can't give you. Even then, a hybrid (connector plus your own app for the gap) is usually cheaper than replacing it.
What the Microsoft connector does
| Data | Direction | Notes from Microsoft's docs |
|---|---|---|
| Items ↔ products and variants | Both | Images, variants, barcodes, vendor item numbers, tags, metafields. Exports item attributes, extended and marketing text, and translations. |
| Prices | Business Central → Shopify | Price and compare-at price from the unit price, customer price group, customer discount group and currency. Market catalogs and B2B catalogs. |
| Inventory | Business Central → Shopify | Per mapped location. Two built-in calculations: projected available balance at today, and free (unreserved) inventory. |
| Customers and B2B companies | Both | Matches customers by email or phone, or by bill-to address. Matches companies by email or phone, or by tax ID. Country templates set posting groups. |
| Orders | Shopify → Business Central | Online Store, POS and B2B orders, with shipping, gift cards, tips, transactions, PO number and fraud risk. Creates a sales order, or a sales invoice if the order is already fulfilled. |
| Shipments | Business Central → Shopify | Posted sales shipments become fulfillments, with tracking numbers. |
| Returns and refunds | Shopify → Business Central | Import only, or automatic credit memos or return orders. |
| Transactions and payouts | Shopify → Business Central | Shopify Payments payouts are for information only. They don't post to the general ledger. |
| Posted sales invoices | Business Central → Shopify | Exported as orders so buyers see all their invoices in one place. |
A few requirements to check before you plan anything:
- The connector works only with Business Central online. It isn't available on-premises or for Embed Apps, and it doesn't connect to other Dynamics 365 apps such as Sales.
- You need a Business Central license and a Shopify plan. Users need the SHPFY – ADMIN permission set.
- You can connect several Shopify shops, each with its own settings, and the same shop can be connected from more than one company or environment. That's useful for testing.
- Syncs run as job queue reports, such as report 30104 to sync orders and report 30102 to sync stock. Microsoft suggests syncing inventory every 15–30 minutes. Auto Sync Orders starts an order import when Shopify reports a new order, but it doesn't take filters.
Where the connector stops
These are limits that Microsoft documents, not guesses. Check each one against your catalog and processes.
Pricing
- The connector calculates prices with a temporary sales quote for a quantity of 1. You can't export quantity-based prices or discounts. If you sell to trade customers with volume pricing, those price breaks have to be managed in Shopify or by custom code.
- It exports one price per product and lets Shopify apply local taxes, currencies and rounding, unless you set up market catalogs with their own price settings.
- Syncing prices for B2B catalogs requires Shopify Plus, according to Microsoft. Shopify offers B2B on every plan, but assigning catalogs directly to companies and company locations is Plus-only.
Products and variants
- Business Central has a single variant code. If a Shopify product uses two or more options (for example Size × Color), the connector can't create new variants on it, and you can't add an item as a variant to it.
- Units of measure as variants share one availability figure, so stock for "box of 6" and "single" can be briefly wrong between syncs.
- Metafields: list types, rich text, link and rating aren't supported. Clearing a value in Business Central doesn't delete it in Shopify.
- Only custom collections can be assigned. Smart collections are rule-based and can't be.
- Bundles: the Shopify Bundles app blocks inventory updates through the API. Microsoft recommends mapping bundle products to non-inventory items, which the stock sync skips.
Orders, locations and fulfillment
- Archived orders can't be imported. Turn off automatic order archiving in Shopify.
- If an order is edited in Shopify after Business Central has processed it, the connector flags the conflict but doesn't change your sales document.
- A Shopify line fulfilled from two locations becomes one Business Central line with one location. Orders with the same product on two lines (for example Buy X get Y) can't be fulfilled from Business Central.
- When you add a new Shopify location, Shopify doesn't create inventory records for existing products there, so the connector can't sync stock to it until you assign them.
- Taxes are recalculated in Business Central when the sales document is created. Wrong posting groups mean wrong VAT, even though the Shopify order was right.
B2B customers
- A Shopify company must have a main contact, or it's skipped. Only the main contact is imported, and the oldest company location is used to create the customer.
Field-mapping reference
Agree on these before the first sync. Changing SKU mapping later means re-mapping products.
| Shopify field | Business Central field | Direction | Watch out for |
|---|---|---|---|
| Product title | Item description, or item translation | Both | Updated only if Can Update Shopify Products is on |
| Variant title | Variant code | BC → Shopify | Uses the code because Shopify needs unique variant titles |
| SKU | Item no., item no. + variant code, vendor item no. or barcode (per SKU Mapping) | Both | Choose one scheme and make SKUs unique first |
| Barcode | Item reference of type barcode | Both | Checked first when matching. Custom builds on Shopify API 2026-10 or later should use the new barcodes field, because ProductVariant.barcode is deprecated |
| Price / compare-at price | Calculated price at quantity 1 | BC → Shopify | On import, the price sets the unit price of newly created items only |
| Cost per item | Unit cost | Both | On import, used for newly created items only |
| Product type / vendor | Item category (by description) / vendor (by name) | Both | Matched by name, so keep names identical in both systems |
| Inventory | Available stock per mapped location | BC → Shopify | Non-inventory and service items are skipped |
| Customer | Customer, with templates per country | Both | Needs an address. Export needs an email and a unique phone number |
| Company tax ID | VAT Registration No. or Registration No. | Both | Pick one in Company Tax ID Mapping |
| PO number | External Document No. | Shopify → BC | |
| Shipping line | Shipping charges G/L account, item or item charge | Shopify → BC | Only the first shipping charge sets the shipment method |
| Refund | Sales credit memo or return order | Shopify → BC | The original order must already be processed |
| Fulfillment and tracking | Posted shipment, shipping agent, package tracking no. | BC → Shopify |
Extend the connector or build your own?
| Approach | What it is | Good for | Trade-off |
|---|---|---|---|
| Configure | Shop card settings, mappings, job queue | Standard DTC stores | None, but know the limits above |
| Per-tenant extension (AL) | Subscribe to the connector's events, call its façade codeunits, add enum options | Business rules on data the connector already moves | Microsoft says you can't change the connector's API calls |
| Hybrid | Connector plus your own unlisted Shopify app for the missing calls | Volume pricing, unsupported metafields, extra webhooks | You own a second integration and its API upgrades |
| Fully custom | Shopify app plus Business Central APIs or custom API pages, usually with middleware | Unusual data models, on-premises Business Central | You own everything: mapping, retries, monitoring, upgrades |
Many gaps are AL-sized. Here's a small extension that copies the Shopify order number into Your Reference, a standard sales header field your document layouts can print. External Document No. is left alone because the connector already fills it with the buyer's PO number:
codeunit 50120 "Shopify Order Reference"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Shpfy Order Events", OnAfterCreateSalesHeader, '', false, false)]
local procedure SetYourReference(OrderHeader: Record "Shpfy Order Header"; var SalesHeader: Record "Sales Header")
begin
// Parameter names must match the publisher: OrderHeader, SalesHeader.
SalesHeader."Your Reference" := CopyStr(OrderHeader."Shopify Order No.", 1, MaxStrLen(SalesHeader."Your Reference"));
SalesHeader.Modify(true);
end;
}
If you go custom, plan for these constraints:
- Shopify's API terms. An app whose primary purpose is sending merchant data to a third party needs Shopify's prior written consent. Microsoft flags this for anyone who wants to publish their own Business Central connector and suggests checking whether an unlisted app fits instead. For one merchant, that usually means a custom-distributed app, but review the terms with your legal team either way. Our custom vs public app guide explains the distribution options.
- Order history. Apps see only the last 60 days of orders unless Shopify approves the
read_all_ordersscope. - Business Central limits. OData requests are limited per user: 6,000 in a five-minute sliding window, 5 processed at the same time, and 100 operations per
$batch. A request times out after 8 minutes. Over the limit, you get HTTP 429. - Business Central webhooks expire after three days unless you renew them. They're sent about 30 seconds after a change, and a burst of more than 1,000 changes arrives as one "collection" notification that you have to re-query.
Your client should back off on 429 and 503, and check for an existing document before it creates one:
// Node 18+. Creates a sales order once, keyed on the Shopify order number.
async function bc(url, token, options = {}, attempt = 0) {
const res = await fetch(url, {
...options,
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
});
if ((res.status === 429 || res.status === 503) && attempt < 5) {
await new Promise((r) => setTimeout(r, 2 ** attempt * 1000));
return bc(url, token, options, attempt + 1);
}
if (!res.ok) throw new Error(`Business Central ${res.status}: ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
async function createOrderOnce(base, token, shopifyOrder) {
const ref = shopifyOrder.name.replace(/'/g, "''");
const found = await bc(`${base}/salesOrders?$filter=externalDocumentNumber eq '${ref}'`, token);
if (found.value.length) return found.value[0]; // already created on an earlier delivery
return bc(`${base}/salesOrders`, token, {
method: "POST",
body: JSON.stringify({
customerNumber: shopifyOrder.bcCustomerNumber, // resolved by your own customer mapping
externalDocumentNumber: shopifyOrder.name,
}),
});
}
Reliability practices
- Choose a system of record per entity before go-live. Microsoft's own advice is to decide whether item and customer data is owned by Business Central or by Shopify, and not to mix directions without a rule.
- Put related job queue entries in the same category. Microsoft recommends this so order, customer and product syncs don't collide.
- Check skipped records. A job queue run completes successfully even when it skips blocked items or invalid customers, so review the Shopify Skipped Records page each week.
- Upgrade Business Central on time. The connector uses a fixed Shopify API version, adopted at each major release. Shopify supports each version for at least 12 months. Microsoft's own example: the October 2025 connector uses API version 2025-07, which was supported until July 1, 2026. Don't count on using the full five-month update window that Business Central allows.
- In custom code, don't trust webhooks alone. Verify, deduplicate and reconcile on a schedule. See Shopify webhooks you can trust. Build on the GraphQL Admin API, not REST. See Moving from REST to GraphQL.
Go-live checklist
- Test with a Business Central sandbox and a Shopify development store or trial. If you must test against Business Central production, first turn off auto-creating items, customers and sales documents.
- Back up your products and customers from Shopify before the first sync.
- Set SKU Mapping and fix duplicate or empty SKUs and barcodes.
- Map locations, shipment methods, payment methods and payment terms.
- Set up customer templates per country, with general business, customer and VAT posting groups.
- For UK, EU, Australian and New Zealand stores with tax-inclusive prices, turn on Prices including VAT and set the domestic VAT business posting group on the shop card.
- Set the G/L accounts for shipping, sold gift cards, tips, refunds and (for POS) cash rounding.
- Turn off automatic order archiving in Shopify.
- Check that the time zone is set on your company's post code, so order dates convert correctly.
- Place test orders for each scenario: gift card, partial refund, return, POS, B2B, an order edited after import, and a line split across locations.
- Schedule the job queue and set the Shopify Activities cue thresholds.
- Note which Shopify API version your Business Central release uses and when your next major upgrade is due.
When you don't need us
If the connector covers your catalog and processes, you don't need custom development. A Business Central partner can configure it, and Microsoft supports the connector through its standard support model. Bring in developers when you've hit a documented limit that costs you money every week, such as manual B2B price updates or stock errors on bundles.
Want help with a Shopify and Business Central integration?
We build AL extensions for the connector, hybrid apps for the gaps, and fully custom integrations, and we can review an existing setup against the limits above. Tell us what's breaking on our Shopify API and ERP integration page. For store, theme and app work around the integration, see our Shopify development services, or hire a Shopify developer with ERP experience to work with your BC partner.
Sources
- Microsoft Learn: Get started with the Shopify Connector
- Microsoft Learn: Synchronize items with Shopify
- Microsoft Learn: Synchronize prices with Shopify
- Microsoft Learn: Synchronize inventory with Shopify
- Microsoft Learn: Synchronize customers and companies with Shopify
- Microsoft Learn: Synchronize and fulfill sales orders with Shopify
- Microsoft Learn: Synchronize transactions and payouts
- Microsoft Learn: FAQ for the Shopify connector
- Microsoft Learn: Extend the Shopify Connector
- Microsoft Learn: Operational limits for Business Central online
- Microsoft Learn: Working with webhooks in Business Central
- Shopify Help Center: Shopify B2B features by plan



