Wysyłka maili masowych (Mailing)
Przewodnik po module do rozsyłania wiadomości i newsletterów do klientów.
👤 Instrukcja dla pracownika (Marketing / Administracja)
Moduł "Mailing" umożliwia masową komunikację e-mail z wybranymi grupami klientów. Właściwe wykorzystanie modułu wymaga zrozumienia mechanizmów zgód marketingowych oraz segmentacji bazy.
1. Zgody marketingowe (Zgodność z RODO)
Przed realizacją jakiejkolwiek kampanii należy upewnić się, że spełnione są wymogi prawne. Podczas rejestracji konta użytkownicy w sposób dobrowolny określają swoje preferencje dotyczące komunikacji marketingowej.
Ścieżka dla pracownika: Dashboard ➔ Mailing ➔ Zgody
- System AcePark automatyzuje weryfikację zgód. Wiadomości o charakterze promocyjnym dystrybuowane są wyłącznie do profili posiadających aktywną zgodę marketingową. System automatycznie blokuje wysyłkę do osób, które zrezygnowały z subskrypcji.
- W przypadku zgłoszenia od klienta w recepcji z prośbą o zaprzestanie wysyłki wiadomości marketingowych, należy odnaleźć jego profil w zakładce Zgody i dokonać dezaktywacji odpowiedniego przełącznika.
2. Segmenty (Zarządzanie bazą odbiorców)
W celu optymalizacji procesu docierania do wybranych grup docelowych (np. "wszyscy klienci z Opola uczęszczający na zajęcia we wtorki"), system wykorzystuje Segmenty.
Ścieżka dla pracownika: Dashboard ➔ Mailing ➔ Segmenty ➔ Nowy segment
- Segment to dynamicznie aktualizowana lista odbiorców, spełniających zdefiniowane kryteria filtrujące (np. "Aktywni Klienci - Legionowo").
- Tworzenie segmentu polega na wyborze parametrów: lokalizacji, konkretnych grup zajęciowych oraz statusu aktywności konta.
- Główną zaletą segmentów jest ich autouzupełnianie. Każdy nowy użytkownik, który spełni zapisane kryteria (np. nowa osoba dołączająca do grupy w Legionowie), zostanie automatycznie włączony do segmentu, bez konieczności manualnej aktualizacji bazy.
3. Tworzenie i realizacja kampanii
Moduł służący do konfiguracji oraz dystrybucji wiadomości.
Ścieżka dla pracownika: Dashboard ➔ Mailing ➔ Kampanie ➔ Nowa kampania
- Nazwa kampanii: Wewnętrzny identyfikator systemowy (niewidoczny dla klientów), ułatwiający archiwizację (np. "Oferta wakacyjna - Wiosna 2026").
- Temat wiadomości: Oficjalny temat e-maila wyświetlany w skrzynkach odbiorczych klientów (np. "Ruszyły zapisy na Półkolonie!").
- Odbiorcy: Możliwość wskazania wcześniej utworzonego Segmentu lub ręczny wybór pojedynczych adresów.
- Treść (HTML): W systemie dostępny jest wbudowany, wizualny edytor tekstu umożliwiający formatowanie wiadomości, wstawianie grafik oraz linków.
- Weryfikacja: Przed finalną wysyłką zaleca się przeprowadzenie testu poprzez funkcję "Wyślij test", co pozwala na sprawdzenie poprawności formatowania wiadomości na urządzeniach mobilnych.
- Wysyłka: Po zapisaniu wersji roboczej i finalnej weryfikacji należy użyć przycisku "Wyślij". Uwaga: Wysyłka jest procesem nieodwracalnym i realizowanym bezzwłocznie.
4. Statystyki
Po zrealizowaniu kampanii, moduł zapewnia dostęp do wskaźników efektywności (przycisk Statystyki obok nazwy kampanii), prezentujących m.in.:
- Wskaźnik dostarczalności (procent wiadomości pomyślnie odebranych).
- Wskaźnik otwarć (Open Rate) – odsetek odbiorców, którzy wyświetlili treść e-maila.
- Ewentualne błędy doręczenia (np. wynikające z usuniętych lub błędnych adresów e-mail).
- Wskaźnik klikalności (CTR) – liczba użytkowników, którzy kliknęli w linki umieszczone w treści wiadomości.
- Wskaźnik rezygnacji (Unsubscribe Rate) – liczba osób, które wypisały się z bazy po otrzymaniu wiadomości.
🛠️ Dokumentacja techniczna
Informacje dla programistów integrujących bazę wysyłkową.
Komunikacja z SendGrid
Moduł mailingu oparty jest o providera SendGrid (lub podobne rozwiązanie dostarczające API i webhooks).
- Otwarcia i kliknięcia: Tabela statystyk nasłuchuje na webhooks ze statusami dostarczenia wiadomości od dostawcy mailowego. Opóźnienie statystyk wynika ze specyfiki działania webhooków.
- Wypisania: Kliknięcie przez klienta przycisku "Wypisz się" z maila powinno automatycznie trafiać na webhook i aktualizować wpis w tabeli powiązanej z danym
userEmail, blokując flagę w ustawieniach (tabela zgódconsents). - Idempotentność i zablokowane adresy: Osoby wypisane nigdy nie dostają wiersza w pętli wysyłkowej, nawet jeżeli znajdują się w Segmencie z odznaczonym parametrem
Wymagaj zgody marketingowej. Hard opt-out w tabeli zawsze nadpisuje wybrane grupy docelowe.
Wyznaczanie listy odbiorców
Cała logika wyboru odbiorców (lib/actions/mail-campaigns.ts) rozstrzygana jest po stronie D1 — worker nigdy nie ładuje pełnych tabel do pamięci, dzięki czemu zużycie pamięci nie rośnie wraz z bazą klientów.
- Jedno zapytanie zamiast łączenia w JS: kandydaci pochodzą z tabeli
player, a zgody (user.marketingConsent/marketingConsentElectronic) i wypisania (client_mail_preferences.unsubscribed_at) dołączane są przezLEFT JOIN. Warunki zgody i wypisania trafiają doHAVING, deduplikacja adresów doGROUP BY lower(trim(owner_email)). - Paginacja kursorowa: odbiorcy pobierani są stronami po
RECIPIENT_PAGE_SIZE(500) z kursoremlower(trim(owner_email)) > ?. Każda strona jest kolejno: uzupełniana o tokeny wypisu, wysyłana do SendGrid i logowana wmail_campaign_recipient— w pamięci znajduje się zawsze najwyżej jedna strona. - Podgląd odbiorców:
previewRecipientszwraca liczniki policzone agregatem SQL oraz próbkę pierwszychPREVIEW_SAMPLE_SIZE(50) adresów, a nie pełną listę. - Listy ręczne: adresy wskazane ręcznie (
manual_include/ „konkretni klienci") pomijają bramkę zgody, ale nadal respektują wypisanie. Są rozwiązywane osobno i wykluczane z zapytania filtrowego (NOT IN (SELECT value FROM json_each(?))), więc nikt nie trafia na listę dwa razy. Listy przekazywane są jako pojedynczy parametr JSON, co omija limit parametrów bindowanych w D1.