Stripe alert

Stripe failed payment alert in Slack

The payment_intent.payment_failed event is involuntary churn in progress. Here's how to turn it into a real-time, CRITICAL Slack alert and what to do next.

Updated July 6, 20266 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 failed payment alert in Slack is a message posted the moment a customer's payment attempt is declined. ChargeBell listens for Stripe's payment_intent.payment_failed event and turns it into a plain-English alert (the amount, the customer, and the decline reason) in the channel your team already watches. Because a failed payment is money actively leaving, ChargeBell marks it CRITICAL: it bypasses quiet hours and can @channel.

What payment_intent.payment_failed means

Stripe describes payment_intent.payment_failed as firing when "a PaymentIntent has failed the attempt to create a payment method or a payment." The event's data.object is the PaymentIntent. Crucially, a failed attempt is not a dead charge: per Stripe's lifecycle docs, when an attempt fails (for example, a card decline) the PaymentIntent's status returns to requires_payment_method so the payment can be retried. Treat the alert as a recoverable failure that needs action, not a permanently lost sale.

For subscription and recurring billing, the parallel event is invoice.payment_failed, which Stripe fires "whenever an invoice payment attempt fails, due to either a declined payment, including soft decline, or to the lack of a stored payment method." Subscription businesses usually want both. See invoice.payment_failed alerts for the recurring-billing side.

Failed payments are involuntary churn

A failed payment isn't a support ticket. It's revenue silently leaking. Involuntary churn (customers lost to failed or declined payments rather than an active decision to cancel) is estimated at 20–40% of all churn for subscription businesses. Much of it is recoverable, which is exactly why speed matters.

20–40%

of all subscription churn is involuntary (est.)

2–3%

of subscribers have a card expire each month (est.)

41% vs 27%

reminder open rate within 24h vs after 30 days

Speed of follow-up measurably improves recovery. Reminders sent within 24 hours see roughly a 41% open rate versus about 27% after 30 days, and front-loaded, multi-channel outreach in the first 72 hours can cut involuntary churn by up to 34% versus email alone. A daily report is too slow for that window. You need the signal in real time.

Why the payment_failed alert is CRITICAL

Most alerts should respect quiet hours: you don't need a 3 a.m. ping about a routine sale. A failed payment is different. ChargeBell classifies the payment failed alert as CRITICAL, which means it bypasses quiet hours and can add an @channel prefix so someone sees it. This is a ChargeBell design choice for money-leaving events, not a Stripe feature: the same treatment applies to disputes.

Not every failure is auto-recoverable

Stripe Smart Retries only auto-retries soft declines. Hard declines like expired_card, lost_card, or stolen_card can't be retried until the customer adds a new payment method, so a human needs to reach out. The alert is how they find out in time.

What a good failed payment alert includes

Raw webhook JSON is useless in Slack. A good alert answers "who failed, how much, why, and do I need to act?" at a glance. ChargeBell surfaces the decline reason and whether Smart Retries can handle it, so the channel knows whether to wait or reach out.

#billing
⚠️
ChargeBellApp

⚠️ Payment failed: $149.00 from acme@example.com

Reason: card_declined (insufficient_funds, soft decline)

Stripe Smart Retries will retry automatically · no action needed yet

#billing
⚠️
ChargeBellApp

⚠️ @channel Payment failed, action needed: $499.00/mo (Pro)

Reason: expired_card (hard decline, Smart Retries can't recover this)

Involuntary churn in progress · reach out to update the card

Fields ChargeBell can include

  • Amount and currency of the failed attempt
  • Customer name or email, when Stripe provides it
  • Decline reason and whether it's a soft or hard decline
  • A link to open the customer or payment in the Stripe dashboard

How to set up a Stripe failed payment alert in Slack

  1. 1

    Connect Stripe

    One-click, read-only OAuth. ChargeBell can see payment events and can never move money or change anything.

  2. 2

    Connect Slack and pick a channel

    Add the app and choose where failed payments should post. A channel like #billing or #founders works well.

  3. 3

    Enable the payment failed alert

    It's on by default and classified CRITICAL, so it bypasses quiet hours. Turn on the @channel prefix if you want it to page the room.

  4. 4

    Send a test alert

    Confirm the message looks right before your next real decline. You'll get your first alert before your coffee cools.

What to do when a payment fails

Stripe already does a lot of the recovery work for you. Treat ChargeBell as the real-time signal layer on top of it, not a replacement.

  • Let Smart Retries handle soft declines. Stripe's default policy retries up to 8 times within 2 weeks (windows are configurable from 1 week to 2 months). For an insufficient_funds or generic decline, wait: the alert says "no action needed yet."
  • Contact the customer on hard declines. For expired_card, lost_card, stolen_card, and similar codes, retries can't succeed until a new card is added. Reach out fast. Front-loaded, multi-channel follow-up in the first 72 hours is where recovery is won.
  • Consider an account updater. Card-updater services capture roughly 60–70% of card changes and can cut card-related failure churn by about 25–35%, a complementary lever to real-time alerts.

Why the alert still matters

Stripe's built-in recovery (Smart Retries plus emails) recovers only an estimated 25–35% of involuntary failures automatically. The other two-thirds, especially hard declines, is exactly where a real-time Slack alert plus human follow-up wins.

Key takeaways

  • payment_intent.payment_failed fires on a failed attempt; the PaymentIntent returns to requires_payment_method and can be retried.
  • Failed payments are involuntary churn: an estimated 20–40% of all subscription churn, and largely recoverable.
  • ChargeBell marks the alert CRITICAL: it bypasses quiet hours and can @channel.
  • Let Smart Retries handle soft declines; contact the customer fast on hard declines.

Catch failed payments before they become churn

Connect Stripe and Slack, enable the CRITICAL payment failed alert, and send a test. Free plan, no card needed.

Start freeFree plan · no card needed

Frequently asked questions

Which Stripe event fires on a failed payment?

payment_intent.payment_failed. It fires when a PaymentIntent fails its attempt to create a payment method or process a payment (for example, a card decline). The PaymentIntent then returns to requires_payment_method so the payment can be retried. For subscriptions, the parallel event is invoice.payment_failed.

Does the alert bypass quiet hours?

Yes. ChargeBell classifies the payment failed alert as CRITICAL, so it bypasses quiet hours and can add an @channel prefix. Unlike a routine sale, a failed payment is money actively leaving, and speed of response measurably improves recovery.

Do I need to act on every failed payment?

No. Stripe Smart Retries automatically retries soft declines (its default policy is up to 8 tries over 2 weeks), so you can wait on those. Hard declines like expired_card can't be recovered until the customer adds a new card, so those need a human to reach out.

Isn't Stripe's own recovery enough?

Stripe's built-in Smart Retries and emails recover only an estimated 25–35% of involuntary failures automatically. A real-time Slack alert plus human follow-up captures the rest, especially hard declines. ChargeBell is the signal layer on top of Stripe's automation, not a replacement.

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 retry a payment, move money, or change anything in your Stripe account. Stripe stays the source of truth.

Primary sources

Product behavior, event definitions, and comparison details were checked against provider documentation and official pricing pages.