B2B
B2B on Shopware 6.7 comes in three layers: what core does for free, what the Commercial B2B Components add, and what only custom code covers. Check them in that order and build only the gap.
Check three layers in order. Core covers customer groups, net prices, company data, tiered prices and per-group payment rules for free. The Commercial B2B Components add employees, quotes, order approval, budgets and individual pricing on the Evolve and Beyond plans. Custom code is for the workflow that is specific to your business, and it plugs into price calculation, the Rule Builder, the Flow Builder and the Store API.
Checked against: Shopware 6.7.15.1 source and the Shopware developer docs, October 2026. Plan assignments come from Shopware's pricing page at that date. Plans change, so confirm them on the pricing page before you buy.
Most B2B requirements we get start as "we need a custom plugin". Many of them turn out to be a setting in core or a component the merchant could license, and the rest really are custom.
Sorting a requirement into the right layer before anyone writes code is the cheapest decision in the project. This guide lists what each layer does on 6.7 and where the custom part attaches.
Everything in this list is in the open-source core of 6.7.15.1. We read each one from the entity definitions and rule classes at that tag.
What core does not have is a buyer-side organisation. Core ACL covers Administration users only. A storefront customer is one person with one login, with no colleagues and no roles.
The B2B Components ship with Shopware Commercial. You switch each one on or off per customer under "Customer-specific features" in the Administration.
Several buyers under one company account, each with a role and permissions.
Departments or locations inside a company, each with its own employees and settings.
Orders above a condition wait for a colleague to approve them. Developers can add their own approval conditions.
The buyer requests a quote from the cart, and the merchant answers with prices the buyer can accept.
Order by SKU and quantity, and keep lists for repeat orders.
Since 6.7.8.0: percentage, fixed or tiered price rules for companies, units, employees or customer tags, with priorities and validity dates. It needs Employee Management and Organization Units.
Budget Management sets spending limits and needs B2B Commercial 7.6.0 or later. On the pricing page, quotes, quick ordering, shopping lists, organisation units, budgets, individual pricing and the extended roles sit on Evolve and Beyond. Rise and the Community Edition have none of them.
Individual Pricing is rule-based: it discounts a catalogue for a group of buyers. A price list per customer and product, maintained in the ERP, is a different feature. Commercial's customer-specific pricing takes those prices through an Admin API endpoint, /api/_action/custom-price, in the sync format with quantity tiers. The pricing page lists it on Beyond only. Core has no per-customer price list at all.
Still on the B2B Suite? Shopware's documentation says the B2B Suite will no longer be supported starting Shopware 6.8. The B2B Suite Migration extension moves its data to the B2B Components and needs Suite 4.9.3 or later. Migrated budgets arrive without an organisation unit, so plan time to assign them.
Custom code earns its place when the requirement is a process only your business runs. Two projects from our case studies show the line.
Other typical custom work: price logic the Rule Builder cannot express, conditions that read ERP data, and integrations that push or pull B2B data on your own schedule.
These are the extension points, with the class names as they exist at the 6.7.15.1 tag.
AbstractProductPriceCalculator. The core ProductPriceCalculator has an internal constructor, so decorate the abstract service instead of extending the class.
CartDataCollectorInterface loads the data once, a CartProcessorInterface changes prices or line items, and a CartValidatorInterface blocks the checkout with an error.
Rule. The example below shows one.
FlowAction for a new action, or implement FlowEventAware on your own event to get a new trigger.
StoreApiRouteScope that return a StoreApiResponse, for portals and headless frontends.
Say your ERP flags customers whose credit limit is used up, and the flag lands in a customer custom field. A Rule Builder condition makes that flag usable everywhere rules work: payment availability, shipping, prices and flows.
<?php declare(strict_types=1);
namespace Acme\B2b\Rule;
use Shopware\Core\Checkout\CheckoutRuleScope;
use Shopware\Core\Framework\Rule\Rule;
use Shopware\Core\Framework\Rule\RuleConfig;
use Shopware\Core\Framework\Rule\RuleConstraints;
use Shopware\Core\Framework\Rule\RuleScope;
class CustomerCreditBlockedRule extends Rule
{
final public const RULE_NAME = 'acmeCustomerCreditBlocked';
public function __construct(protected bool $isBlocked = true)
{
parent::__construct();
}
public function match(RuleScope $scope): bool
{
if (!$scope instanceof CheckoutRuleScope || !$customer = $scope->getCustomer()) {
return false;
}
$blocked = (bool) ($customer->getCustomFields()['acme_credit_blocked'] ?? false);
return $this->isBlocked ? $blocked : !$blocked;
}
public function getConstraints(): array
{
return ['isBlocked' => RuleConstraints::bool(true)];
}
public function getConfig(): RuleConfig
{
return (new RuleConfig())->booleanField('isBlocked');
}
}
Register the class as a service with the tag shopware.rule.definition. The Rule Builder only offers the condition once the Administration knows it too: register it with ruleConditionDataProviderService.addCondition(), and because the class defines getConfig(), the generic sw-condition-generic component renders its field. Then build a rule "customer is not credit-blocked" and set it as the availability rule of the invoice payment method.
Important: core rule classes such as IsCompanyRule are final with internal constructors in 6.7, following a 2025 architecture decision. Write a new class like the one above. A plugin that extends a core rule can break on any minor update.
Core: a customer group with net display, and advanced prices on a group rule.
Core: an availability rule on the payment method. Custom rule if the approval lives in the ERP.
B2B Components: Employee Management, plus Organization Units for departments.
B2B Components: Order Approval. Custom approval conditions plug into it.
Commercial customer-specific pricing on Beyond, fed by the ERP. Without it, a custom price calculator.
Custom plugin: tenders, supplier routing, configurators, approvals with your own statuses.
Written by Huzaifa Mustafa
Build the custom part properly:
Send us the workflow. We'll tell you which parts core or the B2B Components already handle and what the custom part takes.