Rescue failed Stripe payments with a Keap recovery play

When a Stripe payment fails, tag the customer in Keap, log the reason, open a 48 hour follow up task, and send a friendly card update email.

Agentic Task
StripeKeapSlack BotFinanceCustomer SupportEmail AutomationNotifications & Alerts
PromptCreate

When a payment fails in Stripe, run our full failed payment recovery play across Stripe, Keap, and Slack. Trigger this from a Stripe webhook on failed payment events, covering both a failed charge and a failed invoice payment, since recurring invoice failures are where most involuntary churn comes from.

Read the Stripe customer id, the failure reason, and the failed amount from the event payload. Call Stripe's Retrieve Customer operation with that customer id to get the billing name and email address.

Watch the units. Stripe reports amounts in minor units such as cents, while Keap stores money as decimal whole units. Convert the Stripe amount into whole currency units before you compare it against the escalation threshold or write it onto a Keap record. A Stripe amount of 24900 is 249.00.

Find the matching person in Keap using List Contacts filtered on the billing email address returned by Stripe. If more than one contact comes back, use the first exact match on that email address.

When a matching contact exists, update their record in Keap. Use Apply Tag to tag them as "Payment Failed". Use Create a Note to record the failure reason, the converted amount, the date, and the Stripe charge or invoice reference. Use Create a Task to assign the account owner a follow up with this customer, due within 48 hours of the failure, with the customer name in the title.

Then, unless one of the escalation rules below applies, draft the recovery email and send it with Keap's Send an Email operation. Sending through Keap matters here: the message lands from our normal sending identity and stays attached to the contact's record where the rest of the team can see it.

Keep the email short and non-accusatory. Assume the best, because cards expire and banks decline for routine reasons. Say plainly that the latest payment did not go through, give a clear instruction for updating the card on file, and offer help if something else is going on. Do not blame the customer, do not threaten to suspend the account in this first message, and do not paste the raw failure code if it would confuse a non-technical reader.

Escalate to a human instead of sending automatically in two cases. First, if the converted failed amount is above my threshold, which should default to 500 in account currency and be easy for me to change. Second, if no Keap contact matches the billing email at all. In either case, skip the automatic email entirely and post to Slack with Send a Message so a person handles that one personally.

The Slack post should go to our billing channel and include the customer's billing name and email, the failed amount in whole currency units, the failure reason, whether a matching Keap contact was found, and which escalation rule fired. When the contact does exist but the amount was over the threshold, still apply the tag, the note, and the follow up task in Keap, and only skip the email. When no contact exists in Keap, the Slack post is the only action.

Avoid duplicate outreach. Stripe often retries the same failing payment several times. Before sending, check whether we have already emailed this contact about the same charge or invoice. If we have, add a note to the record capturing the repeat failure instead of sending another email.

Additional information

What does this prompt do?
  • Notices the moment a payment fails in Stripe and pulls up that customer's billing name and email automatically.
  • Finds the person in Keap, tags them as a failed payment, records what went wrong and how much was owed, and opens a follow up task for the account owner with a 48 hour deadline.
  • Writes a short, friendly email explaining that the payment did not go through and how to update the card, then sends it from your normal Keap sending identity so a copy stays on the contact's record.
  • Knows when to get a human involved: if the amount is over the limit you set, or nobody in Keap matches that email, it skips the automatic email and posts to Slack instead.
What do I need to use this?
  • A Stripe account where you can turn on notifications for failed payments
  • A Keap account with permission to manage contacts, tags, notes, tasks, and email
  • A Slack workspace with a channel your billing or revenue team watches
  • A "Payment Failed" tag set up in Keap, and the teammate who should own follow up
  • A dollar amount that counts as too big to handle automatically
How can I customize it?
  • Change the amount that triggers a human handoff. Anything at or under it gets the automatic email, anything over it goes to Slack for personal handling.
  • Rewrite the tone and content of the recovery email, and change how long the account owner has to follow up (48 hours by default).
  • Pick which Slack channel receives escalations, which teammate is assigned the Keap task, and which tag gets applied to the contact.

FAQs

Will the recovery email look like it came from us?
Yes. It goes out through Keap using your normal sending identity, and a copy stays on the contact's record so anyone on your team can see exactly what the customer received.
What happens if the customer is not in Keap?
The workflow does not guess and does not send anything. It posts the details to Slack so a person can decide how to handle it, which avoids emailing someone you have no relationship with yet.
Does this work for one off charges as well as subscription invoices?
Yes. It runs both when a card is declined on a single charge and when a recurring invoice fails. Recurring invoice failures are where most involuntary churn comes from.
Will customers get spammed if the payment is retried several times?
No. Before sending, the workflow checks whether you have already reached out about that same failed payment. If you have, it records the repeat failure as a note instead of sending a duplicate email.
Is the email pushy or accusatory?
No. It assumes the best, because cards expire and banks decline for routine reasons. It explains what happened, gives a simple way to update the card, and offers help. No blame and no threats about suspending the account.

Related templates

Chase past-due JobNimbus invoices with escalating emails

Every weekday, find every unpaid JobNimbus invoice, email each customer one reminder that gets firmer as it ages, and post a receivables summary to Slack.

JobNimbus
Gmail
Slack Bot
Agentic Task
Flag at-risk students in Canvas before they fall behind

Every weekday at 7am, your active courses are checked for missing work, silent logins, and slipping grades, with a ranked list sent to your advising channel.

Canvas
Google Sheets
Slack Bot
Agentic Task
Catch Jira service desk tickets before their SLA runs out

Every hour, find the tickets closest to breaching, leave a nudge on each one, and post a ranked at-risk list to your support channel.

Jira Service Management
Slack Bot
Agentic Task
Send Canvas students a kind nudge about missing work

Every weekday afternoon, each student who is behind gets a warm, personal message in their Canvas inbox listing exactly what they owe.

Canvas
Slack Bot
Agentic Task
Weekly Canvas grading backlog report in Slack and Sheets

Every Monday at 8am, see exactly which assignments have work waiting, sorted worst first, posted to Slack and logged to a spreadsheet.

Canvas
Slack Bot
Google Sheets
Deterministic Code
Revoke Bitwarden access when someone leaves in BambooHR

Every weekday morning we compare your password vault against your HR records and suspend access for anyone who has already left.

Bitwarden
BambooHR
Slack Bot
Agentic Task

Stop losing customers to expired credit cards.

Set up a recovery play that catches every failed payment, keeps Keap up to date, and knows when to hand the big ones to a human.