Wróć do bloga

WooCommerce B2B: wiele wtyczek czy własna integracja

WooCommerce B2B zaczyna się od wtyczek, ale ceny, VAT, akceptacja kont i pamięć podręczna w praktyce wymagają własnej warstwy integracyjnej.

Jakub Czechowski

Buduje strony i sklepy internetowe w JC Web Studio, prowadzi StackCompass – publikację o architekturze treści i decyzjach stackowych – i współorganizuje CMS Conf, konferencję o systemach treści.

/ / 7 min czytania

Obietnica budowania B2B na WooCommerce jest kusząca i często prawdziwa: mały lub średni sklep hurtowy może wystartować szybciej i przy niższych kosztach licencji niż projekt oparty na platformie klasy enterprise. Takie porównanie ukrywa jednak, kto przejmuje odpowiedzialność za pracę. WooCommerce nie usuwa złożoności handlu B2B. Przenosi większą jej część na zespół: infrastrukturę, bezpieczeństwo, integracje i długoterminowe utrzymanie. Najczęściej niedoszacowana jest logika zależna od roli, dzięki której sklep rzeczywiście działa jako B2B. Zaczyna się od konfiguracji wtyczek, a kończy jako warstwa integracyjna, którą trzeba zaprojektować i utrzymywać.

To nie jest argument przeciw WooCommerce, tylko za uczciwym nazwaniem kompromisu. Gdy WooCommerce pasuje już do skali i sposobu sprzedaży, decyzja nie brzmi „wtyczki czy własny kod”. Poważne wdrożenie zwykle korzysta z obu. Prawdziwy wybór dotyczy rozproszonej odpowiedzialności między nakładającymi się rozszerzeniami albo małego zestawu wtyczek spiętych jedną warstwą, za którą odpowiada zespół.

Prawdziwa decyzja to rozproszona odpowiedzialność vs własna warstwa

Porównanie platform nadal ma znaczenie. BigCommerce oferuje natywne funkcje B2B, takie jak grupy klientów, cenniki, procesy ofertowe i punchout, czyli połączenie systemu zakupowego klienta z katalogiem dostawcy. Shopify realizuje B2B przez aplikacje i wyższe plany. WooCommerce łączy role, rozszerzenia i własny kod. Daje szeroką kontrolę, ale obciąża zespół odpowiedzialnością za infrastrukturę, bezpieczeństwo, kompatybilność i wydajność. Przy bardzo dużym wolumenie transakcji albo rozbudowanych procesach zakupowych platforma z natywnym B2B może być lepszym wyborem.

Dla małych i średnich sklepów, w których WooCommerce pozostaje rozsądną opcją, trudniejsza decyzja leży wewnątrz samego wdrożenia: czy składać B2B z wielu rozszerzeń, czy kupić niewielki zestaw i połączyć go jedną spójną warstwą?

Rynek zachęca do składania funkcji z osobnych produktów. B2BKing, Wholesale Suite, WholesaleX, Addify i oficjalny marketplace WooCommerce oferują różne części procesu. Łatwo potraktować B2B jak listę kontrolną: ceny według roli z jednej wtyczki, formularz wyceny z drugiej, akceptacja rejestracji z trzeciej. Taki układ wydaje się szybki, dopóki kilka rozszerzeń nie zacznie obsługiwać tych samych hooków koszyka, ceny, konta albo finalizacji zamówienia. Każde z nich inaczej rozumie cykl życia zamówienia. Koszt pojawia się nie w dniu instalacji, lecz przy aktualizacjach WooCommerce, PHP i samych wtyczek, gdy zmienia się zachowanie wspólnego punktu integracji.

Ceny zależne od roli dziedziczą cenę bazową - razem z ograniczeniami

Przed decyzją o tym, co budować, trzeba poznać model rozszerzeń, które wchodzą w grę. To on ogranicza późniejsze wybory. Wiele wtyczek do cen zależnych od roli traktuje cenę bazową produktu jako źródło prawdy i nakłada na nią reguły: rabat procentowy lub kwotowy zależny od roli, kategorii albo liczby sztuk. To rozsądny model. Katalog pozostaje w jednym miejscu i nie wymaga osobnego cennika dla każdej roli.

Ograniczenie kryje się w sposobie łączenia reguł. Zależnie od wtyczki i konfiguracji próg ilościowy może zastępować rabat roli, wybierać korzystniejszą cenę albo łączyć się z innymi rabatami. Kolejność musi być jawna. W przeciwnym razie sklep może naliczać błędne ceny, a zespół odkryje swoje założenie dopiero po zamówieniu klienta. To ta sama pułapka, która pojawia się przy modelowaniu treści bez nadmiernego modelowania: każdy dodatkowy wymiar - rola × kategoria × próg ilości - mnoży liczbę kombinacji do zrozumienia i przetestowania. Kolejność rozstrzygania reguł staje się krytyczną logiką biznesową ukrytą we wtyczce, której zespół nie kontroluje.

Dobrym przykładem jest działający sklep z około sześcioma rolami: gościem, klientem B2C, trzema poziomami B2B - hurtownikiem, hurtownikiem lokalnym i kupującym instytucjonalnym - oraz administratorem. Każdy poziom B2B widzi inne ceny. Gotowa wtyczka wystarczająco dobrze obsługuje reguły cenowe. Problemy zaczynają się wtedy, gdy poszczególne role muszą widzieć inne interfejsy, a nie tylko płacić inne kwoty.

Wyświetlanie VAT netto/brutto to ścieżka odczytu zależna od roli, nie ustawienie

W Polsce i szerzej w Unii Europejskiej klienci biznesowi zwykle pracują na cenach netto, podczas gdy konsumenci oczekują cen brutto z VAT. WooCommerce traktuje sposób wyświetlania podatku jako ustawienie, a część rozszerzeń B2B pozwala zmieniać je zależnie od roli. Na tym etapie wymaganie może jeszcze pozostać konfiguracją.

Przestaje nią być, gdy różnice wykraczają poza etykietę ceny. W opisanym sklepie rola wpływa na prezentację ceny, informacje o stanie magazynowym, przyciski zakupu, panel konta i pola checkoutu. Hurtownik widzi macierz zamówień ilościowych, której klient B2C nie powinien zobaczyć. Kupujący instytucjonalny potrzebuje dodatkowego pola odbiorcy. Warstwa prezentacji należy do szablonów, ale decyzja o tym, co wolno zobaczyć danej roli, powinna pochodzić z jednego modułu domenowego. W przeciwnym razie ta sama reguła zostaje powielona w motywie i hookach checkoutu, aż sklep zaczyna sam sobie przeczyć: pokazuje ceny netto w katalogu, brutto w koszyku albo pomija wymagane pole dla wybranego typu kupującego.

To integracyjna część architektury i miejsce, w którym „po prostu zainstaluj wtyczkę” zmienia się w stałe zobowiązanie programistyczne.

Wyświetlanie zależne od roli ogranicza wspólną pamięć podręczną

Renderowanie zależne od roli ma bezpośredni koszt wydajnościowy. Wspólna pamięć podręczna całej strony działa najlepiej, gdy jeden adres URL prowadzi do jednej odpowiedzi HTML. Wyświetlanie cen netto lub brutto zależnie od roli łamie to założenie. Ten sam produkt może wymagać innych cen, przycisków zakupu i informacji o dostępności. Wyświetlenie hurtownikowi strony zapisanej dla gościa ujawnia niewłaściwe warunki handlowe, a nie tylko błędny wygląd.

Najczęściej wybiera się jedną z trzech dróg. Można wyłączyć pamięć podręczną całej strony dla zalogowanych użytkowników i zaakceptować większe obciążenie serwera. Można tworzyć osobne warianty dla każdej roli, co obniża współczynnik trafień. Można też zapisać wspólny szkielet strony, a ceny, przyciski zakupu i stany magazynowe pobierać osobno dla każdego żądania. Każde rozwiązanie kosztuje infrastrukturę, złożoność albo opóźnienie. To ten sam konflikt między treścią wspólną i personalizowaną, który pojawia się przy wyborze między SSG i SSR: im więcej zależy od tego, kto pyta, tym mniej jeden wyrenderowany dokument może obsłużyć wszystkich. To konsekwencja wymagania B2B, a nie detal optymalizacyjny, który można bez końca odkładać.

Rejestracja i walidacja NIP - tu kończy się „po prostu wtyczka”

Domyślna rejestracja WooCommerce jest celowo prosta. Nie zapewnia procesu akceptacji i weryfikacji firmy potrzebnego w wielu sklepach B2B. Ceny dla wybranych grup zakładają, że sklep wie - i ufa - kim jest użytkownik, zanim przyzna mu uprzywilejowaną rolę.

W takim procesie konto B2B powstaje ze statusem oczekującym i musi zostać zatwierdzone, zanim użytkownik zobaczy chronione ceny albo złoży zamówienie. Wtyczka może dostarczyć formularz i podstawowy proces. Opisany sklep dodatkowo sprawdza format i sumę kontrolną NIP, weryfikuje dane firmy, rozróżnia kupującego od odbiorcy dostawy i przypisuje rolę według własnej polityki. Część kontroli można oprzeć na bibliotekach lub usługach, ale zasady akceptacji pozostają specyficzne dla biznesu. Gotowy może być szkielet rejestracji. Walidacja, cykl życia konta i przydzielanie ról powinny należeć do własnej wtyczki lub mu-pluginu. Podobna granica przebiega przy zapytaniach ofertowych: formularz jest produktem standardowym, ale polityka akceptacji i wyceny należy do firmy.

Hybryda to optymalny kompromis i stałe zobowiązanie

Pragmatyczną odpowiedzią jest hybryda: zakup sprawdzonych elementów standardowych - silnika ról i cen, szkieletu rejestracji, ewentualnie komponentu zapytań ofertowych - oraz własna cienka warstwa integracyjna dopasowana do konkretnego sklepu. Polityka - walidacja NIP, statusy akceptacji, przydzielanie ról, zasady widoczności i integracja cen - powinna trafić do własnej wtyczki lub mu-pluginu. Prezentacja - etykiety netto i brutto, komponenty cen progowych oraz macierz zamówień B2B - należy do motywu. Jedna kontrolowana granica koordynuje mały zestaw rozszerzeń, zamiast pozwalać pięciu dostawcom niezależnie sterować fragmentami tej samej finalizacji zamówienia.

To ta sama logika kupowania elementów standardowych i budowania reguł biznesowych co w architekturze zamkniętego sklepu B2B na WooCommerce oraz przy ocenie, czy dana abstrakcja się opłaca: kupuj elementy rzeczywiście standardowe i stabilne, a buduj te, które kodują konkretne reguły biznesowe. Próba nagięcia uniwersalnego narzędzia może kosztować więcej niż bezpośrednia implementacja. Hybryda ogranicza liczbę zewnętrznych komponentów kontrolujących krytyczną ścieżkę, ale nie zmusza zespołu do ponownego tworzenia dojrzałego silnika reguł.

Hybryda nie usuwa kosztu utrzymania. Warstwa integracyjna zależna od ról nie jest jednorazowym rezultatem. WooCommerce może zmienić szablony i hooki, zewnętrzne rozszerzenia mogą zmienić zachowanie na swoich granicach, a spersonalizowane strony zachowują koszt związany z pamięcią podręczną. Uczciwe pytanie nie brzmi więc „czy da się zbudować B2B na WooCommerce?”. Przy odpowiedniej skali i modelu zakupowym - tak. Pytanie brzmi: „czy zespół jest gotów utrzymywać tę warstwę integracyjną bezterminowo?”. Jeśli tak, WooCommerce daje dużą kontrolę przy rozsądnym koszcie platformy. Jeśli wymaganiem jest gotowa funkcja B2B z procesami utrzymywanymi i gwarantowanymi przez dostawcę, warto wycenić platformę z natywnym B2B, zanim trzecia nakładająca się wtyczka podejmie tę decyzję.