See all services Shopify Plus Partner

Integration · Makro Middleware

SAP Business One Shopify Plus

SAP Business One ↔ Shopify Plus integration, built as custom middleware. Your ERP stays the system of record. Shopify Plus becomes where the order gets placed.

SAP B1 system of record Middleware map · reconcile · audit Shopify Plus buyer self-serve
Live sync feed prod · northside
SAP B1 → Shopify · one wayOrders travel both ways

The real problem

SAP B1 runs the business. The store runs the customer. The work is the space between.

Finance, inventory, pricing and order management on one side, B2B buyer self-serve on the other. The work is everything in the middle.

01 / backbone

SAP B1 is the ledger

Items, pricing, inventory, business partners, and orders. The authoritative record the business is run on.

02 / front door

Shopify is self-serve

Where B2B buyers place repeat orders without a phone call, a rep, or a re-keyed spreadsheet.

03 / the gap

The middle is where it breaks

Duplicate business partners. Orders written twice. Pricing that drifts. Silent failures at month-end close.

Our position

We built a product around that exact gap. SAP Business One plugs into it as a first-class, path-mapped adapter.

How the integration works (architecture)

One direction for master data. Both directions for orders.

Business partners, items, inventory and pricing are read out of SAP Business One and pushed to Shopify. The storefront never writes to the ledger. Orders are the only thing that travels both ways, and SAP Business One stays the source of truth.

System of record

SAP Business One

read · never overwritten

The platform

Makro Middleware.

map · reconcile · audit

The storefront

Shopify Plus B2B

where buyers self-serve

Master data: SAP B1 → Makro Middleware → Shopify, one way
Orders: Shopify → SAP B1, status returns
Service Layer · OData v4The primary surface at /b1s/v2, REST/JSON over OData v4. The same Service Layer runs on both the HANA and SQL Server editions, so the middleware is written edition-agnostic. OData v3 was deprecated as of FP 2405.SAP B1 ⇄ MK
DI API · DI ServerThe COM, Windows-side interface for on-box add-ons and heavy parallel back-loads. Used for initial bulk loads and pre-10.0 SQL installs where the Service Layer is not available.SAP B1 → MK
B1if · eventsThe Service Layer has no webhooks, so real-time runs through B1if. EventSender pushes changes out of SAP B1; a B1if inbound endpoint receives the Shopify legs. Steady sync polls with ge, not gt, because change timestamps are day-only precision.SAP B1 → MK
B1SESSION cookieCookie-session auth, not API keys or bearer tokens. A dedicated, least-privilege Indirect Access user logs in once; the session is pooled and reused, carrying both B1SESSION and ROUTEID.handshake
Orders entity setOrders captured in Shopify are written into SAP B1 as a sales order, status flows back. A webhook is HMAC-verified, deduplicated, GET-by-key then branched to PATCH or POST, and pushed once into the document chain.Shopify ↕ SAP B1

The console

This is not a connector. It is something you operate.

Every sync, every failure, every reconciliation is visible. This is the same Makro Middleware console your team would watch in production. Move through the views.

console.makro.agency / northside-industrial / sync
live
Sync Monitor
Sync Monitor Dead Letter Queue Observability Entity Key Map Schedules Order Relations
Records / 24h
48,210
across 9 entities
Queue depth
3 pending
2 retrying · 1 review
Avg latency
1.2s
event → Shopify
Last reconcile
04:00
0 drift detected
Activitylive · last 60s
Throughputrecords / hr
In queue
3
of 48,210 processed
Auto-retrying
2
transient · session
Needs review
1
permanent
Resolved / 24h
41
38 auto · 3 manual
Dead Letter Queuenothing is dropped in silence
TimeEntityError classAttemptsNextAction
08:13:04order · DocEntry 10288PERMANENT · −10 validation3 / 3heldInspect
07:55:22partner · CardCode C00910TRANSIENT · −5002 session2 / 5re-loginRetry now
06:40:11item · ItemCode A-44120−2028 LOCKED1 / 5backoffInspect
Sync volume7-day · records
Circuit breakersper endpoint
SAP B1 · Service Layerlast trip · never
closed
Shopify · Admin APIlast trip · 3d ago
closed
Shopify · Taxlast trip · never
closed
Uptime · 90 dayserror rate 0.03%
partner · Northside Westentity_key_map
SAP CardCodeC-004182
canonical8f2a-c1d9-4e07-44b0
U_ShopifyIdgid://shopify/Company/61…
checksuma91f… unchanged
versionv17
→ decision: SKIP · already in sync

Every record carries three identities at once: its SAP B1 key, a canonical id, and the Shopify GID stamped into a dedicated U_ShopifyId UDF. The middleware reads this row before every write and decides create, update, or skip.

SAP B1 has no native upsert, so the platform owns it: GET-by-key, then branch PATCH versus POST. Sync a record twice and it updates. 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 items with 12 real edits syncs 12 records, not 50,000.

Active schedules
7
all workflows enabled
Runs today
96
0 failures
Next run
09:46
inventory levels
Nightly batch
01:00
DI Server · 48,210 records
Workflowstenant · northside
Item delta syncService Layer · ge pollevery 15 min 09:38 · 142 recordsnext 09:53Run now
Inventory levelsOnHand − IsCommitedevery 5 min 09:41 · 3 SKUsnext 09:46Run now
Price resolutionGetItemPrice · per partnerhourly 09:00 · 1,204 rowsnext 10:00Run now
Business partnersService Layer · ge pollevery 15 min 09:40 · 6 recordsnext 09:55Run now
Order status returnSAP B1 → Shopifyevery 5 min 09:42 · 11 ordersnext 09:47Run now
Full catalog batchDI Server · parallel loadnightly · 01:00 01:00 · 48,210 recordsnext 01:00Run now
Daily reconciliationboth systems vs key mapdaily · 04:00 04:00 · 0 driftnext 04:00Run now
Shopify order#1042
gidgid://shopify/Order/57…
companyNorthside West
line 1A-99320 × 12
line 2A-44120 × 4
total$8,420.00
SAP B1 sales orderDocEntry 77231
DocEntry77231
CardCodeC-004182
line 199320 · qty 12
line 244120 · qty 4
statusopen · confirmed
Order journey#1042 → DocEntry 77231 · 5s end to end
09:42:04webhook received 09:42:04HMAC ✓ · dedup ✓ 09:42:05GET-by-key · POST 09:42:06pushed to SAP B1 09:42:09DocEntry 77231 open 09:42:09status → Shopify
drag, scroll, or use the tabs

Inside the platform

Feature by feature.

Ten engineered subsystems sit between SAP Business One and Shopify Plus. This is the machine, itemized. None of them is a setting you toggle, and each is something your team can watch run.

01 / 10

When a record fails

Integrations are judged by how they fail. Follow one failed SAP B1 write.

It is classified by SAP error code before it is retried, and nothing disappears into a log file. Colour carries the verdict: amber is sorted, teal retries, red is held, green replays.

01

It arrives

A sales-order write to SAP Business One fails. Instead of disappearing into a log, it enters the pipeline with its full context.

captured
02

It gets classified

Every failure is sorted by SAP error code before anything is retried, so a bad record never loops forever.

−5002 session−2028 lock−10 validation
classified
03

Transient retries

A −5002 session expiry re-logs in; a −2028 locked object backs off and retries, automatically, until it clears.

retrying
04

Permanent is held

A −10 validation error routes straight to the dead-letter queue for review. It is never retried blindly or lost.

held for review
05

You replay it

Fix the cause, replay from the queue. A daily reconciliation pass catches anything the live path missed.

replayed · reconciled

The ways to connect, and when each is right

SAP Business One has no native Shopify connector. So there are three real ways in.

SAP ships no first-party Shopify connector. Every working SAP B1 ⇄ Shopify integration is built a third way: a connector app, an iPaaS platform, or a custom build on SAP's Service Layer. The real decision is not native versus custom. It is which method fits your data, and who builds and owns the Shopify Plus storefront on top of it.

Connector appShopify App Store The visible App-Store option (for example, an eShopSync-class SAP Business One app) syncs items to products and item groups to categories, one way SAP B1 → Shopify. Fastest to stand up, but typically point-to-point and single-direction: no inventory levels, orders, customers, or payments. For low-volume catalogs only. simple catalogs
iPaaS platformAPPSeCONNECT · i95Dev · Celigo · Jitterbit A managed integration platform that brokers standard multi-system sync and the fastest go-live for a typical order-to-cash flow. The right call when the mapping is standard. The cost is a recurring platform fee that grows with volume, and the storefront is still yours to build. standard multi-system sync
B1ifSAP's own framework SAP's Integration Framework ships scenario packages and the real-time legs the Service Layer cannot do alone, since the Service Layer has no webhooks. EventSender pushes changes out; an inbound endpoint receives Shopify webhooks. A real option for event-driven sync, configured rather than coded. event-driven sync
Custom middlewareService Layer · Shopify Plus partner A custom build on SAP's Service Layer REST API, delivered by a Shopify Plus partner. Where Plus and B2B merchants end up when the storefront, Shopify B2B experience, customer-specific price lists, credit-limit enforcement, multi-warehouse stock, serialized or lot data, or a headless front-end is what makes or breaks the project. Owned by the merchant, not rented by the year. non-standard · B2B · headless

Where off-the-shelf connectors break

The failure modes no connector page admits.

The two systems model data differently, and that is where naive connectors fail. These are the gaps we design around from day one, not the ones we discover in production.

products-only · one way

The app syncs items, and nothing else

App-store connectors push items to products and item groups to categories, one way. No inventory levels, no orders, no customers, no payments. A products-only one-way app is a non-starter for a real order-to-cash flow.

delta trap

The day-only timestamp drift

The Service Layer reports change dates with day-only precision. A record edited several times in a day is reported once, so a gt-timestamp poll silently misses intra-day edits and drifts. Robust sync uses ge plus a fuller scan or B1if events.

no upsert

Duplicate orders on retry

SAP B1 has no native upsert and POST is not idempotent. Re-posting a partner with an existing CardCode returns −10. A naive retry on a timed-out write that actually committed creates the duplicate sales order the iPaaS vendors warn about.

session timeout

Login expires mid-fetch

Auth is a cookie session that times out after 30 minutes idle and returns −5002 on expiry. A long fetch that does not pool and reuse the session, carrying both B1SESSION and ROUTEID, fails partway through.

multi-warehouse

"Available to sell" is not stored

SAP B1 has no stored available field. You publish OnHand minus IsCommited per warehouse, mapped to Shopify locations that rarely match SAP warehouse codes. Sync raw OnHand and you sell stock already promised to other orders.

partial returns

One credit memo loses the line detail

SAP B1 is document-flow based and posted documents cannot be deleted. A connector that collapses a multi-line partial refund into a single credit memo silently mishandles the line detail and the order → delivery → invoice → return chain.

Claim vs reality

What you will hear, and what the docs say.

Every reality below is verified against a primary SAP or named-vendor source. This is SAP Business One, the SMB ERP, not SAP S/4HANA or ECC. That distinction is the first thing buyers get wrong.

01
The claim"SAP Business One has a native Shopify connector, just turn it on."
The realitySAP ships no first-party Shopify connector. It exposes only its developer interfaces: the modern Service Layer (REST/OData) on HANA and SQL (10.0+) and the legacy DI API. Every working SAP B1 ⇄ Shopify integration is built by a third party. The real question is which method fits the data, and who builds and owns the Shopify Plus storefront.
02
The claim"The SAP Business One Shopify app handles the whole store."
The realityThe visible App-Store option syncs items to products and item groups to categories, one way SAP B1 → Shopify only. It does not sync inventory levels, orders, customers, or payments. For a Shopify Plus order-to-cash flow, a products-only one-way app is a non-starter.
03
The claim"Just read the live customer price from SAP at checkout."
The realitySAP B1 does not store one price per customer. It stores a layered price cube and resolves the effective price only at document time across a five-level precedence. Call the ERP resolver CompanyService_GetItemPrice per partner, item and date, because the Service Layer cannot join tables.
04
The claim"GetItemPrice returns the full contract price, every discount included."
The realityGetItemPrice resolves the base price list and special prices, and blanket agreements via its parameters. Whether it fully reflects discount groups and period/volume discounts must be verified on the live instance. If a gap exists, fall back to a saved query or layer the math in middleware. Do not assume full coverage.
05
The claim"Sync stock on hand and you are done."
The realitySAP B1 has no stored available field. Availability is always computed. Publish OnHand − IsCommited per warehouse, never raw OnHand, or you sell stock already promised. IsCommited is a soft allocation, and real-time reservation (Advanced ATP) exists only on the HANA edition. Stock moves on the Delivery, not the order.
06
The claim"SAP Business One calculates your cart tax."
The realityCart-time tax should run in Shopify. Native B1 tax is a hand-maintained jurisdiction rate table, not rooftop-accurate, and a per-cart ERP round-trip is an anti-pattern given the cold-start. Enable "Allow External Calculation of Sales Tax" (9.3 PL11+) and write the Shopify-computed tax into the B1 document so B1 records, not calculates.
07
The claim"It is just a REST API, auth with a token like anything else."
The realityThere are no API keys and no persistent bearer tokens. Auth is cookie-session: POST /Login returns a B1SESSION cookie (plus ROUTEID) mandatory on every request, timing out after 30 minutes idle. First login is ≈5 s, warm calls ≈20 ms, so you must pool and reuse the session, not authenticate per call.
08
The claim"The connector will just upsert records, no duplicates."
The realitySAP B1 has no native upsert verb and POST is not idempotent. Re-posting a partner with an existing CardCode returns −10. The integration must own idempotency: probe by key, branch PATCH versus POST, use PATCH not PUT, and ETag/If-Match against concurrent edits.
09
The claim"SAP Business One has a rate limit you can tune against."
The realityThere is no published per-second rate limit and no throttling header. Governance is concurrency plus session reuse plus record locking, bounded by hardware, not a quota. SAP's own benchmark peaked at 6.7 tps. Treat it as scale-with-hardware, with bounded concurrency and error-class-aware retry.
10
The claim"A nightly changed-since delta sync keeps both systems in lockstep."
The realityThe Service Layer reports change dates with day-only precision, so a record edited several times in a day is reported once and a gt poll silently misses intra-day edits and drifts. Robust sync uses ge, pairs date-polling with a fuller scan or checksum, or taps B1if EventSender, because the Service Layer has no webhooks.
11
The claim"Your custom SAP fields will need custom API work."
The realityThe opposite. A UDF auto-flows into the same entity payload as an OData open-type dynamic property under its U_<name>: no SAP-side endpoint, no API code change. The one catch: UDFs are absent from $metadata, so discover them per company DB via UserFieldsMD. UDTs surface as U_<table> for free.
12
The claim"We will just use our existing SAP connector (Boomi / MuleSoft / CPI)."
The realityA connector that says "SAP" almost never means Business One. Boomi's standard SAP connector targets NetWeaver, R/3, S/4HANA via BAPIs, RFMs, IDocs. SAP Business One is not mentioned anywhere. Verify any "SAP connector" speaks Service Layer or DI, not BAPI/IDoc, before scoping.
13
The claim"HANA vs SQL Server does not matter, the API is the same."
The realityThe core CRUD object model is edition-portable, but real divergences exist: the Service Layer was historically HANA-only, SQL Server support arrived in 10.0 PL01, so a pre-10.0 SQL install may have no Service Layer. Advanced ATP is HANA-only; $apply aggregation is HANA, SQL Views are SQL. Confirm the edition and version.
14
The claim"Returns and a partial refund just map to one credit memo."
The realitySAP B1 is document-flow based, and posted documents cannot be deleted (DELETE returns −5006). Order → DeliveryNotes (goods issue) → Invoices; refunds → Returns/CreditNotes, reversed with the Close/Cancel actions. A connector that collapses a multi-line partial refund into one credit memo silently mishandles the line detail and the chain.

Security posture

Built to pass your review, and your SAP partner's questions.

Least-privilege access, verified inbound traffic, encrypted credentials, and a full audit trail. The questions your SAP consultant and your IT reviewer will ask, answered before they ask them.

Least-privilege access to SAP B1

The integration logs in as a dedicated Indirect Access user, never manager and never a Professional seat, with Full authorization only on the modules the sync touches and SAP B1's deny-by-default model for everything else. TLS 1.2/1.3, and a secure tunnel to on-prem.

B1SESSION · Indirect Access · deny-by-default

Inbound traffic is verified

Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id so a replay cannot create a second sales order.

HMAC · replay-safe

Credentials never in plain config

SAP B1 and Shopify secrets are encrypted with AES-256-GCM, keys derived per context, isolated per tenant and rotatable without downtime. Zero credentials are stored in plaintext, ever.

AES-256-GCM · HKDF · per-tenant

Everything is on the record

An append-only audit trail logs every operation, source-tagged, so you can prove what happened during close.

append-only · source-tagged

Frequently asked questions

Where SAP B1 integrations get hard, and where we land.

The details that separate a team that read the docs from a team that shipped against them. Open any one.

01How do you integrate SAP Business One with Shopify?+
SAP Business One has no native, first-party Shopify connector, so it's done one of three ways: a connector app from the Shopify App Store (fastest, but usually point-to-point and limited), an iPaaS platform like APPSeCONNECT, i95Dev, Celigo, or Jitterbit, or a custom build on SAP's Service Layer REST API delivered by a Shopify Plus partner. Because there's no native connector, most of the work is choosing the right method and building the Shopify storefront on top of it.
02Does SAP Business One have a native Shopify connector?+
No. SAP doesn't ship a first-party Shopify connector. It exposes developer interfaces: the modern Service Layer (REST API) on HANA and on SQL version 10, and the legacy DI-API on older SQL systems, and a third party builds the actual integration on top of them.
03What SAP Business One version and database do I need to integrate with Shopify?+
For the smoothest, fastest integration, run SAP Business One 10.0 or higher with the Service Layer (REST API) enabled. The Service Layer works on both the HANA and SQL versions of SAP B1. Version 9.x can integrate via the older DI-API, which adds a configuration step.
04How does real-time sync work between Shopify and SAP Business One?+
A proper integration is bidirectional and near real time, using the SAP Service Layer plus events. Shopify orders flow into SAP B1 as sales orders, SAP B1 in-stock quantity per warehouse pushes to Shopify so the catalog reflects real availability, customers and price lists sync, and returns and credit memos post back to SAP's financial modules. This prevents overselling and pricing drift.
05APPSeCONNECT vs i95Dev vs Celigo vs custom: which is best for SAP B1 and Shopify?+
An iPaaS (APPSeCONNECT, i95Dev, Celigo, Jitterbit) is the right call for standard multi-system sync and the fastest go-live. A custom Service-Layer build is worth it when the storefront, Shopify B2B experience, multi-warehouse stock, customer-specific price lists, or serialized/lot data is non-standard. The connector almost never decides the project: the storefront and B2B experience build does.
06Can a SAP Business One Shopify integration handle B2B?+
Yes. SAP B1 Business Partners map to Shopify B2B companies and SAP B1 price lists sync to Shopify B2B price lists for customer-specific pricing. The harder part is the storefront: surfacing customer-specific pricing, enforcing credit limits before order confirmation, capturing PO numbers and credit terms at checkout, and showing multi-warehouse stock. That experience layer is a Shopify Plus build, not something a sync alone delivers.
07Why do off-the-shelf SAP B1 Shopify connectors break?+
Most app-store connectors are point-to-point and single-direction (for example, products and categories only) and struggle under volume. The two systems also model data differently: a single Shopify product can map to multiple SAP B1 tables depending on whether the item is serialized, lot-tracked, or expiry-dated, and SAP warehouse codes rarely match Shopify location IDs. Those mappings have to be designed deliberately, which is where a custom build or a strong iPaaS plus a Shopify Plus partner is needed.
08Who builds Shopify Plus B2B storefronts on SAP Business One?+
Makro Agency is a Shopify Plus partner that builds the storefront and B2B buyer experience on top of a SAP Business One integration: selecting the right method (Service Layer, iPaaS, or custom) for brands whose B2B catalog, multi-warehouse setup, or order complexity has outgrown an off-the-shelf connector.
09Will rollout touch our production company database?+
Not until you decide it does. Master data syncs are read-only against SAP B1. Order writes go to a test company database first, then through a parallel-run with daily reconciliation. Posted documents in SAP B1 cannot be deleted, so we never write into production posting until the reconciliation report says zero drift and you sign off. The append-only audit trail covers every record from day one.
10What do you need from our team?+
Three things: a dedicated Indirect Access Service Layer user with least-privilege authorizations, access to a sandbox or test company database, and your SAP B1 consultant in the entity-mapping workshops. Your SAP partner is welcome in every session. We would rather they ask hard questions early, especially about your price lists and warehouse setup.
11Are we locked into a black box?+
No. On the SAP B1 side we use standard surfaces only: the Service Layer, DI API, and B1if. Nothing proprietary gets buried in your ERP. The middleware is our platform, but your data, your field mappings, and the full audit trail are yours, documented and exportable, and the deployment is owned by you, not rented by the year. The thing we sell is the opposite of lock-in.

The framework underneath

A proven platform. SAP Business One is a fully mapped adapter.

Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The platform runs in production today for NetSuite. SAP Business One has a fully mapped Service-Layer-first path against the same framework, against the real transports in this research: the Service Layer, DI API, B1if, and the B1SESSION cookie.

We say this plainly: NetSuite is the live production deployment. SAP Business One is path mapped, a precisely understood Service-Layer path, not a decade of B1 traffic. That distinction is exactly what your architect can verify, which is why we lead with it.

adapter contractbase.ts
01authenticate()B1SESSION cookie
02fetchMasterData()Service Layer / DI
03pushOrder()Orders entity
04validate()schema check
05report()audit + status
NS
NetSuite
ERP adapter
middleware in production
B1
SAP Business One
ERP adapter
path mapped

Proof, the replatforms we've run

Claims you can check.

Makro is a Shopify Plus partner. We have unified ERP, CRM and Shopify before: for Clarius we built a single account page over NetSuite ERP, Salesforce CRM and Shopify Plus, with Shopify Flow feeding orders into NetSuite. That is adjacent proof, NetSuite and Salesforce, not SAP Business One. The numbers below are the platform's checkable engineering standard, in production for NetSuite.

Test suite
1,756

Automated tests across 139 suites, run on every change. No code reaches your production data without passing them. Counted in the repository, not rounded for the slide.

85%

Coverage gate enforced before any deploy.

39

End-to-end browser tests across Chromium, Firefox, WebKit.

7

Failure classes, each with its own pre-decided policy.

0

Credentials stored in plaintext, anywhere, ever.

How long it takes and what it costs, honest bands

The connector is rarely the cost driver. The storefront is.

For market context: off-the-shelf connectors start around $99 per month, and packaged setups land in a roughly $15K–$40K range. That is the connector and iPaaS market anchor, not our quote. The point those numbers make is the one most buyers miss: the sync is rarely what the budget goes on. The Shopify Plus storefront and B2B experience build is.

Tier 1 · standard sync

Connector or iPaaS

scoped per build

Items, inventory and orders over a standard mapping, on an iPaaS or a connector app, with a modest Shopify Plus storefront. The right call when the data model is standard and the catalog is not exotic.

  • OnHand − IsCommited inventory, per warehouse
  • Orders → sales orders, status return
  • Business partners and base price lists

Tier 2 · custom B2B

Custom Service-Layer middleware

scoped per build

A custom build on the Service Layer for merchants whose B2B catalog, customer-specific pricing, credit-limit enforcement or multi-warehouse stock has outgrown an off-the-shelf connector. The owned-platform option.

  • GetItemPrice-resolved customer pricing
  • Business Partners → Shopify B2B companies
  • Credit limits and PO numbers at checkout

Tier 3 · headless / multi-store

Custom + storefront build

scoped per build

One SAP B1 instance feeding multiple Shopify stores and Shopify Markets regions, routed by currency, warehouse and price list, with serialized or lot data and a headless or multi-region front-end.

  • Multi-store, multi-region catalog segmentation
  • Serialized / lot / batch-tracked items
  • B1if event-driven near-real-time sync
Cost · scoped per build

Every Makro engagement is scoped per build and priced as an engineering engagement: a build with a support agreement, owned by you. No per-record meter, no platform seat. The market figures above are context for where connectors and iPaaS sit, not our number. We set yours from your actual SAP B1 environment, your catalog, and the B2B experience you need.

Bring your SAP Business One consultant and your renewal quote. We will walk the platform, not a deck.

A real conversation about your SAP B1 environment, your edition and version, your price lists and warehouses, and the three sharp questions you already have.

sap-business-one / final