A failed subscription charge is not automatically a lost customer — most failures are an expired card or a temporary insufficient-funds bounce, recoverable with the right nudge at the right time. An agent detects the failure the moment it happens, classifies why it likely failed, and runs a recovery sequence tuned to that reason instead of a single generic "your payment failed" email that undersells how fixable most of these actually are.
Payment failures get treated as a passive billing event instead of an active recovery opportunity, because building a good recovery flow requires distinguishing failure reasons that look identical in a basic dashboard view — a hard decline (stolen card, closed account) needs a completely different message than a soft decline (insufficient funds, temporary processor issue) that's often resolved by simply retrying a day later. Sending the same recovery email regardless of that distinction either annoys a customer whose bank will clear the charge on retry anyway, or fails to communicate urgency to a customer whose card is genuinely dead and needs to update it before access lapses. The revenue lost to under-built recovery flows is invisible on a P&L line — it just shows up as unexplained churn.
The agent picks up the failed-payment webhook the moment it fires, rather than waiting for a batch job to notice it hours or a day later.
Integration: stripe
The decline code gets read to distinguish a hard decline (card closed, fraud flag) from a soft decline (insufficient funds, temporary issue), since the two need entirely different recovery strategies.
Soft declines get an automatic retry scheduled for a time statistically more likely to succeed (commonly a few days later, after a typical payday cycle) rather than retrying immediately and failing again for the same reason.
Integration: stripe
Hard declines get an urgent, specific message asking the customer to update payment details before access lapses; soft declines get a lighter-touch heads-up that a retry is scheduled — different tone, different urgency, matched to the actual situation.
Integration: customer-io
For accounts above a revenue threshold, a failed payment triggers a direct outreach task for the account's customer success owner rather than relying solely on an automated email.
Integration: hubspot
Which messages and retry timings actually recover payment gets tracked over time, so the sequence keeps improving instead of running the same untested cadence indefinitely.
From the decline code Stripe returns with the failed charge — codes like "insufficient_funds" are treated as soft and retried; codes like "card_declined" with a fraud flag or "expired_card" are treated as hard and routed to an urgent update-payment message instead.
Yes, which is why soft-decline retries are scheduled with a delay rather than immediate — retrying instantly after a decline is unlikely to succeed and can trigger processor-level flags for excessive retry attempts.
After the configured retry and messaging sequence is exhausted without success, the account is flagged for either involuntary churn processing or, for high-value accounts, direct manual outreach.
The pattern applies to any processor that exposes decline codes and webhooks for failed charges — Stripe is the common case but the classification logic isn't Stripe-specific.
$0/mo
Download without a card and start for free.
$50/mo
The full personal agent platform for one person.
$100/mo
One company workspace with room to add your team.
$200/mo
Multiple workspaces and capacity for larger teams.