Pick a B2B ecommerce platform by scoring six workflows — quote negotiation, order approvals, contract pricing, account hierarchy, credit terms and ERP synchronisation — against the exact edition that contains them, and the field sorts itself into three tiers. OroCommerce 6.0 and Adobe Commerce 2.4.8 with the B2B extension 1.5.x ship the workflows complete, commercetools and Spryker deliver them as commercial API services, Shopware 6.7.x gates them behind paid plans, and Sylius 2.0.x, Vendure 3.x and Virto Commerce platform 3.x supply primitives to build them. Everything below is pinned to those version lines, with documentation captured on 2026-07-27 for the two platforms that release continuously.
The six B2B workflows that decide an ecommerce platform choice
A B2B account is a company, not a person. Multiple buyers act under one legal entity, each with a role, a spending limit and access to prices that entity negotiated — a structure with no B2C equivalent. That is why comparisons derived from B2C review templates never model the features that actually decide a B2B platform choice: those features live in workflows B2C stores do not have.
Checkmark parity across incompatible operating models is the mechanism behind bad picks. “Quotes ✓” means five different things in this pool: a licence-gated negotiation workflow (Adobe Commerce B2B), a free-core workflow engine (OroCommerce), a plan-gated commercial component (Shopware), an API primitive you assemble into a storefront (commercetools), or a framework capability you build yourself (Sylius, Vendure). A row of identical checkmarks flattens exactly the differences that determine cost and timeline.
This comparison scores platforms against six working definitions. A workflow counts as supported only if the platform ships the minimum behaviour listed:
- Quote negotiation — a buyer requests pricing on specific items, the seller responds with amended prices or terms, at least one counter-round is possible, and an accepted quote converts to an order at the quoted prices. A contact form is not a quote workflow.
- Order-approval chains — configurable rules (order total, buyer role, budget) hold an order until a designated approver acts, with approval and rejection recorded against the order.
- Contract-priced catalogues — prices negotiated per account resolve automatically once the buyer signs in — in listings, cart and checkout — without coupon mechanics.
- Account hierarchy — a company entity holds multiple buyer users with roles and permissions, ideally with child units inheriting terms from the parent.
- Credit terms — buyers order on account against a limit with a tracked balance, or under negotiated payment terms, and the arrangement changes what checkout offers.
- ERP synchronisation — prices, inventory and customers can be written in bulk, and orders read out through events; scored as an API surface, never as a connector list.
The rest of the article executes this framework: it fixes each platform’s edition boundary, scores all nine in one labelled table, examines the two workflows where architectures diverge most, and closes with per-platform verdicts plus a list of what was not tested.
Editions and licences: where each platform’s B2B features actually live
Adobe Commerce 2.4.8 ships companies with roles, shared catalogs carrying per-company prices, negotiable quotes, purchase orders with approval rules, and company credit — all inside the separate B2B extension 1.5.x (opens in a new tab), available only with the paid Adobe Commerce licence. Magento Open Source 2.4.8 (opens in a new tab) is the same core codebase with none of these modules. The boundary is enforced at the package repository, and you can reproduce it on an Open Source install whose auth.json holds Open Source access keys:
composer require magento/extension-b2b:^1.5 --with-all-dependenciesExpected output:
Shopware’s B2B components — employee management, quote management and order approval — arrived incrementally across the 6.5–6.7 release line as commercial components documented in the Shopware docs (opens in a new tab), and the plan matrix (opens in a new tab) determines which paid plan carries which component. A self-hosted install of the free Community edition boots with no quote, approval or employee screens in the admin.
OroCommerce 6.0 models B2B in its core domain: corporate accounts with hierarchical children, role-based customer users, requests for quote with negotiation, price lists targetable by customer, group and website, payment terms, a configurable workflow engine and built-in CRM, per the OroCommerce documentation (opens in a new tab). The source repository (opens in a new tab) is public. Note that 6.0 is no longer the current line: Oro’s release process page (opens in a new tab) puts 7.0 LTS at March 2026, and because Community Edition patches run for only twelve months after a release, the 6.0 CE line stopped receiving them in March 2025. Enterprise support for 6.0 runs to March 2028. The precise CE-versus-EE module boundary is not stated in the public documentation — oroinc.com refused automated fetches during this pass — so confirm it with Oro directly rather than from this article.
commercetools is usage-priced SaaS under quote-based contracts, with B2B as first-class API objects — Business Units, Associates, Quotes, Approval Rules and Approval Flows — per its documentation (opens in a new tab); the storefront is the implementer’s job. Spryker is commercial and quote-priced, with company accounts, business units, RFQ and approval processes documented in the Spryker docs (opens in a new tab); it versions releases by date, so record the exact release identifier at capture. Sylius 2.0.x (opens in a new tab) is an open-source core with a separately scoped commercial Sylius Plus (opens in a new tab) edition, while Vendure 3.x (opens in a new tab) and Virto Commerce platform 3.x (opens in a new tab) are open-source frameworks.
Every edition label used in the table below is the one fixed here, captured 2026-07-27.
You should now see: which edition, plan or licence contains each platform’s B2B features — and a first-hand check for the Adobe boundary, since the metapackage request against Open Source keys ends in a refusal from repo.magento.com, not an install.
Nine B2B ecommerce platforms scored on six workflows in one labelled table
Every cell uses one four-value scale. Built-in means the workflow ships working in the exact edition named in the row. Paid means it exists only behind a paid plan, licence or commercial component. Assemble means the platform ships first-class API objects or framework primitives and your team implements the workflow. Absent means there is nothing to configure or assemble in that edition.
| Platform (edition as fixed above) | Quotes | Approvals | Contract pricing | Hierarchy | Credit | ERP surface | Captured |
|---|---|---|---|---|---|---|---|
| Adobe Commerce 2.4.8 + B2B 1.5.x | Paid¹ | Paid¹ | Paid¹ (shared catalogs) | Paid¹ | Paid¹ (platform ledger) | Assemble (REST/GraphQL, async bulk) | 2026-07-27 |
| Magento Open Source 2.4.8 | Absent | Absent | Absent | Absent | Absent | Absent² | 2026-07-27 |
| OroCommerce 6.0 CE | Built-in (RFQ + quote) | Built-in (workflow engine) | Built-in (price lists) | Built-in | Built-in (payment terms, no ledger) | Assemble (import/export + message queue) | 2026-07-27 |
| Shopware 6.7.x commercial plan | Paid¹ | Paid¹ | Assemble† | Paid¹† | Absent† (external provider) | Assemble (Admin + Sync API) | 2026-07-27 |
| commercetools (usage-priced SaaS) | Assemble (Quotes API) | Assemble (Approval Rules/Flows) | Assemble (standalone prices) | Assemble (Business Units) | Absent (external provider) | Assemble (import + subscriptions) | docs 2026-07-27 |
| Spryker (dated releases) | Paid¹ | Paid¹ | Paid¹† | Paid¹ | Absent† | Assemble† (first-party middleware) | docs 2026-07-27 |
| Sylius 2.0.x | Assemble | Assemble | Assemble | Assemble† | Absent | Assemble (REST API) | 2026-07-27 |
| Vendure 3.x | Assemble | Assemble | Assemble | Assemble | Absent | Assemble (GraphQL Admin API) | 2026-07-27 |
| Virto Commerce platform 3.x† | Assemble† | Assemble† | Assemble† | Assemble† | Absent† | Assemble† (.NET modules) | 2026-07-27 |
¹ Licence- or plan-gated: the score depends on what you pay for, not on what the technology can do. These are exactly the cells a bare-checkmark comparison flattens into ”✓”. ² No B2B objects exist to synchronise; the core product and order APIs remain. † Thinnest-evidence cells, derived from documentation only; each reappears in the untested list at the end of this article.
The scores produce three clusters. The integrated suites — Adobe Commerce B2B and OroCommerce — carry all five commerce workflows inside one product, differing mainly in licence model and in how credit is represented. The composable commercial tier — commercetools, Spryker and Shopware’s commercial plans — has the workflows, but they arrive as API objects or plan components that your team composes into a storefront. The framework tier — Sylius, Vendure, Virto Commerce — reads Assemble across the board: capable primitives, with the cost moved from licences to engineering.
Magento Open Source appears only as the edition contrast for Adobe Commerce. It scores Absent on all six workflows because the B2B modules do not exist for it, which makes it an edition boundary to understand rather than a B2B platform to shortlist.
How B2B platforms handle credit limits and contract pricing
Credit is structurally different across the pool, not differently sized. Adobe Commerce B2B maintains a platform credit ledger — a limit per company, orders placed on account, balance and reimbursement tracking. OroCommerce models negotiated payment terms rather than a ledger. On most other platforms, “credit” means integrating an external B2B payment provider that underwrites the risk — a different feature with a different accounting and risk owner, and the comparison should always name that owner.
Pay-on-account is also a payment method with its own enablement chain: the method must be enabled globally, applicable to the specific company, and its currency must match the credit currency. Any broken link in that chain produces the classic symptom of a buyer whose account page shows available credit but whose checkout forces a card payment. Trace the full chain on whichever platform you pilot.
Contract pricing mechanics diverge just as much. Adobe Commerce binds companies to shared catalogs carrying per-catalog custom prices; OroCommerce layers price lists that resolve through a combined-price-list calculation; commercetools selects standalone prices by customer group and channel. The negotiated outcome can be identical, yet the number of price rows an ERP must write — companies × SKUs in the worst case — and the recalculation work per import differ per platform, which is precisely what sets integration cost.
OroCommerce executes combined-price-list recalculation, RFQ workflow transitions and notification emails through its message queue, and a bare install does not supervise the consumer. If the consumer is absent or dead, all three silently stall while the admin shows jobs queued. The consumer must run continuously under systemd or supervisord:
php bin/console oro:message-queue:consume --env=prodExpected output:
You should now see: with the consumer supervised, submitted RFQs progress through their workflow states, notification emails send, and imported price changes reach the storefront once recalculation completes.
ERP integration: evaluate the API surface, not the connector promise
No platform in this pool ships a turnkey connector for an arbitrary ERP. Connector lists are claims you cannot score, so this comparison ignores them and evaluates four measurable surfaces instead: completeness of the price, inventory, customer and order APIs; bulk and asynchronous import throughput for large contract-price datasets; webhook or event coverage for order export; and whether an integration framework or middleware layer is first-party.
On those surfaces, the ERP column of the table resolves as follows. Adobe Commerce exposes REST and GraphQL with asynchronous bulk endpoints; commercetools pairs an import surface with event subscriptions; Spryker ships a first-party middleware layer; OroCommerce combines import/export jobs with its message queue; Shopware offers the Admin and Sync APIs; the framework tier exposes complete APIs and leaves everything else to you.
Two pitfalls dominate at contract-pricing scale. A nightly full price import that forces full recalculation makes storefront prices lag by hours while the job backlog grows every night — delta imports touching only changed rows are the design target. And on commercetools, approval rules evaluate only against carts carrying the business-unit association and matching the rule predicate, so an integration client that creates orders directly with broad scopes bypasses approval flows entirely.
{
"key": "orders-over-10000-eur",
"name": "Orders over 10,000 EUR require approval",
"status": "Active",
"predicate": "totalPrice.centAmount > 1000000 and totalPrice.currencyCode = \"EUR\"",
"approvers": {
"tiers": [
{ "and": [ { "or": [ { "associateRole": { "typeId": "associate-role", "key": "procurement-manager" } } ] } ] }
]
},
"requesters": [
{ "associateRole": { "typeId": "associate-role", "key": "buyer" } }
]
}Those field names are the ones the ApprovalRuleDraft reference (opens in a new tab) defines, checked on 5 August 2026: name, status, predicate, approvers and requesters are required, key and description optional. Note that name is a plain string here, not the localized object commercetools uses on most other resources. The rule only fires for orders created from a cart that carries the business-unit context the predicate is evaluated against:
{
"currency": "EUR",
"businessUnit": { "typeId": "business-unit", "key": "acme-procurement" },
"customerId": "<ASSOCIATE_CUSTOMER_ID>"
}You should now see: an order created from a cart carrying the business-unit association generates an approval flow, while an order created directly by a broad-scope API client does not — the bypass your integration must be scoped to avoid.
Best for and avoid when: a verdict on each of the nine B2B platforms
- Adobe Commerce B2B — best when the paid licence is justified and you need ledger-backed credit and shared-catalog pricing out of the box; it holds the only platform-ledger Credit cell in the table. Avoid when budget or policy is open-source-only — every workflow cell in its row is licence-gated.
- OroCommerce — best for quote-driven sellers who want free-core B2B workflows with CRM in the same application; it is the only row scoring Built-in on all five commerce workflows. Avoid without the operations capacity to supervise its message queue and cron, because three workflows stall silently without them.
- commercetools — best for API-first teams building their own storefront on Business Units, Quotes and Approval Flows, per its all-Assemble row. Avoid when a turnkey storefront and predictable non-usage pricing are expected.
- Shopware — best for teams already on Shopware whose plan budget covers the commercial B2B components behind its Paid cells. Avoid if the plan is to stay on the free Community core, where those same cells read Absent.
- Spryker — best for enterprise implementations with dedicated development teams, matching its Paid-across-the-row scoring and first-party middleware. Avoid for small teams or fixed budgets given quote-based commercial pricing.
- Sylius, Vendure, Virto Commerce — best when the B2B workflows are genuinely custom and engineering time is the preferred spend; their rows are Assemble on everything and Absent on credit. Avoid when out-of-the-box quotes, approvals or credit are required.
- Magento Open Source — the edition contrast only: all six cells Absent, so it is not a B2B platform pick, whatever its merits elsewhere.
Each verdict names the cells it derives from, so you can disagree with the weighting and still reuse the scores.
What remains untested and how to verify it before you decide
Nothing in this comparison comes from an operated install in this research pass; every cell rests on vendor documentation, and the cells marked † in the table — Shopware’s contract-pricing and hierarchy depth, Spryker’s contract pricing, credit and middleware scoring, Sylius company modelling, and the entire Virto Commerce row — carry the thinnest evidence. The two terminal captures are placeholders until reproduced.
Every version in scope must be re-confirmed against live documentation before acting: OroCommerce 6.0, Adobe Commerce 2.4.8 with B2B 1.5.x, Shopware 6.7.x and its current plan matrix, Sylius 2.0.x and the Sylius Plus scope, Vendure 3.x, Virto platform 3.x, and fresh capture dates for commercetools and Spryker.
Two checks are decisive and reproducible. Attempt the Adobe Commerce B2B metapackage install against your own licence keys to confirm the edition boundary first-hand, and pilot the single workflow that decides your case end-to-end — for example one RFQ negotiation round-trip — on a trial or Community install. The table is a snapshot; the framework of six workflows, one scale and labelled editions is the durable part to reuse.
You should now see: a dated list of every unverified claim in this comparison and two concrete verification steps to run before committing to a shortlist.
Limitations
This comparison covers self-hosted and API-first platforms only; SaaS suites such as Shopify Plus with B2B features or BigCommerce B2B Edition follow a different licensing model and need their own edition-labelled treatment. It contains no pricing figures, total-cost-of-ownership maths, performance benchmarks or hosting guidance, and it does not cover punchout or procurement-network integration (cXML, OCI), marketplace operating models, or multi-storefront architecture. Because every cell is documentation-derived and plan matrices restructure without notice, the table’s shelf life is bounded by the capture date stamped on each row.