Checkout w PrestaShop to pięć kroków: koszyk, dane, dostawa, płatność i potwierdzenie. Domyślny proces działa poprawnie, dopóki nie dojdą moduły przewoźników, płatności odroczonych i punkty odbioru — wtedy najczęściej sypie się walidacja i znikają stawki dostawy. Ten artykuł zbiera część organizacyjną: co sprawdzić przed startem, jak przetestować trzy ścieżki klienta i jak nie tracić zamówień na etapie konfiguracji. Rozdzielamy przy tym to, co wynika z rdzenia PrestaShop, od tego, co dokładają moduły.
W PrestaShop 1.7 i 8 zamówienie to pięć adresów obsługiwanych przez cztery kontrolery. Warto znać tę mapę, bo większość zgłoszeń „zgubione zamówienie” kończy się sprawdzeniem jednego z tych miejsc.
Podział na szablony i logikę jest kluczowy przy diagnozie: układ pól zmienisz w pliku .tpl, ale walidację i zapis danych — w klasach. Za utworzenie zamówienia odpowiada PaymentModule::validateOrder(); dopiero po jego wywołaniu rekord pojawia się w Zamówienia > Zamówienia. Moduły płatności (Przelewy24, PayU, Stripe) rozszerzają PaymentModule, więc ich błędy nie są błędami rdzenia. Kolejność hooków i klasy opisuje dokumentacja dla deweloperów PrestaShop.
Przełącznik Zezwól na zamówienia od gości siedzi w Parametry sklepu > Ustawienia klientów. Nie chodzi o brak konta: PrestaShop i tak tworzy rekord klienta, ale bez hasła i z flagą gościa. Skutki są praktyczne — gość nie zaloguje się później, nie zobaczy historii zamówień i nie zapisze adresu na następny raz. Przy koszykach do 200 zł to zwykle dobry kompromis; przy B2B i zamówieniach cyklicznych wyłącz gościa i skróć formularz rejestracji do minimum.
Stan wdrożenia sprawdzasz w trzech miejscach: /order (czy kroki przechodzą bez zerwania), /order-confirmation (czy potwierdzenie się renderuje) i back-office Zamówienia > Koszyki, gdzie leżą koszyki, które nie stały się zamówieniami — z datą i kwotą. Dopięcie do tego pomiaru kroków opisuje nasze wdrożenie GA4 eCommerce w PrestaShop.
Najpierw sprawdź, czy twój motyw w ogóle obsługuje tryb jednej strony. Przełącznik znajdziesz w Parametry sklepu > Ustawienia zamówień (w 1.6 było to Preferencje > Zamówienia), ale w części instalacji 1.7.x i w motywach kupionych od firm trzecich nie robi on nic, bo checkout jest nadpisany własnymi szablonami. Test: włącz opcję, wejdź na /order jako gość i policz przeładowania strony. Jedno oznacza, że OPC działa; trzy-cztery — że motyw gra swoje.
Co OPC realnie zmienia? Te same kontrolery, te same szablony, inne składanie kroków po stronie JS. Nie zmienia logiki walidacji ani sposobu liczenia stawek przewoźników.
Kiedy zostawić pięć kroków: koszyk B2B i zamówienia na fakturę z odroczonym terminem, skomplikowane warianty dostawy (kurier + paleta + punkt odbioru), klienci, którzy chcą zobaczyć koszt dostawy przed przejściem do płatności, oraz katalogi z konfigurowalnymi produktami.
Kiedy OPC pomaga: średnia wartość koszyka poniżej 150–200 zł, powyżej 60% ruchu z telefonów, 1–3 przewoźnicy i płatności express (BLIK, karta zapisana w przeglądarce). Zanim przełączysz OPC na ruchu mobilnym, sprawdź wydajność /order — formularz zamówienia z kilkoma skryptami płatności wypada najgorzej w Core Web Vitals i przy wolnym LCP klient nie dociera do podsumowania. Widełki czasowe: w gotowym motywie z natywnym wsparciem to 2–6 h (włączenie, test trzech ścieżek, poprawki CSS). Przepisanie szablonów, walidacji i obsługi błędów AJAX to 16–40 h — i wtedy warto najpierw uporządkować moduły, np. przez integracje płatności i dostaw z PrestaShop.
Najczęstsza pułapka: OPC plus moduł dostawy, który przed pokazaniem stawek wymaga pełnego adresu. Wtedy pierwszy XHR leci z pustym kodem pocztowym, moduł zwraca błąd, a klient widzi puste stawki albo kręcące się kółko. Diagnoza: DevTools > Network, filtr XHR na /order, odpowiedź serwera; potem przestawienie kolejności kroków w motywie albo wyłączenie OPC do czasu poprawki.
| Kryterium | One-page (OPC) | Standardowy 5-krokowy |
|---|---|---|
| Średnia wartość koszyka | do ~200 zł | powyżej 200 zł, faktury, B2B |
| Ruch mobilny | powyżej 60% | dowolny, mniej wrażliwy |
| Liczba przewoźników | 1–3, proste stawki | 4+, palety, punkty odbioru |
| Czas wdrożenia | 2–6 h w gotowym motywie | 0 h, jeśli nie ruszasz motywu |
| Główne ryzyko | puste stawki przy modułach wymagających adresu | porzucenia na kroku dostawy |
Zacznij od pól adresowych. W Międzynarodowy > Lokalizacja > Kraje > Polska > Edytuj ustawiasz dla każdego pola stan: wymagane, opcjonalne albo ukryte. W polskich sklepach Region (stan) prawie zawsze idzie na ukryte — nikt go nie wypełnia, a wymagane pole generuje porzucenia na kroku danych. NIP zostaw: włącz Tryb B2B w Parametry sklepu > Ustawienia klientów, wtedy pole NIP pojawia się w adresie i możesz uczynić je wymaganym. Osobno przemyśl telefon — jeśli wysyłasz nim powiadomienia o dostawie, oznacz jako wymagany; jeśli służy tylko marketingowi, zostaw opcjonalny.
Limity zamówienia: minimalna wartość koszyka jest w Parametry sklepu > Ustawienia zamówień i działa na poziomie całego sklepu. Maksymalnej wagi globalnie nie ma — siedzi w zakresach wagowych przewoźnika (Dostawa > Przewoźnicy > edycja > Rozmiary, wagi i kategorie). Tam też wykluczysz kategorię lub pojedynczy produkt z danego przewoźnika, np. hydraulikę z Paczkomatu albo meble z kuriera.
Walidacja: reguły i formaty siedzą w classes/Validate.php. Kody pocztowe reguluje wzór w Kraje > Polska (N = cyfra, L = litera; typowo NN-NNN). Test: wpisz 00-001 i 00001 — drugi wariant powinien zostać odrzucony; jeśli przechodzi, popraw wzór, żeby nie produkować błędnych adresów u kuriera. Uwaga na moduły weryfikujące NIP przez API — przy limicie zapytań odrzucają poprawne numery i klient utyka na kroku danych.
Koszyk po wylogowaniu PrestaShop domyślnie zachowuje, a opcja pokazywania go ponownie po zalogowaniu jest w Parametry sklepu > Ustawienia klientów. Zmiana kraju dostawy przelicza podatki z reguł podatkowych i stawki przewoźnika ze strefy — jeśli kraj należy do strefy bez reguły dla przewoźnika, dostawa zniknie, a klient zobaczy 0 zł albo puste pole. Chcesz wiedzieć, na którym polu ludzie się zatrzymują? Potrzebny jest DataLayer w PrestaShop, bo walidacja JS nie zostawia śladu w GA4.
| Scenariusz | Co sprawdzasz | Czego szukać w back-office |
|---|---|---|
| Nowy gość | rejestracja bez hasła, pełny adres, płatność | Zamówienia > Zamówienia: klient z flagą gościa |
| Nowy zarejestrowany | wymagane pola, NIP przy B2B, mail potwierdzający | Klienci: zapisany adres, mail w kolejce |
| Powracający z adresem | podstawienie adresu, przeliczenie stawek po zmianie kraju | Zamówienia > Koszyki: brak zdublowanych koszyków |
Kolejność metod płatności w PrestaShop wynika z kolejności instalacji modułów. Rdzeń nie ma przełącznika „metoda domyślna” — żeby jedna z metod była zaznaczona na wejściu, trzeba to zrobić szablonem lub skryptem modułu. Konsekwencja praktyczna: preselekcja generuje zdarzenie jeszcze przed decyzją klienta, więc w pomiarze trzeba je odróżnić od realnego wyboru. Zacznij od Moduły → Płatność i sprawdź „Ograniczenia” każdego modułu: waluta, grupa klienta, kraj, przewoźnik.
Właśnie ograniczenia po przewoźniku wywalają checkout najczęściej. Przykład: PayPo ma sens przy paczkomacie, ale przy płatności za pobraniem klient finansuje zakup dwiema metodami jednocześnie — moduł powinien się wtedy schować. Podobnie raty przy koszyku za 50 zł. Testuj trzy koszyki: ~30 zł, ~300 zł, ~3000 zł, dla każdej pary przewoźnik + płatność.
Mapa punktów (InPost, DPD, DHL) to najbardziej wrażliwe miejsce. Potrzebujesz tokenu/klucza API operatora i kontraktu na usługę, a w module pola, do którego zapisuje się identyfikator punktu razem z nazwą i adresem. Test walidacji: przejdź checkout bez wybrania punktu — jeśli zamówienie powstaje bez identyfikatora, masz błąd konfiguracji, który wyjdzie dopiero przy nadawaniu paczki. Gdy API nie odpowiada (timeout, 429, brak tokenu), nie blokuj checkoutu: pokaż listę punktów z cache z ostatnich 24 h, a brak danych obsłuż jako wybór z listy tekstowej i zapisz zdarzenie w logu modułu.
Powrót z bramki: dla przekierowań zamówienie powstaje przed potwierdzeniem płatności, więc klient widzi je w statusie oczekiwania, a koszyk jest już skasowany. Drugi przypadek to płatność potwierdzona, ale zamówienie nie zapisało się (błąd walidacji po stronie modułu) — wtedy transakcja istnieje tylko w panelu bramki. Wykryjesz to porównaniem dziennym: zestawienie transakcji z panelu z zamówieniami w PrestaShop po kwocie i dacie. Webhook musi mieć publiczny adres, działać przy wyłączonym trybie serwisowym, odpowiadać 200 w kilka sekund, weryfikować podpis i być idempotentny — bramki ponawiają wysyłkę.
Checklista przed przełączeniem na produkcję: klucze produkcyjne, adres webhooka, whitelista IP, karty 3DS, waluta PLN, wyłączone wysyłki testowe do klientów, kopia zamówień testowych usunięta ze statystyk. Całość organizacyjnie opisujemy w materiale o integracjach z PrestaShop i organizacji wdrożenia; konfigurację modułów sprawdzasz w dokumentacji deweloperskiej PrestaShop.
| Element | Gdzie ustawiasz | Na co uważać |
|---|---|---|
| Kolejność metod płatności | Moduły → Płatność (kolejność instalacji, pozycja w hooku displayPayment) | Preselekcja liczy się jako zdarzenie bez decyzji klienta |
| Dostępność metody | Konfiguracja modułu → Ograniczenia (waluta, grupa, kraj, przewoźnik) | Płatność odroczona + pobranie = dwie formy finansowania naraz |
| Punkty odbioru | Moduł przewoźnika + pole punktu w zamówieniu | Zamówienie bez identyfikatora punktu przechodzi dalej |
| Powrót z bramki | Konfiguracja modułu + Statusy zamówień | Brak webhooka = zamówienia „w koszyku, ale opłacone” |
| Tryb testowy → produkcja | Klucze, webhook, IP, 3DS, waluta | Testowe zamówienia zostają w statystykach |
Strona zamówienia nie ma prawa być cache’owana w pełni. Zawiera sesję, zawartość koszyka i token CSRF w formularzu, więc cache stron dla adresów z kontrolera order, order-confirmation i wszystkich z parametrem token musi być wyłączony. Jeśli używasz modułu cache lub CDN z regułami, dodaj wyjątki po nazwie kontrolera, a nie po samym /order — sklepy z niestandardowym checkoutem mają inne ścieżki. W Parametry zaawansowane → Wydajność sprawdź też CCC dla JavaScriptu: przy starszych modułach płatności łączenie plików psuje skrypty i checkout przestaje reagować, więc testuj z wyłączonym CCC.
LCP na kroku dostawy najczęściej psuje mapa punktów. Ładuj ją dopiero po wybraniu przewoźnika (przycisk „wybierz punkt” uruchamia widget), nie na starcie kroku — na mobile to często 300–600 kB JavaScriptu i główny powód LCP ponad 4 s. Skrypty bramek (3DS, fingerprint) wczytuj asynchronicznie z defer, ale skryptu modułu, który przelicza stawki dostawy przez AJAX, nie ruszaj: kolejność jego wykonania decyduje o tym, czy koszt dostawy się podstawi. Cel: TTFB poniżej 0,5 s, LCP poniżej 2,5 s, INP poniżej 200 ms — progi opisane w artykule web.dev o Web Vitals i w wytycznych Core Web Vitals.
Liczbę zapytań na kroku płatności zmierzysz w trybie debugowania: na dole strony pojawia się profil z listą zapytań SQL i czasem. Alternatywa bez wyłączania sklepu: slow query log MySQL z progiem 0,2 s plus SHOW FULL PROCESSLIST w trakcie testu. Jeśli krok płatności generuje 200+ zapytań, winne są zwykle reguły cenowe i przeliczanie koszyka, a nie sam moduł płatności.
Na mobile skróć formularz: w Klienci → Adresy odznacz pola, których nie potrzebujesz, dodaj atrybuty autocomplete (email, tel, postal-code, street-address, cc-number) i inputmode dla pól liczbowych, a fonty ustaw z font-display: swap, żeby zmiana kroku nie migała. Gdy problemem jest serwer, zobaczysz to po sygnałach: 5xx przy składaniu zamówienia, timeouty webhooków płatności, wolne zapisy do ps_orders, błędy „Too many connections” i backup w godzinach szczytu. Zamiana VPS na maszynę z lepszym dyskiem bywa tańsza niż pół roku optymalizacji modułów — kryteria wyboru wykonawcy opisaliśmy w tekście o tym, kogo wybrać do wdrożenia PrestaShop i ile to kosztuje.
| Objaw | Najczęstsza przyczyna | Czym zmierzyć |
|---|---|---|
| Checkout nie reaguje na zmianę przewoźnika | CCC dla JS lub skrypt modułu z defer | Konsola przeglądarki, test po wyłączeniu CCC |
| LCP 4–6 s na kroku dostawy | Mapa punktów ładowana na starcie kroku | PageSpeed Insights / Lighthouse na mobile |
| TTFB 1,5 s+ i 200+ zapytań | Reguły cenowe, przeliczanie koszyka | Profil w trybie debug, slow query log |
| 5xx przy składaniu zamówienia | Wyczerpany pool PHP-FPM, locki w MySQL | Logi serwera, SHOW FULL PROCESSLIST |
| Webhooki przychodzą po kilku minutach | Timeouty PHP i kolejkowe retry bramki | Logi modułu płatności + panel bramki |
Zdarzenia GA4 dla checkoutu mają jasne znaczenie: view_cart wysyłasz, gdy klient otwiera koszyk, begin_checkout przy wejściu na pierwszy krok zamówienia, add_shipping_info po wybraniu przewoźnika i przejściu dalej, add_payment_info po zatwierdzeniu metody płatności, purchase dopiero na order-confirmation. Błąd numer jeden to wysyłanie add_shipping_info na klik w radio zamiast na przejście kroku — wtedy dwie osoby, które tylko oglądały listę kurierów, wyglądają jak porzucający na dalszym etapie.
W DataLayer musi trafić: currency, value (zgodne z kwotą zamówienia w PrestaShop, z dostawą i podatkiem), tablica items z item_id równym SKU/odniesieniu, nazwą, ceną po rabacie i ilością, a także shipping_tier (nazwa przewoźnika widoczna dla klienta) i payment_type. Braki, które widzimy najczęściej: brak waluty (GA4 przyjmuje domyślnie USD i przychód rozjeżdża się z fakturą), cena przed rabatem, wewnętrzne ID zamiast SKU oraz brak metody dostawy — bez niej nie odpowiesz, czy tracisz klientów na paczkomatach, czy na kurierze. Wdrożenie opisujemy szerzej w materiałach o GA4 eCommerce w PrestaShop i o DataLayer w PrestaShop bez chaosu.
Porzucenie na kroku dostawy i porzucenie na bramce to dwa różne problemy. W GA4 oba wyglądają jak wyjście z kroku 3, dopóki nie dodasz własnych zdarzeń: payment_redirect przed wyjściem do bramki i payment_return po powrocie. Dopiero z nimi rozdzielisz „nie chciał płacić online” od „bramka odrzuciła kartę”. Warto logować też checkout_error z kodem błędu walidacji.
Raport tygodniowy: Funnel exploration z czterema krokami, podział po urządzeniu, plus osobno koszyk → krok 1. Zamiast jednego „conversion rate” licz spadek procentowy między krokami; liczby rzędu 1000 sesji → 400 begin_checkout → 300 add_shipping_info → 180 add_payment_info → 120 purchase mówią, gdzie interweniować.
Pułapka duplikacji: powrót przyciskiem wstecz albo F5 na order-confirmation wysyła purchase ponownie. GA4 deduplikuje po transaction_id, ale tylko gdy identyfikator jest ten sam i nie zmieniasz go po drodze. Zabezpiecz się lokalnie: znacznik w localStorage z numerem zamówienia i blokada wysyłki na 30 dni. I nie uruchamiaj jednocześnie wbudowanego modułu GA4 i kontenera GTM — to najczęstsza przyczyna podwójnych zakupów w raportach.
| Zdarzenie | Kiedy wysłać | Minimum w DataLayer |
|---|---|---|
| view_cart | Otwarcie koszyka | currency, value, items |
| begin_checkout | Wejście na krok 1 zamówienia | currency, value, items, coupon |
| add_shipping_info | Przejście kroku dostawy | shipping_tier, currency, value, items |
| add_payment_info | Zatwierdzenie metody płatności | payment_type, currency, value, items |
| purchase | Strona order-confirmation | transaction_id, currency, value, items, shipping_tier, payment_type |
| payment_redirect / payment_return | Wyjście i powrót z bramki | transaction_id, payment_type, timestamp |
Trzy awarie odpowiadają za większość zamówień, które nie dochodzą do skutku: przewoźnik zniknął z listy, zamówienie kończy się błędem 500, płatność pobiera pieniądze dwa razy. Każdą da się zdiagnozować w kilkanaście minut, jeśli wiadomo, gdzie patrzeć.
Pusta stawka dostawy. Najczęstsza przyczyna to zmiana przypisania kraju do strefy w Międzynarodowe → Lokalizacja → Strefy albo dodanie kraju do strefy, do której żaden przewoźnik nie jest przypisany. PrestaShop nie pokazuje wtedy błędu — przewoźnik po prostu wypada z kroku „Dostawa”. Sprawdź w Przewoźnicy → Zakres i koszty, czy każda strefa z twojej konfiguracji ma przewoźnika, i przetestuj checkout dla Polski, Niemiec i kraju spoza UE. W Zaawansowane → Logi szukaj wpisów z „carrier”, na serwerze w error_log frazy „No carriers available”. Na środowisku testowym włącz _PS_MODE_DEV_ w config/defines.inc.php — produkcja ukrywa ostrzeżenia, które tam zobaczysz.
memory_limit na tanim hostingu; po aktualizacji brakuje kolumn, które moduł dodawał we własnej metodzie install(). Punkt startowy to error_log z pełnym stack trace i zgodność wersji PHP z dokumentacją deweloperską PrestaShop.ps_orders dla tego samego id_cart w odstępie 2–5 sekund oznaczają podwójne kliknięcie albo powrót z bramki płatności i odświeżenie. Moduł płatności powinien blokować przycisk po pierwszym kliknięciu i przekazywać token idempotencji. Sprawdź zapytaniem: SELECT id_cart, COUNT(*) FROM ps_orders GROUP BY id_cart HAVING COUNT(*) > 1./themes/twoj-motyw/templates/checkout/ zostają stare. Zrób diff katalogu szablonów przed wdrożeniem (git, rsync -n) — różnice w order-confirmation.tpl i order-detail.tpl łapie się w minutę.| Objaw | Gdzie szukać | Test w 5 minut |
|---|---|---|
| Brak przewoźników w kroku dostawy | Międzynarodowe → Strefy; Przewoźnicy → Zakres i koszty | Zmień kraj w checkoucie na DE i sprawdź, czy przewoźnik się pojawia |
| Błąd 500 przy potwierdzeniu zamówienia | error_log serwera, Zaawansowane → Logi, tryb debug | Złóż zamówienie bez modułów płatności i kurierów, potem dodawaj po jednym |
| Dwa zamówienia z jednego koszyka | ps_orders, ps_order_payment | Grupowanie po id_cart z warunkiem COUNT(*) > 1 |
| Zła kwota po edycji produktu | ps_cart_product, krok dostawy | Zmień cenę produktu przy aktywnym koszyku i odśwież checkout |
| Brak potwierdzenia po aktualizacji | diff /themes/.../templates/checkout/ | Porównaj pliki order-*.tpl z wersją z paczki motywu |
Punkt wyjścia: większość sklepów nie potrzebuje własnego checkoutu, tylko uporządkowanej konfiguracji i jednego dobrze wybranego modułu. Własny kod zaczyna się opłacać, gdy twoja logika sprzedaży nie mieści się w standardowych polach formularza.
Sygnały, że nadszedł czas na własny moduł:
Pułapka modułu z marketplace. Działa w demo na motywie klasycznym, a potem okazuje się, że nadpisuje ten sam hook displayPaymentTop co moduł płatności, a autor nie wydał nowej wersji od dwóch lat. Koszt ukryty pojawia się nie przy zakupie, tylko przy pierwszej aktualizacji PrestaShop: motyw się rozjeżdża, support milczy, a ty płacisz za łatanie cudzego kodu.
Widełki do budżetu: konfiguracja 4–12 h, własny krok dostawy 40–80 h, przepisanie całego checkoutu 120–200 h. Licz to nie w izolacji, ale względem kosztu porzuceń. Przy 1000 zamówieniach miesięcznie i 2% porzuceń na kroku dostawy to 20 zamówień. Jeśli każde wymaga telefonu i ręcznego doliczenia stawki, a obsługa zajmuje 15 minut przy 100 zł/h, mówimy o 500 zł miesięcznie straconych tylko na samej obsłudze — nie licząc klientów, którzy nie wrócą.
Utrzymanie. Własny moduł to nie plik na serwerze, tylko zobowiązanie: kto reaguje po wydaniu nowej wersji PrestaShop, kto testuje po zmianie PHP, jaki jest czas reakcji. Ustal to przed startem, bo później brak SLA jest droższy niż sam kod. Sposób liczenia budżetu na całe wdrożenie rozkładamy w materiale o tym, ile realnie kosztuje wdrożenie sklepu na PrestaShop.
| Wariant | Zakres prac | Widełki | Główne ryzyko |
|---|---|---|---|
| Konfiguracja | Strefy, przewoźnicy, płatności, maile, testy | 4–12 h | Błędne przypisanie strefy — przewoźnik znika bez komunikatu |
| Własny krok dostawy | Moduł z logiką wyceny, hook checkoutu, testy regresji | 40–80 h | Konflikt z modułem płatności o ten sam hook |
| Przepisanie checkoutu | Cały proces, własne szablony, integracja ERP w trakcie zamówienia | 120–200 h | Utrzymanie przy każdej aktualizacji rdzenia i PHP |
Testuj w stałej kolejności: koszyk → dane → dostawa → płatność → mail → ERP/magazyn. Nie przechodź dalej, dopóki poprzedni krok nie działa na wszystkich kombinacjach. Błąd w kroku dostawy maskuje problem z płatnością i tracisz czas na diagnozie złego elementu.
Środowisko testowe. Chrome, Safari na iOS (tam najczęściej wychodzą problemy z autouzupełnianiem i klawiaturą numeryczną), Firefox, Edge. Desktop plus ekran 360 px. Zawsze w trybie incognito — sesja i cache potrafią pokazać checkout, którego klient już nie zobaczy. Wyłącz cache w Zaawansowane → Wydajność (Cache: Nie) albo wyczyść /var/cache/prod i /var/cache/dev.
Po każdej aktualizacji PrestaShop, motywu i każdego modułu płatności lub kuriera sprawdź:
order-*.tpl w motywie nie zostały nadpisane i zawierają nowe pola,ps_orders ma wszystkie kolumny wymagane przez moduły,Kto za co odpowiada. Klient: dane karty, przeglądarka, rozszerzenia blokujące. Wykonawca: konfiguracja, moduły, serwer, logi. W zgłoszeniu podaj: adres URL, datę i godzinę z sekundami, id_cart i id_order, krok, na którym wystąpił błąd, wybrany kraj i metodę dostawy, wersję PrestaShop i PHP, treść błędu oraz informację, czy problem powtarza się w incognito na innym urządzeniu. Bez tego pierwsie pół godziny pracy idzie na odtwarzanie sytuacji, a nie na naprawę. Jeśli po testach chcesz sprawdzić, czy zamówienia faktycznie dochodzą do analityki, zacznij od poprawnego wdrożenia GA4 eCommerce w PrestaShop — bez tego nie odróżnisz porzucenia od błędu technicznego.
| Krok | Co sprawdzić | Kto testuje |
|---|---|---|
| Koszyk | Dodanie, edycja ilości, usunięcie, kwota i waga | Wykonawca |
| Dane | Walidacja pól, format kodu pocztowego, wymagane pola dla danego kraju | Wykonawca |
| Dostawa | Przewoźnicy dla PL, DE, kraju spoza UE, cena i czas dostawy | Wykonawca |
| Płatność | Powrót z bramki, status zamówienia, brak podwójnych zamówień | Wykonawca + klient na własnej karcie |
| Potwierdzenie w skrzynce, poprawność kwot i adresu | Wykonawca | |
| ERP/magazyn | Zamówienie w systemie, rezerwacja stanu, numer z ERP | Wykonawca + dział obsługi |
Włączony one-page checkout przy module dostawy, który wymaga pełnego adresu przed pokazaniem stawek.
Jak wykryć: W konsoli przeglądarki na /order pojawiają się błędy AJAX, a lista przewoźników zostaje pusta po wpisaniu adresu.
Jak naprawić: Wyłącz szybkie zamówienie w Preferencje > Zamówienia i przetestuj standardowy, krokowy proces. Jeśli OPC ma zostać, wymień moduł dostawy na taki, który liczy stawki bez pełnego adresu, albo popraw kolejność walidacji w motywie.
Pole stan/region wymagane w formularzu adresu dla Polski.
Jak wykryć: W formacie adresu kraju PL widnieje stan, a w sekcji wymaganych pól adresu jest oznaczony jako obowiązkowy.
Jak naprawić: Usuń stan z formatu adresu dla Polski i odznacz to pole w ustawieniach wymaganych pól. Sprawdź potem, czy nie wymusza go żaden moduł kurierski, bo część z nich potrafi dodać własne reguły.
Testy checkoutu robione wyłącznie na zalogowanym koncie administratora albo na starym koncie z zapisanym adresem.
Jak wykryć: Wdrożenie działa u Ciebie, ale na produkcji pojawiają się zgłoszenia o błędach przy pierwszym zamówieniu.
Jak naprawić: Zrób trzy osobne przejścia w trybie incognito: gość, nowo zarejestrowany klient, powracający klient z zapisanym adresem. Każde doprowadź do ekranu order-confirmation i zapisz numer zamówienia.
Bramka płatności zostawiona w trybie testowym po wdrożeniu albo przełączona na produkcję bez sprawdzenia webhooków.
Jak wykryć: Wpłaty są widoczne u operatora, ale zamówienia w panelu stoją na statusie oczekiwania na płatność; brakuje identyfikatora transakcji.
Jak naprawić: Przed przełączeniem sprawdź klucze produkcyjne, adresy powrotu i webhook zgodne z domeną produkcyjną, a potem wykonaj jedną realną transakcję na symboliczną kwotę i porównaj status zamówienia z zapisem u operatora.
Wymuszona kolejność lub domyślna metoda płatności blokuje pozostałe opcje przy wybranej formie dostawy.
Jak wykryć: Klient wybierający Paczkomat widzi tylko jedną metodę płatności, choć pozostałe moduły są włączone i mają ustawione ograniczenia.
Jak naprawić: Przejrzyj ograniczenia dostaw i płatności w konfiguracji każdego modułu. Metodę domyślną ustaw tak, żeby była podpowiedzią, a nie filtrem odcinającym resztę.
Brak wykrywania zamówień opłaconych, które nie powstały w sklepie.
Jak wykryć: U operatora płatności widnieją wpłaty bez odpowiadającego im zamówienia w back-office albo zamówienia bez zmiany statusu po powrocie z bramki.
Jak naprawić: Ustaw webhooki i cykliczne porównanie listy transakcji z listą zamówień. Dla znalezionych przypadków dopisz zamówienie ręcznie lub skoryguj status i powiadom klienta.
Checkout to nie jedna opcja w panelu, a zestaw decyzji: gość czy konto, lista wymaganych pól, limity zamówienia, dostępność przewoźników i metod płatności. Najwięcej zamówień traci się nie na wyglądzie kroków, a na walidacji i błędach po stronie modułów, dlatego każdą zmianę warto przepuścić przez trzy scenariusze testowe. Zacznij od pomiaru, żeby wiedzieć, na którym kroku klienci odpadają — pomoże w tym wdrożenie GA4 eCommerce w PrestaShop, a dopiero potem zmieniaj układ kroków. Efekt ocenisz po kilku tygodniach danych, nie po jednym demo.
Nie, pełny proces zamówienia jest częścią rdzenia PrestaShop i działa od razu po instalacji. Moduły dokupuje się do rzeczy dodatkowych: płatności odroczonych, mapy punktów odbioru, niestandardowych pól w formularzu. Zanim kupisz moduł, sprawdź w dokumentacji, czy danej funkcji nie da się włączyć w konfiguracji. Opis szablonów i kontrolerów znajdziesz w dokumentacji dla deweloperów PrestaShop.
Opcja znajduje się w Preferencje > Zamówienia i w zależności od wersji oraz języka panelu nazywa się szybkie zamówienie albo one-page checkout. Sam przełącznik nie wystarczy — motyw musi mieć szablony dostosowane do jednokrokowej formy. Po włączeniu przejdź całą ścieżkę testową, bo najczęściej właśnie tam wychodzą błędy AJAX i puste stawki dostawy.
Ekran order-confirmation pokazuje się także wtedy, gdy bramka nie potwierdziła jeszcze transakcji — to nie jest równoznaczne z opłaceniem. Sprawdź status zamówienia w back-office, konfigurację webhooka oraz zapis transakcji u operatora dla tego numeru. Warto mieć ustaloną procedurę dla takich przypadków, żeby nie zniknęły między działem obsługi a księgowością.
Nie, dla Polski to pole zwykle niczego nie wnosi i tylko wydłuża formularz. Wyłączasz je w formacie adresu kraju oraz w liście wymaganych pól adresu. Uwaga na moduły kurierskie, które potrafią wymusić własne reguły niezależnie od ustawień rdzenia.
Najczęstsza przyczyna to ograniczenia w konfiguracji modułu płatności powiązane z konkretnymi przewoźnikami. Druga możliwość to konflikt z szybkim zamówieniem, gdzie moduł dostawy wymaga pełnego adresu przed krokiem dostawy. Sprawdź ograniczenia obu modułów i przetestuj tę samą kombinację na standardowym, krokowym checkoutcie.
Ustaw dla nich osobne ograniczenia kwotowe i sprawdź je na kilku koszykach: poniżej progu, powyżej i na granicy widełek. Ważne też, czy metoda znika poprawnie przy formach dostawy, których operator nie obsługuje — na przykład przy wysyłce za pobraniem. Wynik zapisz w jednym miejscu, bo przy kolejnej zmianie w modułach nikt tego nie odtworzy z pamięci.
Nie, checkout zależy od sesji, koszyka i danych klienta, więc pełny cache tu nie zadziała. Poprawiać trzeba inne rzeczy: czas odpowiedzi serwera, liczbę skryptów firm trzecich na kroku płatności i to, czy moduły nie dociągają zasobów z zewnętrznych domen. Progi i definicje metryk opisuje web.dev.
Jeśli wolisz mieć checkout sprawdzony raz a dobrze, DropDigital prowadzi audyty i wdrożenia sklepów PrestaShop — od konfiguracji pól i przewoźników po testy bramek płatności. Napisz, co masz teraz w sklepie, a powiemy, co warto poprawić w pierwszej kolejności.