# Wieloetapowe Odzyskiwanie Porzuconych Koszyków: pełny przewodnik

> Wprowadzenie Moduł Wieloetapowe Odzyskiwanie Porzuconych Koszyków (datafireflycartrecovery) wykrywa porzucone koszyki i kontaktuje się z klientami za pomocą sekwencji zaplanowanych e-maili. Każdy etap ma własne opóźnienie, treść w każdym języku i…

- Strona: <https://www.datafirefly.com/pl/documentation/datafireflycartrecovery/>
- Język: pl
- Zaktualizowano: 2026-10-14
- Inne języki: [fr](https://www.datafirefly.com/documentation/datafireflycartrecovery/index.md), [en](https://www.datafirefly.com/en/documentation/datafireflycartrecovery/index.md), [es](https://www.datafirefly.com/es/documentation/datafireflycartrecovery/index.md), [de](https://www.datafirefly.com/de/documentation/datafireflycartrecovery/index.md), [it](https://www.datafirefly.com/it/documentation/datafireflycartrecovery/index.md), [pt](https://www.datafirefly.com/pt/documentation/datafireflycartrecovery/index.md), [nl](https://www.datafirefly.com/nl/documentation/datafireflycartrecovery/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

## Wprowadzenie

Moduł **Wieloetapowe Odzyskiwanie Porzuconych Koszyków** (`datafireflycartrecovery`) wykrywa porzucone koszyki i kontaktuje się z klientami za pomocą **sekwencji zaplanowanych e-maili**. Każdy etap ma własne opóźnienie, treść w każdym języku i **opcjonalny kupon rabatowy**, którego zachęta może rosnąć z etapu na etap. Podpisany link pozwala klientowi **odzyskać koszyk jednym kliknięciem, z już zastosowanym kuponem**, a panel mierzy faktycznie odzyskany przychód etap po etapie.

Średnio prawie 7 na 10 koszyków zostaje porzuconych przed płatnością. Dobrze ustawiona sekwencja (proste przypomnienie, potem umiarkowany rabat, a następnie mocniejsza oferta z darmową dostawą) odzyskuje część tego przychodu bez pracy ręcznej.

## Kompatybilność

- PrestaShop od 8.0 do 9.x
- PHP od 8.1 do 8.3
- Pojedynczy sklep i multisklep (kampanie, koszyki i statystyki rozdzielone według sklepu)
- Interfejs: FR, EN, ES, DE, IT, PL
- Szablony e-maili i domyślna kampania: FR, EN, ES, DE, IT, PL, NL, PT. Każdy inny zainstalowany język automatycznie otrzymuje edytowalną kopię szablonu domyślnego języka sklepu (w razie jego braku angielskiego).
- Zgodność z oficjalnym modułem RODO `psgdpr`
- Architektura PSR-4 bez Composera, bez zależności zewnętrznych

## Instalacja

1. W panelu administracyjnym otwórz **Moduły > Menedżer modułów**.
2. Kliknij **Załaduj moduł** i wybierz `datafireflycartrecovery.zip`.
3. Kliknij **Konfiguruj**, aby ustawić parametry ogólne i wygląd e-maili.
4. Skonfiguruj zadanie zaplanowane (kolejna sekcja), a następnie wyślij sobie e-mail testowy z wybranego etapu.

Instalacja tworzy tabele modułu, rejestruje jego hooki, dodaje zakładkę **Odzyskiwanie koszyków** i **domyślną kampanię z trzema etapami**: **+1 h** (proste przypomnienie), **+24 h** (kupon -5 %) i **+72 h** (kupon -10 % i darmowa dostawa).

### Aktualizacja z wcześniejszej wersji

Załaduj nowy plik ZIP: skrypty aktualizacji uruchamiają się automatycznie.

- **Do 1.3.11**: pełny audyt modułu. W multisklepie każdy sklep przetwarza już tylko własne wysyłki (cron jednego sklepu wysyłał też e-maile pozostałych, z własnymi linkami i logo). Klient, który wrócił do koszyka i znowu wyszedł, nie otrzymuje już dwa razy tego samego etapu. Po przerwie w działaniu crona wysyłany jest tylko najbardziej zaawansowany etap. Kupony gości nie są już proponowane innym odwiedzającym w koszyku. Link do wypisania wyświetla stronę potwierdzenia (skanery linków w firmowych skrzynkach pocztowych nie wypisują już klientów). Uprawnienia pracowników są sprawdzane przy każdej akcji w panelu. Skrypt dodaje trzy kolumny, pozostawia jedną aktywną kampanię na sklep (tę, której skanowanie już używało), poprawia nazwę nadawcy zapisaną z ukośnikiem wstecznym i zeruje kwotę opróżnionych koszyków. Linki w e-mailach wysłanych przed aktualizacją nadal przywracają koszyk, ale bez automatycznego logowania.
- **Do 1.3.10**: koszyk opróżniony przez klienta zatrzymuje swoją sekwencję (zaplanowane e-maile anulowane z powodem „Koszyk opróżniony przez klienta”) i pokazuje 0 produktów oraz kwotę 0. Bez zmian w bazie danych.
- **Do 1.3.9**: opóźnienie etapów jest wyświetlane w języku pracownika i bez części dziesiętnych („1 h 30 min”, „1 dn. 12 h”). Wcześniej zawsze pojawiał się francuski skrót „j”. Bez zmian w bazie danych.
- **Do 1.3.8**: naprawia w PrestaShop 8 przyciski w nagłówku panelu (Ustawienia, Wyłącz, Usuń, Dodaj etap), które nakładały się na siebie. Bez zmian w bazie danych.
- **Do 1.3.7**: koszyk usunięty w PrestaShop nie otrzymuje już e-maili z przypomnieniem. Skrypt rejestruje nowy hook. E-maile zaplanowane dla koszyków już usuniętych są anulowane przy pierwszym przebiegu crona. Bez zmian w bazie danych.
- **Do 1.3.6**: podgląd e-maili pokazuje szablon nadpisany w motywie (zob. **Dostosowanie szablonu e-maila**). Bez zmian w bazie danych.
- **Do 1.3.5**: kuponu z przypomnienia nie można już łączyć z innym kodem rabatowym. Skrypt rejestruje dwa nowe hooki. Bez zmian w bazie danych.
- **Do 1.3.4**: naprawia pustą stronę „If no employee is assigned in the context, cart ID must be provided to this method”, gdy koszyk jest zapisywany poza sesją przeglądania (webservice, konektor, webhook płatności, skrypt), przycisk „Wyślij teraz” poza oknem wysyłki oraz przesunięcie terminów, gdy serwer MySQL nie używa strefy czasowej sklepu. Bez zmian w bazie danych.
- **Do 1.3.1**: naprawia błąd 500 adresu cron w PrestaShop 8. Bez zmian w bazie danych.
- **Do 1.3.0**: dodaje targetowanie według grup i kategorii oraz ustawienia wyglądu. E-maile otrzymują biały nagłówek z logo sklepu, a pierwotny niebieski pozostaje kolorem akcentu. W razie potrzeby zmień to w sekcji **Wygląd e-maili**.
- **Do 1.2.0**: rejestruje nowe hooki (RODO, nagłówki e-maili, dodanie języka) i tworzy brakujące szablony e-maili dla zainstalowanych języków.

Jeśli sklep miał wersję 1.1.0, aktualizacja ponownie klasyfikuje koszyki błędnie liczone jako odzyskane (zamówienia złożone bez żadnego e-maila z przypomnieniem). Wyświetlany odzyskany przychód spada: to prawidłowa wartość. Przetestuj aktualizację na środowisku testowym przed produkcją.

## Zadanie zaplanowane (cron)

Moduł działa w regularnych przebiegach wywoływanych przez **adres zabezpieczony tokenem**. Przy każdym przebiegu:

1. **Skanowanie**: koszyki nieaktywne dłużej niż opóźnienie porzucenia są kwalifikowane (targetowanie, blokada powtórzeń), a ich etapy planowane.
2. **Wysyłka**: należne e-maile są wysyłane z zachowaniem wszystkich zabezpieczeń.
3. **Czyszczenie**: kupony modułu wygasłe od 7 dni i nigdy nieużyte są usuwane.

Dokładny adres z tokenem widać w panelu (przycisk **Skonfiguruj**, z kopiowaniem jednym kliknięciem) i w konfiguracji modułu:

```
https://TWOJ-SKLEP/index.php?fc=module&module=datafireflycartrecovery&controller=cron&token=TOKEN
```

Zaplanuj wywołanie mniej więcej co 10 minut:

```
*/10 * * * * curl -s "https://TWOJ-SKLEP/index.php?fc=module&module=datafireflycartrecovery&controller=cron&token=TOKEN" >/dev/null 2>&1
```

Blokada gwarantuje, że w danym momencie działa tylko jeden przebieg: dwa jednoczesne wywołania nigdy nie wyślą tego samego e-maila dwa razy.

### Status przetwarzania

U góry panelu widać status zadania zaplanowanego: **zielony**, jeśli ostatni automatyczny przebieg (cron lub uruchamianie bez crona) był mniej niż 30 minut temu, **pomarańczowy** do 3 godzin, **czerwony** powyżej lub jeśli zadanie nigdy się nie uruchomiło. Przycisk **Uruchom teraz** natychmiast wykonuje przebieg i pokazuje wynik: wykryte koszyki, wysłane e-maile, e-maile przełożone poza okno wysyłki, błędy. Nie zmienia wskaźnika na zielony: tylko automatyczny przebieg potwierdza, że cron działa.

### Bez dostępu do zadań cron

Włącz **Uruchamianie bez crona serwera** w konfiguracji modułu. Przetwarzanie jest wtedy wyzwalane przez wizyty w sklepie, najwyżej co 10 minut, po wysłaniu strony do odwiedzającego: przeglądanie nie zwalnia. Ta opcja wymaga PHP-FPM lub LiteSpeed. Na serwerze z mod_php pozostaje nieaktywna, a przy zapisie wyświetla się ostrzeżenie: utwórz wtedy prawdziwe zadanie cron.

Ta opcja zależy od ruchu: sklep bez wizyt w nocy nic nie wyśle przed pierwszą poranną wizytą. Prawdziwy cron pozostaje bardziej niezawodny. Nie udostępniaj tokenu adresu cron.

## Ustawienia ogólne

- **Opóźnienie porzucenia** (domyślnie 60 min): czas bezczynności, po którym koszyk uznaje się za porzucony.
- **E-maile na przebieg** (domyślnie 50): liczba e-maili przetwarzanych w jednym przebiegu.
- **Maks. e-maili na koszyk** (domyślnie 3): limit dla wszystkich etapów, 0 oznacza brak limitu.
- **Maksymalny czas życia** (domyślnie 30 dni): później niezrealizowany koszyk otrzymuje status Utracony.
- **Automatyczne logowanie przez link** (domyślnie włączone): ponownie loguje zarejestrowanego klienta, który kliknie link przywracania, przez 7 dni od wysłania e-maila, pod warunkiem że e-mail jego konta jest nadal adresem, na który wysłano przypomnienie.
- **E-mail i nazwa nadawcy**: gdy puste, używane są dane sklepu. Nazwa nie może zawierać znaków < > ; = # { }, odrzucanych przez PrestaShop przy wysyłce.
- **Uruchamianie bez crona serwera**: zob. poprzednia sekcja.

## Wygląd e-maili

W konfiguracji modułu blok **Wygląd e-maili** dopasowuje przypomnienia do identyfikacji wizualnej sklepu:

- **Logo sklepu**: używa logo e-maili ustawionego w **Wygląd > Szablon i logo**, w przeciwnym razie logo głównego. Jego wymiary są obliczane tak, aby wyświetlało się poprawnie w Outlooku. Bez logo wyświetlana jest nazwa sklepu.
- **Kolor akcentu**: przycisk, linki, linia pod nagłówkiem i blok kuponu.
- **Tło nagłówka**: biały zalecany, jeśli logo jest ciemne.

Tekst na tych kolorach automatycznie zmienia się na biały lub ciemny zależnie od kontrastu: żółty przycisk otrzymuje ciemny tekst, granatowy biały. Efekt widać w podglądzie każdego etapu.

## Dostosowanie szablonu e-maila

Tekst każdego etapu (temat, treść, przycisk) ustawia się w panelu. Aby zmienić sam układ (strukturę, czcionki, stopkę), skopiuj szablon modułu do swojego motywu. PrestaShop używa go wtedy zamiast szablonu modułu, zarówno przy wysyłce, jak i w podglądzie oraz w e-mailu testowym.

```
themes/TWOJ-MOTYW/modules/datafireflycartrecovery/mails/pl/df_cart_recovery.html
themes/TWOJ-MOTYW/modules/datafireflycartrecovery/mails/pl/df_cart_recovery.txt
```

Dla każdego języka PrestaShop szuka w aktywnym motywie, potem w motywie nadrzędnym, a na końcu w module. Próbuje języka klienta, potem domyślnego języka sklepu, a następnie angielskiego.

Skopiuj **oba pliki**, `.html` i `.txt`. Przy typie e-maili „oba” (domyślne ustawienie PrestaShop) folder motywu zawierający tylko `.html` sprawia, że PrestaShop przechodzi do następnego języka: klient otrzymuje wtedy angielski szablon modułu.

Zachowaj zmienne zastępowane przy wysyłce:

- **HTML**: `{body_html}`, `{cart_table}`, `{voucher_block}`, `{restore_url}`, `{unsubscribe_url}`, `{cta_label}`, `{shop_name}`, `{tracking_pixel}`, `{header_brand}`, `{header_bg}`, `{header_text}`, `{accent_color}`, `{accent_text}`.
- **Tekst**: `{body_text}`, `{cart_text}`, `{voucher_text}`, `{restore_url}`, `{unsubscribe_url}`, `{shop_name}`.

Bez `{tracking_pixel}` otwarcia nie są już liczone. Bez `{unsubscribe_url}` znika link do wypisania, co stanowi problem ze zgodnością. Po aktualizacji modułu porównaj swoją kopię z szablonem modułu, aby uwzględnić ewentualną nową zmienną.

## Kampanie i targetowanie

Kampania grupuje sekwencję etapów i jej reguły. Ekran kampanii pokazuje jej ustawienia, a poniżej listę etapów.

**Jedna aktywna kampania na sklep.** Włączenie kampanii wyłącza pozostałe, a ich trwające sekwencje przechodzą do nowej: wznawiają się od etapu następującego po ostatnim wysłanym e-mailu. Nowa kampania jest tworzona jako wyłączona, a kampanii bez aktywnego etapu nie można włączyć. W multisklepie utwórz kampanię w każdym sklepie.

- **Minimalna wartość koszyka**: 0 oznacza brak minimum.
- **Okno wysyłki**: przedział godzin, poza którym należne e-maile są przekładane. Może przechodzić przez północ (od 22 do 6). Ta sama godzina początku i końca: wysyłka o każdej porze.
- **Blokada powtórzeń** (w dniach): odbiorca, który w tym okresie otrzymał przypomnienie dotyczące innego koszyka lub którego inny koszyk jest już w sekwencji, nie otrzyma kolejnego. Reguła jest sprawdzana ponownie tuż przed każdą wysyłką.
- **Uwzględnij gości**: uwzględnia lub pomija klientów-gości.
- **Wyklucz konta B2B**: wyklucza klientów z podaną firmą, numerem SIRET lub NIP.
- **Wykluczone grupy klientów**: brak e-maili dla klientów z tych grup (sprzedawcy, personel).
- **Wykluczone kategorie**: koszyk z co najmniej jednym produktem z tych kategorii nie otrzymuje przypomnienia (karty podarunkowe, produkty o niskiej marży, produkty na receptę). Pole wyszukiwania filtruje drzewo.

## Etapy sekwencji

- **Pozycja**: kolejność etapu, unikalna w obrębie kampanii.
- **Opóźnienie po porzuceniu** (w minutach): 60 = 1 h, 1440 = 24 h, 4320 = 72 h. Musi rosnąć wraz z pozycją: każdy etap jest wysyłany po poprzednim.
- **Temat, tekst przycisku i treść dla każdego języka**: treść pisze się w edytorze wizualnym. Pusty tekst przycisku zastępowany jest przetłumaczoną etykietą domyślną. Temat nie może zawierać znaków < i >, odrzucanych przez PrestaShop przy wysyłce.
- **Etap aktywny**: wstrzymuje etap bez jego usuwania.

### Zmienne

Do użycia w temacie, tekście przycisku i treści. Kliknięcie zmiennej ją kopiuje.

- `{firstname}`, `{lastname}`: imię i nazwisko klienta.
- `{shop_name}`: nazwa sklepu.
- `{cart_total}`: wartość koszyka w jego walucie.
- `{voucher_code}`, `{voucher_value}`, `{voucher_expiry}`: kod, wartość (np. 10 % lub 5,00 zł) i data ważności kuponu. Puste, jeśli etap nie generuje kuponu.

Treść jest wstawiana do responsywnego szablonu, który dodaje nagłówek, podsumowanie koszyka (zdjęcia, warianty, suma), blok kuponu, przycisk i stopkę z linkiem do wypisania. Dla programów pocztowych bez obsługi HTML generowana jest czysta wersja tekstowa.

### Podgląd i e-mail testowy

Po zapisaniu etapu:

- Przycisk **Podgląd** w każdej zakładce języka (lub ikona oka na liście etapów) otwiera ostateczny wygląd z przełącznikiem **komputer / telefon**.
- Blok **Wyślij e-mail testowy** wysyła etap na wybrany adres i w wybranym języku. Temat otrzymuje przedrostek [TEST].

Podgląd i test używają zapisanej wersji etapu i najnowszego prawdziwego koszyka w sklepie, z fikcyjnym kodem DFCR-TEST42. Żaden kupon nie jest tworzony, żadne statystyki nie są zmieniane, a link przycisku prowadzi do strony koszyka bez przywracania koszyka klienta.

## Kupony rabatowe

Każdy etap może wygenerować kupon w momencie wysyłki:

- **Typ**: procent lub stała kwota (brutto lub netto).
- **Wartość** (procent od 0 do 100) i **minimalna kwota zamówienia**.
- **Ważność** w dniach.
- **Darmowa dostawa**, osobno lub razem z rabatem.

- Kupon jest **jednorazowy** i ważny przez ograniczony czas. Dla **zarejestrowanych klientów jest imienny**. Dla gości nie jest powiązany z kontem, ponieważ PrestaShop tworzy nowe konto gościa przy każdym zamówieniu: kod pozostaje tajny, można go użyć tylko raz i nigdy nie jest proponowany innym odwiedzającym w koszyku.
- **Bez łączenia z innym kodem rabatowym**: jeśli klient wpisze inny kod, gdy w koszyku jest kupon z przypomnienia, lub odwrotnie, kod zostaje odrzucony z komunikatem „Tego kodu rabatowego nie można łączyć z innym kodem rabatowym.”, a kod już obecny w koszyku zostaje zachowany. Automatyczne reguły koszyka bez kodu (np. darmowa dostawa od X) nadal się łączą.
- **Stopniowanie bez łączenia**: gdy nowy etap generuje kupon, poprzedni nieużyty kupon tego samego koszyka zostaje wyłączony. W koszyku może być tylko jeden kupon z przypomnienia naraz: wpisanie ważnego kodu DFCR- zastępuje kod już obecny, a błędny lub wygasły kod nie usuwa zastosowanego kuponu.
- **Czyszczenie**: kupony wygasłe od 7 dni i nigdy nieużyte są usuwane automatycznie.

Dobra praktyka: brak rabatu w pierwszym etapie, potem stopniowe zwiększanie (-5 %, następnie -10 % z darmową dostawą). Panel pokazuje przychód przypisany do każdego etapu: widzisz, czy najwyższy rabat przynosi więcej, niż kosztuje.

## Przywracanie koszyka jednym kliknięciem

Każdy e-mail zawiera **podpisany link** (HMAC). Po kliknięciu:

- koszyk zostaje odtworzony, a klient trafia na stronę koszyka;
- **kupon z klikniętego e-maila jest stosowany** automatycznie (ewentualny wcześniejszy kupon z przypomnienia jest usuwany), chyba że koszyk zawiera już inny kod rabatowy: wtedy kod klienta zostaje zachowany;
- zarejestrowany klient jest ponownie logowany, jeśli opcja jest włączona, a e-mail ma mniej niż 7 dni; adres wybrany w koszyku zostaje zachowany;
- kliknięcie jest zliczane.

W multisklepie linki prowadzą do sklepu, w którym utworzono koszyk, w języku klienta, a koszyk można przywrócić tylko w jego sklepie.

Każda zmiana parametrów linku unieważnia go. Koszyk, który został już zamówiony, przekierowuje na stronę główną. Jeśli w przeglądarce zalogowany jest inny klient, jego sesja i koszyk pozostają bez zmian, a koszyk z e-maila nie jest przywracany.

## Przebieg sekwencji

- **Wznowienie**: jeśli klient wróci i zmieni koszyk, oczekujące przypomnienia są anulowane (powód „Klient wrócił do koszyka”). Jeśli znowu wyjdzie, sekwencja jest planowana ponownie od następnego etapu, bez ponownego wysyłania etapu już otrzymanego.
- **Nadrabianie zaległości**: po przerwie w działaniu crona, jeśli kilka etapów tego samego koszyka jest należnych jednocześnie, wysyłany jest tylko najbardziej zaawansowany. Pozostałe są pomijane z powodem „Zastąpiony przez następny etap, już należny”.
- **Opróżniony koszyk**: jeśli klient usunie wszystkie produkty z koszyka, sekwencja się zatrzymuje, a koszyk pokazuje 0 produktów i kwotę 0.
- **Stare koszyki**: koszyk nieaktywny od ponad 7 dni nigdy nie otrzymuje przypomnienia. Po dłuższej przerwie w działaniu crona pierwszy przebieg nie wysyła więc e-maili do klientów, którzy odeszli wiele tygodni temu. Jeśli klient wróci do koszyka, znów kwalifikuje się do przypomnień.
- **Niedostępne produkty**: jeśli żadnego produktu z koszyka nie można już zamówić (brak na stanie bez zamówień z odroczeniem, produkt wyłączony), etap jest pomijany. Kolejne etapy pozostają zaplanowane na wypadek uzupełnienia stanu.
- **Błąd wysyłki**: przy błędzie SMTP e-mail jest ponawiany po 15, a potem po 30 minutach. Po 3 nieudanych próbach otrzymuje status nieudany z komunikatem błędu, a utworzony kupon jest usuwany.
- **Usunięty koszyk**: jeśli koszyk zostanie usunięty w PrestaShop (Zamówienia > Koszyki, skrypt czyszczący, moduł zewnętrzny), jego zaplanowane e-maile są anulowane, od razu lub przy następnym przebiegu crona, a tuż przed każdą wysyłką odbywa się ostatnia kontrola.
- **Zamówienie**: po zatwierdzeniu zamówienia pozostałe przypomnienia są anulowane. Zamówienie utworzone z pominięciem procesu zamówienia (import, ERP) jest wykrywane tuż przed następną wysyłką i przypisywane w ten sam sposób.

## Śledzenie i atrybucja

- **Otwarcia**: niewidoczny piksel w każdym e-mailu.
- **Kliknięcia**: kliknięcie przycisku lub linku przywracania.
- **Odzyskanie**: koszyk jest liczony jako **Odzyskany** tylko wtedy, gdy przed zamówieniem wysłano co najmniej jeden e-mail z przypomnieniem. Zamówienie złożone przed jakimkolwiek e-mailem otrzymuje status **Zamówiono bez przypomnienia** i nie wlicza się do odzyskanego przychodu.
- **Atrybucja do etapu**: każdy odzyskany koszyk jest przypisywany do ostatniego e-maila wysłanego przed zakupem.
- **Podzielone zamówienie**: gdy PrestaShop tworzy kilka zamówień dla jednego koszyka (różni przewoźnicy), odzyskany przychód to suma wszystkich tych zamówień.

## Panel

- **Okres**: 7, 30 lub 90 dni.
- **Wskaźniki**: wykryte koszyki i porzucona wartość, odzyskane koszyki i wskaźnik odzyskania, wysłane e-maile, wskaźniki otwarć i kliknięć, e-maile oczekujące na wysyłkę, odzyskany przychód. Kwoty są przeliczane na domyślną walutę sklepu. Porzucona wartość to wartość koszyka w chwili porzucenia.
- **Wykres** wykryć i odzyskań dziennie.
- **Wyniki etapów** aktywnej kampanii: wysłane, otwarte, kliknięte, wskaźnik kliknięć, odzyskane koszyki i przypisany przychód.

## Monitorowane koszyki

Zakładka **Koszyki** zawiera listę monitorowanych koszyków z filtrem statusu, wyszukiwaniem (e-mail, nazwisko lub nr koszyka, `#123` dla konkretnego koszyka), stronicowaniem i **eksportem CSV** przefiltrowanych wyników. Każdy wiersz pokazuje klienta, kwotę, status, liczbę wysłanych i zaplanowanych e-maili, link do koszyka i ewentualnie do zamówienia w panelu. Ikona wykluczenia zatrzymuje wszystkie przypomnienia dla koszyka.

| Status | Znaczenie |
| --- | --- |
| Aktywny | Koszyk w toku, jeszcze nieporzucony |
| Przypomnienie w toku | Sekwencja zaplanowana lub w trakcie wysyłki |
| Odzyskany | Zamówienie złożone po co najmniej jednym e-mailu z przypomnieniem |
| Zamówiono bez przypomnienia | Zamówienie złożone przed jakimkolwiek e-mailem, nieprzypisane |
| Utracony | Sekwencja zakończona lub przekroczony czas monitorowania |
| Wykluczony | Odfiltrowany przez kampanię (kwota, gość, B2B, grupa, kategoria, blokada powtórzeń): oceniany ponownie, jeśli klient zmieni koszyk. Wykluczony ręcznie lub koszyk usunięty w PrestaShop: na stałe |
| Wypisany | Klient nie chce już otrzymywać przypomnień |

## Dziennik wysyłek

Zakładka **Dziennik wysyłek** pokazuje szczegóły każdego e-maila: planowaną datę i datę wysyłki, odbiorcę, etap, status (zaplanowany, wysłany, pominięty, anulowany, nieudany), otwarcie, kliknięcie, kod rabatowy i przyczynę (klient wrócił do koszyka, koszyk opróżniony przez klienta, osiągnięty limit, niedostępne produkty, blokada powtórzeń, etap zastąpiony przez następny, błąd SMTP, koszyk usunięty w PrestaShop...). Zaplanowany e-mail możesz **wysłać teraz** lub **anulować**. „Wyślij teraz” wysyła e-mail natychmiast, także poza oknem wysyłki, i pokazuje wynik lub powód braku wysyłki.

## RODO i dostarczalność

- Każdy e-mail zawiera **link do wypisania**. Otwiera on stronę potwierdzenia: wypisanie następuje po kliknięciu przycisku, aby skanery linków w firmowych skrzynkach pocztowych nie wypisywały klientów bez ich wiedzy. Adres trafia na trwałą **listę wykluczeń**, a oczekujące wysyłki wszystkich jego koszyków są anulowane.
- Nagłówki `List-Unsubscribe` i `List-Unsubscribe-Post` umożliwiają wypisanie jednym kliknięciem w Gmailu, Yahoo i innych usługach, które tego wymagają dla e-maili marketingowych.
- Monitorowane są tylko koszyki powiązane z adresem e-mail (klient lub gość, który zatwierdził krok danych osobowych): żaden adres nie jest przechwytywany, zanim klient go wyśle.
- Z oficjalnym modułem `psgdpr` moduł pojawia się na liście modułów przetwarzających dane: eksport i usuwanie danych klienta obejmują jego monitorowane koszyki i e-maile z przypomnieniami. Eksport wskazuje też ewentualny wpis adresu na liście wykluczeń.
- Usunięcie konta klienta usuwa jego monitorowane koszyki, kolejkę wysyłki i zdarzenia. Ewentualny sprzeciw pozostaje na liście wykluczeń.
- Odinstalowanie usuwa tabele, konfigurację i zakładkę administracyjną.

## FAQ i rozwiązywanie problemów

### Żadne przypomnienie nie jest wysyłane

Sprawdź status przetwarzania u góry panelu. Jeśli jest czerwony, zadanie cron nie wywołuje adresu (lub nie z właściwym tokenem): użyj **Uruchom teraz**, aby to sprawdzić, a potem popraw zadanie lub włącz uruchamianie bez crona serwera. Następnie sprawdź, czy kampania i co najmniej jeden etap są aktywne oraz czy bieżąca godzina mieści się w oknie wysyłki, i zajrzyj do **Dziennika wysyłek**: znajdziesz tam przyczynę każdego pominiętego lub nieudanego e-maila.

### Klient nie może dodać swojego kodu rabatowego

To zamierzone: kuponu z przypomnienia nie można łączyć z żadnym innym kodem rabatowym. Klient musi najpierw usunąć kod z koszyka, a potem wpisać drugi. Automatyczne reguły koszyka bez kodu nie są objęte tą zasadą.

### Usunięty koszyk nadal otrzymuje e-maile

Do wersji 1.3.6 e-mail już zaplanowany był wysyłany, nawet jeśli koszyk został usunięty w PrestaShop. Zaktualizuj moduł do wersji 1.3.7 lub nowszej: wysyłki dla tych koszyków są anulowane, a dziennik wysyłek pokazuje powód „Koszyk usunięty w PrestaShop”.

### Klient otrzymał dwa razy to samo przypomnienie

Do wersji 1.3.10 duplikat mógł powstać w dwóch przypadkach: klient wrócił do koszyka, a potem znowu wyszedł, lub dwa sklepy tej samej instalacji multisklepu przetwarzały tę samą kolejkę. Zaktualizuj moduł do wersji 1.3.11 lub nowszej.

### Pusta strona „If no employee is assigned in the context, cart ID must be provided to this method”

Ten komunikat rdzenia PrestaShop mógł pojawiać się w wersjach od 1.0.0 do 1.3.1, gdy koszyk był zapisywany poza sesją przeglądania (webservice, konektor, webhook płatności, skrypt). Zaktualizuj moduł do wersji 1.3.4 lub nowszej.

### Adres cron zwraca błąd 500

W PrestaShop 8 wersje od 1.0.0 do 1.3.0 powodowały błąd 500 na adresie cron. Zaktualizuj moduł do wersji 1.3.1 lub nowszej i sprawdź wersję widoczną w menedżerze modułów. Jeśli błąd się powtarza, włącz tryb debugowania PrestaShop lub sprawdź logi PHP serwera, aby odczytać dokładny komunikat.

### Koszyk nie pojawia się na liście

Koszyk jest monitorowany tylko wtedy, gdy jest powiązany z adresem e-mail: zalogowany klient lub gość, który zatwierdził krok danych osobowych. Staje się porzucony po opóźnieniu porzucenia (domyślnie 60 minut) i przy następnym przebiegu crona.

### Moje logo się nie wyświetla lub jest nieczytelne

Sprawdź, czy opcja Logo sklepu jest włączona i czy logo jest ustawione w Wygląd > Szablon i logo. Jeśli logo jest ciemne, wybierz jasne tło nagłówka. Niektóre programy pocztowe domyślnie blokują obrazy: wtedy wyświetla się nazwa sklepu.

### E-mail testowy nie dociera

Sprawdź, czy etap ma temat w wybranym języku i czy sklep może wysyłać e-maile (**Zaawansowane > E-mail**, przycisk testu PrestaShop). Zajrzyj też do folderu spam.

### Czy klient może dostać zbyt wiele e-maili?

Nie: limit e-maili na koszyk, blokada powtórzeń dla odbiorcy i okno wysyłki kontrolują częstotliwość. Zamówienie lub wypisanie anuluje pozostałe przypomnienia.

### Czy moduł obsługuje multisklep?

Tak. Kampanie, monitorowane koszyki, ustawienia wyglądu i statystyki są rozdzielone według sklepu.

### Czy jest zgodny z PrestaShop 9?

Tak. Moduł jest zgodny z PrestaShop 8 i 9 i uwzględnia zmiany API w PS9 (formatowanie cen przez API Locale, kontrolery, wysyłka e-maili).
