Short answer
Pick one stable identifier that both systems share — usually the SKU — and make it unique and immutable on both sides. Map each ecommerce variant (not product) to one ERP article, store platform IDs in a cross-reference table, define explicit rules for bundles, units of measure, and non-stock items, and validate the mapping continuously so an unmapped SKU is caught before a customer can buy it.
- Product T-shirt (parent)
- Variant Red / XL · SKU TS-RED-XL
- Cross-reference Variant ID ↔ SKU ↔ article
- ERP article 100245 · unit EA
The cross-reference table links platform IDs to the ERP article, keyed by a shared SKU.
Product mapping is the quiet foundation of every other workflow. Orders cannot post without it, inventory cannot sync without it, and reporting cannot reconcile without it. Most “integration bugs” reported as order or stock problems turn out to be mapping problems.
Map variants, not products
Ecommerce platforms model a sellable item as a product with variants (size, color). In Shopify, inventory is tracked per variant through its inventory item. WooCommerce has variable products with variations; BigCommerce has products with variants, each with its own SKU.
ERPs usually model each sellable, stockable thing as an article (or item, material, part). The correct mapping is almost always:
one ecommerce variant ↔ one ERP article
A product with three sizes and four colors is twelve ERP articles. If your ERP uses a “matrix item” or “style” concept, map the ecommerce product to that, and still map each variant to its child article.
Choose the shared identifier
Pick one identifier present in both systems that will act as the join key. The SKU is the natural candidate, provided you enforce three properties:
- Unique. No two variants share a SKU, across all products and stores feeding the same ERP. Most platforms allow duplicate or empty SKUs, so uniqueness is your responsibility.
- Stable. It does not change after orders exist.
- Present. Every sellable variant has one. An empty SKU should block publication.
If the ERP’s article number is the master, consider using it directly as the ecommerce SKU. If marketing needs readable SKUs and the ERP uses numeric articles, keep both and map through a cross-reference.
Build a cross-reference table
Even with a shared SKU, store the platform’s internal IDs. They are faster and more reliable for API calls, and they survive SKU typos being corrected.
CREATE TABLE product_xref (
channel TEXT NOT NULL, -- e.g. 'shopify:store-a'
sku TEXT NOT NULL,
erp_article TEXT NOT NULL,
platform_product_id TEXT,
platform_variant_id TEXT NOT NULL,
platform_inventory_item_id TEXT, -- Shopify tracks stock per inventory item
uom_factor NUMERIC NOT NULL DEFAULT 1,
active BOOLEAN NOT NULL DEFAULT true,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (channel, platform_variant_id),
UNIQUE (channel, sku)
);
Populate it when products are created (if the ERP publishes products) or by a matching job (if products are created in the platform), and keep it in sync on every catalog change.
Define rules for the hard cases
Units of measure
An ERP may stock a product by the box of 12 while the store sells single units, or the reverse. Store a conversion factor per mapping and apply it in both directions: order quantities into the ERP, stock quantities out of it. Round stock down when converting to sellable units, never up.
Bundles and kits
Options:
- ERP-defined kit. The bundle is an article with a bill of materials; the ERP explodes it into components for picking and stock. The store sells the bundle SKU. Stock published to the store must be calculated from component availability.
- Platform-defined bundle. The store sells a bundle made of component SKUs; the integration posts the components to the ERP. Revenue allocation between components must be defined.
Choose one per bundle type and document it; mixed approaches produce stock and revenue errors.
Non-stock items
Gift cards, warranties, gift wrapping, shipping insurance, and digital products need ERP service items or explicit exclusion rules.
Variants without inventory tracking
If a platform variant does not track inventory (made-to-order products, for example), the integration should skip inventory sync for it but still map it for orders.
Discontinued and replacement items
When an article is discontinued and replaced, keep the old mapping active for returns and historical orders, mark it inactive for new sales, and add the replacement as a new mapping.
Decide who creates products
| Model | Flow | Good for |
|---|---|---|
| ERP-first | ERP or PIM creates articles; integration creates platform products and variants | Businesses where purchasing and pricing live in the ERP |
| Platform-first | Merchandisers create products in the store; integration creates or matches ERP articles | Fast-moving catalogs managed by ecommerce teams |
| Matched | Both exist independently; a job matches them by SKU | Migrations and existing operations |
ERP-first gives the strongest guarantees. Platform-first needs a gate that prevents publishing a product until its ERP article exists.
Validate continuously
Run a catalog check at least daily, and before every major launch:
- Active variants with no SKU.
- SKUs duplicated within a channel.
- Active variants with no ERP mapping.
- Mapped ERP articles that are blocked, discontinued, or missing.
- Unit-of-measure factors that are zero or missing.
Publish the result as a report owned by the catalog team. A product that cannot be mapped should not be buyable.
Error handling in order and stock flows
- Order with unmapped SKU: do not drop the line. Move the order to review with a precise message.
- Stock update for an unmapped article: log and skip; include in the daily catalog report.
- SKU changed in the platform: detect through product update events, update the cross-reference, and alert if the new SKU collides with an existing one.
Testing
- Order containing every special case: bundle, gift card, non-stock item, unit-of-measure conversion.
- Product with variants added after launch.
- Duplicate SKU introduced on purpose to confirm the check catches it.
- SKU edit in the platform after orders exist.
Common mistakes
- Mapping at product level and ignoring variants.
- Allowing duplicate or empty SKUs.
- Rounding converted stock quantities up.
- Matching on product title.
- Deleting mappings for discontinued items that still appear in returns.
Summary
Map each ecommerce variant to one ERP article through a unique, stable, shared SKU, and store platform IDs in a cross-reference table. Define explicit rules for units of measure, bundles, non-stock items, and discontinued products, decide which system creates products, and validate the catalog daily. Clean mapping is what makes every other workflow reliable.
Frequently asked questions
Should the SKU be the same in the ERP and the ecommerce platform?
Ideally yes. A shared SKU makes orders, inventory, and support simpler. If the ERP uses internal article numbers that cannot be exposed, keep a cross-reference table and make the ecommerce SKU unique and stable anyway.
Can I change a SKU after products are live?
Treat SKUs as immutable once orders exist. If a change is unavoidable, update the cross-reference first, keep the old SKU as an alias for historical orders and returns, and change both systems in a coordinated window.
How do I handle products that exist only online?
Decide explicitly. Either create them in the ERP as non-stock or service items so orders post cleanly, or exclude them from export with a documented rule. Silently dropping them distorts revenue.
Where should the cross-reference table live?
In the integration layer's database, or in an ERP field if the ERP supports external identifiers per channel. It should be queryable by either side's ID.
Sources and further reading
Platform-specific statements on this page were checked against these sources on . Vendor APIs change; confirm details in the current documentation before you build.
- [1] Shopify ProductVariant object — Shopify
- [2] Shopify InventoryItem object — Shopify
- [3] BigCommerce catalog variants — BigCommerce
- [4] WooCommerce REST API — product variations — WooCommerce
Related reading
- Concepts What Is Data Mapping in Integrations? What data mapping means in ecommerce-ERP integrations — field, value, and structural mapping — with examples, common pitfalls, and how to document and test mappings.
- Guides How to Synchronize Shopify Orders with an ERP How to export Shopify orders to an ERP reliably — choosing the trigger, mapping lines, taxes, discounts and payments, handling edits, and avoiding duplicates.
- Guides How to Synchronize Inventory Between Shopify and an ERP Keep Shopify stock levels aligned with your ERP — choosing which quantity to publish, mapping locations, using compare-and-swap updates, and reconciling drift.
- Platforms Shopify ERP Integration How Shopify connects to an ERP — the GraphQL Admin API, webhooks, inventory states, fulfillment orders, rate limits — plus the sync patterns and pitfalls that matter.
- Platforms Magento and Adobe Commerce ERP Integration How Magento Open Source and Adobe Commerce connect to an ERP — REST and asynchronous bulk APIs, message queues, Multi-Source Inventory, webhooks, and Adobe I/O Events.