For two weeks, Ember's upgrade-to-Pro flow looked fine and was completely broken. Every webhook call from Gumroad came back 200, no errors anywhere — and not one real purchase actually flipped a user to Pro.
I'd built it assuming Gumroad signs and nests its payloads the way Stripe does. It doesn't — no signature header at all, and the fields (email, seller_id, product_id) come through flat and form-encoded, not tucked in a purchase object. My code was reading a shape that never existed, so every lookup silently failed while the handler kept reporting success.
Fixed it with my own token check on the webhook URL instead of a signature, and by parsing the real flat payload. Found one more sharp edge along the way: a Supabase update that matches zero rows fails silently too — so a mismatched email could still report "success" and update nothing.
Lesson: 200 OK means your code didn't crash. It says nothing about whether it did what it was supposed to.
Top comments (0)