h1

Integrating Adobe Commerce with SAP ERP means solving for data ownership, sync patterns, real-time pricing, and catalog segmentation — before writing a single line of code. This article covers material data synchronization, ATP availability checks, order simulation pricing, and how Commerce's native B2B features map onto the workflows SAP-driven enterprises already run.

B2B commerce sits at the intersection of two competing pressures: buyers want a self-service experience that matches B2C convenience, while enterprises need the operational control, pricing governance, and ERP integration that comes with decades of business process investment. Nowhere is this tension more visible than in SAP-driven organizations.

SAP is the backbone for many mid-market and enterprise manufacturers, distributors, and wholesalers. It holds the authoritative data for products (called materials in SAP terminology), pricing conditions, customer master records, and inventory. When a company decides to open a digital storefront using Adobe Commerce, the integration challenge is not just technical — it’s about deciding which system owns what, how data flows in each direction, and where business logic lives.

In a recent implementation for a mid-market industrial supplier, the project team spent the first two weeks not writing a single line of integration code, but mapping out exactly those questions. That investment paid off significantly later.

Designing the system landscape

Before writing an API call or configuring a data feed, you need a clear picture of your system landscape and its responsibilities.

In SAP, product data is called material master data. It contains far more than a product name and price — it includes units of measure, plant assignments, material groups, and procurement types. Adobe Commerce has its own product catalog with its own attribute model. The integration is not a one-to-one copy; it is a deliberate translation that maps SAP material fields to Commerce product attributes.

A typical landscape for this kind of project has three tiers. SAP ERP holds Material Master (MM), Customer Master and Pricing Conditions (SD), ATP checks, and Sales Orders. An integration middleware layer — built on App Builder, MuleSoft, or a custom API layer — orchestrates batch sync for catalog and customer data, event-driven updates for inventory and pricing, and real-time API calls for ATP checks and order simulation. Adobe Commerce sits at the front end, serving Company Accounts, Shared Catalogs, Purchase Orders with approval rules, and Negotiable Quotes to buyers.

Default alt

NOTE
Deployment model: The patterns described in this article apply primarily to Adobe Commerce PaaS (Cloud). Adobe Commerce as a Cloud Service (SaaS/ACO) introduces a different catalog architecture where some of these constraints — particularly around local SKU ingestion — may differ. Confirm your deployment model before designing the integration. Even with real-time pricing and ATP, the product catalog must exist locally in Adobe Commerce PaaS; Commerce cannot act as a pure rendering layer without local SKU creation.

The middleware layer is critical. Direct point-to-point connections between SAP and Adobe Commerce tend to become brittle over time, especially when SAP release cycles and Commerce upgrade cycles are not aligned. A decoupled, event-driven approach — where SAP publishes changes and Commerce subscribes — is significantly more resilient.

TIP
Treat the middleware layer as a first-class architectural concern, not an afterthought. The integration layer will outlast your initial Commerce version and potentially your SAP release. Design it to be independently deployable and testable. If SAP Business Technology Platform with Integration Suite is within budget, it is worth evaluating as a managed middleware option.

Data flow and synchronization

With the system landscape defined, the next question is: what moves between systems, in which direction, and how often? There are two broad patterns, and the right choice depends on your data volume and how time-sensitive accuracy needs to be.

Batch synchronization is the simpler pattern. SAP exports material data — descriptions, attributes, units, classification — on a scheduled basis (typically nightly or hourly), and the middleware transforms and imports it into Adobe Commerce. This works well for product catalog data that doesn’t change minute-to-minute. The risk is stale data: if a material is discontinued in SAP at noon but the next sync runs at midnight, customers can place orders for unavailable products.

Event-driven synchronization is more complex but more accurate. When a material record changes in SAP — a new product is created, a price condition updated, a customer account modified — SAP fires an event that middleware picks up and relays to Commerce in near-real time. This requires either SAP’s IDoc/BAPI/RFC infrastructure or, in newer S/4HANA environments, the SAP Business Technology Platform event mesh.

In practice, most implementations use a hybrid: batch for catalog data (which tolerates some lag), and event-driven or real-time API calls for inventory and pricing (which must be accurate).

Data domain
Direction
Pattern
Tolerance for lag
Material master
SAP → Commerce
Batch (hourly/nightly)
High — tolerates lag
Customer master
SAP → Commerce
Batch (hourly/nightly)
High — tolerates lag
Stock / inventory
SAP ↔ Commerce
Event-driven / Real-time
Low — must be accurate
Pricing conditions
SAP ↔ Commerce
Event-driven / Real-time
Low — must be accurate
Sales orders
Commerce → SAP
Real-time on submit
None — immediate
NOTE
Depending on the business model, the data domains and directions in this table may vary.

Customer data flows similarly. SAP customer master records contain the SAP customer number, payment terms, credit limits, and purchasing organization. These map to Company Accounts in Adobe Commerce B2B, which serve as the central organizing entity for all B2B features. Synchronizing the SAP customer number into a custom attribute on the Commerce company account is the key that ties orders placed in Commerce back to the correct SAP customer record downstream.

TIP
Store the SAP customer number as a dedicated attribute on the Adobe Commerce company account from day one. Every order, quote, and invoice will reference it. Retrofitting this mapping after go-live is painful.

Real-time availability with SAP ATP checks

One of the most impactful — and most misunderstood — integration points is inventory availability.

Adobe Commerce has its own stock management (Multi-Source Inventory), and you can import static stock figures from SAP in batch. But for B2B customers ordering large quantities of industrial goods, “we have 500 units” is not enough. They need to know: can you promise me 500 units by next Thursday?

That question is answered by SAP’s Available to Promise (ATP) check, part of the Materials Management (MM) and Sales & Distribution (SD) modules. An ATP check does not just look at on-hand stock — it considers open sales orders, planned production runs, incoming purchase orders, and warehouse lead times to calculate a realistic availability date.

Integrating real-time ATP into Adobe Commerce requires a custom call from the storefront to the middleware, which then calls SAP’s BAPI BAPI_MATERIAL_AVAILABILITY (or the equivalent RFC in S/4HANA). The response is not a simple yes/no — it includes a confirmed quantity and a confirmed delivery date, which can be surfaced directly in the product detail page or cart.

NOTE
ATP batching is custom: Adobe Commerce has no native support for ATP batching or caching at cart level. Both must be implemented as custom integration logic in the middleware layer. Additionally, order simulation typically adds 300–900ms or more per call depending on SAP system architecture and network topology. Design and test for this latency explicitly — do not assume it will be negligible.

In a deployment for a European chemical distributor, surfacing confirmed delivery dates in the cart reduced inbound phone calls from buyers asking “when will it arrive?” by over 40%. The buyers trusted the date because it was calculated by SAP in real time, not estimated by a marketing team.

The tradeoff is performance. Each ATP call adds latency. The solutions are caching (short-lived, for items where stock doesn’t fluctuate wildly) and batching (a single ATP call for all items in the cart rather than one per line item). Design this carefully — a checkout that takes 8 seconds because it fires 12 sequential ATP calls is worse than no ATP check at all.

TIP
Batch ATP checks at cart level, not per product page view. A single SAP call with a list of materials and quantities is orders of magnitude faster than individual calls per product. Cache results where possible for a short TTL (2–5 minutes) to balance accuracy with performance

Approval workflows and dynamic pricing via order simulation

B2B pricing is almost never a flat price list. SAP’s pricing conditions model supports layered discounts: base price, customer-specific conditions, volume scales, contract pricing, regional surcharges, and more. Recreating this logic inside Adobe Commerce — either in Shared Catalogs or custom price rules — is technically possible but creates two sources of truth that inevitably diverge.

The cleaner pattern for price-sensitive B2B is SAP order simulation. Rather than importing prices into Commerce, the Commerce cart sends a simulated order to SAP (via BAPI_SALESORDER_SIMULATE or the S/4HANA equivalent). SAP runs its full pricing engine — applying all conditions, discounts, and rules — and returns the final calculated price for each line item. Commerce displays that price to the buyer.

Default alt

NOTE
Order simulation requires custom integration: Adobe Commerce does not provide native UI components or hooks for SAP pricing simulation on product listing pages, product detail pages, cart totals, or Shared Catalog price display. Surfacing simulation results in Commerce requires custom front-end development and middleware orchestration for every touchpoint where price is displayed. Plan this scope explicitly — it is not a configuration exercise

The downside is latency and dependency: if SAP is unavailable, the storefront cannot show prices. A fallback strategy — cached last-known prices, or a degraded mode — is mandatory in production.

In a large-scale implementation for a German industrial distributor with over 80,000 active customer accounts, order simulation replaced a complex price import process that had required nightly reconciliation jobs and still produced mismatches on approximately 2% of orders. After switching to real-time simulation, pricing discrepancies dropped to near zero, and the reconciliation jobs were decommissioned entirely.

Adobe Commerce’s native Negotiable Quotes feature maps naturally onto this pattern. A buyer can request a quote from the cart; the seller initiates a simulation in SAP to get an accurate price before responding; and the negotiated quote is confirmed back through Commerce. The full negotiation history — including line item discounts and counter-offers — is tracked within Commerce, while the final pricing logic lives in SAP.

For purchase order workflows, Adobe Commerce’s native approval rules handle the internal governance: who can approve what, at what order value, and what the escalation path is. Once a PO is approved in Commerce, the order is transmitted to SAP SD where it becomes a confirmed sales order. The Commerce PO number is stored as the SAP purchase order reference, providing a traceable link between the two systems.

Custom catalogs and company hierarchies

SAP’s customer master supports sales areas, distribution channels, and pricing groups — it already models the fact that different customers get different products at different prices. Adobe Commerce’s Shared Catalogs are the native mechanism for expressing this on the storefront.

A Shared Catalog is assigned to one or more Company Accounts. Each catalog can contain a custom subset of products and fixed pricing per SKU. A large industrial manufacturer might have 15,000 SKUs in SAP but only 400 of them relevant to a specific distribution partner. That partner’s Shared Catalog contains exactly those 400, at pricing derived from SAP conditions via the integration layer.

NOTE
Shared catalog pricing limitations: Shared Catalog custom pricing is limited to simple fixed prices per SKU. SAP pricing logic — conditions, scales, volume discounts, customer-material info records, VKORG/VKGRP condition records — cannot be replicated natively in Shared Catalogs. Complex pricing must be resolved in SAP (via order simulation or a pricing export) and written into Commerce as flat values. If your SAP pricing model relies on stacked conditions or graduated scales, plan for middleware to handle the resolution before Commerce receives the price

When combined with Company Hierarchies, organizational grouping becomes manageable at scale. A parent company can have subsidiaries, each mapped to their own SAP sales organization — yet all visible from a single Commerce admin. The parent company administrator can view and manage company accounts for all assigned subsidiaries, mirroring the high-level organizational model that SAP’s enterprise structures already represent.

NOTE
Company hierarchy limitations: Company Hierarchies are available from Adobe Commerce B2B 1.5+ and are not universally deployed across all customer installations — confirm availability in your version before designing around this feature. Critically, Company Hierarchies in Adobe Commerce do not automatically propagate Shared Catalog assignments, pricing, or credit limits to child company accounts. There is no inheritance model. Each Company Account must be assigned its own Shared Catalog, pricing configuration, and credit limit individually, regardless of its position in the hierarchy. The hierarchy provides organizational visibility and parent-level account management — it does not replicate SAP’s sales-area inheritance model.
NOTE
Shared catalogs and SAP sales areas: Shared Catalogs can approximate SAP customer segmentation — product visibility and contract pricing per customer group — but they do not mirror SAP’s SD structure (Sales Organization + Distribution Channel + Division). SAP condition records, pricing groups, and distribution chain logic cannot be modeled natively in Commerce. Additional integration logic in the middleware layer is required to translate SAP sales area assignments into the correct Commerce catalog and pricing configuration.

In a deployment for a multinational packaging group with subsidiaries in six European markets, each country entity had its own SAP sales organization with distinct pricing agreements. Mapping these to individual Commerce Company Accounts under a single parent hierarchy allowed the central procurement team to monitor spend across all entities while each subsidiary’s buyers saw only their own contracted assortment and prices — with pricing resolved via SAP and written to each catalog individually.

The mapping work is non-trivial. SAP sales areas (Sales Organization + Distribution Channel + Division) do not map one-to-one to Commerce company accounts or Shared Catalogs. You will need a deliberate mapping document before any configuration begins.

TIP
Build a mapping matrix before configuration: SAP Customer Number → Commerce Company Account → Shared Catalog → Pricing Source. For every B2B buyer, this matrix should have a single, unambiguous row. Ambiguity here causes pricing errors in production that are very hard to diagnose.

Key takeaways

Actionable next steps

  1. Document your SAP system landscape first: which modules are active (MM, SD, FI), what RFC/BAPI versions are available, and whether you are on ECC or S/4HANA. This determines which integration patterns are available to you.

  2. Confirm your Adobe Commerce deployment model — PaaS, SaaS, or ACO — before designing the integration. Catalog architecture and the requirement for local SKU ingestion differ across deployment types.

  3. Build the customer and material master mapping matrix before any Commerce configuration. For every B2B buyer: SAP Customer Number → Commerce Company Account → Shared Catalog → Pricing Source. One unambiguous row per buyer.

  4. Decide your synchronization pattern for each data domain — catalog, inventory, pricing, customers, orders — and document your tolerance for lag per domain before any middleware development begins.

  5. Prototype the ATP call pattern early in a sandbox to validate latency. Design your batching strategy (one cart-level call, not per-product calls) and caching TTL before storefront development begins. Plan for 300–900ms or more per simulation call in your performance budget.

  6. Define your fallback strategy for SAP unavailability before go-live: what does the Commerce storefront show for pricing and availability when SAP is not reachable? Cached last-known prices or a degraded mode are both valid approaches — the absence of a strategy is not.

  7. Enable the Adobe Commerce B2B feature set and configure Company Accounts, Shared Catalogs, and Purchase Orders in sequence. Verify your Commerce version includes Company Hierarchies (B2B 1.5+) before building organizational structure that depends on it.

  8. Run end-to-end order simulation tests covering the full quote-to-order-to-SAP-sales-order flow before User Acceptance Testing begins.