Shopify and EDI
Shopify EDI integration
Shopify has no X12 or EDIFACT in it. Purchase orders from retailers become Shopify orders through the Admin API, with the PO number and the buyer's company on them, and the 855, 856, 810 and 846 are generated from orders, fulfillments and inventory. We build that layer per trading partner, host it and run it.
Is Shopify EDI capable?
Shopify does not read or write EDI. The platform has no X12 or EDIFACT translator: its Admin API exchanges JSON over GraphQL, and nothing in it produces an ISA envelope, a control number or a 997. A retailer that asks whether you are EDI capable asks whether you can receive its 850 and return an 855, 856, 810 and 997 according to its guide. A Shopify store can, with a layer in front of the API.
The route has three parts:
- The trading partner sends and receives X12 files over AS2, SFTP or a VAN.
- The integration translates each file, applies the mapping for that partner and keeps the acknowledgments.
- Shopify's Admin API creates the order and supplies the fulfillment and inventory data for the documents that go back.
This page is the Shopify side of our EDI integration. When an ERP sits behind the store, the same documents map to the ERP instead, as on the NetSuite EDI integration page.
What Shopify gives you natively
The B2B features and the Admin API hold most of what a purchase order needs.
| EDI need | Shopify object | Detail |
|---|---|---|
| The buyer | Company and company location | On Basic, Grow, Advanced and Plus |
| The buyer's PO number | poNumber on the order |
A string, set at creation |
| Net terms | Payment terms on the company location | Net payment terms on all four plans |
| Partner prices | B2B catalogs | 3 active catalogs below Plus, unlimited on Plus |
| Order from outside the checkout | orderCreate mutation |
Needs the write_orders scope |
| Shipment with tracking | fulfillmentCreate mutation |
Tracking company, numbers and URLs |
| Stock per location | inventorySetQuantities and inventory levels |
Available quantity per location |
| A trigger when something changes | Webhook topics ORDERS_CREATE, FULFILLMENTS_CREATE, INVENTORY_LEVELS_UPDATE |
Sent to the integration |
Plan features checked on 3 October 2026 against Shopify's B2B plan overview. Direct catalog assignment to a company is Plus only.
Which documents a Shopify merchant handles
| Document | Direction | Source or target in Shopify |
|---|---|---|
| 850 purchase order | In | Becomes an order through orderCreate |
| 997 acknowledgment | Both | None. Kept in the integration per document |
| 855 acknowledgment | Out | Order lines checked against available inventory |
| 856 ship notice | Out | Fulfillment, plus carton and SSCC data from outside Shopify |
| 810 invoice | Out | Order totals. The invoice number comes from your accounting system or the integration |
| 846 inventory advice | Out | Available quantity per variant and location |
One order is 4 business documents and 4 acknowledgments, 8 transaction sets. The full list is under EDI document types.
How an 850 becomes a Shopify order
The request for the first line of that order:
{
"order": {
"poNumber": "4500018236",
"companyLocationId": "gid://shopify/CompanyLocation/7001",
"sourceIdentifier": "HARBOR-4500018236",
"lineItems": [
{
"variantId": "gid://shopify/ProductVariant/44810",
"quantity": 24,
"priceSet": { "shopMoney": { "amount": "12.50", "currencyCode": "USD" } }
}
]
},
"options": { "inventoryBehaviour": "DECREMENT_OBEYING_POLICY" }
}
Five things in it are decisions, and each is a place where an EDI order goes wrong in Shopify.
| Field | What Shopify does | What the mapping has to do |
|---|---|---|
inventoryBehaviour |
Default is BYPASS: "Do not claim inventory" |
Set it, or EDI orders leave the available quantity untouched and the store and the 846 oversell |
priceSet |
Takes the price as sent. Automatic discounts are not applied | Compare PO104 with the partner's catalog price before the 855 goes out |
variantId |
Needs Shopify's own ID | Find the variant on barcode or SKU. A GTIN-14 in the 850 is not the 12-digit UPC in barcode |
quantity |
Counts sellable units | Convert cases: 24 cases of 12 is 288 |
sendReceipt |
Default is false | Leave it, so the buyer's contact gets no consumer order email |
Two limits apply to the request itself. Every array input on a Shopify API holds at most 250 items, and the PO1 loop of an 850 can repeat 100,000 times, so a purchase order with 300 lines does not fit in one orderCreate call and has to be split or built up with order edits. On a trial or development store, orderCreate is limited to five new orders per minute: a partner's test batch of 40 orders takes 40 divided by 5, so 8 minutes, when the test runs against a development store.
The technical reality of this pair
EDI arrives in batches and Shopify meters by cost. The GraphQL Admin API restores 100 cost points per second on standard plans, 200 on Advanced and 1,000 on Plus, and a single query may cost at most 1,000 points. A throttled request comes back as HTTP 200 with a THROTTLED error in the body, so an integration that only checks the status code counts a refused order as created. Shopify documents the limits on its rate limits page; the note on Shopify API rate limits works them through.
The second point is the 846. A drop-ship partner sells what your last inventory advice said was available. Shopify holds inventory per location, and not every location ships for every partner. Three locations with 14, 6 and 0 available make 20 when all count and 14 when only the main warehouse ships partner orders. The rule is set once per partner. How the available figure is built is covered under stock and availability.
The third is what Shopify does not store. A Shopify order and its fulfillments have no field for the contents of a carton, an SSCC or a bill of lading, and no separate invoice number. The 856 and the 810 need all four, so the integration reads them from the shipping tool or 3PL and from your accounting system.
Small volumes
Drop-ship programs send one purchase order per consumer order, often for a single unit. The document count is the same as for a pallet order: 8 transaction sets each. A store with 50 drop-ship orders a month exchanges 50 times 8, so 400 sets, and every one of the 150 outbound business documents has to match the partner's guide.
The usual starting point is a web portal: a person reads each order, types it into Shopify, and types the acknowledgment, the ship notice and the invoice back into the portal. At 50 orders that is 150 documents keyed by hand each month, and a mistyped quantity or tracking number in a ship notice is the kind of error retailers charge for. The integration replaces the typing in both directions, and the orders appear in Shopify next to the store's own.
When it goes wrong
| What happens | What the integration does |
|---|---|
| The 850 names an item that has no variant | The order is held with the PO1 line shown. The 997 has already gone out, because the file was valid |
| The buyer resends the same PO | The PO number exists for this company: held, no second order |
Shopify answers THROTTLED |
The request waits in the queue and is retried after the cost budget has restored |
| The partner rejects an 856 with a 997 | AK3 and AK4 are shown with the segment and element. The corrected notice goes out under a new control number |
| No 997 arrives for an invoice | The timer for that document runs out and an alert is raised |
Nothing is skipped without a trace. Every document has a status in the dashboard, with the raw file and the Shopify record it became or came from.
We build the integration to your trading partners and your store, host it and run it, for a fixed build price and a monthly fee. A new partner starts as a dry run that creates no orders, and you approve the first documents before they are sent. More on the platform side is under Shopify integrations and Shopify ERP integration. Tell us which retailer asked you for EDI.
Frequently asked questions
Is Shopify EDI capable?
Not on its own. Shopify has no X12 or EDIFACT translator, no envelope handling and no acknowledgments. It does have what an EDI flow needs on the inside: an API that creates orders with a PO number and a purchasing company, fulfillments with tracking, and inventory per location. With a translation and mapping layer in front of that API, a Shopify store meets a retailer's EDI requirements.
Do I need Shopify Plus for EDI?
No. The Admin API is the same on every plan, and Shopify lists B2B with companies, company locations, PO numbers and net payment terms on Basic, Grow, Advanced and Plus. Plus adds unlimited B2B catalogs (3 on the other plans) and direct catalog assignment to a company, and it raises the API rate from 100 to 1,000 cost points per second.
Do I need an ERP between Shopify and my trading partner?
No. When Shopify is where orders are picked, shipped and counted, the EDI documents can be built from Shopify data alone, with the pack data from your shipping tool or 3PL. When an ERP is the system of record, the 850 goes into the ERP and Shopify receives the resulting stock. See EDI integration for the ERP route.
Can orders from a retailer land as Shopify orders?
Yes. Each 850 is created with the orderCreate mutation, which Shopify documents for "importing orders from an external system or creating orders for wholesale customers". The order carries the retailer's PO number in poNumber and the retailer as a company location, so it appears in the same order list and fulfillment flow as store orders.
Is there a Shopify EDI app or connector?
Yes, the Shopify App Store lists apps that connect a store to an EDI network or provider. An app moves the documents. The decisions on this page still have to be made per partner: which item ID the partner sends, cases against eaches, which pack structure the ship notice needs, and what happens to a document that is rejected. Those are the parts we build.
Where does the carton and SSCC data for the 856 come from?
Not from Shopify. A Shopify fulfillment holds the line items, a tracking company, tracking numbers and tracking URLs. Which units went into which carton, and the SSCC printed on each label, are recorded by the shipping tool, the warehouse system or the 3PL. The integration reads them there and combines them with the order to build the 856.
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