Lemon Squeezy webhook reference

Lemon Squeezy subscription_payment_failed

The webhook that signals a failed Lemon Squeezy subscription renewal. The recovery rules are the same as Stripe. Dedupe by subscription, send 3 emails, link to the customer portal. But most churn tools ignore Lemon Squeezy entirely.

Quick answer

subscription_payment_failed fires on each failed renewal attempt. Dedupe by subscription ID, send a 3-email dunning sequence with the LS customer-portal update link, stop on subscription_payment_success. Combined recovery rate with Lemon Squeezy's built-in retries: 50-65%.

What the event means

subscription_payment_failedis Lemon Squeezy's notification that a recurring renewal charge failed. It does NOT mean the subscription is cancelled. Lemon Squeezy will keep retrying for several days before giving up. If all retries fail, you'll get a subscription_expired orsubscription_cancelled event.

Related Lemon Squeezy subscription events

EventMeaning
subscription_payment_failedA renewal charge failed; LS will retry.
subscription_payment_successA retry succeeded; stop your dunning sequence.
subscription_payment_recoveredA previously failed payment recovered later. Confirmation signal.
subscription_cancelledCustomer voluntarily cancelled. Handle separately with exit email.
subscription_expiredSubscription ended (cancelled, retries exhausted, or paused). Route to reactivation.

FAQ

When does subscription_payment_failed fire?
Lemon Squeezy fires subscription_payment_failed when a recurring subscription renewal charge fails. Usually because the card on file was declined, expired, or hit an issuer block. It can fire multiple times across the retry window as Lemon Squeezy re-attempts the charge.
How is subscription_payment_failed different from order_failed?
order_failed fires for any failed Lemon Squeezy order, including initial purchases and one-time charges. subscription_payment_failed is subscription-specific and fires only on renewal failures. For SaaS dunning, subscription_payment_failed is the event you want.
What fields are in the payload?
The payload includes the subscription ID, customer ID, customer email, the failed invoice details, the failure reason from the payment processor, and the next retry timestamp. Use the subscription ID to dedupe across multiple retry events.
Will Lemon Squeezy retry the charge automatically?
Yes. Lemon Squeezy automatically retries failed renewal charges over a multi-day window. Your job in dunning is to layer email follow-up on top so the customer knows to log in and update their card. Lemon Squeezy's automatic retry can't fix an expired card on its own.
Should I dedupe subscription_payment_failed events?
Yes. Without dedupe by subscription ID, you'll send the customer one 'your payment failed' email per retry attempt, which can mean 3-4 nearly identical emails in a few days. The right pattern: trigger your dunning sequence on the first event, then suppress subsequent events for the same subscription ID until either subscription_payment_success or subscription_expired fires.
What's the right link to send in dunning emails?
Lemon Squeezy's customer portal update-payment-method URL. The customer logs in and updates their card without leaving the LS ecosystem. Generic 'click here to pay' links break trust because customers don't know what site they're being sent to.
How does ChurnNote handle subscription_payment_failed?
ChurnNote registers a webhook on your Lemon Squeezy store, dedupes subscription_payment_failed events by subscription ID, and sends a 3-email recovery sequence with the LS customer-portal update link. The sequence stops automatically when subscription_payment_success fires.

Lemon Squeezy as a first-class integration.

ChurnNote handles subscription_payment_failed dedupe, the 3-email sequence, and clean reactivation routing. Same flat $12/mo plan as Stripe.

Get started