When a subscription charge fails, Stripe fires invoice.payment_failed. ChargeBell surfaces that declined charge in Slack, marked CRITICAL, so you can act before the customer silently churns.
Updated July 6, 2026·6 min read
Written and reviewed by the ChargeBell product team
The team that builds and maintains ChargeBell's Stripe and Slack connections. Provider claims are checked against primary documentation. About our editorial process.
A Stripe invoice payment failed alert in Slack tells your team the moment a subscription or invoice charge is declined. Stripe fires invoice.payment_failed when it can't collect on an invoice, and the underlying charge attempt also raises payment_intent.payment_failed. ChargeBell's Payment Failed alert keys off payment_intent.payment_failed. So when Stripe raises that charge-level event for an invoice or subscription attempt, the decline lands in Slack in plain English, marked CRITICAL.
What invoice.payment_failed means
invoice.payment_failed fires when Stripe attempts a payment on an invoice and it doesn't go through: the customer's default payment method was declined. It applies to recurring subscription renewals, the first invoice on a new subscription, and any auto-collected invoice. On the first failure a subscription becomes incomplete (by default the customer has about 23 hours to fix the payment method before it becomes incomplete_expired). On a renewal failure the subscription moves to past_due while Stripe keeps retrying.
How ChargeBell surfaces it (the honest version)
ChargeBell does not subscribe to invoice.payment_failed directly. It listens for payment_intent.payment_failed, the charge-level event that carries the decline code and message, which Stripe raises for the underlying charge attempt on an invoice or subscription. So when a renewal is declined and Stripe emits that charge-level event, the failure lands in Slack with the reason attached, marked CRITICAL.
Why a Stripe invoice payment failed alert in Slack matters
Stripe already retries the charge, but nobody on your team knows it failed. Failed charges are revenue actively leaking, which is why ChargeBell marks this alert CRITICAL: it bypasses quiet hours and can add an @channel prefix. The window to act is finite. Industry estimates put involuntary (failed-payment) churn at roughly 20–40% of total SaaS churn, with a good dunning sequence recovering 30–70% of failed charges. That only works if someone sees the failure in time to reach out.
Reach the customer first: an email or a nudge to update the card beats waiting for automated retries alone.
Catch high-value churn. A $499/mo plan going past_due is worth a same-day human response.
See the reason: insufficient_funds and card_declined call for very different follow-ups.
Dunning and retries: the window you're racing
invoice.payment_failed fires on each retry attempt during dunning, not just once. Stripe's Smart Retries pick the retry times for failed charges, and you configure how many attempts run over what window in your Dashboard settings. Once retries are exhausted, the subscription's terminal state follows those settings: canceled, unpaid, or left past_due. In other words, there's a countdown from the first decline, and the alert is what starts your clock.
What a good alert includes
Raw webhook JSON isn't useful in Slack. A good failed-payment alert answers "who, how much, and why?" at a glance. Because ChargeBell reads the charge-level event, it can show the decline reason (the human message like "Your card has insufficient funds") alongside the customer, so the team knows exactly how to respond.
#billing
⚠️
ChargeBellApp
⚠️ CRITICAL: Payment failed, $499.00 from Acme Corp
billing@acmecorp.com · Stripe will retry automatically
Fields ChargeBell can include
Amount and currency of the declined charge
The decline reason (e.g. insufficient_funds, card_declined) when Stripe provides it
Customer name or email, when Stripe provides it
That it's a critical event, so it bypasses quiet hours
Where to send it
Route failed payments to a channel where someone will act, like #billing or #founders. Because this alert is critical, it comes through even during quiet hours, and you can turn on the @channel prefix so it's impossible to miss. See how to monitor Stripe subscriptions in Slack for pairing this with the rest of your subscription alerts.
How to set it up
1
See the CRITICAL alert in Slack
ChargeBell posts the declined charge (amount, customer, and reason) the moment it happens, bypassing quiet hours.
2
Open the customer or invoice in Stripe
Click through to the customer in your Stripe Dashboard to check the subscription status and payment method.
3
Reach out or update the payment method
Send a dunning email or ask the customer to update their card. ChargeBell is read-only, so the fix happens in Stripe.
4
Let Smart Retries or a manual retry confirm the charge
When the charge finally goes through, ChargeBell can send a payment recovered alert so you know it's resolved.
Which Stripe event fires when a subscription payment fails?
invoice.payment_failed. Stripe fires it when it can't collect on an invoice: a renewal, a first subscription invoice, or any auto-collected invoice. The underlying charge attempt also raises payment_intent.payment_failed, which carries the decline reason. That's the event ChargeBell listens for.
Does ChargeBell alert on invoice.payment_failed specifically?
Not directly. ChargeBell's Payment Failed alert fires on payment_intent.payment_failed, the charge-level event Stripe raises for the underlying charge attempt on an invoice or subscription. When Stripe emits that event for a declined renewal, it reaches Slack with the decline reason attached, marked CRITICAL.
Will the alert include why the payment failed?
Yes, when Stripe provides it. Because ChargeBell reads the charge-level event, it can show the decline reason, like insufficient_funds or card_declined, so your team knows how to follow up instead of guessing.
Does the alert bypass quiet hours?
Yes. Failed payments are marked CRITICAL, so the alert comes through even during quiet hours, and you can turn on an @channel prefix so nobody misses it.
Does ChargeBell need write access to Stripe?
No. ChargeBell connects with official read-only OAuth. It can see payment events to build alerts, but it can never move money, retry a charge, or change anything in your Stripe account. That stays with you in Stripe.
Primary sources
Product behavior, event definitions, and comparison details were checked against provider documentation and official pricing pages.