<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: noor abid</title>
    <description>The latest articles on DEV Community by noor abid (@noor_abid_ed5b15458af2400).</description>
    <link>https://dev.to/noor_abid_ed5b15458af2400</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4109801%2Fe0e4bc62-d38b-43ac-b503-a242f2329472.png</url>
      <title>DEV Community: noor abid</title>
      <link>https://dev.to/noor_abid_ed5b15458af2400</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/noor_abid_ed5b15458af2400"/>
    <language>en</language>
    <item>
      <title>My payment webhook returned 200 and still didn't upgrade a single user</title>
      <dc:creator>noor abid</dc:creator>
      <pubDate>Mon, 07 Sep 2026 21:34:19 +0000</pubDate>
      <link>https://dev.to/noor_abid_ed5b15458af2400/my-payment-webhook-returned-200-and-still-didnt-upgrade-a-single-user-1jbn</link>
      <guid>https://dev.to/noor_abid_ed5b15458af2400/my-payment-webhook-returned-200-and-still-didnt-upgrade-a-single-user-1jbn</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Lesson: 200 OK means your code didn't crash. It says nothing about whether it did what it was supposed to.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>testing</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
