Czy wtyczka wymaga zewnętrznej usługi mailingowej (Mailchimp, Klaviyo, Brevo)?
Nie. Plugin używa wbudowanego w WordPress wp_mail() — tej samej funkcji, której WooCommerce używa do maili o zamówieniach. Jeśli Twoje sklepowe maile dochodzą, dojdą i te. Dla najlepszej deliverability rekomendujemy zainstalować plugin SMTP (WP Mail SMTP, FluentSMTP) i podpiąć dedykowaną usługę transactional email (Amazon SES, Postmark, SendGrid, Mailgun). Plugin SMTP działa transparentnie — Stock Notifier nic nie wie o jego istnieniu i działa bez dodatkowej konfiguracji.
Co z RODO i zgodami marketingowymi?
Każdy zapis przechodzi double opt-in — klient musi potwierdzić mailem. W tabeli zapisujemy znacznik czasu zgody, IP (hashowane HMAC-SHA256, nie surowe) i user agent. To pełen audit trail wymagany przez GIODO. Tekst zgody jest edytowalny w ustawieniach — plugin zapisuje wersję obowiązującą w momencie opt-in, więc zmiana wordingu nie unieważnia starych zgód.
Czy działa z produktami wariantowymi?
Tak. Subskrybenci są zapisywani per (product_id, variation_id) — klient czekający na rozmiar L nie dostanie maila, gdy wróci rozmiar S. Detektor stock status nasłuchuje hooków zarówno simple (woocommerce_product_set_stock_status) jak i variation (woocommerce_variation_set_stock_status).
Co jeśli zrobię szybką sekwencję OOS → IS → OOS → IS (flap stanu)?
Plugin ma debounce 5 minut na transient cache per produkt — wielokrotne zmiany w krótkim oknie nie wysypią baterii maili. Plus per-subskrybent antispam window (domyślnie 24h): ta sama osoba nie dostaje dwóch powiadomień dla tego samego SKU. Te dwa mechanizmy są niezależne — pierwsze chroni przed flap, drugie przed namierzeniem konkretnego klienta.
Czy zobaczę, które maile przyniosły zamówienie?
Tak. Po ukończonym zamówieniu (woocommerce_order_status_completed) plugin matchuje billing_email z subskrybentami w statusie „notified” dla zamówionych produktów i flaguje ich jako „converted” z ID zamówienia. W tabeli widzisz dokładnie który mail skończył się sprzedażą, plus możesz wyeksportować CSV i policzyć konwersję per produkt / kategoria / kampania.
Czy plugin jest kompatybilny z HPOS (High-Performance Order Storage)?
Tak. Deklarujemy pełną kompatybilność z HPOS. Match konwersji używa wc_get_order() i nowych API zleceń, nie odpytuje post_meta. Tabela subskrybentów jest niezależna od orderów (relacja przez billing_email + product_id), więc HPOS nie wpływa na strukturę danych.
Czy są limity liczby subskrybentów / wysłanych maili?
Nie. Wersja Free nie ma żadnych limitów. Jedyne ograniczenie to wydajność Twojego hostingu — Action Scheduler dzieli kolejkę na batche po 50, więc nawet bardzo duże sklepy z 5000+ oczekujących radzą sobie bez problemu. Dla bardzo dużych wolumenów warto rozważyć dedykowany worker dla Action Scheduler (np. WC tools).
Co z odinstalowaniem? Czy mogę testować bez ryzyka?
Domyślnie tabela subskrybentów zostaje w bazie po dezaktywacji i odinstalowaniu — to ochrona przed przypadkową utratą danych. Pełny cleanup (DROP TABLE + delete options + clear transients) następuje wyłącznie gdy świadomie włączysz opcję „Skasuj dane przy odinstalowaniu” w ustawieniach i potem odinstalujesz wtyczkę.
Czy plugin obsługuje produkty na backorder (przyjmowanie zamówień przy braku stanu)?
W MVP Free — nie bezpośrednio. Plugin opiera się na transitions outofstock → instock; produkty z backorders='notify' i stock_quantity=0 mają status onbackorder, który nie wchodzi w flow. Pro doda dedykowany tracker dla onbackorder → instock.
Czy mogę używać własnego template’a maila?
Tak. Skopiuj plik wp-content/plugins/wpnest-stock-notifier-for-woocommerce/includes/email/templates/restock-notification.php do your-theme/wpnest-stonot/restock-notification.php. Plugin użyje motywu zamiast bundlowanego template’a. Wersja Pro doda WYSIWYG editor w settings dla nieprogramistów.
Co z WPML / Polylang i wielojęzycznością?
Tekst zgody, subject maila i intro powiadomienia są filtrowalne: wpnest_stonot_gdpr_consent_text, wpnest_stonot_email_subject (z subscriber_row jako context), wpnest_stonot_email_intro. Twój multilang plugin może per-visitor-locale swapować wartości. Plugin trzyma w tabeli jedną opcję per concept (NIE pair _en/_pl) — bo to filtry, nie storage, decydują o lokalizacji.