Sklep, który zbierał dane bez zgody
ALU-GUM to rodzinna firma z Sulmierzyc, na rynku od 2007 roku. Około sześciu tysięcy felg na stanie: oryginały OE do Renault, Dacii, grupy PSA, Volkswagena, BMW i Jaguara, felgi stalowe, opony, koła kompletne. Realny magazyn, realni klienci, sprzedaż w kilku kanałach jednocześnie.
I sklep internetowy, który tego wszystkiego nie udźwignął. Zbudowany na Elementorze, obwieszony wtyczkami, z bannerem zgody na cookies, który był wyłącznie dekoracją. Google Analytics odpalał się i tak, zanim ktokolwiek kliknął „akceptuję".
Audyt: od najpilniejszego
Zaczęliśmy od przeglądu na żywo, po publicznym kodzie, sitemapach, stronach prawnych i danych strukturalnych. Nie od projektu graficznego, tylko od pytania, co grozi firmie już jutro.
Skrypt Google Analytics ładował się jako zwykły, wykonywalny tag, bez blokady i bez Consent Mode. Dane zbierały się przed zgodą użytkownika. To realne ryzyko RODO, a od 2024 roku brak Consent Mode w wersji drugiej odcina też remarketing i pomiar konwersji w Google Ads.
Reszta listy była podobnie konkretna. Polityka cookies szablonowa, bez nazw ciasteczek i czasu ich życia. Deklaracja dostępności istniała jako pusty adres, bez daty, poziomu zgodności i kontaktu. Przy formularzu zwrotu widniało „POBIERZ", tylko że bez żadnego linku, jako goły tekst.
Do tego warstwa niewidoczna dla klienta, a kosztowna dla sklepu: po trzy nagłówki H1 na stronie, dane strukturalne strony głównej opisujące sklep jako artykuł na blogu, produkty bez marki i bez kodu producenta, przez co felgi gorzej wchodziły do Google Shopping, oraz zebrane opinie klientów, które nigdzie nie były wpięte w dane dla wyszukiwarki.
Analityka startowała przed zgodą na cookies
Deklaracja dostępności: pusta strona
Formularz zwrotu: napis „POBIERZ" bez pliku
Trzy nagłówki H1 na jednej stronie
Strona główna opisana w danych strukturalnych jako artykuł
Produkty bez marki i kodu producenta
Jeden język, jedna waluta
Elementor i 31 arkuszy stylów
Własny mechanizm zgody, analityka rusza dopiero po akceptacji
Deklaracja dostępności i polityka cookies z tabelą ciasteczek
Interaktywny formularz zwrotu z klauzulą i zgodą
Jeden H1 na stronę, nawigacja klawiaturą, skip link
Sklep opisany jako sklep z częściami, produkty z marką i kodem
Marka i kod producenta uzupełnione na blisko trzech tysiącach pozycji
Pięć języków i cztery waluty
Własny motyw, dwa arkusze stylów
Decyzja: nie łatanie, tylko nowy fundament
Klient dostał dwie wyceny. Pierwsza obejmowała samo zdjęcie ryzyka prawnego. Druga, wybrana, oznaczała wyrzucenie Elementora i zbudowanie sklepu od nowa, przy zachowaniu katalogu i zamówień. Nie migrowaliśmy danych, tylko wymieniliśmy całą warstwę prezentacji i logiki wokół nich.
Audyt i koncept
Przegląd stanu faktycznego, potem klikalny koncept graficzny na dziesięć ekranów jako samodzielny plik HTML. Klient zaakceptował wygląd, zanim powstała pierwsza linia kodu produkcyjnego
Warstwa zgody i pomiaru
Własny mechanizm zgody z Consent Mode w wersji drugiej, zamiast zewnętrznej wtyczki. Kontener pomiarowy i pełna warstwa danych e-commerce
Motyw od zera
Klasyczny motyw w PHP z Tailwindem kompilowanym do statycznego pliku. Zero page buildera. Strona główna, listing z filtrami, karta produktu z konfiguratorem, koszyk, kasa i konto klienta
Reguły biznesowe w kodzie
Sprzedaż w kompletach, dodatki do felg, matryca przewoźników i płatności. To, co wcześniej było ustaleniem w głowie właściciela, stało się regułą, której sklep pilnuje sam
Migracja na nowy hosting
Przeniesienie sklepu ze starego dostawcy, przepięcie domeny, poczty i certyfikatów, bez przerwy w sprzedaży
Ekspansja i automatyzacja
Pięć języków, cztery waluty, reguły sprzedaży zagranicznej, katalog produktowy w Google, asystent zakupowy i kampanie reklamowe
Zgoda na cookies zrobiona uczciwie
Zewnętrzną wtyczkę do zgody wyrzuciliśmy i napisaliśmy własną. Powód jest prozaiczny: w Consent Mode w wersji drugiej liczy się kolejność, w jakiej rzeczy trafiają do nagłówka strony. Wtyczka, która robi to po swojemu, potrafi zepsuć pomiar mimo poprawnego bannera.
- Domyślna odmowa dla analityki i marketingu, ustawiana zanim cokolwiek się załaduje
- Zapamiętany wybór użytkownika odczytywany przed startem kontenera pomiarowego
- Czyszczenie adresu z parametrów śledzących, żeby nie zaśmiecały statystyk i wyników wyszukiwania
- Kategorie: niezbędne, statystyczne, marketingowe, z możliwością zmiany decyzji z poziomu stopki
- Bez zgody dane lecą w formie anonimowej, po zgodzie w pełnej, i to jest różnica między pomiarem legalnym a nielegalnym
Na tym fundamencie stanęła warstwa danych e-commerce: obejrzenie produktu, dodanie do koszyka, rozpoczęcie płatności i zakup razem z kwotą, walutą i numerem zamówienia. Jedno źródło dla analityki, reklam i przyszłych integracji marketingowych.
Formularze, które faktycznie działają
Napis „POBIERZ" bez pliku zastąpił interaktywny formularz zwrotu. Klient wypełnia go online, zaznacza wymaganą zgodę na przetwarzanie danych i widzi klauzulę informacyjną, a zgłoszenie trafia mailem do sklepu i do niego samego. Nie ma etapu drukowania, skanowania i odsyłania.
Analogicznie powstał formularz kontaktowy z osobną, dobrowolną zgodą marketingową, pułapką na roboty i limitem zgłoszeń na minutę. Zgody pojawiły się też przy rejestracji konta: akceptacja regulaminu i polityki jest wymagana, marketing pozostaje wyborem, a decyzja zapisuje się przy koncie klienta.
Nowy sklep zamiast Elementora
Motyw powstał od zera, na tokenach z zaakceptowanego konceptu. Efekt widać w liczbach, bo usunięcie page buildera zdjęło ze strony około 470 kilobajtów samego kodu HTML, zanim jeszcze doliczymy style i skrypty.
Dostępność podniosła się z osiemdziesięciu ośmiu do dziewięćdziesięciu pięciu punktów. Jeden nagłówek H1 na stronę, link pozwalający pominąć nawigację, poprawny kontrast, obsługa klawiaturą, zamykanie menu klawiszem Escape. To nie jest kosmetyka, tylko wymóg Europejskiego Aktu o Dostępności, który obowiązuje sklepy od czerwca 2025 roku.
Karta produktu, która sprzedaje komplet
Felgi sprzedaje się w kompletach i sklep wreszcie o tym wie. Karta produktu ma konfigurator: klient wybiera liczbę sztuk, dokłada opony, czujniki ciśnienia i montaż, a suma przelicza się na żywo. Reguła biznesowa właściciela została zapisana w kodzie, łącznie z rozpoznawaniem, kiedy oferta dotyczy pojedynczej sztuki, a kiedy pełnego kompletu.
- Wyszukiwarka rozumiejąca zapytania w rodzaju „clio 17" albo „5x114,3" i zamieniająca je na filtry
- Dobór po parametrach: średnica, szerokość, rozstaw śrub, otwór centralny i wylot
- Filtr stanu, oddzielający felgi nowe od używanych, zbudowany na danych z całego katalogu
- Prawdziwe opinie produktów widoczne na stronie głównej i w danych dla wyszukiwarki
- Statystyki liczone z bazy, nie wpisane na sztywno w szablon
Dostawa i płatność bez telefonu do klienta
Reguły wysyłki felg były do tej pory wiedzą plemienną. Zamieniliśmy je w automat, który nie pozwala złożyć niemożliwego zamówienia.
- Felgi jadą wyłącznie kurierem, paczkomat znika z wyboru sam
- Drobne produkty mogą iść zarówno kurierem, jak i do paczkomatu
- Przy paczkomacie pobranie jest niedostępne, zostaje przedpłata
- Za granicę wyłącznie kurierzy międzynarodowi, z progiem minimalnego kosztu
- Poza Polską pobranie nie jest oferowane w ogóle
Pięć języków i cztery waluty
Sklep miał wyjść poza Polskę, więc dostał pięć wersji językowych: polską, niemiecką, czeską, słowacką i rumuńską, każdą w osobnym katalogu adresu. Przetłumaczyliśmy nie tylko interfejs, ale i katalog: ponad trzy tysiące produktów razy cztery języki to około piętnastu tysięcy wpisów produktowych, do tego menu, kategorie, strony i komplet treści prawnych.
Po włączeniu wielojęzyczności przestały działać filtry na wersjach obcych. Przyczyny były dwie i obie leżały głęboko: wtyczka tłumacząca obejmowała także atrybuty techniczne felg, przez co zapytanie do bazy nie mogło zwrócić nic sensownego, a przetłumaczone produkty nie trafiły do tabeli, z której WooCommerce czyta ceny i stany. Naprawa obu warstw przywróciła filtry, dane techniczne i produkty powiązane we wszystkich językach.
Do tego cztery waluty: złoty, euro, korona czeska i lej rumuński, z kursami pobieranymi automatycznie z Narodowego Banku Polskiego. Waluta dobiera się do języka, a klient może ją zmienić ręcznie i wybór zostaje zapamiętany.
Sprzedaż zagraniczna z własnymi regułami
Wysyłka felg za granicę kosztuje więcej i klient postawił jasne warunki. Ceny dla zagranicy dostają ustalony narzut procentowy, doliczany zanim waluta zostanie przeliczona, żeby kolejność działań nie zafałszowała kwoty. Wysyłka poza Polskę idzie tylko wybranymi kurierami międzynarodowymi, z minimalną kwotą przewalutowywaną na walutę klienta. Wszystkie progi ustawia się z panelu sklepu, bez dotykania kodu.
Jedno źródło prawdy dla wszystkich kanałów
ALU-GUM sprzedaje nie tylko na własnej stronie. Stany i ceny całego katalogu żyją w BaseLinkerze, który zasila dwa konta Allegro, Erli i sklep internetowy. Nasza rola polegała na tym, żeby ten obieg był spójny i żeby dane nadawały się do kanałów, które ich wymagają.
- Uzupełnienie producenta i kodu producenta na blisko trzech tysiącach pozycji, bo bez nich marketplace'y i Google Shopping traktują ofertę gorzej
- Automatyczne przypisywanie kodu jako identyfikatora produktu po stronie sklepu, czego sam BaseLinker nie robi
- Automatyczna klasyfikacja kategorii na podstawie danych producenta felgi
- Katalog wysyłany do Google Merchant Center, ponad trzy tysiące ofert, ze zdjęciami i etykietami do sterowania stawkami
- Ceny dla katalogu Google zawsze w wersji krajowej, niezależnie od tego, jaką walutę widzi odwiedzający
Po włączeniu wielojęzyczności interfejs programistyczny sklepu zaczął zwracać produkty ze wszystkich języków naraz. Automat wysyłający katalog do Google zdublował więc oferty kilkukrotnie, co skończyło się tysiącami odrzuconych pozycji. Znaleźliśmy przyczynę, wyczyściliśmy duplikaty i przebudowaliśmy automat tak, żeby filtrował język i przerywał pracę, gdy dane wyglądają podejrzanie. Każdy program czytający dane wielojęzycznego sklepu musi jawnie wskazać język.
Felek, asystent zakupowy bez abonamentu
Klient zobaczył u konkurencji czat obsługiwany przez wynajętą usługę i chciał to samo. Policzyliśmy koszty i zaproponowaliśmy coś innego: własnego asystenta, bez modelu językowego i bez opłat abonamentowych.
Felek rozpoznaje intencję pytania, radzi sobie z literówkami i odmianą, rozumie pytania w pięciu językach i przeszukuje katalog sklepu. Zapytany o rozmiar opony rozpozna go wyrażeniem regularnym, zapytany o „golfa" albo „passata" sprowadzi nazwę do modelu auta. Odpowiada na pytania o dostawę, zwroty, płatności, komplety, dostępność, sprzedaż zagraniczną i hurt, a dane bierze wprost z ustawień sklepu, więc nie rozjedzie się z rzeczywistością.
Pytania, na które Felek nie umiał odpowiedzieć, trafiają do panelu administratora razem z licznikiem powtórzeń. Właściciel widzi, o co klienci pytają najczęściej, i jednym przyciskiem dopisuje odpowiedź. To zamienia czat w narzędzie do badania potrzeb klientów, a nie tylko w automat od odpowiadania.
Reklama, która wie, co sprzedaje
Na koniec doszły kampanie Google Ads. Nie ruszyliśmy ich, dopóki sklep nie potrafił zmierzyć sprzedaży co do złotówki, bo bez tego reklama jest wydatkiem, o którym nic nie wiadomo.
- Trzy kampanie: wyszukiwarkowa według marki auta, produktowa zasilana katalogiem i obrona własnej nazwy
- Dwadzieścia grup reklam, po jednej na markę auta, plus dobór po rozstawie i felgi używane
- Pięćset cztery słowa kluczowe w dopasowaniach ograniczających przypadkowy ruch
- Siedemdziesiąt cztery wykluczenia od pierwszego dnia, między innymi naprawa, prostowanie, skup i wynajem
- Katalog podzielony na piętnaście segmentów z osobnymi stawkami, od najdroższych marek premium po akcesoria
- Pomiar zakupu przekazujący kwotę, walutę i numer zamówienia, więc raport pokazuje przychód, nie liczbę kliknięć
Świadomie zaczęliśmy od licytowania pod kliknięcia z limitem stawki, a nie od automatu optymalizującego konwersje. Automat potrzebuje historii sprzedaży, a konto jej nie miało. Wyłączyliśmy też kampanię zakładaną automatycznie przez kreator Google oraz rozszerzenia zasięgu na sieć reklamową i partnerów, bo na starcie zaciemniają odczyt tego, co naprawdę działa.
Awaria, która czegoś nauczyła
Pod koniec sierpnia sklep przestał odpowiadać na blisko dobę. Przyczyną było obejście konfiguracyjne odziedziczone po migracji, które hosting w końcu ubił. Doraźne restarty przestały pomagać, więc zamiast reanimować obejście, przenieśliśmy sklep na aktualną, systemową wersję PHP, a całą diagnostykę i procedurę wyjścia opisaliśmy w dokumentacji.
Tydzień później okazało się, że awaria zostawiła ślad w innym miejscu. Zamówienia przestały trafiać do BaseLinkera, mimo że stany magazynowe synchronizowały się normalnie. Analiza logów pokazała, że po serii nieudanych zapytań w czasie awarii BaseLinker sam wstrzymał pobieranie zamówień i nie wznowił go po powrocie sklepu. Sklep działał poprawnie przez cały czas. To trafiło do dokumentacji jako stała procedura na wypadek każdej dłuższej niedostępności.
Technologie
WooCommerce
PHP 8.5
MariaDB
Tailwind CSS 4
Motyw klasyczny bez page buildera
REST API
Polylang Pro
Multiwaluta z kursami NBP
BaseLinker
Przelewy24
Google Tag Manager
GA4 z Consent Mode v2
Google Merchant Center
Google Ads
Schema.org JSON-LD
Docker
PHPUnit
Rezultaty
Czego ten projekt uczy
Sklep nie był zepsuty dlatego, że komuś zabrakło chęci. Był zepsuty, bo każdy kolejny element dokładano do poprzedniego, aż całość przestała się trzymać kupy: page builder na wtyczce, wtyczka na wtyczce, zgoda na cookies jako obrazek do zamknięcia. Naprawa oznaczała odwrócenie kolejności: najpierw fundament prawny i pomiarowy, potem szybka warstwa prezentacji, dopiero na końcu ekspansja i reklama.
Dzięki tej kolejności każdy kolejny etap dało się dołożyć bez przebudowywania poprzedniego. Wielojęzyczność weszła na gotowy motyw. Waluty weszły na wielojęzyczność. Sprzedaż zagraniczna weszła na waluty. Reklama weszła na pomiar, który stał od pierwszego tygodnia projektu.