B2B
B2B auf Shopware 6.7 hat drei Ebenen: was der Core kostenlos kann, was die kommerziellen B2B Components ergänzen und was nur eigener Code abdeckt. Prüfen Sie sie in dieser Reihenfolge und bauen Sie nur die Lücke.
Prüfen Sie drei Ebenen in dieser Reihenfolge. Der Core deckt Kundengruppen, Nettopreise, Firmendaten, Staffelpreise und Zahlungsregeln pro Gruppe kostenlos ab. Die kommerziellen B2B Components ergänzen Mitarbeiter, Angebote, Bestellfreigaben, Budgets und individuelle Preise in den Plänen Evolve und Beyond. Eigener Code ist für den Ablauf da, den nur Ihr Unternehmen hat, und setzt an Preisberechnung, Rule Builder, Flow Builder und Store API an.
Geprüft gegen: den Quellcode von Shopware 6.7.15.1 und die Shopware-Entwicklerdokumentation, Oktober 2026. Die Zuordnung zu den Plänen stammt von der Preisseite von Shopware zu diesem Zeitpunkt. Pläne ändern sich, prüfen Sie sie deshalb vor dem Kauf auf der Preisseite.
Die meisten B2B-Anforderungen, die uns erreichen, beginnen mit "wir brauchen ein eigenes Plugin". Viele davon sind am Ende eine Einstellung im Core oder eine Komponente, die der Händler lizenzieren kann, und der Rest ist wirklich individuell.
Eine Anforderung der richtigen Ebene zuzuordnen, bevor jemand Code schreibt, ist die günstigste Entscheidung im Projekt. Diese Anleitung zeigt, was jede Ebene auf 6.7 kann und wo der eigene Teil andockt.
Alles in dieser Liste steckt im Open-Source-Core von 6.7.15.1. Wir haben jeden Punkt aus den Entity-Definitionen und Regelklassen dieses Tags gelesen.
Was der Core nicht hat, ist eine Organisation auf Käuferseite. Die ACL des Core gilt nur für Benutzer der Administration. Ein Storefront-Kunde ist eine Person mit einem Login, ohne Kollegen und ohne Rollen.
Die B2B Components gehören zu Shopware Commercial. Sie schalten jede Komponente pro Kunde unter "Customer-specific features" in der Administration ein oder aus.
Mehrere Einkäufer unter einem Firmenkonto, jeder mit Rolle und Berechtigungen.
Abteilungen oder Standorte innerhalb einer Firma, jeweils mit eigenen Mitarbeitern und Einstellungen.
Bestellungen ab einer Bedingung warten auf die Freigabe durch eine Kollegin oder einen Kollegen. Entwickler können eigene Freigabebedingungen ergänzen.
Der Einkäufer fordert aus dem Warenkorb ein Angebot an, und der Händler antwortet mit Preisen, die der Einkäufer annehmen kann.
Bestellen per Artikelnummer und Menge, und Listen für wiederkehrende Bestellungen.
Seit 6.7.8.0: prozentuale, feste oder gestaffelte Preisregeln für Firmen, Einheiten, Mitarbeiter oder Kunden-Tags, mit Prioritäten und Gültigkeitsdaten. Setzt Employee Management und Organization Units voraus.
Budget Management setzt Ausgabenlimits und braucht B2B Commercial 7.6.0 oder neuer. Auf der Preisseite stehen Angebote, Schnellbestellung, Einkaufslisten, Organisationseinheiten, Budgets, Individual Pricing und die erweiterten Rollen bei Evolve und Beyond. Rise und die Community Edition haben keine davon.
Individual Pricing arbeitet mit Regeln: es rabattiert einen Katalog für eine Gruppe von Einkäufern. Eine Preisliste pro Kunde und Produkt, gepflegt im ERP, ist eine andere Funktion. Die kundenspezifischen Preise von Commercial nehmen diese Preise über einen Admin-API-Endpunkt entgegen, /api/_action/custom-price, im Sync-Format mit Mengenstaffeln. Die Preisseite führt sie nur bei Beyond. Der Core hat gar keine Preisliste pro Kunde.
Noch auf der B2B Suite? Laut Shopware-Dokumentation wird die B2B Suite ab Shopware 6.8 nicht mehr unterstützt. Die Erweiterung B2B Suite Migration überträgt ihre Daten in die B2B Components und setzt Suite 4.9.3 oder neuer voraus. Migrierte Budgets kommen ohne Organisationseinheit an, planen Sie Zeit für die Zuordnung ein.
Eigener Code lohnt sich, wenn die Anforderung ein Ablauf ist, den nur Ihr Unternehmen hat. Zwei Projekte aus unseren Fallstudien zeigen die Grenze.
Weitere typische Individualentwicklung: Preislogik, die der Rule Builder nicht abbilden kann, Bedingungen, die ERP-Daten lesen, und Integrationen, die B2B-Daten nach Ihrem eigenen Takt übertragen.
Das sind die Erweiterungspunkte, mit den Klassennamen, wie sie im Tag 6.7.15.1 existieren.
AbstractProductPriceCalculator. Der ProductPriceCalculator des Core hat einen internen Konstruktor, dekorieren Sie also den abstrakten Service, statt die Klasse abzuleiten.
CartDataCollectorInterface lädt die Daten einmal, ein CartProcessorInterface ändert Preise oder Positionen, und ein CartValidatorInterface stoppt den Checkout mit einem Fehler.
Rule erweitert. Das Beispiel unten zeigt eine.
FlowAction für eine neue Aktion, oder implementieren Sie FlowEventAware an Ihrem eigenen Event für einen neuen Auslöser.
StoreApiRouteScope, die eine StoreApiResponse liefern, für Portale und Headless-Frontends.
Angenommen, Ihr ERP markiert Kunden, deren Kreditlimit ausgeschöpft ist, und die Markierung landet in einem Zusatzfeld am Kunden. Eine Bedingung im Rule Builder macht diese Markierung überall nutzbar, wo Regeln wirken: Zahlungsverfügbarkeit, Versand, Preise und 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');
}
}
Registrieren Sie die Klasse als Service mit dem Tag shopware.rule.definition. Der Rule Builder bietet die Bedingung erst an, wenn auch die Administration sie kennt: registrieren Sie sie mit ruleConditionDataProviderService.addCondition(), und weil die Klasse getConfig() definiert, rendert die generische Komponente sw-condition-generic ihr Feld. Legen Sie dann eine Regel "Kunde ist nicht gesperrt" an und setzen Sie sie als Verfügbarkeitsregel der Zahlungsart Rechnung.
Wichtig: Regelklassen des Core wie IsCompanyRule sind in 6.7 final mit internem Konstruktor, nach einer Architekturentscheidung von 2025. Schreiben Sie eine neue Klasse wie die oben. Ein Plugin, das eine Core-Regel ableitet, kann bei jedem Minor-Update brechen.
Core: eine Kundengruppe mit Nettoanzeige und erweiterte Preise auf einer Gruppenregel.
Core: eine Verfügbarkeitsregel an der Zahlungsart. Eigene Regel, wenn die Freigabe im ERP liegt.
B2B Components: Employee Management, dazu Organization Units für Abteilungen.
B2B Components: Order Approval. Eigene Freigabebedingungen docken daran an.
Kundenspezifische Preise von Commercial in Beyond, gespeist vom ERP. Ohne sie ein eigener Preisrechner.
Eigenes Plugin: Ausschreibungen, Lieferanten-Routing, Konfiguratoren, Freigaben mit eigenen Status.
Geschrieben von Huzaifa Mustafa
Den eigenen Teil sauber bauen:
Schicken Sie uns den Ablauf. Wir sagen Ihnen, welche Teile Core oder B2B Components schon abdecken und was der eigene Teil braucht.