playbook
How to Get a Slack Alert When a Stripe Payment Fails
A failed Stripe payment is a customer about to churn. Here are three ways to get a real-time Slack alert when one happens — from the raw webhook to a one-click setup.
When a Stripe subscription payment fails, a clock starts. Stripe will retry the charge a few times over the next couple of weeks, and if none succeed, the subscription cancels. That window is your best — often only — chance to save the customer. But it only helps if someone knows the payment failed. Here are three ways to get that into Slack.
Why failed payments deserve their own alert
A failed payment is rarely the customer’s decision. Most are involuntary: an expired card, a hit credit limit, or a bank declining a routine charge. The customer still wants your product; the payment just didn’t go through. A quick, friendly “hey, your card didn’t go through” often fixes it in minutes — but only if your team sees it in time. Buried in a monthly Stripe report, it’s already churn.
The event you care about is invoice.payment_failed. It carries
everything you need to act: the customer, the amount, the decline reason, how many times Stripe
has retried, and when it will try again.
Option 1: Build it yourself
Register a webhook endpoint, subscribe to invoice.payment_failed, verify the signing secret, and
post to Slack with an incoming webhook:
if (event.type === 'invoice.payment_failed') {
const inv = event.data.object;
await postToSlack({
text: `⚠️ Payment failed: ${inv.customer_email} — ${formatMoney(inv.amount_due, inv.currency)}`,
});
}
This works, but a genuinely useful alert needs more than a line of text: the customer’s name and
company (not just cus_ABC123), the decline reason in plain English, the retry date, and
deduplication so three retries don’t post three near-identical messages. That’s the part that takes
real time to build and maintain — see the webhook guide for the
details you’d need to handle.
Option 2: Zapier or a workflow tool
A Stripe → Slack Zap avoids hosting an endpoint, but it forwards raw fields: you’ll see cus_ABC123
and a decline code like insufficient_funds, not “Jane Cooper at Initech — card declined
(insufficient funds), Stripe retries in 3 days.” You also can’t easily consolidate retries into one
thread. It’s fine for a bare ping; it won’t give the team enough to act without opening Stripe.
Option 3: Notipus (the two-minute version)
Notipus is a purpose-built Stripe-to-Slack bridge. Point a Stripe webhook at it, paste the signing secret, and failed-payment alerts arrive already enriched:
- Who — customer name, company background, and contact, not just an ID.
- Why — the decline reason translated into plain English.
- What’s next — the retry count and next retry date, so you know how much time you have.
- One message, not five — related retries are consolidated instead of spamming the channel.
It delivers the same alerts to Telegram and Microsoft Teams too, and the same enrichment applies to new subscriptions, upgrades, and cancellations. See the Stripe integration to set it up.
Whichever route you pick
The point isn’t the tool — it’s the reaction time. Involuntary churn is one of the most recoverable kinds of churn there is, and the difference between saving a customer and losing them is often just whether someone saw the alert. If you want to understand the underlying problem, read what involuntary churn is and how to reduce it.
Failed-payment alerts in Slack, in two minutes
Connect Stripe to Notipus and every failed payment posts to your channel with the customer, the decline reason, and the retry schedule — no code to maintain.
Start free