Stripe alert

Stripe invoice payment failed alert in Slack

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, 20266 min read

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 — but only 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 reasoninsufficient_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

Reason: insufficient_funds · subscription renewal declined

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. 1

    See the CRITICAL alert in Slack

    ChargeBell posts the declined charge — amount, customer, and reason — the moment it happens, bypassing quiet hours.

  2. 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. 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. 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.

New to failed-payment alerts? Start with how to send failed payment alerts to Slack for the full setup and the options beyond a single alert.

ChargeBell vs. raw Stripe webhooks

CriterionChargeBellRaw Stripe webhook
Catches failed subscription charges
Plain-English Slack message
Shows the decline reasonYou parse it yourself
Bypasses quiet hours as critical
Code requiredNoneBuild and host a handler
ChargeBell reads the same Stripe events — you just skip the plumbing.

Key takeaways

  • invoice.payment_failed means a subscription or invoice charge was declined — and it fires on every dunning retry.
  • ChargeBell listens for payment_intent.payment_failed (not invoice.payment_failed directly), marked CRITICAL, with the decline reason attached.
  • Stripe retries failed charges on its own via Smart Retries, but you have a finite window to reach the customer first.
  • ChargeBell is read-only — it alerts you; the fix happens in Stripe.

Never miss a failed subscription charge

Connect Stripe and Slack, pick a channel, and send a test alert. Free plan, no card needed.

Start freeFree plan · no card needed

Frequently asked questions

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 — and 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.