Skip to main content
Payment Retries re-charge failed subscription renewal payments automatically, on the standard schedule or on waits you choose. When a retry succeeds, the subscription returns to active, with no customer action and no integration work.

What Are Payment Retries?

When a subscription renewal payment fails, the subscription moves to on_hold, or to past_due if you set a grace period. With Payment Retries on, Dodo Payments re-charges the customer’s saved payment method on a schedule until a charge succeeds or the schedule runs out. Retries recover revenue lost to temporary failures, such as a temporary hold on the card, insufficient funds that the customer tops up later, or a transient network error. The customer gets no email and doesn’t need to change anything.
Payment Retries apply only to subscription renewal payments. The first payment of a subscription (mandate setup), one-time payments, plan-change charges, and on-demand charges are not retried.

How Payment Retries Work

1

Renewal fails

A subscription renewal payment fails, and the subscription moves to on_hold, or to past_due during a grace period.
2

Retryability check

Dodo Payments checks the failure’s error code. Soft declines, such as insufficient funds, a generic decline, or a processing or network error, are retryable. Hard declines end the retry chain, because another attempt won’t change the outcome. A failure without an error code counts as a hard decline.
3

Scheduled retry

If the decline is retryable and your retry schedule has another attempt left, Dodo Payments schedules it. Each retry is an off-session charge to the customer’s saved payment method, and each wait counts from the previous failure.
4

Recovery

On the first successful retry, the subscription returns to active, and the next billing date moves to one billing period after the successful retry. If the schedule runs out before any retry succeeds, retries stop and the subscription keeps its status, such as on_hold.

Configuring Payment Retries

Turn on and configure Payment Retries in Settings → Recovery in your dashboard.
Payment retries section of the Recovery settings with the toggle on, Standard selected under Retry schedule, a Recovery window of 13 days, and the expanded schedule table marking the 6th to 8th retries as Skipped

Payment Retries settings under Settings → Recovery

The page has these settings: The Payment retries toggle saves as soon as you switch it. The Retry schedule settings appear only while the toggle is on, and changes to them take effect when you click Save. The recovery window starts when the invoice for the failed renewal is created. With the Standard schedule, Dodo Payments schedules an attempt only if the sum of all waits up to that attempt fits inside the window, and only while the window is still open.

Changing the Schedule During a Retry Chain

Dodo Payments reads your settings each time it schedules the next retry, so a change also applies to payments that are already being retried:
  • A retry that is already queued keeps its time. Your new settings decide the wait before the retry after it.
  • When you switch between Standard and Custom, the chain continues at the same retry number. For example, if the 3rd retry fails after the switch, the next one is the 4th retry of the new schedule.
  • If the new schedule has no retry with that number, the chain ends. This happens when you switch to a Custom schedule with fewer retries, or when you remove custom retries.
  • When you switch to Standard, the recovery window applies again. If the next retry doesn’t fit in the window, or the window has already closed, the chain ends.

Retry Schedule

Choose the schedule under Retry schedule on the same settings page. In both modes, Dodo Payments does not retry a hard decline. To see when the next automatic retry runs for a failed payment, open the payment’s Transaction details page. It shows Next automatic retry with the date and the retry number, for example Retry 2 of 5. The total counts the retries that your current schedule plans for the invoice, so it changes when you change the schedule.

Standard Schedule

Retries back off progressively. Dodo Payments makes up to 8 attempts, as long as each one fits in your recovery window. The settings page shows how many retries fit in your window. Click View schedule to see each retry, with the ones outside the window marked Skipped:
The default window of 13 days covers attempts 1 through 5, because attempt 5 fires about 10.5 days after the failure. To run the later, more widely spaced attempts, increase the window: attempt 6 needs at least 16 days, attempt 7 at least 23 days, and attempt 8 the 30-day maximum.

Custom Schedule

Select Custom to set your own waits. Each row is one retry, and its wait counts from the previous attempt. The first time you select Custom, the rows are 12 hours, 1 day, and 2 days. The rules are:
  • Add 1 to 8 retries. Click Add retry to add a row with the longest wait that still fits. The button is hidden at 8 retries, or when less than 12 hours of the 30 days are left.
  • To remove a retry, click × next to its row. The other rows renumber. The last row can’t be removed.
  • Each wait is 12 hours, or 1, 2, 3, 4, 5, or 7 days.
  • The waits must add up to 30 days or less. Options that would push the total past 30 days are disabled.
Below the rows, the settings page shows how many retries the schedule makes and when the last one runs, counted from the failed payment.
Payment retries section of the Recovery settings with Custom selected under Retry schedule, three retry rows with wait menus, an Add retry button, and the note on when the last retry runs

A custom retry schedule under Settings → Recovery

The recovery window doesn’t apply to a custom schedule. Because the waits add up to 30 days or less, all retries of a custom schedule run within 30 days of the failed payment. In addition, once 30 days have passed since the invoice for the failed renewal was created, Dodo Payments queues no new retry. Dodo Payments checks the 30-day limit when it queues a retry, not when the retry runs. A retry can therefore run after day 30 in two cases: you change the schedule while a payment is being retried, or the result of a retry arrives late. For example, the 5th retry of the Standard schedule fails at about day 10.5. You then switch to a Custom schedule whose 6th, 7th, and 8th waits are 7 days each. These retries run at about day 17.5, 24.5, and 31.5. The 8th retry is queued at day 24.5, before the limit, so it still runs.

Subscription Status Transitions

Retries move the subscription between these statuses:
When a subscription is cancelled, its retry chain ends and no further attempts are made. Every other status (on_hold, past_due, expired, pending, failed) keeps retrying, because the open renewal invoice is a debt for a period the customer already used. Retries also stop when the invoice is paid another way, for example after the customer updates their payment method, or when you add the customer to your blocklist.
These transitions emit the standard subscription webhook events, so your entitlement logic needs no retry-specific handling:

Subscription Webhook Payloads

View the full webhook payload schemas for subscription lifecycle events.

Retryable vs. Non-Retryable Failures

The error code of the most recent failure decides whether the chain continues:
Retrying a hard decline won’t change the outcome, so the chain ends as soon as a hard decline occurs. Pair Payment Retries with Subscription Dunning to ask the customer for a new payment method in those cases. For the type of every code, see Transaction Failures.

Retrying on Demand

You don’t have to wait for the next scheduled attempt. While a subscription is on_hold, you can send a retry from the failed payment’s detail page in the dashboard, or with POST /payments/{payment_id}/retry. Manual retries run independently of the schedule: they don’t use up or move an automatic attempt, and they work even when Payment Retries are off. See Manual Payment Retry. When Payment Retries are on, your customers can also retry a failed renewal themselves with Retry Payment in the Customer Portal, while the subscription is on_hold or past_due. See Customer Retries from the Portal.

Payment Retries vs. Dunning

Payment Retries and Subscription Dunning recover different kinds of failure: Turn on both for the widest coverage: automatic retries catch transient failures, and dunning brings back customers whose payment method needs replacing.

Manual Payment Retry

Send a retry right away instead of waiting for the next scheduled attempt.

Subscription Dunning

Email sequences that ask customers to update their payment method.

Abandoned Cart Recovery

Recover abandoned or failed checkouts with recovery emails.

Subscriptions

The subscription states that recovery flows move between.

Subscription Webhooks

React to subscription.on_hold and subscription.active events.
Last modified on October 18, 2026