WooCommerce and Dynamics

WooCommerce to Microsoft Dynamics: field mapping and sync guide

Which WooCommerce field goes where in Dynamics, when to use webhooks and when to run a scheduled sync, and what happens when the two systems disagree. Field names checked against WooCommerce and Microsoft documentation on 30 October 2026.

By itmarkerz Technologies. Updated 30 October 2026.

What this guide is based on

The WooCommerce side uses the REST API v3. The Dynamics side uses the Business Central API v2.0, because it has one documented resource for each thing a store needs. If you run Dynamics 365 Sales or Finance, the logic holds and the names differ; our product comparison covers those.

We have delivered order and customer sync between WooCommerce and Dynamics on a high-volume Belgian store, and enquiries and customer data from WordPress into Dynamics for a water-treatment supplier. Most of our work is delivered under NDA, so many projects cannot be named. Product and invoice mappings come from the documentation, and we say so here rather than imply otherwise. Treat this as a starting point to check on your own environment, because Dynamics customisation can change which fields exist and which are required.

Decide three things before mapping a single field

  1. Who owns each record. For each field, one system is the source of truth. If you can’t say which, you will end up with both systems overwriting each other.
  2. The shared key. SKU for products, order number for orders, and your own lookup table for customers. A store and an ERP have different internal IDs, and neither should have to remember the other’s.
  3. When an order becomes real. Most stores should send an order when payment is confirmed, not when it is created. Otherwise abandoned payment attempts turn into sales documents someone has to clean up.

Orders

Usually one way, store to Dynamics, with status coming back. See the Woo order properties, salesOrder and salesOrderLine.

WooCommerce order fields mapped to Business Central sales order fields
WooCommerceBusiness CentralWatch out for
numberexternalDocumentNumberYour duplicate check. Search for it before creating anything.
date_paid_gmtorderDateDecide which date finance wants, and convert from GMT to the company’s time zone.
customer_idcustomerNumberThrough your own lookup table, not by copying the ID. Guests have customer_id 0, so they need a rule.
billing.*billToAddressLine1, billToCity, billToPostCode…Check maximum lengths in your Dynamics configuration, or trim with a logged warning.
shipping.*shipToName, shipToAddressLine1, shipToCity…Sent per order, so a one-off gift address doesn’t overwrite the customer record.
currencycurrencyCodeYour local currency may be blank in Business Central. Test this before go-live.
line_items[].skusalesOrderLines[].lineObjectNumberWith lineType set to Item. An empty SKU in Woo should stop the order and raise an alert.
line_items[].quantityquantityDirect.
line_items[].priceunitPriceCheck prices_include_tax against pricesIncludeTax, which is read-only on the order. See the tax section below.
shipping_lines[]salesOrderLines[] with lineType Account or ChargeNeeds a decision from finance on where shipping is posted.
fee_lines[]salesOrderLines[] with lineType Account or ChargeSame as shipping. Often forgotten until a payment fee plugin is added.
coupon_lines[]discountAmount on the line or the orderLine totals in Woo already include discounts, so send one or the other, never both.
transaction_id, payment_methodCustom field, or a payment journal entryThe standard salesOrder has no field for these. See the note on custom APIs.
statusYour own ruleWoo statuses and Dynamics statuses don’t correspond one to one. See the table below.

Status mapping

Woo has seven standard statuses, and a Business Central sales order only reports Draft, In Review or Open, plus a fullyShipped flag. So status isn’t a field-to-field copy. A workable rule looks like this:

How WooCommerce order statuses can be handled in Dynamics
Woo statusWhat to do in Dynamics
pending, on-hold, failedNothing yet. Waiting for payment or already failed.
processingCreate the sales order.
completedNormally set from Dynamics: when fullyShipped is true, mark the Woo order completed.
cancelledIf not yet shipped, delete or cancel by agreed process. If shipped, alert a person.
refundedRaise a credit memo through whichever route finance agrees. Never edit a posted document.

Tax and rounding

Don’t expect totals to match by chance. Woo calculates tax by its own settings, and Dynamics recalculates from its own tax setup, so a 0.01 difference on a multi-line order is common. Decide the tolerance with finance, and compare total and total_tax with totalAmountIncludingTax and totalTaxAmount after creation. Anything outside the tolerance should raise an alert rather than quietly post.

Customers

See Woo customers and the customer resource. Many B2C stores send every order to a single “web customer” in Dynamics, with the address on the order, and only create named customers for accounts. That is a legitimate choice and removes a lot of matching logic, but check that finance and your VAT reporting can live with it.

WooCommerce customer fields mapped to Business Central customer fields
WooCommerceBusiness CentralWatch out for
emailemailThe usual match key for people, but not always unique in Dynamics. Decide what happens when it matches two records.
billing.company, or first_name + last_namedisplayName, typeSet type to Company or Person accordingly.
billing.address_1, address_2, city, state, postcode, countryaddressLine1, addressLine2, city, state, postalCode, countryWoo uses ISO country codes. Check they match your Dynamics country table.
billing.phonephoneNumberDirect, after formatting.
VAT number (usually order or customer meta)taxRegistrationNumber, taxLiableNot a core Woo field. It comes from whichever plugin collects it.
Nonenumber, creditLimit, paymentTermsId, blockedOwned by Dynamics. Read blocked before accepting a B2B order on account.
date_modified_gmtlastModifiedDateTimeUsed for change detection on each side, and never copied across.

Products and stock

Usually Dynamics to store. See Woo products and the item resource. Keep descriptions, images and SEO fields in WooCommerce unless you have a reason not to, since an ERP is a poor place to write them.

WooCommerce product fields mapped to Business Central item fields
WooCommerceBusiness CentralWatch out for
skunumberThe join between the systems. Agree this first, and clean duplicates before you start.
global_unique_idgtinDirect, where you hold barcodes.
namedisplayNameOften owned by the shop, since marketing names differ from warehouse names.
regular_priceunitPrice, priceIncludesTaxUsually owned by Dynamics. Check whether the store displays prices with or without tax.
stock_quantity, manage_stockinventoryinventory is read-only and is a total. Per-location stock needs another source.
variations[]itemVariantsEach variation needs its own SKU. Decide whether variations are items or item variants in Dynamics.
statusblockedA blocked item should stop selling. Decide if that means draft or simply out of stock.
tax_classtaxGroupCodeA small lookup table, reviewed whenever someone adds a rate.

Stock is where timing matters most. Dynamics’ figure doesn’t know about orders that haven’t reached it yet, so a naive overwrite can put units back on sale. Either subtract orders in flight or accept and document a small overselling risk.

Invoices

Let Dynamics issue invoices, and let the store only display them. The shipAndInvoice action on a sales order and the post action on a salesInvoice are how documents become final. Microsoft notes that the id on this resource can differ from the record’s systemId once posted, so store the API id and don’t assume they match.

WooCommerce order data mapped to Business Central invoice data
WooCommerceBusiness CentralWatch out for
numberexternalDocumentNumber, orderNumberLets you find the invoice from the order on either side.
Download link in My AccountpdfDocumentFetch and store a copy, or serve it through your own endpoint with an ownership check.
date_paid_gmt, statusremainingAmount, status (Open, Paid, Canceled, Corrective)Payment facts travel in one agreed direction. Don’t let both systems mark a thing paid.
refunds[]salesCreditMemos, or makeCorrectiveCreditMemoA Woo refund isn’t a credit note until accounting says so. Agree who issues it.

Webhooks or scheduled sync

Use both. Webhooks give you speed, and a scheduled job gives you certainty. Here is what each side actually does.

WooCommerce and Business Central change notifications compared
WooCommerce webhooksBusiness Central webhooks
PayloadJSON of the resource, with an HMAC-SHA256 signature headerWhich record changed and how. You fetch the record.
TimingProcessed in the backgroundWaits 30 seconds after the first change. More than 1,000 changes become a single collection notification.
On failureDisabled after five consecutive failures, until someone re-enables itRetries for 36 hours on 408, 429 or 5xx. Any other error code deletes the subscription.
LifetimeUntil disabledExpires after three days unless renewed, with a handshake each time.
SourceWooCommerce docsMicrosoft docs

Three things follow from that table.

  • Answer webhooks fast. Accept, store the message, reply with a 2xx, and do the work in a queue. A slow receiver is how a Woo webhook gets disabled, and at that point nothing announces that orders have stopped flowing.
  • Return a retryable error. If your receiver is having trouble with Business Central notifications, send a 503 and not a 400. The wrong error code deletes your subscription.
  • Renew on a schedule, and monitor it. A forgotten three-day renewal is a silent failure.

Then add a scheduled job as the safety net. Ask each system for what changed since the last run, using modified_after on WooCommerce and a filter on lastModifiedDateTime on Business Central, and process anything the webhooks missed. Because the job can run again safely, it also repairs an outage without anybody having to work out what was lost.

Conflict rules

Avoid “last write wins” unless a field really doesn’t matter. Clocks differ, and a bulk update in Dynamics can overwrite a customer’s address from an hour ago. Here is a starting point to adapt.

Starting conflict rules for each kind of data
DataOwnerIf they differ
Order lines and prices after paymentWooCommerceDynamics edits are not sent back. Changes go through an agreed process, and a person is told.
Fulfilment and shipment statusDynamicsDynamics overwrites the store’s status.
Credit limit, payment terms, blocked flagDynamicsDynamics overwrites, and the store only reads.
Customer login, marketing consentWooCommerceNever sent to overwrite anything in Dynamics.
Customer addressAgree per fieldOrder addresses stay on the order. An account address change goes to a review queue if both sides changed since the last sync.
Price and stockDynamicsDynamics overwrites, with stock adjusted for orders in flight.
Marketing name, description, imagesWooCommerceNot synced from Dynamics.
Payment statusOne agreed sideMismatch raises an alert. Never resolved automatically.
Tax totalsDynamics for postingWithin tolerance, accept. Outside it, hold and alert.

The limits to design around

For how this holds up under load, read syncing orders at high volume. If you would like us to build it, see the integration service. For the store itself, see WooCommerce development.

Dynamics integrations we have delivered

Questions

Does this apply to Dynamics 365 Sales or Finance as well?

The principles do. The field names here are from the Business Central API v2.0, because its documented resources line up closely with a store. Sales uses Dataverse tables such as salesorder and account, and Finance uses data entities through OData. Our guide to the three products covers what changes.

Have you built all four of these flows?

Not all of them. Our delivered Dynamics work covers orders and customers from a WooCommerce store, and enquiries and customer data from a WordPress site. The product and invoice mappings here come from the two products' documented APIs. They are how we would approach that work, and we would confirm them on your environment.

Should a webhook carry the data, or only trigger a fetch?

On the WooCommerce side the payload is the resource itself. On the Business Central side, the notification only tells you which record changed, so you fetch it. In both cases, we prefer treating the message as a signal and reading current data before writing, because messages can arrive late or out of order.

Which system should own the customer?

Usually Dynamics owns account and credit data, and the store owns login and preferences. Address is the one to discuss, because customers edit it at checkout. The conflict table on this page shows a starting point.

More on WooCommerce and Dynamics

Want this mapped for your store?

Tell us which Dynamics product you run and what should travel in each direction.

We reply within one business day (IST).