Free template · CSV
Shopify to ERP Field Mapping Template
A starting field map for the order-to-cash flows most Shopify–ERP integrations need.
Download CSV
23 rows · opens in Excel, Google Sheets, or Numbers · no sign-up
Most integration bugs are mapping decisions nobody wrote down: which field holds the PO number, what happens to a discount on a bundle, which tax lines are the marketplace’s liability. This template turns those decisions into a reviewable table that developers, finance, and operations can sign off on before code is written.
Shopify field names use the GraphQL Admin API. ERP fields are left as placeholders in brackets because every ERP — and every ERP configuration — names them differently.
How to use it
- Replace each bracketed ERP field with the actual field or API property in your ERP, or mark the row “not mapped” with a reason.
- Fill in the transform rule for anything that isn’t a straight copy (rounding, unit conversions, code lookups).
- Agree the owner of each row — the person who decides when the rule changes.
- Verify every Shopify field against the API version your integration pins; fields are occasionally renamed or deprecated.
- Keep the finished file in version control next to the integration code, and update it in the same change as the mapping code.
What each column means
- Entity
- The business object the row belongs to (order, line, customer, tax line…).
- Shopify field
- Field path in the Shopify GraphQL Admin API.
- ERP field
- Target field in your ERP. Placeholders are in [brackets].
- Direction
- Which way data flows: Shopify → ERP, ERP → Shopify, or both.
- Required
- Whether the ERP rejects the record without it.
- Transform rule
- Any conversion, lookup, rounding, or default applied.
- Validation
- What the integration checks before sending; failures go to review, not to the ERP.
- Owner
- Who decides changes to the rule (IT, finance, operations).
- Notes
- Edge cases, open questions, and links to decisions.
Preview
The full template, exactly as in the download.
| Entity | Shopify field | ERP field | Direction | Required | Transform rule | Validation | Owner | Notes |
|---|---|---|---|---|---|---|---|---|
| Order | Order.id | [External reference / external ID] | Shopify → ERP | Yes | Prefix with store code, e.g. SHOP-US-{numeric id} | Unique in ERP; used as idempotency key | IT | Never reuse across stores |
| Order | Order.name | [Customer-facing order number] | Shopify → ERP | No | Copy as text (e.g. #1043) | Max length of ERP field | Operations | Shown on picking slips and support screens |
| Order | Order.createdAt | [Order date] | Shopify → ERP | Yes | Convert UTC to the ERP company time zone | Valid date | Finance | Affects which period the sale lands in |
| Order | Order.currencyCode | [Currency] | Shopify → ERP | Yes | ISO 4217 code lookup | Currency enabled in ERP | Finance | Use shop currency or presentment currency consistently |
| Order | Order.poNumber | [Customer PO number] | Shopify → ERP | B2B: yes | Copy as text | Required for accounts flagged PO-required | Sales ops | B2B customers match invoices on it |
| Order | Order.paymentGatewayNames | [Payment method] | Shopify → ERP | Yes | Map each gateway name to an ERP payment method | Unmapped gateway → review queue | Finance | Drives which clearing account receives the payment |
| Order | Order.displayFinancialStatus | [Release / hold status] | Shopify → ERP | Yes | Only release PAID (or authorized, per policy) | Status in allowed list | Finance | Decide how to handle pending and partially paid orders |
| Customer | Order.customer.id | [Customer external reference] | Shopify → ERP | No | D2C: generic web customer per channel; B2B: see company location | Exists or create per policy | Finance | Don’t match customers on email alone |
| Customer | Order.purchasingEntity → CompanyLocation.externalId | [Customer account / ship-to] | Shopify → ERP | B2B: yes | Direct lookup by external ID | Account active and not on credit hold | Sales ops | B2B orders only |
| Address | Order.shippingAddress.address1 / address2 | [Ship-to street] | Shopify → ERP | Yes | Trim; split if ERP lines are shorter | Not empty for shippable orders | Operations | Check ERP line length limits |
| Address | Order.shippingAddress.city / provinceCode / zip / countryCodeV2 | [Ship-to city / state / ZIP / country] | Shopify → ERP | Yes | Country and state codes as ISO codes | Valid state for US addresses | Operations | Carriers reject mismatched state and ZIP |
| Line | LineItem.sku | [Item number] | Shopify → ERP | Yes | Exact match; no fuzzy matching | SKU exists in ERP and is sellable | Operations | Unmatched SKU → review queue, not a placeholder item |
| Line | LineItem.quantity | [Quantity] | Shopify → ERP | Yes | Convert units if ERP sells in packs | Positive integer | Operations | Subtract removed quantities on edited orders |
| Line | LineItem.originalUnitPriceSet.shopMoney.amount | [Unit price] | Shopify → ERP | Yes | Shop currency; tax-exclusive or inclusive per store setting | Matches price list within tolerance (B2B) | Finance | Document whether prices include tax |
| Line | LineItem.discountAllocations | [Line discount] | Shopify → ERP | No | Sum allocations per line; or post as separate discount line | Total discounts reconcile to order | Finance | Decide per-line vs. order-level discount posting |
| Tax | Order.taxLines (title, rate, priceSet) | [Tax code + amount by jurisdiction] | Shopify → ERP | Yes | Map title/jurisdiction to ERP tax code; don’t recalculate | Every tax line has a mapping | Finance | Unmapped tax line → review queue |
| Tax | TaxLine.channelLiable | [Marketplace-collected flag] | Shopify → ERP | Yes | If true, record as collected and remitted by the channel | Boolean present | Finance | Keeps marketplace tax out of your own returns |
| Shipping | Order.shippingLines (title, code, originalPriceSet) | [Shipping method + freight charge] | Shopify → ERP | Yes | Map shipping code to ERP ship method / carrier service | Method exists in ERP | Operations | Free shipping still needs a method |
| Fulfillment | FulfillmentOrder.id | [Fulfillment reference] | Shopify → ERP | Yes | Store on ERP order lines for later fulfillment | Present for each location | IT | Needed to fulfill the right lines on split shipments |
| Fulfillment | Fulfillment.trackingInfo (company, number, url) | [Carrier + tracking number] | ERP → Shopify | Yes | Map ERP carrier codes to Shopify carrier names (UPS, FedEx, USPS…) | Tracking number format per carrier | Operations | Customer notification is sent from Shopify |
| Refund | Refund.refundLineItems (lineItem, quantity, restockType) | [Credit memo / return lines] | Shopify → ERP | Yes | Reverse sales, tax, and shipping in the same jurisdictions | Refunded qty ≤ shipped qty | Finance | Restock type decides whether stock returns |
| Inventory | InventoryLevel.quantities (available) by location | [Available-to-sell by warehouse] | ERP → Shopify | Yes | ERP available − unexported orders − safety buffer | Not negative | Operations | Map each Shopify location to one ERP location |
| Payout | ShopifyPaymentsPayout.net + balance transactions | [Bank deposit + fees] | Shopify → ERP | Yes | Clear payments from clearing account; book fees separately | Sum of transaction nets = payout net | Finance | See payout reconciliation guide |
Notes
- Shopify field paths reflect the GraphQL Admin API at the time of review. Confirm them in the API reference for your pinned version.
- ERP placeholders are intentionally generic. Do not assume a field exists until you’ve checked your ERP’s API reference.