B2B

Shopware 6 for B2B: what core does and what needs custom code

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.

By Huzaifa Mustafa 8 min read October 31, 2026

The Quick Answer

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.

Layer 1: What Core Does for Free

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.

  • Customer groups with net prices: each group decides whether the storefront shows gross or net prices, and can have its own registration form, limited to company accounts if you want.
  • Registration with approval: a customer can apply for a group, and you accept or decline the request. Acceptance fires an event the Flow Builder can react to, for example with a welcome mail.
  • Company data: the customer has an account type, a company name and VAT IDs.
  • Tiered prices per rule: advanced prices attach to a Rule Builder rule and a quantity range. "Customer is in group Wholesale" is a rule, so group prices with quantity tiers work out of the box.
  • Order quantities: minimum and maximum purchase quantity and purchase steps per product, so a pallet item can be sold in steps of 40.
  • Payment and shipping per rule: every payment and shipping method can carry an availability rule, so invoice payment can be limited to company customers in a trusted group.
  • Flow Builder actions: change a customer's group or add a tag when an event fires, without code.

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.

Layer 2: What the B2B Components Add

The B2B Components ship with Shopware Commercial. You switch each one on or off per customer under "Customer-specific features" in the Administration.

Employee Management

Several buyers under one company account, each with a role and permissions.

Organization Units

Departments or locations inside a company, each with its own employees and settings.

Order Approval

Orders above a condition wait for a colleague to approve them. Developers can add their own approval conditions.

Quote Management

The buyer requests a quote from the cart, and the merchant answers with prices the buyer can accept.

Quick Order and Shopping Lists

Order by SKU and quantity, and keep lists for repeat orders.

Individual Pricing

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.

Customer-specific prices from the ERP

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.

Layer 3: What Still Needs Custom Code

Custom code earns its place when the requirement is a process only your business runs. Two projects from our case studies show the line.

  • A tender platform: an industrial machinery manufacturer sells equipment through tenders with sealed bids, a reveal at the deadline and approval by finance, legal and management. Quote Management covers a buyer asking for a price. It does not cover many bidders competing under encryption, so this was a custom plugin.
  • Supplier routing: a distributor needed each order checked against several suppliers' stock, split when no single supplier had everything, and sent to the right warehouse. That is fulfilment logic no component ships with.

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.

Where Custom Code Plugs In on 6.7

These are the extension points, with the class names as they exist at the 6.7.15.1 tag.

  • Product prices: decorate AbstractProductPriceCalculator. The core ProductPriceCalculator has an internal constructor, so decorate the abstract service instead of extending the class.
  • The cart: a CartDataCollectorInterface loads the data once, a CartProcessorInterface changes prices or line items, and a CartValidatorInterface blocks the checkout with an error.
  • Rule Builder conditions: a new class that extends Rule. The example below shows one.
  • Flow Builder: extend FlowAction for a new action, or implement FlowEventAware on your own event to get a new trigger.
  • Store API: routes in the StoreApiRouteScope that return a StoreApiResponse, for portals and headless frontends.

Example: hide invoice payment for credit-blocked customers

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.

Which Layer Covers Your Requirement?

Net prices and wholesale tiers

Core: a customer group with net display, and advanced prices on a group rule.

Invoice only for approved companies

Core: an availability rule on the payment method. Custom rule if the approval lives in the ERP.

Several buyers per company

B2B Components: Employee Management, plus Organization Units for departments.

Orders need a manager's OK

B2B Components: Order Approval. Custom approval conditions plug into it.

Negotiated prices per customer from the ERP

Commercial customer-specific pricing on Beyond, fed by the ERP. Without it, a custom price calculator.

A process only your business runs

Custom plugin: tenders, supplier routing, configurators, approvals with your own statuses.

Key Takeaways

  • Core already does net prices, group tiers, company data, quantity steps and payment per rule.
  • Buyer organisations, quotes, approvals and budgets come from the B2B Components on Evolve or Beyond.
  • The B2B Suite loses support with Shopware 6.8. Plan the move to the Components now.
  • Custom code belongs to processes only you run. On 6.7 it attaches through decorators, cart processors, new rule classes, flow actions and Store API routes.

Written by

Share:

Found a Gap Core Doesn't Cover?

Send us the workflow. We'll tell you which parts core or the B2B Components already handle and what the custom part takes.