Payment recovery infrastructure
Turn declined charges into recovered revenue
Declined.io orchestrates dunning, incentives, and customer outreach when cards fail, so your team sees exactly what was saved and why.
Recovery overview
$18,420
+12.4% vs last month
Attempts
142
Save rate
34%
Northwind Labs
$249.00
Harbor Analytics
$89.00
Studio Meridian
$1,120.00
Sequence "Card retry + email" saved $4.2k this week
Connects to the billing stack you already run
- Stripe
- Chargebee
- Paddle
- Recurly
- Braintree
Platform
Everything between a decline and a saved subscription
Declined.io is not another dunning template. It is operational infrastructure with analytics, incentives, and APIs your engineering team can ship against.
Recovery sequences
Multi-step dunning with retries, email, and SMS timed to card network behavior.
Incentive offers
Deploy credits and discounts only when recovery probability justifies the margin hit.
Revenue attribution
Every recovered charge ties back to sequence, channel, and attempt.
Provider health
Monitor webhook delivery and sync status across Stripe, Chargebee, and Paddle.
Customer comms
Branded recovery pages and transactional messages your team controls.
Event ingestion
REST API and webhooks for payment_failed, payment_recovered, and custom billing signals.
Workflow
Live in an afternoon, not a quarter
Most teams connect a provider, clone a proven sequence, and validate recovery in sandbox before touching production billing.
Connect billing
OAuth into Stripe or configure Chargebee, Paddle, or Recurly. Webhooks start flowing in minutes.
Design sequences
Define retry timing, channels, and incentive rules. Test in sandbox with synthetic declines.
Recover and measure
Live attempts run automatically. Finance sees recovered MRR; engineering gets structured events.
Developers
SDKs and REST APIs your team will actually adopt
Six official SDKs, sandbox keys, and typed endpoints for events, recoveries, sequences, and webhooks. Ship custom recovery flows without reverse-engineering billing webhooks.
- Node.js
- Python
- Ruby
- PHP
- Go
- Java
import Declined from "declined";
const client = new Declined({
apiKey: process.env.DECLINED_API_KEY,
});
await client.events.create({
type: "payment_failed",
customer_id: "cus_123",
invoice_id: "inv_456",
});
await client.recoveries.markRecovered("ra_789");Stop treating declines as write-offs
Create a sandbox workspace, connect your billing provider, and see recovery metrics before you flip the switch on live traffic.
Create your workspace