Mój pierwszy klient zapłacił. Moja aplikacja tego nie zauważyła.
Kilka tygodni temu wypuściłem mały Power-Up do Trello. Planuje komentarze na kartach, więc możesz coś napisać wieczorem, a na karcie pojawi się to jutro o dziewiątej rano. O tym, jak powstawał, pisałem ostatnio. Ten tekst jest o tym, co się stało, gdy ktoś pierwszy raz naprawdę za niego zapłacił, a właśnie o tej części myślałem najmniej.
W skrócie: zapłacił i nie dostał Pro.
Płatność przeszła. Paddle był zadowolony, mój webhook odpowiedział 200, a wszystkie panele świeciły na zielono. Tyle że płatność nie była powiązana z żadnym kontem. ID użytkownika zgubiło się gdzieś między stroną a kasą, więc gdy webhook dotarł, mój kod zobaczył płatność, której nie umiał nikomu przypisać, wzruszył ramionami i zwrócił „ok”. Żadnej ponownej próby, nigdzie nic czerwonego. Znalazłem to tylko dlatego, że przeglądałem kod z zupełnie innego powodu.
To przeszkadza mi najbardziej. Gdyby webhook się wywalił, wiedziałbym o tym tego samego dnia. Ponieważ „obsłużył” problem po cichu, mógł tak leżeć tygodniami. Pierwsza poprawka nie była więc nawet poprawką tego błędu. Ustawiłem, żeby kod wysyłał mi e-mail za każdym razem, gdy przyjdzie płatność, której nie da się połączyć z użytkownikiem. Mam nadzieję, że ten e-mail nigdy nie przyjdzie.
Potem zrobiłem to, co powinienem był zrobić przed startem: kupiłem własny produkt na drugim koncie ze stuprocentowym rabatem i otworzyłem aplikację, żeby sprawdzić, czy Pro naprawdę się włączyło.
Nie włączyło się. Tym razem inny błąd. We własnych notatkach wpisałem sobie zastępczy tekst w stylu <your-id>, skopiowałem link i nawiasy ostre poszły razem z ID. Paddle zapisał je dokładnie tak, jak były, mój serwer zapisał Pro pod ID, które nie istnieje, a aplikacja dalej pokazywała mi paywall. Wstyd, ale właśnie dlatego testuje się całą ścieżkę, a nie tylko poszczególne kawałki. Kasę przetestowałem. Webhook przetestowałem na przykładowych zdarzeniach. Nigdy jednak nie przeszedłem w jednym ciągu od „kliknij upgrade” do „otwórz aplikację i sprawdź”.
Szukając błędu, nauczyłem się jeszcze jednego: logi z hostingu z chwili zakupu już zniknęły. Na darmowym planie nie trzymają się długo. Uratowała mnie historia powiadomień w Paddle. Przechowuje każdy wysłany webhook z pełną treścią i odpowiedzią mojego serwera i pozwala wysłać go ponownie. Jeśli coś sprzedajesz, sprawdź, gdzie Twój dostawca płatności trzyma tę historię, zanim będziesz jej potrzebować.
Skoro już w tym siedziałem, znalazłem też wolniejszy problem. Jak większość integracji, moja ma cotygodniowe zadanie, które usuwa dane osób odłączających aplikację. Rozsądne, tyle że usuwało też ich płatny plan. Ktoś, kto by się odłączył i połączył ponownie, wróciłby do darmowej wersji, a płaciłby dalej co miesiąc. Nikt na to jeszcze nie trafił. Zmieniłem to tak, żeby Pro mógł odebrać tylko system płatności.
Potem jeszcze raz przeczytałem własną stronę i to też było na swój sposób upokarzające. Cennik obiecywał coś innego, niż kod faktycznie egzekwował. Darmowego planu, przez który większość ludzi testowałaby produkt, w cenniku w ogóle nie było. A techniczne ograniczenie widniało tam tak, jakby było zaletą Pro. Nic z tego nie było celowe. To były teksty z pierwszego szkicu, do których nie wróciłem po zmianach w produkcie. Strona wyglądała też jak każda inna SaaS-owa strona wygenerowana przez AI, ciemna z fioletową poświatą, co nie jest najlepsze, gdy prosisz ludzi o połączenie konta Trello. Przerobiłem ją na spokojniejszą i dodałem swoje zdjęcie ze zdaniem, że e-maile do wsparcia trafiają prosto do mnie. Kiedy robisz wszystko sam, to chyba najbardziej przekonujące, co możesz pokazać.
A klient? Napisałem do niego sam i przyznałem, że błąd był po mojej stronie. Zwróciłem mu pierwotną płatność i wysłałem kod rabatowy na pierwszy miesiąc nowej subskrypcji, tym razem poprawnie połączonej z jego kontem. Zajęło to dziesięć minut, a gdy masz dokładnie jednego płacącego klienta, to dobrze wydany czas.
Gdybym miał to podsumować: zanim wystartujesz, kup własny produkt od początku do końca z darmowym kuponem. Niech wszystko, co dotyczy pieniędzy, głośno krzyczy, gdy nie może wykonać swojej pracy. Wiedz, gdzie Twój dostawca płatności trzyma historię zdarzeń. I przeczytaj swój cennik jak sceptyczny nieznajomy.
Powiem szczerze, jak ten tydzień naprawdę wyglądał. Pierwsza sprzedaż była małym świętem, a kilka dni później gapiłem się na płatność, której nie umiałem nikomu przypisać, i zastanawiałem, co jeszcze zepsułem. Myślę, że tak właśnie wygląda budowanie czegoś w pojedynkę. Nikt nie przejrzy Ci webhooka, nikt nie przeczyta ponownie cennika, nikt nie powie, że zadanie porządkowe po cichu anuluje ludziom plany. Dowiadujesz się, gdy się o to potkniesz.
Więc jeśli jesteś w tej samej sytuacji, wypuszczasz wieczorami po pracy swoją pierwszą płatną rzecz, odświeżasz panel płatności częściej, niż byś się przyznał, i w połowie podejrzewasz, że coś jest zepsute: tak, pewnie coś jest. To nic. U mnie było, dwa razy w jednym tygodniu. Da się to naprawić, a pierwsi klienci będą dużo bardziej wyrozumiali, niż myślisz, jeśli powiesz im wprost.
Bardzo chętnie przeczytam Twoją wersję. Co zepsuło się po Twojej pierwszej sprzedaży? Napisz do mnie.