01 / backbone
SAP S/4HANA is the ledger
Finance, plants, condition-record pricing, the order-to-cash document chain. The authoritative record the business is run on.
Integration / Makro Middleware
Your ERP stays the system of record. Shopify Plus becomes where the order gets placed. We build custom SAP S/4HANA to Shopify Plus middleware: condition pricing to B2B price lists, multi-plant inventory, real-time order sync.
SAP S/4HANA holds finance, plants, condition-record pricing and the order-to-cash chain. Shopify is where B2B buyers self-serve. The middle is where it breaks: duplicate customers, orders written twice, pricing that drifts, silent failures at month-end close.
01 / backbone
Finance, plants, condition-record pricing, the order-to-cash document chain. The authoritative record the business is run on.
02 / front door
Where B2B buyers place repeat orders without a phone call, a rep, or an EDI batch.
03 / the gap
Duplicate customers. Orders written twice. Pricing that drifts. Silent failures at month-end close.
The Makro Middleware platform runs in production today. SAP S/4HANA plugs into it as a first-class adapter, its path fully mapped against SAP's released OData surface.
Business partners, products, ATP inventory and pricing are read out of SAP and pushed to Shopify. The storefront never writes to the ledger. Orders are the only thing that travels both ways, and a Shopify order becomes a full SAP document chain.
System of record
read · never overwritten
The platform
map · reconcile · audit
The storefront
where buyers self-serve
API_BUSINESS_PARTNER, API_PRODUCT_SRV, API_MATERIAL_STOCK_SRV, read out of SAP and normalized before they reach Shopify.SAP → MKAPI_SALES_ORDER_SRV only supports a deep insert: header plus line items plus partners plus pricing together. A header-only create is not supported.Shopify ↕ SAPSAP_COM_0092) carries only the key, so the platform then calls the OData API for full state. Delta queries are the fallback.SAP → MKThere are three ways to connect Shopify to SAP S/4HANA: the official SAP Integration Suite accelerator, a third-party iPaaS connector like APPSeCONNECT, Celigo, or Alumio, and a custom-built integration maintained by a Shopify Plus development partner. The right method is decided by S/4HANA edition, B2B pricing complexity, and how many plants and company codes route through your store, not by price alone.
Option 01
SAP's own "Shopify Integration with SAP S/4HANA Cloud" package on the Business Accelerator Hub. A template set of Cloud Integration iFlows, B2C-first, competent on the happy path.
Right for standard order-to-cash on S/4HANA Cloud Public Edition where the B2C happy path is enough.
Option 02
Subscription middleware on a shared platform with pre-built SAP adapters. Strong for templated multi-system sync across many endpoints.
Right for templated multi-system sync where the SAP B2B logic fits a fixed-mapping template.
Option 03 · our build
Built around your exact order flow and SAP configuration, owned by you, operated with a support agreement. Where Plus and B2B manufacturers end up.
Right for B2B condition pricing, multi-plant inventory, company-code routing, on-prem or Private Cloud S/4HANA, or high B2B complexity a fixed-mapping connector cannot model.
SAP S/4HANA ⇄ Shopify integrations break at the same predictable points. The official accelerator and most iPaaS templates handle the happy path and skip these. A custom middleware layer is built to handle all of them, explicitly.
SAP price is a runtime computation over the condition technique: customer-, material-, and scale-based condition types, resolved per order type and customer. Shopify Plus B2B resolves by a fixed price-list entry on the buyer's catalog. These are structurally different, and standard connectors skip the mapping. We flatten the right condition level into a Shopify catalog per company.
→ explicit mapping per condition type, plus live checkout simulationInventory in S/4HANA is managed at the plant level, and API_MATERIAL_STOCK_SRV returns physical stock that is read-only and ignores open orders. Publish that and you oversell. The sellable number is the ATP availability-check quantity, a dynamic projection, mapped per plant and storage location to a Shopify Location.
Orders route through company codes, and the same SKU legitimately carries a different price, tax, and even pricing procedure across sales organizations. The middleware must send the correct sales-area context on every call, or it gets a valid price that is the wrong price. A generic connector does not model this.
→ correct sales-area context on every callSAP holds a condition currency per record distinct from the document currency, and converts between them using a configured exchange-rate type after the multiplication. A nightly sync against converted prices lags the true rate and produces penny variances. We let SAP resolve the price in the document currency rather than re-implement SAP's conversion and rounding.
→ SAP resolves the document-currency price by simulationA plain OData POST is not idempotent: a retry after a timeout creates a second sales order, and SAP assigns the document key itself. The Shopify order id rides in PurchaseOrderByCustomer as a correlation field, not a dedup guarantee. Reliable idempotency needs a middleware idempotency-key store with a unique constraint.
SAP publishes no universal requests-per-second limit; it gives per-API parallelism guidance and hard limits, including a custom OData fetch ceiling of 5,000 records that cannot be raised. Sustained over-calling can get API access temporarily blocked. A connector that hammers SAP on every page view hits this. We design with backoff, events, and scheduled deltas from day one.
→ exponential backoff, events over polling, scheduled deltasEvery sync, every failure, every reconciliation is visible. This is the same Makro Middleware console your team would watch in production. Move through the views.
| Time | Entity | Error class | Attempts | Next | Action |
|---|---|---|---|---|---|
| 08:13:04 | sales order · 0000010288 | PERMANENT · validation | 3 / 3 | held | Inspect |
| 07:55:22 | business partner · 1000910 | TRANSIENT · timeout | 2 / 5 | 09:50 | Retry now |
| 06:40:11 | product · MAT-44120 | RATE_LIMIT · paced | 1 / 5 | paced | Inspect |
Every record carries three identities at once. The middleware reads this row before every write and decides create, update, or skip.
Sync a record twice and it updates. SAP owns the document key, so the Shopify order id rides in PurchaseOrderByCustomer as correlation while the platform dedupes on its own key. This is what stops duplicate business partners and double-posted orders before they reach your ledger.
Change detection runs on the stored checksum, so a catalog of 50,000 materials with 12 real edits syncs 12 records, not 50,000.
entity key map · every id matched before write
Ten engineered subsystems carry every SAP S/4HANA ⇄ Shopify build. The sync engine, mapping layer, error handling and Shopify integration never change when a new ERP plugs in.
01 / 10
Every reality below is verified against a primary SAP source or a named vendor or Shopify doc. This is the difference between a team that read the marketing and a team that shipped against the documentation.
API_SLSPRICINGCONDITIONRECORD_SRV returns, in SAP's own words, "stored condition records and their structural metadata only, not resolved or effective prices." To get the real number you resolve it in SAP via API_SALES_ORDER_SIMULATION_SRV, or flatten the cube into Shopify price lists at sync time.available. API_MATERIAL_STOCK_SRV returns physical stock and is read-only; unrestricted-use stock ignores open sales orders, deliveries, and future receipts and oversells. The sellable number is the ATP availability-check quantity (warehouse stock plus planned inward minus planned outward), a dynamic projection, mapped to Shopify available.TAXUSX). Point both sides at the same engine so the rates reconcile.PurchaseOrderByCustomer, where you carry the Shopify order id, is a correlation field, not a dedup guarantee. Reliable idempotency needs a middleware idempotency-key store with a unique constraint, a GET-before-POST key check for master data, or external number ranges.API_SALES_ORDER_SRV only creates a header with its line items, partners, and pricing in one transactional POST. A header-only create is not supported. And the order cannot stand alone: SAP turns it into a document chain (sales order, outbound delivery, goods issue, billing document), with returns referencing back up the chain.YY1_ namespace) enabled on an extensible, released OData API and published joins that service's metadata and its GET, POST, PATCH bodies, with no new endpoint. The middleware just re-reads metadata and adds a mapping. Whole new entities (Custom Business Objects, RAP services) are the exception that needs a dedicated endpoint wrapped in a Custom Communication Scenario.It is classified before it is retried, and nothing disappears into a log file. Colour carries the verdict: amber arrives and is sorted, teal retries, red is held, green replays and reconciles.
A deep-insert order write to SAP times out, or a master-data record fails to write to Shopify. Instead of disappearing into a log, it enters the pipeline.
capturedEvery failure is sorted before anything is retried, so a bad record never loops forever and a duplicate order is never created by a blind retry.
classifiedTimeouts and SAP throttle responses retry with exponential backoff and pacing, automatically, deduped against the idempotency key so the order writes once.
retryingA validation or permission failure routes straight to the dead-letter queue for review. It is never retried blindly or lost.
held for reviewFix the cause, replay from the queue. A daily reconciliation pass catches anything the live path missed.
replayed · reconciledSAP and Shopify secrets are held as encrypted fields, isolated per tenant and rotatable without downtime. No credential sits in plaintext, anywhere.
encrypted · rotatableEvery Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id, so a replayed webhook cannot create a second order.
verify · dedupeThe integration authenticates as a single Communication User over OAuth 2.0 client credentials or X.509 mTLS, scenario-scoped to the whitelisted commerce APIs. On-prem, least-privilege is scoped at S_SERVICE per OData service and S_RFC per BAPI, never wildcarded, never SAP_ALL.
An append-only audit trail logs every operation, source-tagged, so you can prove what happened during month-end close.
audit · source-taggedThe details that separate a team that read the docs from a team that shipped against them. Open any one.
Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The platform runs in production today against NetSuite. SAP S/4HANA is a registered target on that same framework, its path fully mapped against SAP's released OData surface: the deep-insert order model, the condition-technique pricing engine, ATP-per-plant inventory, and the communication-scenario access gate.
We say this plainly: the credibility is a real platform in production and a precisely understood, docs-backed S/4HANA path, not a live SAP deployment behind us yet. That distinction is exactly what your architect can verify, which is why we lead with it. The rest is an engagement away.
An SAP S/4HANA ⇄ Shopify Plus build lands in one of three bands depending on edition, B2B pricing complexity, the number of plants and company codes, and how many of the break points above are in play.
Band 01 · foundation
templated · standard order-to-cash
Band 02 · B2B custom
Shopify Plus B2B · condition pricing
Band 03 · multi-entity
multi-plant · multi-company-code
We price an SAP S/4HANA integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever. For market context, a templated accelerator or iPaaS path can go live in days to a few weeks for standard order-to-cash but carries an SAP Integration Suite or BTP subscription, while a fully custom build that handles condition-record pricing, multi-plant inventory and B2B contract logic commonly runs ~10 to 16 weeks. Your exact figure is scoped to the band and the break points in play, and we put it in writing before anything starts.
Test suite · run on every changeAutomated tests across 139 suites, run on every change. Counted in the repository, not rounded for the slide. No code reaches your production data without passing them.
Coverage gate enforced before any deploy.
End-to-end browser tests, Chromium, Firefox, WebKit.
Failure classes, each with its own pre-decided policy.
Credentials stored in plaintext, anywhere, ever.
This is our NetSuite and Salesforce work; the SAP S/4HANA path is built on the same platform and the same engineering standard. For Clarius, Makro built a unified account page integrating NetSuite ERP, Salesforce CRM and Shopify Plus into a single view of orders and invoices across three enterprise systems, with Shopify Flow automation feeding order data into the ERP, eliminating manual order entry and reducing operational costs by over $100,000 annually. It is evidence that Makro builds reliable multi-system ERP to Shopify integrations.
A real conversation about your S/4HANA edition, your condition pricing, your plants and company codes, and the three sharp questions you already have.