Shopify and SAP
Shopify SAP integration
Orders from Shopify into SAP Business One or SAP S/4HANA, items, prices and stock per warehouse back to Shopify. Built on the Service Layer or the S/4HANA OData APIs, to your business partners, price lists and sales areas, then hosted and run for you.
What moves between Shopify and SAP
"SAP" in a Shopify project means one of two systems. SAP Business One is the ERP for small and midsize companies, reached through the Service Layer. SAP S/4HANA, and its predecessor ECC, is the enterprise ERP with released OData APIs and IDocs. The flows are the same in both; the objects have different names.
| Flow | Direction | SAP Business One | SAP S/4HANA |
|---|---|---|---|
| Items | to Shopify | Items |
material, product master |
| Prices | to Shopify | PriceLists, SpecialPrices |
pricing conditions |
| Stock | to Shopify | ItemWarehouseInfoCollection |
API_MATERIAL_STOCK_SRV |
| Orders | to SAP | POST /Orders |
POST A_SalesOrder |
| Customers | to SAP | BusinessPartners |
business partner, sold-to and ship-to |
| Deliveries and tracking | to Shopify | DeliveryNotes |
outbound delivery |
The general setup of an ERP integration is on e-commerce ERP integration.
Which system owns what
| Data | System of record | Direction | Sync behavior |
|---|---|---|---|
| Item code, units, weight | SAP | to Shopify | changed items on a schedule |
| Titles, descriptions, images | Shopify or a PIM | stays in Shopify | not overwritten from SAP |
| Price lists and special prices | SAP | to Shopify | resolved per customer, nightly |
| Stock per warehouse or plant | SAP | to Shopify | changed quantities every few minutes |
| Orders | Shopify until import, then SAP | to SAP | once, keyed on the Shopify order name |
| Business partners | SAP | Shopify supplies new web customers | match on email, then create |
| Deliveries and tracking | SAP or the WMS | to Shopify | one fulfillment per delivery |
What Shopify and SAP store differently
No variants in SAP Business One. A Shopify product has up to three options and 2,048 variants. The Items object in SAP Business One has no parent or variant property: each color and size is its own item with its own ItemCode, 20 characters in SAP's SDK reference. Its 64 item properties are yes or no flags for reports, not options. The integration groups items into one Shopify product by a rule you set, such as a shared code prefix or a user-defined field, and keeps the variant ID next to each ItemCode. More in variant mapping.
Special prices against Shopify catalogs. SAP Business One prices an item from the business partner's price list, number PriceListNum. A special price for one business partner overrides it, with periods (SpecialPricesDataAreas) and quantity scales per period (SpecialPricesQuantityAreas). Shopify gives a B2B customer the lowest price across all catalogs assigned to them. Price list 2 at 10.00 and a special price of 10.40 for customer C20012 would show 10.00 in Shopify. So the integration calculates the SAP price per customer and item and writes one catalog per customer, 250 prices per request.
Sales areas in S/4HANA. Every S/4HANA sales order carries a sales organization, a distribution channel and a division, as in SAP's own example: 1010, 10, 00. Shopify has none of these. A rule table derives them from the Shopify channel: the online store to channel 10, B2B company locations to channel 20. SAP fills other fields from configuration and master data, and its documentation notes that such values cannot be cleared in the create request.
Material numbers. An S/4HANA material number is 18 characters by default and 40 when the extended material number is switched on. A Shopify SKU has no fixed length. A SKU longer than the material field is caught before the item is created, not after the first order fails.
Business partners and references. A Business One business partner has a CardCode of 15 characters and a name of 100. A Business One address has a Street of 100 characters and a ZipCode of 20. The Shopify order name goes into NumAtCard, the customer's reference on the document, which holds 100 characters. In S/4HANA it goes into PurchaseOrderByCustomer. In the EU, each Business One document line carries a VatGroup of 8 characters, which the integration sets from the ship-to country and the customer's VAT status.
POST /b1s/v1/Orders HTTP/1.1
Cookie: B1SESSION=PTRzIjYK-weN6; ROUTEID=.node1
Content-Type: application/json
{
"CardCode": "C20012",
"NumAtCard": "SHOP-100482",
"DocDate": "2026-10-03",
"DocDueDate": "2026-10-06",
"DocumentLines": [
{ "ItemCode": "10482-NAVY-L", "Quantity": 4,
"UnitPrice": 10.40, "WarehouseCode": "01", "VatGroup": "S1" }
]
}
The technical reality of this pair
| Limit | Shopify | SAP Business One Service Layer | SAP S/4HANA OData |
|---|---|---|---|
| Access | token per app | login, B1SESSION cookie |
X-CSRF-Token on every write |
| Session | none | 30 minutes default timeout | none |
| Page size | 250 per input array | 20 by default, set per request | $top and $skip |
| Batching | bulk operations | $batch, atomic change sets |
one sales order per change set |
| Over the limit | THROTTLED |
the server slows | the server slows |
The Business One numbers come from SAP's guide Working with SAP Business One Service Layer, checked on October 3, 2026. SAP publishes no request rate for either system: the limit is the server, often shared with the users entering orders by hand.
Reading items, worked through. 6,000 items at the Service Layer's default page size of 20 is 300 requests. With Prefer: odata.maxpagesize=500 it is 12. Each item carries its stock per warehouse, InStock, Committed and Ordered. With two warehouses that is 12,000 quantities, and writing them to Shopify takes 12,000 divided by 250, which is 48 calls. After the first run only changed items are read, filtered on their update date.
Sessions. The Service Layer answers a login with a B1SESSION cookie and, behind its load balancer, a ROUTEID cookie that keeps requests on the same node. A session expires after 30 minutes without use. The integration logs in again when that happens and resends the request, so a quiet night does not end in failed orders.
Atomic writes. In a Service Layer $batch, a change set is atomic: one failed request rolls back the whole set. Since 10.0 FP 2102 the Service Layer also supports ETags, so an update made with an outdated version of a record is rejected instead of overwriting someone's change. On S/4HANA a $batch may hold only one sales order per change set. A batch of 50 Shopify orders is 50 change sets, and one rejected order does not hold back the other 49.
Shopify's side. Shopify waits five seconds for an answer to a webhook and retries 8 times over 4 hours. The webhook only places the order ID in a queue; a reconciliation run compares recent Shopify orders with NumAtCard or PurchaseOrderByCustomer values in SAP. The cost model is in Shopify API rate limits.
Where standard connectors stop
Standard connectors and iPaaS templates for Shopify and SAP come with fixed answers to questions that are configuration in every SAP system: which sales area a web order gets, which pricing condition carries a discount, how a VAT group is chosen, how items are grouped into a product. Anything outside those settings goes back to your SAP team as a custom extension or a manual step.
On S/4HANA the alternative is often an EDI-style route: Shopify orders converted to ORDERS IDocs, which SAP lists as the inbound message for sales orders, in IDoc types up to ORDERS05. That works where an IDoc channel already runs, and it moves the errors into SAP's IDoc monitor instead of a place the e-commerce team sees.
A built integration takes the rule table, the price calculation and the item grouping from how your SAP is configured. The technical comparison is in custom integration vs iPaaS.
When it goes wrong
| What fails | What the integration does | What you see |
|---|---|---|
| Service Layer session expired | logs in again, resends the request | nothing |
| Sold-to party not found | order held, a new business partner proposed | the order and the email |
SKU without an ItemCode or material |
that order held, the rest continue | the order and the SKU |
| Change set rolled back | the order is sent again on its own, then held | the order and SAP's message |
| SAP down for maintenance | orders wait in the queue | the queue length |
Shopify THROTTLED |
smaller batches, sent again | nothing |
An order that still fails after its retries is kept with its original payload and sent again once the cause is fixed. Each order carries the Shopify name as its reference, so a retry finds the existing document instead of creating a second one. Nothing is dropped without a trace; how that works is in what happens when a sync fails.
Before go-live the integration runs as a dry run against a test company database or a quality system, writing nothing, and you approve what it would do. After that every run has a diff per record. We host and monitor it and change it when Shopify ships a new API version or SAP a new feature pack. The system side is on SAP Business One integration, the platform side on Shopify integration, all flows on integrations. Sibling pages: Magento SAP integration, Shopify Business Central integration and Shopify NetSuite integration. Tell us which SAP you run.
Frequently asked questions
Does this work with SAP Business One and with S/4HANA?
Yes, through different APIs. SAP Business One runs through the Service Layer, an OData service on SAP HANA and, since 10.0 PL01, on SQL Server. S/4HANA runs through its released OData APIs such as API_SALES_ORDER_SRV. The flows are the same; the fields and the limits differ.
Can we use the DI API instead of the Service Layer?
The DI API is a COM library that runs on a Windows machine next to SAP Business One and does not support multithreading. For a web shop that sends orders at the same time as stock and prices are read, the Service Layer is the better fit: it is HTTP, runs behind a load balancer and can serve several sessions in parallel.
Do B2B customers see their SAP prices in Shopify?
Yes. A business partner becomes a Shopify company, and its price list plus special prices become one catalog with a price list. Shopify gives a customer the lowest price across all catalogs assigned to them, so we resolve the SAP price first and send one catalog per customer. See customer-specific pricing.
We already exchange orders with SAP through IDocs. Does that change?
It does not have to. SAP's sales documentation lists the ORDERS IDoc, up to type ORDERS05, as the inbound message for sales orders, next to the OData API. If your SAP team already processes ORDERS IDocs from EDI partners, Shopify orders can arrive the same way. Otherwise the OData API is simpler to monitor per order.
Do we need Shopify Plus?
No. Companies, catalogs and payment terms are on every Shopify plan since April 2026, with 3 active catalogs below Plus. Plus raises the API rate from 100 to 1,000 points per second and the location limit from 10 to 200, which matters with many SAP warehouses.
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