Collects as they arrive, acts daily
Track failed payments until they're recovered
Every failed payment is followed until it's paid, and each Friday you see what's recovered and what's still unpaid.
- Runs
- Collects as they arrive, acts daily
- Apps
- Stripe
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: keep track of every failed Stripe invoice payment, mark it recovered when it's later paid, and every Friday email me what's still unpaid and the total recovered.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A subscription company knows failed payments happen, but not how many are recovered. A card fails on the 3rd, Stripe retries three times, and the customer either updates their card or quietly disappears. Finance sees only the end result in monthly revenue, with no visibility on which failures are still open, how much money is at stake or whether recovery efforts are working. Without a tracker, recovery stays a guess.
ClickRuntime records each failed payment as it arrives and clears it when the matching invoice is paid. Every Friday it emails a summary: how much remains outstanding, how much was recovered this week and how many accounts are still at risk, so you know where to focus before the weekend.
It suits teams that run dunning through Stripe and want a clear weekly picture.
What you get out of it
You see the money still at risk
An outstanding total makes the stakes concrete. Knowing 6,200 dollars of renewals remain unpaid focuses attention more than a general sense that some payments failed. The number gives the team a goal to chase during the week.
Recovery performance becomes measurable
Comparing recovered amounts week to week shows whether dunning emails, retry timing or card update prompts are working. You can test a change and see its effect in the next summary.
Follow-up is aimed at the right accounts
The list of unrecovered failures tells your team exactly who to contact before access is cut off. Effort goes to unpaid accounts, not to customers who already fixed the problem.
Closed failures drop off automatically
When an invoice is paid, its failure entry is cleared, so the Friday email never nags you about resolved cases. The list stays short and trustworthy. Resolved cases never clutter the report, so the list stays short.
Forecasts reflect reality
Finance can separate expected recoveries from likely losses when planning cash. That makes revenue projections more accurate and avoids a nasty surprise at month end. A clearer recovery picture also helps when setting growth targets and budgets.
How it works
What happens, step by step
Every time a Stripe payment fails, ClickRuntime adds it to its list of unpaid payments.
When that invoice is later paid, it is moved from unpaid to recovered.
Every Friday you get an email with the payments still unpaid and the total recovered so far.
Before it runs live
- Connect Stripe
- Paste your automation's link into the other app's webhook settings
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Stripe steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_event, on_trigger, state, notify, verify, credentials
@on_event
def handle(event):
if not verify.stripe(event.body, event.header("Stripe-Signature"), credentials.secret("STRIPE_WEBHOOK_SECRET")):
return {"ignored": "bad signature"}
inv = event.json["data"]["object"]
failed = state.get("failed") or {}
if event.json["type"] == "invoice.payment_failed":
failed[inv["id"]] = {"customer": inv.get("customer_email"), "amount": inv["amount_due"]}
elif event.json["type"] == "invoice.paid" and inv["id"] in failed:
state.set("recovered", (state.get("recovered") or 0) + failed.pop(inv["id"])["amount"])
state.set("failed", failed)
return {"outstanding": len(failed)}
@on_trigger
def friday_report(event):
failed = state.get("failed") or {}
recovered = state.get("recovered") or 0
lines = [f"• {f['customer']}: ${f['amount'] / 100:,.2f}" for f in failed.values()]
notify.email_me(f"Failed payments: {len(failed)} unpaid, ${recovered / 100:,.2f} recovered",
"Still unpaid:\n" + ("\n".join(lines) or "none"))
return {"unpaid": len(failed), "recovered": recovered}FAQ
Common questions
How does it know a payment has been recovered?
What if a customer cancels instead of paying?
Can the summary go to a Slack channel instead of email?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Find out why customers cancel
Cancellation feedback is sorted into reasons, and each month you get a breakdown.
See how it worksGet alerted when a payment fails
Each failed charge or invoice payment shows up in Slack with the customer, amount and reason.
See how it worksGet yesterday's revenue every morning
Each morning you see yesterday's charges, refunds and new subscriptions in one message.
See how it worksKeep exploring
Set up “Track failed payments until they're recovered” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.