vercel / nextjs-subscription-payments

Clone, deploy, and fully customize a SaaS subscription application with Next.js.
https://subscription-payments.vercel.app/
MIT License
6.08k stars 1.23k forks source link

Stripe webhooks failing (status 400) #356

Open aleskozelsky opened 1 month ago

aleskozelsky commented 1 month ago

Hi,

I am using this template, followed the guide and added a Stripe webhook with all events being sent to /api/webhooks on my install.

When users on the site take certain actions that are NOT on the list of relevantEvents they trigger the /api/webhooks endpoint. All of the NON relevantEvents return status 400 (error) because they are "Unsupported event type".

Events that I have seen that return errors: customer.created billing_portal.session.created balance.available setup_intent.canceled payment_intent.payment_failed checkout.session.expired invoice.finalized invoice.payment_failed charge.failed payment_intent.created checkout.session.expired

Code: File: route.ts

// api/webhooks/route.ts

// relevant events are handled nicely, they return 200 response code
const relevantEvents = new Set([
  'product.created',
  'product.updated',
  'product.deleted',
  'price.created',
  'price.updated',
  'price.deleted',
  'checkout.session.completed',
  'customer.subscription.created',
  'customer.subscription.updated',
  'customer.subscription.deleted'
]);

...

if (relevantEvents.has(event.type)) {
...
} else {
    return new Response(`Unsupported event type: ${event.type}`, {
      status: 400
    });
}

Why are the non relevant events returned as an error? Those events are retried multiple times by Stripe. Should not they return a 200 response instead?

kylecampbell commented 1 month ago

I'm seeing the same thing

kylecampbell commented 1 month ago

FYI I only found this to be an issue if you haven't set up your customer portal in Stripe before attempting to open customer portal. Once I did that, then subscribed, then open customer portal, no event errors.

aleskozelsky commented 1 month ago

Yeah, there are some server actions that handle the customer portal instead. Also the customer portal is not in the relevant events. Mainly I am asking is because i feel it does not make any sense to throw errors for those event. It is very hard to spot any real errors when ~90% of the non relevant events throws errors for no reason.

codyeisenbach commented 1 month ago

I'm also having this issue, please let me know if anyone figures it out

cgar420 commented 2 weeks ago

Same thing here.

Customer events aren't handled in the example

Updating email or name with the /account forms causes a de-sync between supabase and stripe

kelsiesmurphy commented 1 week ago

Also facing this exact issue