Rozliczanie subskrypcji w SaaS: jak działają Stripe i subskrypcje
Gdy budujesz SaaS, rozliczenia rzadko są ekscytującym tematem – ale to one decydują, czy na koniec na Twoim koncie wyląduje gotówka. Dobra wiadomość: nie musisz tworzyć własnego systemu płatności. Stripe przejmuje najbardziej delikatne części (dane kart kredytowych, cykliczne obciążenia, bezpieczeństwo), a Ty budujesz jedynie pomost między swoim produktem a Stripe. W tym artykule wyjaśniamy, jak to naprawdę działa od strony technicznej i organizacyjnej – bez marketingowego pustosłowia.
Podstawowe elementy: Product, Price, Subscription
Stripe myśli w trzech warstwach, które warto raz zrozumieć – wtedy reszta układa się sama:
- Product – Twoja abstrakcyjna oferta, na przykład plan Pro lub plan Team.
- Price – konkretna cena dla danego Product, na przykład 29 EUR miesięcznie lub 290 EUR rocznie. Jeden Product może mieć wiele Prices (miesięczny, roczny, różne waluty).
- Subscription – stałe powiązanie między klientem a Price. Dba o to, by obciążenie następowało automatycznie co miesiąc lub co rok.
Do tego dochodzi Customer: obiekt Stripe reprezentujący jednego z Twoich użytkowników, z którym powiązane są metoda płatności i subskrypcje. Najważniejsza zasada od samego początku: zapisuj Stripe-Customer-ID w swojej własnej bazie danych przy rekordzie użytkownika. Dzięki temu w każdej chwili możesz czysto powiązać Stripe ze swoim systemem.
Tak przebiega zakup subskrypcji
Dziś najczęstszym i najbezpieczniejszym sposobem jest Stripe Checkout – strona płatności hostowana przez Stripe. Przebieg:
- Twój użytkownik klika w taryfie przycisk Kup. Twój serwer tworzy sesję Checkout z odpowiednim Price-ID.
- Użytkownik zostaje przekierowany do Stripe, podaje tam dane swojej karty i finalizuje płatność. Wrażliwe dane nigdy nie dotykają Twojego serwera – to oszczędza Ci najbardziej rygorystycznych części zgodności z PCI.
- Stripe przekierowuje z powrotem na Twoją stronę powodzenia i w tle zakłada Customer oraz Subscription.
Ważne, by to zrozumieć: przekierowanie na Twoją stronę powodzenia nie jest wiarygodnym dowodem na to, że płatność się odbyła. Użytkownik mógł zamknąć kartę przeglądarki. Prawdziwy dowód prawdy przychodzi przez webhooki.
Webhooki: serce, które wielu nie docenia
Webhook to komunikat, który Stripe aktywnie wysyła do Twojego serwera, gdy tylko coś się wydarzy – płatność udana, płatność nieudana, subskrypcja anulowana. Twój serwer nasłuchuje na stałym punkcie końcowym i reaguje. To jedyny niezawodny sposób, by utrzymać Twoją bazę danych w synchronizacji z rzeczywistością po stronie Stripe.
Zdarzenia, na których w praktyce niemal zawsze zależy w SaaS:
- checkout.session.completed – użytkownik pomyślnie dokonał zakupu, odblokuj dostęp.
- invoice.paid – cykliczna płatność w kolejnym miesiącu się powiodła.
- invoice.payment_failed – karta została odrzucona, powinieneś poinformować użytkownika i ewentualnie ograniczyć dostęp.
- customer.subscription.deleted – subskrypcja została zakończona, odbierz dostęp.
Dwie rzeczy musisz przy tym zrobić poprawnie: po pierwsze sprawdzać sygnaturę każdego webhooka, aby nikt nie podstawił Ci sfałszowanych zdarzeń. Po drugie zbudować swój handler idempotentnie – Stripe może wysłać to samo zdarzenie wielokrotnie, a Ty nie możesz przez to dwukrotnie odblokować ani obciążyć użytkownika.
Okresy próbne, anulowanie i zmiana planu
Subskrypcje mogą mieć okres próbny – na przykład siedem dni za darmo, po czym następuje automatyczne obciążenie. Stripe zarządza tą datą za Ciebie. Anulowanie zwykle ustawiasz na cancel_at_period_end: użytkownik zachowuje dostęp do końca opłaconego okresu, a następnie subskrypcja wygasa. Podwyższenie lub obniżenie planu w trakcie okresu Stripe rozlicza proporcjonalnie metodą proracji, tak aby nikt nie zapłacił za dużo ani za mało.
Podatki, faktury i kontekst UE
Dla obszaru niemieckojęzycznego kluczowe są dwa punkty. Po pierwsze podatek VAT: jeśli sprzedajesz konsumentom w UE, obowiązują stawki podatkowe kraju klienta. Stripe Tax potrafi obliczyć to automatycznie i doliczyć. Po drugie silne uwierzytelnianie klienta (SCA): w UE wiele płatności kartą musi być potwierdzanych przez 3-D Secure. Stripe Checkout załatwia to automatycznie – dobry powód, by nie budować własnego formularza płatności. Faktury Stripe również generuje; to, czy spełniają one Twoje formalne wymogi, warto krótko skonsultować z biurem rachunkowym.
Czego nauczyliśmy się w praktyce
Prowadzimy siedem własnych marek w produkcji, kilka z nich z modelami subskrypcyjnymi lub płatnymi przez Stripe. Powracające przeszkody rzadko są związane z samą integracją, lecz z przypadkami brzegowymi: nieudane kolejne płatności, podwójnie przetworzone webhooki, użytkownicy anulowani w panelu Stripe, którzy w Twojej bazie wciąż figurują jako aktywni. Szczera rada: zacznij po prostu. Jeden plan, miesięczne rozliczenie, Checkout i trzy starannie obsłużone zdarzenia webhook w zupełności wystarczą na start. Złożone taryfy ilościowe, kody rabatowe i rozliczenie oparte na zużyciu możesz dodać później, gdy realni klienci o to poproszą – nie wcześniej.