Szkoła Psiok - psiok.com.pl
Sklep, kursy online, webinary, kursy stacjonarne i landing książki. Wszystko na jednej instalacji WordPressa. Klientka obsługuje sama.
Wyzwanie
Olga prowadzi Szkołę Psiok. Sprzedaje cztery zupełnie różne rzeczy: produkty fizyczne (sklep), kursy online (filmy), webinary i kursy stacjonarne (te z miejscami i datami), oraz książkę edukacyjną dla rodziców - na własnym landingu z osobnym checkoutem. Wszystko to chciała mieć na jednej instalacji WordPressa i obsługiwać samodzielnie, bez programisty na telefonie.
Brzmi prosto, ale jak siądziesz do tego na poważnie, robi się ciekawie. Płatności mają iść przez jednego operatora (jedno konto Przelewy24 dla wszystkich produktów - sklepu, kursów, książki). Materiały wideo nie mogą wyciekać poza opłaconych kursantów. Na kursy stacjonarne nie można sprzedać 11 miejsc, jak są tylko 4 wolne. A całość ma działać też za pół roku, kiedy WooCommerce i Sensei wypuszczą kolejne dziesięć aktualizacji.
Plus drobnostka: w pierwszym tygodniu po starcie strona ma sprzedawać, nie testować się.
System kursów - autorska wtyczka, zero ingerencji w Sensei
Sensei LMS to świetny silnik kursów do WordPressa, ale w stanie pudełkowym nie obsługuje wszystkiego, czego Olga potrzebowała. Klasyczne pokusy w takim momencie to: a) zhakować Sensei, b) dorzucić 8 wtyczek od różnych autorów. Obie kończą się tak samo - dwa lata później nic nie da się zaktualizować, bo wszystko jest sklejone na pinezki.
Napisaliśmy autorską wtyczkę psiok-lms-extras, która rozszerza
Sensei wyłącznie przez hooki. Sensei aktualizuje się niezależnie, nasza wtyczka żyje obok,
nic w core nie modyfikujemy. Z grubsza 20 modułów, w pełni napisanych pod konkretne
potrzeby Olgi:
- 4 typy kursów - online (wideo), webinary, stacjonarne, hybrydowe. Każdy ma swoje pola, swoje ekrany, swoje reguły dostępu.
- Rezerwacja miejsc z mechanizmem anti-oversell (transakcyjne blokady na poziomie bazy danych - nie da się sprzedać więcej miejsc niż jest na kurs stacjonarny, nawet jak 5 osób kliknie "kup" w tej samej sekundzie).
- Lista obecności dla webinarów i kursów stacjonarnych.
- Pliki .ics + przypomnienia mailowe przed wydarzeniem.
- Generowanie certyfikatów PDF po ukończeniu kursu (dompdf, własne szablony graficzne).
- Panel dokumentacji wbudowany w wp-admin - Olga sama wie, jak co działa, bez zaglądania w mail z 2024 roku.
Płatności P24 napisane od zera na REST API
Gotowa wtyczka P24 do Woo? Owszem, jest. Ale w naszym przypadku nie wystarczała - ta sama integracja miała obsługiwać Woo (sklep + kursy w koszyku) i osobny landing książki z własnym checkoutem. Zamiast łatać dwa różne mechanizmy, napisaliśmy jedną integrację Przelewy24 od zera na REST API:
- Podpisy SHA-384 przy rejestracji transakcji i weryfikacji webhooka.
- Kwota i status transakcji zawsze sprawdzane po stronie serwera - nigdy nie ufamy danym, które wracają z przeglądarki klienta. Brzmi banalnie, ale "Wirtualny Koszyk" P24, którego klientka używała wcześniej, ufał tym danym i to był realny problem bezpieczeństwa.
- Jedno konto operatora, te same klucze API dla sklepu, kursów i landingu książki - z punktu widzenia Olgi to jeden panel P24, jedno saldo, jeden raport.
Przy okazji wymieniliśmy landing książki "Moje pierwsze ABeCadło - Psy" ze starego "Wirtualnego Koszyka" na nową bezpieczną integrację. Ten sam landing wizualnie, ale pod spodem zupełnie inny, bezpieczny mechanizm płatności.
Sklep - WooCommerce dopieszczony pod markę
WooCommerce to platforma, na której można robić wszystko - i dlatego domyślnie nie robi nic szczególnie dobrze. Trzeba ją dopieścić. U Olgi:
- Przeprojektowany koszyk i checkout wzorowany na nowoczesnych sklepach, w kolorystyce marki PSIOK.
- Floating mini-cart - wysuwany koszyk z drawerem, jak w największych e-commerce.
- Metody dostawy: Paczkomat InPost (z geowidgetem do wyboru paczkomatu), kurier, odbiór osobisty.
- Spolszczenie całego flow zakupowego - bo standardowy WooCommerce po polsku to czasem proza dla koneserów.
- Te same Przelewy24, ta sama integracja - sklep i kursy w jednym koszyku.
Ochrona wideo - Bunny Stream
Kursy online to płatne filmy. Wystawienie ich pod zwykłym linkiem na serwerze oznacza, że pierwsza osoba, która zapłaci, wysyła link reszcie znajomych na Messengerze i tyle z biznesu. Wybraliśmy Bunny Stream - CDN dla wideo z tokenowaną ochroną dostępu:
- Każdy odtwarzacz dostaje link z tokenem czasowym, który wygasa po krótkim okresie.
- Plik nie jest do pobrania, link nie działa po skopiowaniu poza domeną kursu.
- Token wygenerowany w jednej sesji nie zadziała w innej.
Płatny content zostaje przy płacących. Brzmi oczywiście, ale w praktyce większość małych sklepów z kursami online tego nie robi i potem dziwią się, że sprzedaż "nie idzie".
Analityka pod przyszłe decyzje
Olga niekoniecznie chce dziś siedzieć w GA4 i patrzeć na lejki. Ale za pół roku albo za rok pewnie będzie chciała wiedzieć, gdzie ludzie odpadają w checkoucie albo które kursy najlepiej kończą. Żeby wtedy mieć dane, musimy je zbierać teraz.
Wdrożyliśmy Google Analytics 4 z pełnym Enhanced Ecommerce i zdarzeniami Sensei:
view_item,add_to_cart,begin_checkout,purchase- cały lejek sprzedażowy w sklepie i na kursach.- Zapis na kurs, ukończenie lekcji, ukończenie kursu - lejek edukacyjny.
- Google Consent Mode v2 z banerem Pressidium - sygnały
gcsprzełączają się G100 -> G111 po wyrażeniu zgody. Domyślnie wszystko denied, dopiero po klikieniu w baner przechodzimy w granted.
Dane zbierają się od dnia jeden. Decyzję, co z nimi robić, można podjąć za pół roku.
Bezpieczeństwo i jakość kodu
Przed odpaleniem zrobiliśmy audyt bezpieczeństwa całej platformy. Załatane podatności:
- Serwerowa weryfikacja kwot i podpisów płatności (kluczowa rzecz przy P24 - nigdy nie ufaj tylko temu, co wraca z przeglądarki).
- Wektor SSRF w generatorze PDF zamknięty - dompdf pobiera zasoby, więc trzeba pilnować, skąd.
- Ograniczenie czasu ważności tokenów wideo Bunny Stream do sensownego okna.
- Statyczna analiza kodu PHPStan jako standard w naszym pipeline buildowym.
- Integracja przez WP Mail SMTP (zamiast wbudowanego wp_mail, który czasami "po prostu nie działa"), audyt Site Health.
Pierwszy tydzień po starcie
Kilkadziesiąt realnych transakcji.
Nie testowych. Realnych. W pierwszym tygodniu od wdrożenia. Platforma sprzedawała, a my mogliśmy spokojnie zająć się obserwowaniem dashboardów, zamiast gasić pożary. To jest ten moment, w którym wiesz, że projekt poszedł dobrze.
Efekty
- Działający, zweryfikowany E2E przepływ płatności - testowe i prawdziwe zakupy przeszły przez P24, potwierdzenia i powiadomienia dochodzą poprawnie.
- Klientka obsługuje wszystko z jednego panelu - sklep, kursy, zamówienia, zapisy na webinary. Zero zewnętrznych narzędzi.
- Pełne dane analityczne zbierane od dnia startu, "na zapas" pod przyszłe decyzje.
- Zgodność RODO i cookies wdrożona i potwierdzona (Consent Mode v2 + Pressidium).
- Architektura odporna na aktualizacje - Sensei i WooCommerce można aktualizować bez ryzyka rozjechania customów.
- Pierwszy tydzień: kilkadziesiąt realnych transakcji.
Wyróżniki techniczne
Rzeczy, które robi się w 10% projektów e-commerce, ale których brak boli, jak już zacznie boleć:
- P24 zaimplementowane od zera na REST API - nie gotowa wtyczka. Pełna kontrola, podpisy SHA-384, kwota i status weryfikowane po stronie serwera, jedna integracja dla sklepu, kursów i landingu książki.
- Anti-oversell na rezerwacjach - realny problem biznesowy (nie sprzedać 11 miejsc na 10-osobowy kurs stacjonarny) rozwiązany transakcyjnie na poziomie bazy.
- Ochrona treści wideo Bunny Stream - płatny content nie wycieka na grupy znajomych.
- Jedna wtyczka, zero modyfikacji core - utrzymywalne, bezpieczne przy aktualizacjach Sensei, WooCommerce i samego WordPressa.
- Maksymalizacja zbieranych danych analitycznych bez konfiguracji po stronie GA4 - wszystko gotowe do analizy, kiedy klientka będzie chciała.
Stack
Aktualne wersje. MariaDB 10.11, serwer LiteSpeed. Hosting CyberFolks.
Autorska wtyczka rozszerzająca Sensei przez hooki. PHP OOP, namespace, ~20 modułów.
Sklep z produktami fizycznymi. Wspólna integracja P24 ze stroną kursów.
Własna integracja z SHA-384, weryfikacją webhooków po stronie serwera.
CDN dla wideo z tokenowaną ochroną dostępu - materiały kursowe nie do podlinkowania.
Generowanie certyfikatów PDF po ukończeniu kursu, własne szablony graficzne.
Geowidget do wyboru paczkomatu wprost w checkoucie WooCommerce.
Enhanced Ecommerce, zdarzenia Sensei, sygnały gcs G100->G111. Pressidium jako baner zgód.
Statyczna analiza kodu w pipeline buildowym - łapie błędy zanim trafią na produkcję.
SMTP CyberFolks - powiadomienia z platformy faktycznie dochodzą do klientów.