Shared Catalogs in Magento 2: Kundenspezifische Kataloge und Preisstrategien
AI generated
M2
di.xml
Magento 2 · B2B Suite
Shared Catalogs
Kundenspezifische Kataloge und Preisstrategien technisch verstehen

Shared Catalogs steuern für jede Company, welche Kategorien sichtbar sind und zu welchen Preisen bestellt werden kann, aufgebaut auf denselben Category Permissions, die auch außerhalb der B2B-Suite existieren. Wer die Mechanik dahinter kennt, kann Sichtbarkeit und Preisüberschreibungen gezielt steuern, statt bei wachsender Katalog-Anzahl von Indexierungsproblemen überrascht zu werden.

13 Min. Lesezeit Shared Catalogs · B2B Suite Magento 2.4.x Commerce

1. Shared Catalogs im B2B-Kontext einordnen

Ein Shared Catalog ist eine benannte Teilmenge des öffentlichen Katalogs, die einer oder mehreren Companies zugewiesen wird und damit steuert, welche Kategorien und Produkte für deren Mitglieder überhaupt sichtbar sind. Anders als eine reine Kundengruppen-Preisregel geht ein Shared Catalog also über die Preisgestaltung hinaus und wirkt zusätzlich auf die Sichtbarkeit ganzer Kategorien.

Jede Company im Standardsetup ist genau einem Shared Catalog zugeordnet, standardmäßig dem öffentlichen Katalog, der alle Kategorien ohne Einschränkung zeigt. Sobald ein eigener Shared Catalog angelegt und einer Company zugewiesen wird, sehen deren Mitglieder ausschließlich die dort freigegebenen Kategorien, unabhängig davon, wie der Katalog für anonyme Besucher oder andere Companies aussieht.

2. Technischer Aufbau: virtuelle Kundengruppe und Category Permissions

Unter der Haube ist ein Shared Catalog kein völlig neues Konzept, sondern eine Kombination aus zwei bestehenden Mechanismen. Beim Anlegen eines Shared Catalogs erzeugt Magento automatisch eine eigene, für Administratoren im regulären Kundengruppen-Grid verborgene Customer Group, die intern als Bindeglied zwischen Company und Katalog dient. Diese virtuelle Gruppe wird anschließend genau wie eine reguläre Kundengruppe von der Category-Permissions-Funktion des Moduls Magento_CatalogPermissions verwendet.

Für jede Kategorie lässt sich pro Kundengruppe eine Berechtigung von ALLOW, DENY oder ALLOW_PARTIAL hinterlegen, wobei ALLOW_PARTIAL die Kategorie zwar in der Navigation zeigt, aber den Produktinhalt sperrt. Ein Shared Catalog setzt diese Berechtigungen für seine virtuelle Kundengruppe gezielt, sodass Kategorien außerhalb der freigegebenen Struktur für Mitglieder der zugewiesenen Company effektiv unsichtbar bleiben, technisch aber weiterhin über den Category-Permissions-Index gefiltert werden.


<?php

declare(strict_types=1);

namespace Mironsoft\SharedCatalogExtension\Model;

use Magento\CatalogPermissions\App\ConfigInterface;
use Magento\CatalogPermissions\Model\Permission;
use Magento\SharedCatalog\Api\SharedCatalogRepositoryInterface;

/**
 * Liest die effektive Category-Permission für die virtuelle Kundengruppe
 * eines Shared Catalogs aus, um sie in einem eigenen Report auszuwerten.
 */
class SharedCatalogPermissionReader
{
    /**
     * @param SharedCatalogRepositoryInterface $sharedCatalogRepository
     * @param ConfigInterface $permissionsConfig
     */
    public function __construct(
        private readonly SharedCatalogRepositoryInterface $sharedCatalogRepository,
        private readonly ConfigInterface $permissionsConfig,
    ) {
    }

    /**
     * Liefert true, wenn die angegebene Kategorie für den Shared Catalog sichtbar ist.
     *
     * @param int $sharedCatalogId
     * @param int $categoryId
     * @return bool
     */
    public function isCategoryVisible(int $sharedCatalogId, int $categoryId): bool
    {
        $sharedCatalog = $this->sharedCatalogRepository->get($sharedCatalogId);
        $customerGroupId = (int) $sharedCatalog->getCustomerGroupId();

        return $this->permissionsConfig->getPermission($categoryId, 0, $customerGroupId)
            !== Permission::PERMISSION_DENY;
    }
}

3. Sichtbarkeit vs. Bestellbarkeit sauber trennen

Ein häufiges Missverständnis ist, Sichtbarkeit und Bestellbarkeit als denselben Mechanismus zu behandeln. Category Permissions steuern ausschließlich, ob eine Kategorie oder ein Produkt in der Navigation und Suche auftaucht, nicht ob ein Produkt tatsächlich bestellt werden darf. Ein Produkt kann technisch sichtbar, aber über andere Mechanismen wie Lagerbestand oder Mindestbestellmengen trotzdem nicht bestellbar sein, und umgekehrt lässt sich ein Produkt über eine DENY-Regel unsichtbar machen, obwohl es preislich und lagerseitig bestellbar wäre.

Für eigene Erweiterungen bedeutet das, dass Sichtbarkeitsprüfungen und Preisprüfungen getrennt implementiert werden müssen. Wer etwa einen eigenen Produkt-Feed für einen Shared Catalog bauen will, darf sich nicht allein auf den Category-Permissions-Index verlassen, sondern muss zusätzlich die Preisüberschreibungen des Katalogs und die reguläre Katalog-Sichtbarkeit des Produkts selbst berücksichtigen, um ein konsistentes Ergebnis zu erhalten.

4. Preisüberschreibungen pro Katalog

Neben der Sichtbarkeit ist die zweite zentrale Funktion eines Shared Catalogs die Preisgestaltung. Für jeden Katalog lässt sich pro Produkt entweder ein fester Preis oder eine prozentuale beziehungsweise absolute Abweichung vom regulären Katalogpreis hinterlegen. Technisch laufen diese Überschreibungen über dieselbe Preisregel-Infrastruktur, die auch für reguläre Catalog Price Rules verwendet wird, nur zielgerichtet auf die virtuelle Kundengruppe des jeweiligen Shared Catalogs.

Für die Pflege großer Preislisten bietet die Verwaltung einen Export als Excel-Tabelle, in der pro Produkt Preis und Sichtbarkeit gemeinsam bearbeitet und anschließend wieder importiert werden können. Für automatisierte Preispflege aus einem externen ERP-System empfiehlt sich stattdessen ein eigener Import über die Preisregel-APIs, der denselben Datenpfad nutzt, aber ohne den manuellen Excel-Umweg auskommt und sich in einen bestehenden Preissynchronisationsprozess einbetten lässt.

5. Shared Catalogs programmatisch verwalten

Über Magento\SharedCatalog\Api\SharedCatalogRepositoryInterface und SharedCatalogManagementInterface lassen sich Shared Catalogs vollständig programmatisch anlegen, Kategorien zuweisen und Companies verknüpfen, ohne den Admin manuell zu bedienen. Das ist besonders relevant für Projekte, in denen neue Firmenkunden automatisiert aus einem externen System angelegt werden und dabei sofort einen passenden Katalog zugewiesen bekommen sollen.

Für Bulk-Operationen, etwa das gleichzeitige Anpassen von hunderten Produktpreisen in einem Katalog, ist ein direkter Aufruf über die Preisregel-Services deutlich effizienter als hunderte einzelne Repository-Aufrufe, weil sich so unnötige Einzeltransaktionen und wiederholte Neuberechnungen der Preisregel vermeiden lassen.

6. Automatische Katalogzuweisung per Plugin

Ein typischer Erweiterungsfall ist die automatische Zuweisung eines passenden Shared Catalogs, sobald eine neue Company angelegt wird, etwa basierend auf einem benutzerdefinierten Attribut wie Kundensegment oder Vertriebsregion. Dafür bietet sich ein Plugin auf der Company-Anlage an, das nach dem erfolgreichen Speichern prüft, welcher Shared Catalog anhand der hinterlegten Regel passt, und die Zuweisung automatisch vornimmt.

Wichtig ist dabei, die Zuweisung nicht direkt im before-Teil eines Plugins auszuführen, weil zu diesem Zeitpunkt die Company-ID noch nicht feststeht. Ein after-Plugin auf der Save-Methode ist hier der richtige Ansatz, da die vollständige, gespeicherte Company-Entität inklusive ID zur Verfügung steht und die Zuweisung sicher nachgezogen werden kann.


<?php

declare(strict_types=1);

namespace Mironsoft\SharedCatalogExtension\Plugin;

use Magento\Company\Api\CompanyRepositoryInterface;
use Magento\Company\Api\Data\CompanyInterface;
use Magento\SharedCatalog\Api\SharedCatalogManagementInterface;
use Mironsoft\SharedCatalogExtension\Model\SegmentCatalogResolver;

/**
 * Weist einer neu angelegten Company automatisch den zum Kundensegment
 * passenden Shared Catalog zu.
 */
class AssignCatalogOnCompanyCreatePlugin
{
    /**
     * @param SegmentCatalogResolver $catalogResolver
     * @param SharedCatalogManagementInterface $catalogManagement
     */
    public function __construct(
        private readonly SegmentCatalogResolver $catalogResolver,
        private readonly SharedCatalogManagementInterface $catalogManagement,
    ) {
    }

    /**
     * @param CompanyRepositoryInterface $subject
     * @param CompanyInterface $result
     * @return CompanyInterface
     */
    public function afterSave(CompanyRepositoryInterface $subject, CompanyInterface $result): CompanyInterface
    {
        $sharedCatalogId = $this->catalogResolver->resolveForCompany($result);
        if ($sharedCatalogId !== null) {
            $this->catalogManagement->assignCompany((int) $result->getId(), $sharedCatalogId);
        }

        return $result;
    }
}

7. Indexierung: Category Permissions und Preisindex

Jeder Shared Catalog erzeugt intern eine eigene Kundengruppe, und der Category-Permissions-Index sowie der Produktpreis-Index arbeiten beide über eine Matrix aus Kundengruppe mal Kategorie beziehungsweise Kundengruppe mal Produkt. Mit jedem zusätzlichen Shared Catalog wächst diese Matrix, was sich direkt auf die Laufzeit der entsprechenden Indexer auswirkt, besonders bei großen Katalogen mit vielen Kategorien.

In der Praxis bedeutet das, dass ein vollständiger Reindex nach dem Anlegen mehrerer neuer Shared Catalogs spürbar länger dauern kann als vorher, weil sowohl die Sichtbarkeits- als auch die Preisberechnung für jede zusätzliche virtuelle Gruppe erneut durchlaufen werden muss. Wer viele Kataloge parallel plant, sollte den Indexer-Modus und die verfügbaren Ressourcen des Indexierungs-Crons entsprechend im Blick behalten.

8. Performance-Implikationen bei vielen Shared Catalogs

Ab einer bestimmten Anzahl paralleler Shared Catalogs, in der Praxis häufig irgendwo im mittleren zweistelligen Bereich abhängig von Katalog- und Kategoriegröße, wird die Indexierungslast spürbar. Statt für jedes einzelne Kundensegment einen eigenen Katalog anzulegen, lohnt sich häufig eine Konsolidierung: Ähnliche Preisstrategien lassen sich oft über gemeinsame Kataloge mit zusätzlichen, granuleren Preisregeln abdecken, statt für jede kleine Abweichung eine neue virtuelle Kundengruppe zu erzeugen.

Für Shops mit wirklich vielen unterschiedlichen Firmenkunden empfiehlt sich außerdem, den vollständigen Reindex bewusst außerhalb der Stoßzeiten zu planen und den Schedule-Modus für die betroffenen Indexer zu verwenden, statt bei jeder kleinen Preisänderung eine sofortige, synchrone Neuberechnung über den gesamten Katalog auszulösen.

9. Betrieb: Pflege und Nachvollziehbarkeit

Da Shared Catalogs sowohl Sichtbarkeit als auch Preise steuern, lohnt sich eine klare interne Dokumentation, welcher Katalog welchem Kundensegment mit welcher Preislogik zugeordnet ist. Ohne diese Übersicht wird es bei wachsender Katalogzahl schnell unübersichtlich, welche Company welche Preise sieht, insbesondere wenn mehrere Kataloge über die Zeit von unterschiedlichen Teammitgliedern gepflegt wurden.

Für Audits und Support-Anfragen ist außerdem sinnvoll, sich nicht nur auf die Admin-Oberfläche zu verlassen, sondern die zugrunde liegende Kundengruppen-Zuordnung und die Category-Permissions-Einträge auch direkt in der Datenbank nachvollziehen zu können, gerade wenn ein Kunde meldet, ein Produkt fälschlich zu sehen oder nicht zu sehen.

Aspekt Öffentlicher Katalog Shared Catalog Technische Grundlage
Sichtbarkeit Alle Kategorien sichtbar Nur freigegebene Kategorien Category Permissions je Kundengruppe
Preise Reguläre Katalogpreise Feste oder abweichende Preise Preisregeln auf virtuelle Kundengruppe
Kundengruppe Standardgruppen Automatisch erzeugte virtuelle Gruppe Beim Anlegen des Katalogs generiert
Zuweisung Keine Zuweisung nötig Genau ein Katalog pro Company SharedCatalogManagementInterface
Indexlast Konstant Wächst mit jedem Katalog Kundengruppe-mal-Kategorie-Matrix
Pflege Zentral im Katalog Excel-Export/Import je Katalog SharedCatalog-Admin-Grid

Mironsoft

Magento-Entwicklung, Modul-Beratung und Systemarchitektur

Magento-Projekt, das eine zweite Meinung oder erfahrene Umsetzung braucht?

Wir entwickeln individuelle Magento-Module, beraten bei Architekturentscheidungen und übernehmen komplexe Umsetzungen, von der Service-Contract-Planung bis zum produktionsreifen Deployment.

Architektur-Beratung

Modul- und Systemarchitektur vor der Umsetzung fundiert durchdenken lassen.

Custom-Modul-Entwicklung

Individuelle Magento-Module nach Best Practices sauber umsetzen.

Code-Review & Audit

Bestehende Module auf Performance, Sicherheit und Wartbarkeit prüfen lassen.

10. Zusammenfassung

Shared Catalogs Preisstrategie

Technische Basis

Jeder Shared Catalog erzeugt eine verborgene virtuelle Kundengruppe, gesteuert über Category Permissions.

Preise

Preisüberschreibungen laufen über dieselbe Preisregel-Infrastruktur wie reguläre Catalog Price Rules.

Trennung

Sichtbarkeit und Bestellbarkeit sind getrennte Mechanismen und müssen bei eigenen Erweiterungen getrennt geprüft werden.

Performance

Viele parallele Kataloge vergrößern die Indexierungsmatrix, Konsolidierung reduziert die Last spürbar.

11. FAQ: Shared Catalogs Preisstrategie

1Was ist ein Shared Catalog technisch gesehen?
Eine benannte Teilmenge des öffentlichen Katalogs, die intern über eine automatisch erzeugte, verborgene Kundengruppe an Category Permissions und Preisregeln gekoppelt und einer Company zugewiesen wird.
2Kann eine Company mehreren Shared Catalogs zugewiesen sein?
Nein, im Standardsetup ist jede Company genau einem Shared Catalog zugeordnet, standardmäßig dem öffentlichen Katalog ohne Einschränkungen.
3Steuern Category Permissions auch, ob ein Produkt bestellbar ist?
Nein, sie steuern ausschließlich die Sichtbarkeit in Navigation und Suche. Bestellbarkeit hängt zusätzlich von Lagerbestand, Mindestmengen und anderen Mechanismen ab.
4Wie werden Preisüberschreibungen pro Katalog gespeichert?
Über dieselbe Preisregel-Infrastruktur wie reguläre Catalog Price Rules, gezielt auf die virtuelle Kundengruppe des jeweiligen Shared Catalogs angewendet.
5Wie lässt sich die Zuweisung eines Katalogs automatisieren?
Über ein after-Plugin auf der Company-Speicherlogik, das nach erfolgreichem Speichern anhand eines Attributs den passenden Katalog ermittelt und über SharedCatalogManagementInterface zuweist.
6Warum wächst die Indexierungslast mit der Anzahl der Shared Catalogs?
Weil sowohl Category Permissions als auch der Preisindex über eine Matrix aus Kundengruppe mal Kategorie beziehungsweise Produkt arbeiten, die mit jeder zusätzlichen virtuellen Gruppe größer wird.
7Gibt es eine Empfehlung für die maximale Anzahl an Shared Catalogs?
Eine feste Grenze gibt es nicht, aber ab dem mittleren zweistelligen Bereich wird die Indexierungslast in der Praxis spürbar, weshalb eine Konsolidierung ähnlicher Preisstrategien sinnvoll ist.
8Wie können große Preislisten für einen Katalog gepflegt werden?
Über den Excel-Export und -Import im Admin-Grid für manuelle Pflege, oder über einen eigenen Import gegen die Preisregel-APIs für automatisierte Synchronisation mit einem externen System.
9Lassen sich Shared Catalogs vollständig programmatisch verwalten?
Ja, über SharedCatalogRepositoryInterface und SharedCatalogManagementInterface lassen sich Kataloge anlegen, Kategorien zuweisen und mit Companies verknüpfen, ohne den Admin manuell zu bedienen.
10Was ist beim Debugging von Sichtbarkeitsproblemen zu beachten?
Es lohnt sich, neben der Admin-Oberfläche auch die zugrunde liegende Kundengruppen-Zuordnung und die Category-Permissions-Einträge direkt in der Datenbank nachzuvollziehen, um die tatsächliche Ursache zu finden.