W PrestaShop koszt wysyłki nie wynika z jednego pola, tylko z łańcucha: strefa → przewoźnik → przedział wagowy lub cenowy → opłata → podatek → zaokrąglenie. Jeśli którykolwiek element wypadnie, klient zobaczy brak metody dostawy albo stawkę niższą od kosztu paczki. Ten tekst to część organizacyjna: lista najczęstszych błędów, checklista wdrożenia i pytania, które najczęściej dostajemy od klientów. Konfigurację krok po kroku i integracje kurierskie opisujemy w pozostałych sekcjach artykułu.
W PrestaShop koszt dostawy nie siedzi w jednym polu. To łańcuch czterech elementów, które muszą do siebie pasować:
Kolejność działania jest zawsze taka sama: adres dostawy wyznacza strefę, strefa wskazuje dostępnych przewoźników, waga lub wartość koszyka wybiera przedział, z przedziału pobierana jest opłata, do opłaty doliczany jest VAT przewoźnika, a wynik jest zaokrąglany zgodnie z ustawieniami sklepu. Każdy z tych kroków potrafi wyczyścić listę metod: brak kraju w strefie, brak przedziału dla paczki 7,5 kg albo przewoźnik odznaczony dla strefy i klient na podsumowaniu widzi brak dostawy.
Koszt wysyłki zależy więc jednocześnie od adresu, wagi koszyka, jego wartości i stawki podatku przypisanej do przewoźnika. Dwie firmy z identyczną tabelą cennika kuriera mogą pokazać klientowi inne kwoty tylko dlatego, że jedna ustawiła przedziały cenowe, a druga wagowe — a trzecia dodała do tego geolokalizację zmieniającą domyślny kraj.
Struktura tych obiektów jest opisana w dokumentacji PrestaShop dla deweloperów. Jeśli wolisz, żeby strefy i przedziały poskładał ktoś, kto robi to na co dzień, zobacz nasze wdrożenia PrestaShop — konfigurację krok po kroku i integracje kurierskie opisujemy w pozostałych sekcjach.
Procedura od zera do działającego cennika. Ścieżki podaję dla panelu PrestaShop 8 i 9 — nazwy zakładek są takie same lub bardzo zbliżone.
Ustawienia zaawansowane: darmowa dostawa przez opłatę 0 zł plus warunek w Promocje → Reguły koszyka („Wysyłka za darmo” od kwoty), obsługa dużych paczek przez limit maksymalnej wagi u przewoźnika i osobny przedział, opóźnienia przez pole czasu dostawy. Zrób zrzuty ekranu z zakładek: Przewoźnicy, Przedziały, koszt wysyłki dla strefy oraz podsumowanie koszyka z brakującą metodą — to dokumentacja, do której wrócisz przy każdej zmianie cennika. Wdrożenie integracji kurierskiej bez przestoju w zamówieniach opisujemy w tekście wdrożenie InPost w PrestaShop krok po kroku.
Najczęstsza awaria to dziura między przedziałami. Jeśli zdefiniujesz 1–5 kg i 6–10 kg, paczka 5,5 kg nie trafi do żadnego z nich i klient zobaczy brak metody dostawy. Przedziały powinny stykać się dokładnie: 0–1, 1–5, 5–10, 10–20 kg. Wtedy paczka 5 kg trafia do jednego, z góry ustalonego progu — sprawdź to testem, bo przy wartościach granicznych łatwo o niespodziankę.
| Przedział wagowy | Opłata netto (przykład) | VAT 23% | Kwota w koszyku (brutto) |
|---|---|---|---|
| 0–1 kg | 12,00 zł | 2,76 zł | 14,76 zł |
| 1–5 kg | 16,00 zł | 3,68 zł | 19,68 zł |
| 5–10 kg | 22,00 zł | 5,06 zł | 27,06 zł |
| 10–20 kg | 30,00 zł | 6,90 zł | 36,90 zł |
Jak wykryć lukę: zbuduj koszyk o wadze dokładnie 1,00 kg, 5,00 kg, 10,00 kg i 10,01 kg. Jeśli przy którejś z tych wartości lista przewoźników jest pusta, brakuje przedziału. Ta sama zasada dotyczy przedziałów cenowych — 199,99 zł i 200,00 zł to dwa różne koszyki i mogą dostać różną opłatę.
VAT i zaokrąglenia zmieniają kwotę, którą widzi klient. Opłata za wysyłkę jest osobną pozycją koszyka, a PrestaShop liczy podatek od każdej pozycji osobno i zaokrągla zgodnie z ustawieniami w Parametry sklepu → Ustawienia ogólne (typ zaokrąglenia i sposób: dla każdej pozycji albo dla całości). Przy cenniku 12,00 zł netto klient zapłaci 14,76 zł, ale przy kilku pozycjach i zaokrąglaniu od sumy różnica sięga kilku groszy. Jeśli wystawiasz faktury z cennika netto, ustal jeden tryb zaokrągleń i nie zmieniaj go sezonowo.
Brak strefy dla kraju objawia się komunikatem o braku dostępnych przewoźników dla wybranego adresu, a przy płatnościach ograniczonych przewoźnikiem — także zniknięciem metod płatności. Kolejność naprawy jest krótka:
Masz trzy realne warianty. Oficjalny moduł od przewoźnika: instalujesz z panelu nadawczego, wklejasz klucze API, konfigurujesz domyślne gabaryty i gotowe. Zakres: etykiety A6 w PDF, numer trackingowy, punkty odbioru w checkoutcie. Koszt zwykle zero, wdrożenie 1–3 dni. Ryzyko: tempo aktualizacji pod nowe wersje PrestaShop bywa różne, a wsparcie idzie przez przewoźnika, nie przez Twojego wykonawcę.
Moduł płatny od zewnętrznego dostawcy: jeden panel do kilku kurierów, polskie wsparcie, częstsze wydania poprawek. Koszt to zwykle kilkaset złotych jednorazowo plus subskrypcja. Ma sens, gdy wysyłasz dwoma–trzema kurierami i chcesz jedno miejsce do nadawania i zwrotów.
Własny moduł na API: pełna kontrola, ale utrzymanie po Twojej stronie — rotacja tokenów, mapowanie statusów przesyłki na statusy zamówienia, limity zapytań, zmiany wersji API. Realnie 1–2 tygodnie pracy plus poprawki po każdej zmianie po stronie przewoźnika. Opłaca się przy nietypowej logice, np. własnym algorytmie wyboru kuriera po wadze i strefie.
Niezależnie od wariantu wdrożenie musi objąć cztery elementy: etykiety generowane z poziomu zamówienia, numer trackingowy zapisany w zamówieniu i wysyłany mailem, wybór punktu odbioru (widget mapy przy przewoźniku) oraz statusy zamówień. Bez mapowania statusów klient nie dostaje informacji „wysłane” i pisze na czacie. Osobno zaplanuj zwroty i nadania zwrotne. Szczegóły dla paczkomatów opisujemy w tekstach o wdrożeniu InPost w PrestaShop krok po kroku oraz o InPost i PrestaShop 9 bez przestojów.
| Wariant | Koszt | Czas wdrożenia | Kto utrzymuje |
|---|---|---|---|
| Oficjalny moduł przewoźnika | Zwykle 0 zł | 1–3 dni | Przewoźnik |
| Moduł płatny (multi-kurier) | Kilka set zł + subskrypcja | 3–7 dni | Dostawca modułu |
| Własny moduł na API | Roboczogodziny wdrożenia | 1–2 tygodnie | Ty / agencja |
Próg darmowej dostawy ustawia się raz i wraca do niego co kwartał. Punkt wyjścia to trzy liczby: średnia wartość koszyka (AOV), koszt wysyłki netto i marża procentowa na produkcie. Przykład: AOV 180 zł, marża 35%, koszt kuriera 15 zł netto. Dodatkowe zakupy muszą wygenerować co najmniej 15 zł marży, czyli około 43 zł wartości koszyka. Próg 200 zł jest w tym układzie stratny o kilka złotych na zamówienie — przy 300 zamówieniach miesięcznie robi się z tego poważna kwota w skali roku.
Wzór do zapisania: próg ≈ koszt wysyłki / marża procentowa + obecne AOV, zaokrąglony w górę do „ładnej” kwoty. Policz to samo dla paczkomatu (tańszy koszt = niższy próg) i dla przesyłki pobraniowej, gdzie dochodzi opłata za pobranie.
Reguły koszyka: Katalog → Rabaty i promocje → nowa reguła, warunek „Wartość koszyka >= próg”, akcja „Darmowa dostawa”. Pułapka: kod rabatowy obniża wartość koszyka. Klient z kodem -20 zł spada poniżej progu, darmowa dostawa znika, a on porzuca koszyk. Sprawdź też, czy reguła nie nakłada się na inną promocję i nie daje darmowej wysyłki dwa razy.
Test: w trybie gościa złóż zamówienie dla każdej strefy i każdego przewoźnika — Polska, UE, strefa „reszta świata”, kurier, paczkomat, pobranie. Sprawdź, czy próg działa identycznie i czy podatek nie rozjeżdża kwoty końcowej o kilka groszy.
Ryzyko: paczki ponadstandardowe (gabaryt lub waga powyżej limitu standardowego) jadą po cenie zwykłej przesyłki, choć koszt rzeczywisty bywa kilkukrotnie wyższy. Rozwiązanie: osobny przewoźnik „Przesyłka gabarytowa” z wyższą stawką i wyłączeniem z reguły darmowej dostawy. Kontekst techniczny znajdziesz w dokumentacji dla deweloperów PrestaShop, a szerszy obraz zmian w zakładce o PrestaShop.
PrestaShop nie ma natywnego pola „opłata za pobranie”. W praktyce widzimy dwa podejścia. Opłata w koszcie przewoźnika: duplikujesz przewoźnika jako „Kurier — pobranie” i w jego cenniku ustawiasz stawkę wyższą o kwotę opłaty, np. 18 zł zamiast 15 zł. Plus: zero modułów, działa od razu. Minus: klient widzi „Wysyłka 18 zł”, a nie „pobranie 3 zł”, więc pojawiają się pytania na czacie.
Osobna pozycja w koszyku: moduł dopinający opłatę albo override klasy liczącej koszyk. Plus: czytelny koszyk z rozbiciem. Minus: do utrzymania przy aktualizacjach, dlatego lepiej wybrać moduł niż własny override — o nadpisywaniu kodu bez błędów piszemy w tekście o PrestaShop override.
VAT: sposób opodatkowania opłaty za pobranie zależy od tego, czy traktujesz ją jako element dostawy, czy jako odrębną usługę — spotykamy w firmach obie interpretacje. Nie zgaduj: ustal to z księgową, a potem ustaw spójnie regułę podatkową dla przewoźnika w Ustawienia → Podatki i pilnuj, czy ceny w cenniku wpisujesz netto czy brutto.
Ograniczenia: maksymalną kwotę pobrania ustala umowa z przewoźnikiem — sprawdź ją przed włączeniem metody. Nie każdy kurier obsługuje pobranie za granicę, a jeśli obsługuje, dochodzi opłata dodatkowa. Ogranicz metodę do wybranych krajów i przewoźników zamiast włączać ją globalnie.
Kolejność naliczania: 1) rabaty obniżają wartość towarów, 2) doliczany jest koszt wysyłki, 3) dochodzi opłata za pobranie, 4) VAT liczony jest od całości. Odwrotna kolejność — np. pobranie liczone od kwoty po rabacie, a wysyłka przed rabatem — rozjeżdża koszyk o kilka groszy i klient to zauważy.
Zmiana przewoźnika w działającym sklepie najczęściej kończy się zgłoszeniem „klient nie widzi mojej metody dostawy”. W większości przypadków winny jest cache, a nie konfiguracja. Kolejność czyszczenia ma znaczenie, bo warstw jest kilka.
var/cache/{prod|dev}/smarty/compile, nie ruszając plików źródłowych w katalogu themes/.opcache_reset()). Bez tego serwer nadal wykonuje stary kod.Override klas to druga pułapka. Nadpisanie Carrier.php czy Cart.php w katalogu override/classes/ działa do pierwszego upgrade'u, a gdy dwa moduły nadpisują tę samą klasę, wygrywa ostatni i pierwszy po cichu przestaje działać. Sięgaj po override tylko wtedy, gdy nie ma hooka — a przy wysyłce hooków jest sporo: actionCarrierProcess, actionValidateOrder, actionCartSave. Zasady i typowe błędy zebraliśmy w artykule PrestaShop override: jak nadpisywać kod bez błędów.
Diagnostyka w praktyce: włącz _PS_MODE_DEV_ w config/defines.inc.php, sprawdź logi w var/logs/, a potem złóż testowy koszyk z produktem o wadze granicznej (np. 1,00 kg przy przedziale 1–5 kg). Po testach wyłącz tryb debug — pokazuje błędy klientom i potrafi psuć AJAX koszyka.
| Warstwa cache | Gdzie wyczyścić | Kiedy |
|---|---|---|
| Cache PrestaShop | Parametry zaawansowane → Wydajność → Wyczyść cache | po każdej zmianie stref, przewoźników i zakresów |
| Cache Smarty | zawartość var/cache/{prod|dev}/smarty | po edycji order-carrier.tpl i szablonów maili |
| OPcache | restart php-fpm lub opcache_reset() | po edycji plików PHP i override klas |
| Cache CDN | panel CDN: purge całej strefy | gdy reguły cache obejmują strony sklepu; koszyk wyklucz |
Sama lista przewoźników przenosi się dobrze. Psuje się to, co wokół: moduły kurierskie, pobranie i mapowanie statusów.
Do przeniesienia są konkretne tabele: ps_carrier, ps_carrier_lang, ps_carrier_shop, ps_carrier_group, ps_carrier_tax_rules_group_shop, ps_zone, ps_range_weight, ps_range_price i ps_delivery. Kluczowa zasada: zachowaj te same ID, bo ps_delivery wskazuje jednocześnie na przewoźnika, strefę i przedział. Jeśli w nowym sklepie najpierw dodasz przewoźników ręcznie, ID się rozjadą i macierz stawek wskaże na obcego przewoźnika. Najbezpieczniej zaimportować tabele na czystą instalację, zanim dopiszesz własnych przewoźników, i dopiero wtedy zweryfikować ceny.
Moduły kurierskie: sprawdź deklarację kompatybilności w pliku konfiguracyjnym modułu (ps_versions_compliancy) oraz to, czy panel działa w oparciu o Symfony. Moduł z 1.7 potrafi wyłączyć się bez komunikatu i zostawić sklep bez generowania etykiet. Organizację takiego wdrożenia opisujemy w tekście InPost i PrestaShop 9: organizacja wdrożenia bez przestojów. Warto zajrzeć też do dokumentacji dla deweloperów PrestaShop przy weryfikacji struktury tabel.
Testy po migracji, minimum pięć zamówień: etykieta generuje się i drukuje, numer tracking wraca do zamówienia i do maila, koszyk pokazuje właściwą stawkę w każdej strefie, faktura zawiera koszt dostawy zgodny z zapłatą, statusy przechodzą przez wszystkie etapy. Sprawdź wartości graniczne wag: 0,99 kg, 1,00 kg, 1,01 kg — tam najczęściej wychodzą luki w przedziałach. Przed migracją zrób backup bazy i plików oraz eksport listy przewoźników z zakresami do CSV jako punkt odniesienia.
| Obszar | Co zrobić | Ryzyko przy pomyłce |
|---|---|---|
| Tabele przewoźników | przenieść ps_carrier, ps_carrier_lang, ps_carrier_shop, ps_carrier_group, ps_carrier_tax_rules_group_shop | rozjechane ID — stawki przypisane do złego przewoźnika |
| Strefy i przedziały | przenieść ps_zone, ps_range_weight, ps_range_price, ps_delivery | luka w przedziale = brak metody dostawy w koszyku |
| Moduły kurierskie | aktualizacja do wersji wspierającej 8.x/9.x i weryfikacja deklaracji kompatybilności | stary moduł wyłącza się bez komunikatu |
| Statusy i maile | mapowanie statusów oraz szablony maili z numerem śledzenia | klient nie dostaje numeru przesyłki |
Poniższa lista ma 14 punktów. Pierwsze dziewięć odklikaj przed startem, pozostałe pięć to monitoring po wdrożeniu. Przejście przez całość zajmuje zwykle 2–3 godziny i łapie 2–3 błędy, które inaczej wyszłyby dopiero w koszykach klientów.
var/logs/ i krok dostawy w statystykach koszyków.Kryteria akceptacji są trzy: brak błędów w koszyku, poprawna etykieta i zgodny tracking. Jeśli którykolwiek punkt nie przechodzi, nie wdrażaj dalej. Pełny zakres prac — konfigurację, integracje i stronę serwerową — opisujemy w sekcji PrestaShop.
| Kryterium akceptacji | Jak sprawdzić | Sygnał problemu |
|---|---|---|
| Brak błędów w koszyku | testowe zamówienie na koncie bez uprawnień admina, w trybie incognito | „Niestety, nie ma przewoźników dostępnych dla tego zamówienia” |
| Poprawna etykieta | wygeneruj etykietę dla zamówienia testowego, porównaj adres, wagę i usługę | etykieta bez numeru nadania lub z błędną wagą |
| Zgodny tracking | numer z etykiety = numer w zamówieniu = numer w mailu | numer nie zapisuje się w zamówieniu |
Kraj docelowy nie należy do żadnej strefy, więc koszyk nie pokazuje żadnego przewoźnika.
Jak wykryć: Złóż testowe zamówienie z adresem zagranicznym (np. Niemcy, Czechy). Jeśli lista przewoźników jest pusta, a dla Polski działa — to strefa.
Jak naprawić: W zakładce Międzynarodowe → Lokalizacja → Strefy przypisz kraj do właściwej strefy i sprawdź, czy wybrany przewoźnik ma zaznaczoną tę strefę.
Luki w przedziałach wagowych, np. 0–1 kg i 1,01–5 kg, ale brak przedziału powyżej 5 kg.
Jak wykryć: Dodaj do koszyka produkt o wadze granicznej 1,00 kg, 1,01 kg oraz powyżej najwyższego progu. Brak stawki = luka.
Jak naprawić: Ustaw przedziały ciągłe i zamknij ostatni jako otwarty (od X kg w górę), żeby każda waga miała przypisaną stawkę.
Koszt wysyłki liczony bez poprawnej reguły podatkowej, więc kwota w koszyku nie zgadza się z fakturą.
Jak wykryć: Porównaj kwotę wysyłki w koszyku z ustawieniem podatku przewoźnika i strefą podatkową kraju dostawy.
Jak naprawić: Ustaw regułę podatkową dla przewoźnika i zdecyduj, czy ceny w sklepie pokazujesz brutto, czy netto — spójnie dla całego sklepu.
Darmowa dostawa włączona globalnie, bez rozróżnienia stref i przewoźników.
Jak wykryć: Testuj koszyk tuż poniżej progu i powyżej progu w każdej strefie, w której sprzedajesz. Sprawdź, czy darmowa dostawa nie łapie paczek ponadstandardowych.
Jak naprawić: Ustaw próg osobno dla każdej strefy i wyłącz darmową dostawę dla przewoźników obsługujących paczki ponadstandardowe.
Opłata za pobranie dodana jako osobny produkt lub ręcznie dopisana do zamówienia zamiast konfiguracji przewoźnika.
Jak wykryć: Złóż zamówienie z pobraniem i kodem rabatowym, a potem porównaj kolejność pozycji w koszyku, w podsumowaniu i na fakturze.
Jak naprawić: Trzymaj COD jako opłatę przypisaną do przewoźnika, żeby rabat, wysyłka, pobranie i VAT naliczały się w ustalonej kolejności.
Zmiana stawek lub przewoźników bez wyczyszczenia cache — klient nadal widzi stare metody dostawy.
Jak wykryć: Otwórz koszyk w trybie incognito i porównaj z panelem. Rozbieżność oznacza cache PrestaShop, Smarty albo CDN.
Jak naprawić: Wyczyść cache PrestaShop i Smarty, odśwież cache CDN, a przy nietypowych zachowaniach włącz tryb debug i sprawdź logi.
Wysyłka w PrestaShop działa tylko wtedy, gdy strefy, przewoźnicy i przedziały tworzą spójny łańcuch bez luk. Najczęstsze awarie są nudne i powtarzalne: brak kraju w strefie, dziura w przedziale wagowym, brak reguły podatkowej i cache, który trzyma stare stawki. Wnioski są proste: konfiguruj per strefa, testuj wagi i kwoty graniczne oraz zawsze przechodź pełne zamówienie testowe po każdej zmianie. To zajmuje kilkanaście minut, a ratuje marżę na całej kampanii.
Strefa to grupa krajów, do których chcesz wysyłać. Przewoźnik to konkretna metoda dostawy, np. kurier krajowy albo paczkomat. Dopiero przypisanie przewoźnika do strefy sprawia, że klient z danego kraju zobaczy go w koszyku. Bez tego połączenia przewoźnik istnieje w panelu, ale nie jest widoczny dla klienta.
Najczęstsza przyczyna to brak kraju w strefie albo brak przewoźnika przypisanego do tej strefy. Drugie typowe źródło to luka w przedziale wagowym lub cenowym dla zawartości jego koszyka. Trzecia możliwość to cache — sprawdź koszyk w trybie incognito, zanim zaczniesz zmieniać konfigurację.
Próg darmowej dostawy ustawiasz w regułach przewoźnika, nie globalnie. Zdefiniuj osobny przewoźnik lub osobną regułę dla strefy Polska z wymaganym progiem kwotowym i pozostaw strefy zagraniczne bez tego progu. Po zmianie przetestuj koszyk tuż poniżej progu, dokładnie na progu i powyżej niego.
Opłata za pobranie jest elementem usługi związanej z dostawą, więc traktuje się ją jak koszt wysyłki i dolicza według stawki właściwej dla danej usługi. W praktyce najbezpieczniej jest skonfigurować ją jako opłatę przypisaną do przewoźnika, a nie jako osobny produkt w katalogu. Dzięki temu VAT i kolejność naliczania są spójne z resztą zamówienia. Jeśli masz wątpliwości co do konkretnej stawki, potwierdź to z księgowością.
W sekcji Międzynarodowe → Wysyłka, w zakładce Przedziały. Tam definiujesz zakresy wagowe lub cenowe, które potem przypisujesz do przewoźnika w jego ustawieniach zakresu. Sam podział bez przypisania go do przewoźnika nic nie zmieni w koszyku.
Tak, w większości przypadków bez tego klient zobaczy starą listę metod dostawy albo stare stawki. Wyczyść cache PrestaShop i Smarty, a jeśli korzystasz z CDN, odśwież też warstwę CDN. Weryfikację rób w trybie incognito, żeby wykluczyć cache przeglądarki.
Całą ścieżkę zakupu: koszyk, listę przewoźników dla Polski i dla krajów zagranicznych, progi darmowej dostawy, opłatę za pobranie oraz fakturę. Zmiany w rdzeniu i w modułach kurierskich potrafią zmienić zachowanie koszyka, dlatego test zamówienia to obowiązkowy punkt odbioru migracji, a nie formalność.
Jeśli wolisz, żeby ktoś przeszedł przez tę konfigurację z Tobą, zajrzyj do naszego zakresu usług dla PrestaShop: PrestaShop w DropDigital. Przy okazji sprawdzimy strefy, przedziały wagowe i integracje kurierskie w Twoim sklepie.