My first customer paid. My app didn't notice.
I launched a small Trello Power-Up a few weeks ago. It schedules card comments, so you can write something tonight and have it show up on the card at 9am tomorrow. I wrote about building it in my last post. This one is about what happened after the first person actually paid for it, which turned out to be the part I'd thought about least.
Short story: they paid, and they didn't get Pro.
The checkout went through. Paddle was happy, my webhook answered 200, and every dashboard I had was green. But the payment wasn't tied to anyone's account. The user ID got lost somewhere between the website and the checkout, so when the webhook came in, my code saw a payment it couldn't match, shrugged and returned “ok”. No retry, nothing red anywhere. I only found it because I was reading through the code for a different reason.
That's the thing that bugs me most. If the webhook had crashed, I'd have known that day. Because it “handled” the problem quietly, it could have sat there for weeks. So the first fix wasn't even the bug itself. I made the code email me whenever a payment shows up that it can't connect to a user. I'm hoping that email never arrives.
Then I did what I should have done before launch: I bought my own product on a second account, using a 100% discount code, and opened the app to see if Pro was actually unlocked.
It wasn't. Different bug this time. I'd written a placeholder like <your-id> in my own notes, copied the link, and the angle brackets went along with the ID. Paddle stored it exactly as written, my server saved Pro under an ID that doesn't exist, and the app kept showing me the paywall. Embarrassing, but also exactly why you test the whole flow and not just the pieces. I'd tested checkout. I'd tested the webhook with sample events. I had never gone from “click upgrade” to “open the app and check” in one go.
Debugging it taught me something else: my hosting logs from the time of the purchase were already gone. On the free tier they don't stick around long. Paddle's notification history saved me. It keeps every webhook it sent, with the full payload and my server's response, and it lets you resend one. So if you sell anything, find out where that history lives in your payment provider before you need it.
While I was in there, I found a slower problem too. Like most integrations, mine runs a weekly job that deletes data for people who disconnect the app. Sensible, except it also deleted their paid plan. So someone who disconnected and reconnected would have dropped back to free while still being charged every month. Nobody had hit it yet. I changed it so only the billing system can take Pro away.
Then I re-read my landing page, and that was humbling in its own way. The pricing table promised one thing and the code enforced another. The free tier, which is how most people would try the product, wasn't in the pricing table at all. And a technical limit was listed as if it were a Pro feature. None of that was deliberate. It was copy from an early draft that I never went back to after the product changed. The page also looked like every other AI-generated SaaS site, dark with a purple glow, which isn't great when you're asking people to connect their Trello account. I redesigned it to be calmer and put my photo on it with a line saying support emails go straight to me. When it's just you, that's probably the most convincing thing you can show.
As for the customer: I emailed them myself and said it was my bug. I refunded the original payment and sent them a discount code for the first month of a new subscription, this time linked to their account properly. It took ten minutes, and when you have exactly one paying customer, that's time well spent.
If I had to boil it down: before you launch, buy your own product end to end with a free coupon. Make anything involving money complain loudly when it can't do its job. Know where your payment provider keeps its event history. And read your pricing page like a skeptical stranger would.
I'll be honest about how the week actually felt. The first sale was a little high, and then a few days later I was staring at a payment I couldn't match to anyone, wondering what else I'd got wrong. I think that's just what building something alone looks like. Nobody reviews your webhook, nobody re-reads your pricing page, nobody tells you the clean-up job is quietly cancelling people's plans. You find out by tripping over it.
So if you're in the same spot, shipping your first paid thing at night after your day job, refreshing the payment dashboard more often than you'd admit, half sure something's broken: yeah, probably something is. That's fine. Mine was, twice in one week. It's fixable, and your first customers will be a lot more forgiving than you expect if you tell them straight.
I'd genuinely like to hear your version. What broke after your first sale? Write to me.