Świeży projekt

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.

psiok.com.pl ↗ | Szkoła szkolenia psów | E-commerce + LMS

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 gcs przełą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ć:

  1. 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.
  2. Anti-oversell na rezerwacjach - realny problem biznesowy (nie sprzedać 11 miejsc na 10-osobowy kurs stacjonarny) rozwiązany transakcyjnie na poziomie bazy.
  3. Ochrona treści wideo Bunny Stream - płatny content nie wycieka na grupy znajomych.
  4. Jedna wtyczka, zero modyfikacji core - utrzymywalne, bezpieczne przy aktualizacjach Sensei, WooCommerce i samego WordPressa.
  5. Maksymalizacja zbieranych danych analitycznych bez konfiguracji po stronie GA4 - wszystko gotowe do analizy, kiedy klientka będzie chciała.

Stack

WordPress 7.0 + PHP 8.3

Aktualne wersje. MariaDB 10.11, serwer LiteSpeed. Hosting CyberFolks.

Sensei LMS + psiok-lms-extras

Autorska wtyczka rozszerzająca Sensei przez hooki. PHP OOP, namespace, ~20 modułów.

WooCommerce

Sklep z produktami fizycznymi. Wspólna integracja P24 ze stroną kursów.

Przelewy24 REST API

Własna integracja z SHA-384, weryfikacją webhooków po stronie serwera.

Bunny Stream

CDN dla wideo z tokenowaną ochroną dostępu - materiały kursowe nie do podlinkowania.

dompdf

Generowanie certyfikatów PDF po ukończeniu kursu, własne szablony graficzne.

InPost Paczkomaty

Geowidget do wyboru paczkomatu wprost w checkoucie WooCommerce.

GA4 + Consent Mode v2

Enhanced Ecommerce, zdarzenia Sensei, sygnały gcs G100->G111. Pressidium jako baner zgód.

PHPStan

Statyczna analiza kodu w pipeline buildowym - łapie błędy zanim trafią na produkcję.

WP Mail SMTP

SMTP CyberFolks - powiadomienia z platformy faktycznie dochodzą do klientów.