Sprzedaż produktu cyfrowego wygląda w prezentacjach jak jeden przycisk, a jest łańcuchem pięciu rzeczy, które muszą się wydarzyć w kilkanaście sekund po kliknięciu „zapłać": potwierdzenie płatności, nadanie dostępu, wiadomość z linkiem, faktura i zapisanie kontaktu na właściwą listę mailingową. Każde z tych ogniw da się popsuć osobno.
Sami sprzedajemy kursy i ebooki, a u klientów budujemy takie łańcuchy od formularza zapisu na szkolenie po platformę z abonamentem. Ten tekst jest o tym, co dzieje się między płatnością a dostępem. Ogólną mechanikę bramek opisaliśmy w artykule o płatnościach w automatyzacjach i tamte zasady (weryfikacja podpisu, idempotencja, kwoty w groszach) obowiązują tu bez zmian.
TL;DR: Do sprzedaży cyfrowej wystarczy Payment Link i jeden webhook. Dostęp nadawaj po checkout.session.completed ze sprawdzeniem payment_status, a przy abonamencie opieraj go na statusie subskrypcji, nie na pierwszej płatności. Fakturę wystawiaj polskim programem przez API, bo Stripe Invoicing nie robi dokumentu zgodnego z naszymi przepisami ani nie wysyła go do KSeF. Zwrot i chargeback muszą odbierać dostęp automatycznie.
Produkty, ceny i trzy sposoby sprzedaży
Stripe rozdziela dwie rzeczy, które w sklepach są zwykle jednym rekordem. Produkt to opis tego, co sprzedajesz („Kurs n8n od zera"), a cena to kwota, waluta i rytm rozliczeń przypięte do produktu. Jeden produkt może mieć wiele cen: 799 zł jednorazowo, 99 zł miesięcznie, 990 zł rocznie, osobno w euro. Wygląda to na formalność, dopóki nie podnosisz ceny i nie okazuje się, że stara musi dalej działać dla tych, którzy kupili wcześniej. Wtedy nie edytujesz kwoty, tylko tworzysz nową cenę.
Sprzedawać ten katalog można na trzy sposoby, a różni je nie technologia, tylko kupujący.
| Payment Link | Checkout Session | Faktura (Invoicing) | |
|---|---|---|---|
| Kto kupuje | ktokolwiek z linkiem | kupujący z Twojej aplikacji | konkretna firma lub osoba |
| Typowe użycie | kurs, ebook, zapis na szkolenie | sklep, platforma, konto użytkownika | B2B, płatność po terminie |
| Subskrypcje | tak | tak | tak (rozliczenia cykliczne) |
| Rozłożenie na raty | nie | nie | tak, płatności częściowe |
Payment Link to najkrótsza droga od pomysłu do sprzedaży: tworzysz link w panelu bez linijki kodu i wrzucasz go do maila, opisu na YouTube albo w bio na Instagramie. Obsłuży kody rabatowe, produkty dodatkowe w koszyku, kod QR i przycisk na stronie. Wyglądu strony płatności nie przerobisz jednak głębiej, a rat tam nie zrobisz.
Checkout Session to ten sam mechanizm sterowany z kodu, potrzebny przy koncie użytkownika, koszyku z kilkoma pozycjami albo cenie wyliczanej w Twojej aplikacji. Różnica praktyczna jest jedna, za to istotna: do sesji z API dokładasz własne identyfikatory (client_reference_id, metadata), więc po płatności wiesz, który użytkownik kupił. Bez tego jedynym łącznikiem zostaje adres e-mail, a pierwsza literówka w domenie kończy się ręcznym dopisywaniem dostępu.
Faktura zostaje do sprzedaży firmom. Kupujący dostaje dokument z terminem, może zapłacić w częściach i nie musi wyciągać karty, co przy kursie kupowanym przez dział zakupów bywa jedyną możliwą drogą. Link i Checkout kończą się natomiast tym samym obiektem, więc reszta artykułu dotyczy ich tak samo.
Subskrypcje: trial, zmiana planu, nieudane obciążenia
Subskrypcja ma własny cykl życia i to on, a nie pojedyncza płatność, decyduje o dostępie. Zaraz po utworzeniu ma status incomplete, a klient 23 godziny na opłacenie pierwszej faktury. Potem wchodzi w active, przy okresie próbnym w trialing. Gdy obciążenie za kolejny okres nie przejdzie, idzie w past_due, a po wyczerpaniu prób w canceled albo unpaid.
Okres próbny. Trial bez karty jest wygodniejszy dla klienta i droższy dla Ciebie, bo subskrypcja bez metody płatności zostanie po nim zapauzowana albo anulowana. Trzy dni przed końcem Stripe wysyła zdarzenie customer.subscription.trial_will_end i to jest moment na wiadomość „za trzy dni startuje płatny okres", która ratuje więcej konwersji niż każdy baner w aplikacji.
Zmiana planu w trakcie okresu. Przejście na wyższy pakiet Stripe rozlicza proporcjonalnie: liczy niewykorzystaną część opłaconego okresu, odejmuje ją i dolicza nowy plan od dnia zmiany. Brzmi rozsądnie, dopóki nie zobaczysz na fakturze trzech pozycji z ułamkowymi kwotami. Przy produktach edukacyjnych prościej wyłączyć proporcjonalne rozliczenie i zmieniać plan od kolejnego okresu.
Nieudane obciążenia. To normalny ruch, nie sytuacja brzegowa: karty wygasają, limity się kończą, banki odrzucają transakcje. Stripe ma na to Smart Retries, dobierające moment ponowienia modelem uczonym na danych z całej sieci. Politykę ustawiasz sam, na przykład osiem prób w ciągu dwóch tygodni. Twardych odmów (skradziona karta, błędny numer) Stripe nie ponawia, dopóki klient nie poda nowej metody płatności. Szerzej o rozliczeniach rozłożonych w czasie piszemy przy ratach i płatnościach cyklicznych.
Zasada, którą stosujemy: dostęp gaśnie przy statusie unpaid albo canceled, nie przy pierwszej nieudanej próbie. Klient odcięty w dniu, w którym bankowi nie przeszło obciążenie, pisze do supportu wściekły, a płaci i tak dwa dni później.
Customer Portal, czyli samoobsługa zamiast maili do supportu
Customer Portal to hostowana przez Stripe strona, na której klient sam wymieni kartę, pobierze faktury, zmieni plan albo anuluje subskrypcję (natychmiast lub z końcem okresu). Konfigurujesz ją w panelu, podpinasz logo i kolory, a klient trafia tam z linku z Twojej aplikacji. Interfejs jest po polsku.
To najtańsza automatyzacja w całym zestawieniu, bo zdejmuje z człowieka trzy najczęstsze zgłoszenia: „zmieniłem kartę", „poproszę fakturę", „chcę zrezygnować". Dochodzi ekran zatrzymujący przy anulowaniu, na którym proponujesz rabat i pytasz o powód rezygnacji. Powody wpadają webhookiem, więc po kwartale masz realną listę przyczyn odejść zamiast przeczuć. Dwa ograniczenia: portalu nie osadzisz w ramce na własnej stronie, a subskrypcji rozliczanej od zużycia albo obejmującej kilka produktów naraz klient tylko anuluje, nie zmieni.
Webhook: które zdarzenia naprawdę trzeba łapać
Podstawy są takie same jak przy każdej bramce: weryfikuj podpis na surowym ciele żądania, odpowiadaj 200 od razu, resztę rób asynchronicznie, zabezpiecz się przed podwójnym przetworzeniem zdarzenia. Jeśli koncepcja jest dla Ciebie nowa, zacznij od wyjaśnienia, czym jest webhook. W sprzedaży cyfrowej dochodzą do tego pułapki, których nie ma przy zwykłym sklepie.
Pierwsza: checkout.session.completed nie znaczy „zapłacone". Zdarzenie mówi tylko tyle, że klient przeszedł przez proces płatności. Przy metodach z opóźnionym potwierdzeniem środków jeszcze nie ma, a sesja ma payment_status równy unpaid. Pobierz więc sesję z API, sprawdź to pole i dopiero wtedy realizuj zamówienie, a osobno nasłuchuj checkout.session.async_payment_succeeded i async_payment_failed.
Druga: dostęp nadawaj z dwóch miejsc, ale jedną funkcją. Wywołanie jej ze strony „dziękujemy" daje klientowi dostęp od razu, webhook łapie tych, którzy zamknęli przeglądarkę. Skutek jest taki, że ta sama funkcja odpali się dwa razy, czasem równolegle, i musi to znieść bez skutków ubocznych.
Trzecia: przy subskrypcji zamknięcie sesji to dopiero początek. Kolejne okresy nie tworzą sesji Checkout, tylko faktury. Automat oparty wyłącznie na checkout.session.completed nada dostęp raz i nigdy się nie dowie, że klient przestał płacić.
| Zdarzenie | Co znaczy | Co robi automat |
|---|---|---|
checkout.session.completed | klient przeszedł płatność | sprawdź payment_status, nadaj dostęp, wyślij powitanie |
checkout.session.async_payment_succeeded | opóźniona płatność doszła | nadaj dostęp |
invoice.paid | opłacony kolejny okres | przedłuż dostęp, wystaw fakturę |
invoice.payment_failed | obciążenie odrzucone | mail z linkiem do wymiany karty |
customer.subscription.trial_will_end | trial kończy się za 3 dni | przypomnienie o starcie płatności |
customer.subscription.updated / .deleted | zmiana planu, anulowanie | zmień lub odbierz dostęp |
charge.refunded | zwrot pieniędzy | odbierz dostęp, korekta |
charge.dispute.created | klient zgłosił reklamację w banku | alert do człowieka |
Nadanie dostępu: plik, konto, uprawnienia
Tę decyzję podejmujesz raz i zwykle zostaje z Tobą na lata.
Link do pliku. Ebook, szablon, paczka materiałów: po płatności generujesz link wygasający po określonym czasie i wysyłasz go mailem. Plik trzymaj poza katalogiem publicznym, bo najczęstszy wyciek materiałów płatnych to nie włamanie, tylko adres zgadnięty z numeracji.
Konto w platformie kursowej. Webhook wywołuje API platformy (Teachable, Kajabi, WordPress z wtyczką kursową albo Twojej własnej), zakłada konto na adres z płatności i zapisuje kupującego na kurs. Tu boli mapowanie: potrzebujesz tabeli tłumaczącej identyfikator ceny w Stripe na identyfikator kursu. Trzymaj ją w jednym miejscu, a nie w warunkach rozsianych po workflow.
Uprawnienia w Stripe. Przy subskrypcjach nie musisz budować własnej tabeli uprawnień. Definiujesz funkcje, przypinasz je do produktów, a Stripe przy każdym zakupie, zmianie planu i anulowaniu wysyła zdarzenie z aktualną listą uprawnień klienta. Aplikacja tylko je zapisuje i sprawdza przy logowaniu. Znika wtedy stan „w Stripe anulowane, w aplikacji nadal aktywne".
„Największy koszt sprzedaży cyfrowej to nie prowizja od płatności, tylko mail o treści »zapłaciłem i nie mam dostępu«. Jeden taki mail kosztuje kwadrans pracy, zaufanie klienta i zwykle kończy się prośbą o zwrot. Dlatego przy wdrożeniach najpierw budujemy ścieżkę nadania dostępu i ponawiania jej po awarii, a dopiero potem wszystko, co ładne." — Mikołaj Brunka, założyciel NoCodeWork
Faktura po polsku: Stripe Invoicing kontra Fakturownia
Tu najwięcej polskich wdrożeń idzie w złą stronę. Stripe ma własny moduł fakturowy i wygląda on porządnie, ale nie wystawia dokumentu zgodnego z polskimi przepisami: nie obsłuży naszych stawek i oznaczeń (zw, np), nie sformatuje NIP-u, nie ponumeruje faktur według polskich zasad i nie wyśle niczego do KSeF. Potwierdzenia ze Stripe traktuj jako dowód płatności, nie jako fakturę.
Rozwiązanie jest od lat to samo: webhook uderza do polskiego programu fakturowego przez API. W Fakturowni to zwykłe żądanie POST na /invoices.json z tokenem i pozycjami dokumentu, w inFakcie i Wfirmie analogicznie. Numeracja, stawki, wysyłka do KSeF i archiwum zostają po stronie programu, czyli tam, gdzie i tak siedzi Twoja księgowość. Proces rozkładamy na części w artykule o automatyzacji faktur i księgowości.
Na kształt dokumentu przy sprzedaży cyfrowej wpływają jeszcze trzy sprawy.
- B2B kontra B2C. KSeF jest obowiązkowy dla faktur między firmami: od 1 lutego 2026 dla podatników ze sprzedażą powyżej 200 mln zł, od 1 kwietnia 2026 dla pozostałych. Faktury konsumenckie są poza obowiązkiem, a wysłanie ich do KSeF jest dobrowolne. Przy sprzedaży kursów masz oba ruchy naraz, więc automat musi sprawdzić, czy w polu NIP coś jest, i wystawić inny dokument w każdym przypadku.
- Sprzedaż za granicę. Usługi cyfrowe dla konsumentów z innych krajów UE są co do zasady opodatkowane w kraju nabywcy. Dopóki cała taka sprzedaż mieści się w progu 10 000 euro rocznie, można stosować stawkę własnego kraju. Powyżej wchodzi rejestracja w procedurze OSS albo w każdym kraju osobno, a przy sprzedaży firmie z ważnym numerem VAT UE odwrotne obciążenie. Stripe Tax policzy podatek i przypilnuje progów, ale deklaracji nie złoży.
- Paragon i kasa fiskalna. Sprzedaż usług osobom prywatnym, opłacona w całości bezgotówkowo i udokumentowana tak, że z ewidencji wynika, czego dotyczyła wpłata, bywa zwolniona z kasy fiskalnej. Pytanie do księgowej przed startem sprzedaży, nie po pierwszym miesiącu.
Mailing z tagiem produktu i sekwencja po zakupie
Kontakt, który właśnie zapłacił, jest najcieplejszym adresem, jaki masz. Automat powinien dopisać go do systemu mailingowego, otagować kupionym produktem i uruchomić sekwencję powitalną. Tag jest ważniejszy, niż wygląda: bez niego po pół roku masz jedną listę „klienci" i nie wyślesz wiadomości do osób, które kupiły kurs A, ale nie kupiły kursu B. Nam wystarcza układ, w którym tagi odpowiadają identyfikatorom cen ze Stripe.
Sekwencja po zakupie ma doprowadzić człowieka do pierwszego użycia produktu. Przy kursie to trzy wiadomości w pierwszym tygodniu: powitanie z danymi do logowania, przypomnienie po dwóch dniach dla tych, którzy nie weszli, i pytanie po tygodniu, czy coś nie działa. Osobno uruchom powiadomienie dla siebie: wiadomość na czat firmowy przy sprzedaży, nieudanym obciążeniu i zwrocie. Jak to spiąć, opisujemy przy botach Telegrama do wysyłki dokumentów i dostępów.
Kolejność w łańcuchu jest jedna: najpierw dostęp, potem faktura, na końcu sprawy wewnętrzne. Kupujący przeżyje fakturę po dwóch godzinach, kursu następnego dnia już nie.
Zwroty i chargebacki: odebranie dostępu bez awantury
Zwrot przy produkcie cyfrowym jest inny niż przy fizycznym, bo towaru nie da się odesłać. Przy sprzedaży konsumenckiej dochodzi prawo odstąpienia i zgoda na natychmiastowe udostępnienie treści, którą klient zaznacza przy zakupie. Jedno pole w formularzu, a bez niego reszta traci znaczenie.
Dalej sprawa jest prosta i najczęściej pomijana: zdarzenie charge.refunded musi odbierać dostęp. W praktyce mija pół roku, zanim ktoś zauważy, że wszyscy zwracający wciąż mają konta w platformie. Zwrot uruchamia też korektę dokumentu sprzedaży, czyli osobną ścieżkę w programie fakturowym, a nie „minus fakturę".
Chargeback jest cięższym kalibrem. Stripe od razu zdejmuje z salda kwotę transakcji plus opłatę za obsługę sporu, w Polsce 90 zł, i ta opłata nie wraca nawet przy wygranej. Na odpowiedź masz zwykle od 7 do 21 dni, a decyzja banku potrafi zająć dwa miesiące. Najlepszym dowodem jest przy produktach cyfrowych historia użycia: kiedy klient się zalogował, ile lekcji otworzył, kiedy pobrał plik. Jeśli tego nie logujesz, nie masz czym się bronić. Dlatego przy charge.dispute.created automat zawiesza dostęp i wysyła alert do człowieka.
Polskie realia: BLIK, waluty, wypłaty, podatki
Stripe działa w Polsce normalnie, rozlicza w złotówkach i wypłaca na polskie konto, ale kilka rzeczy zaskakuje przy pierwszym wdrożeniu.
- BLIK i Przelewy24 są w Stripe metodami jednorazowymi. Sprzedasz nimi kurs czy ebook, ale subskrypcji nie zbudujesz: cykliczne obciążenia wymagają karty. To najczęstszy powód, dla którego przy abonamencie dla polskich klientów detalicznych rozważamy PayU, gdzie BLIK cykliczny istnieje.
- Prowizje (ceny z sierpnia 2026): karty europejskie 1,5% + 1 zł, premium 1,9% + 1 zł, karty spoza Europy 3,25% + 1 zł, BLIK 1,6% + 1 zł, Przelewy24 1,9% + 1 zł, przewalutowanie dodatkowo 2%. Moduł subskrypcyjny kosztuje osobno 0,7% obsłużonego wolumenu, moduł podatkowy bez kodu 0,5% od transakcji. Przy abonamencie te dwa dodatki potrafią podnieść koszt płatności o połowę, więc policz je, zanim włączysz.
- Wypłaty. Pierwsza wypłata na nowym koncie przychodzi zwykle po kilku, kilkunastu dniach od pierwszej płatności, kolejne według harmonogramu. Planując kampanię finansowaną ze sprzedaży, nie zakładaj, że pieniądze będą na koncie następnego dnia.
- Faktura za prowizje przychodzi od podmiotu irlandzkiego, więc rozliczasz ją przez odwrotne obciążenie. Niech księgowość dowie się o tym przed pierwszym rozliczeniem.
Na co uważać
- Testujesz tylko ścieżkę udaną. Sprawdź klienta, który zamknął przeglądarkę po zapłaceniu, płatność odrzuconą, zwrot, wygasłą kartę przy odnowieniu i to samo zdarzenie dostarczone dwa razy.
- Dostęp nadawany na adres e-mail bez własnego identyfikatora. Ktoś kupi z prywatnej skrzynki, a zaloguje się firmową i masz ręczną robotę. Dokładaj
client_reference_idalbometadataprzy tworzeniu sesji. - Brak przycisku „nadaj dostęp ponownie". Program fakturowy kiedyś odpowie błędem, platforma kursowa będzie niedostępna. Każdy krok łańcucha musi dać się powtórzyć osobno, bez duplikatów.
- Pomylone klucze testowe i produkcyjne. Automat działa idealnie w testach, a po przełączeniu na produkcję nasłuchuje zdarzeń z trybu testowego. Sprawdź to, zanim odpalisz kampanię.
- Brak alertu, gdy webhook przestaje działać. Stripe ponawia próby, ale nie w nieskończoność. Bez alertu dowiesz się o awarii od klienta, który zapłacił i czeka.
FAQ
Czy da się sprzedawać kursy przez Stripe bez własnej strony?
Tak. Payment Link to strona płatności hostowana przez Stripe, którą tworzysz w panelu bez linijki kodu i wrzucasz gdziekolwiek: do maila, opisu filmu, bio na Instagramie, jako kod QR albo przycisk na stronie. Obsłuży płatność jednorazową i subskrypcję, przyjmie kody rabatowe i policzy podatek. Do automatycznego nadawania dostępu potrzebujesz jednak webhooka, bo sam link tylko przyjmuje pieniądze.
Kiedy nadać dostęp do kursu po płatności Stripe?
Po zdarzeniu checkout.session.completed, ale dopiero po sprawdzeniu pola payment_status, bo przy metodach z opóźnionym potwierdzeniem sesja bywa zamknięta, zanim pieniądze dojdą. Dodatkowo nasłuchuj checkout.session.async_payment_succeeded. Przy subskrypcjach opieraj dostęp na statusie subskrypcji (active, trialing), bo kolejne okresy nie tworzą już żadnej sesji Checkout.
Czy Stripe wystawi polską fakturę VAT?
Nie w formie, która spełnia polskie wymogi. Stripe Invoicing nie obsługuje polskich oznaczeń stawek, nie numeruje dokumentów według naszych zasad i nie integruje się z KSeF. Fakturę wystawiaj polskim programem (Fakturownia, inFakt, Wfirma) wywoływanym z webhooka przez API. Faktury B2B objęte są obowiązkiem KSeF od 1 lutego 2026 dla największych podatników i od 1 kwietnia 2026 dla pozostałych, a konsumenckie pozostają poza tym obowiązkiem.
Czy w Stripe zrobię subskrypcję płatną BLIK-iem?
Nie. W Stripe BLIK i Przelewy24 są metodami jednorazowymi, więc obsłużą sprzedaż kursu czy ebooka, ale cykliczne obciążenia wymagają karty. Jeśli sprzedajesz abonament polskim klientom detalicznym, a BLIK jest ich podstawową metodą płatności, sprawdź PayU z BLIK-iem cyklicznym na tokenie.
Co zrobić, gdy klientowi nie przejdzie płatność za kolejny miesiąc?
Włącz automatyczne ponawianie (Smart Retries) i ustaw politykę, na przykład kilka prób rozłożonych na dwa tygodnie. Po każdej nieudanej próbie wyślij wiadomość z linkiem do Customer Portal, gdzie klient sam wymieni kartę. Dostęp odbieraj dopiero wtedy, gdy subskrypcja przejdzie w stan unpaid albo canceled, nie po pierwszej odmowie banku. Twardych odrzuceń Stripe nie ponawia bez nowej metody płatności.
Podsumowanie
Stripe daje do sprzedaży cyfrowej komplet: katalog produktów i cen, stronę płatności bez linijki kodu, subskrypcje z trialem i ponawianiem obciążeń, portal samoobsługowy i uprawnienia. Największa część roboty leży poza samą płatnością i sprowadza się do jednego webhooka, który wie, co zrobić z każdym zdarzeniem: nadać dostęp, przedłużyć, odebrać, wystawić dokument, otagować kontakt.
Dwie decyzje ratują później miesiące tłumaczeń. Dostęp opieraj na stanie subskrypcji, nie na pojedynczej płatności, i pozwól każdemu krokowi powtórzyć się bez duplikatów. Faktury wystawiaj polskim programem przez API, bo dokument ze Stripe nie przejdzie ani u księgowej, ani w KSeF. Do tego rzecz, o której łatwo zapomnieć: zwrot i reklamacja w banku muszą odbierać dostęp same. Inaczej po roku sprzedaży masz w platformie grupę osób, które za nią nie zapłaciły.
Chcesz ustalić, jak spiąć u siebie płatność, dostęp, fakturę i mailing? Umów bezpłatną konsultację — powiemy wprost, jeśli w Waszym przypadku wystarczy gotowa platforma kursowa z wbudowanym Stripe i żadne wdrożenie nie jest potrzebne.
Przeczytaj również
- Przelewy24, PayU czy Stripe: płatności w automatyzacjach firmowych
- Raty i płatności cykliczne: jak zautomatyzować rozliczenia rozłożone w czasie
- Jak zautomatyzować faktury i księgowość w firmie
- Telegram w firmie: boty do wysyłki dokumentów, dostępów i powiadomień
- Automatyzacja w firmie szkoleniowej: zapisy, certyfikaty i faktury robią się same
