Manual Retry re-attempts a failed subscription renewal payment when you ask, from the payment’s detail page or through the API. It charges the payment method saved on the subscription, and it runs independently of the automatic Payment Retries schedule.
What Is Manual Retry?
When a renewal payment fails, the subscription moves toon_hold. If you turned on Payment Retries, they re-attempt the charge on a back-off schedule. Sometimes you know the payment will go through now: the customer has confirmed they topped up their account, or your support team is on a call with them. Manual Retry sends one attempt immediately, instead of waiting hours or days for the next scheduled one.
- Renewal payments only: Manual Retry applies to subscription renewal invoices while the subscription is
on_hold. First payments, one-time payments, plan-change charges, and on-demand charges are not eligible. - No customer action: The charge goes to the payment method already saved on the subscription.
- Independent of automatic retries: A manual retry doesn’t use up an attempt from the automatic schedule, doesn’t move the next scheduled retry, and works even when Payment Retries are off.
- Retries the invoice, not the payment: The failed payment is only the entry point. Dodo Payments finds the open renewal invoice behind it and charges that debt, so it doesn’t matter which failed payment on the invoice you retry from.
Retrying from the Dashboard
Only users with the Owner or Editor role can send a manual retry.1
Open the failed payment
Go to Transactions → Payments and click the failed renewal payment to open its Transaction details page.
2
Click Retry Payment Manually
Click Retry Payment Manually in the top-right corner. The button is available only while the payment is eligible.
3
Check the result
Dodo Payments creates a new payment for the attempt, and it appears in the Activity Log. If the charge succeeds, the subscription returns to
active, and the next billing date moves to one billing period after the successful retry. If the payment processor hasn’t settled the charge yet, the payment shows as in progress until the payment.succeeded or payment.failed webhook reports the outcome.
Retry Payment Manually on the transaction details page of a failed renewal
Eligibility
Dodo Payments sends a manual retry only when every check in this table passes. The Reason code column is what the API returns: inreason on GET /payments/{payment_id}/retry, and as the error code on POST /payments/{payment_id}/retry.
Manual Retry is narrower than automatic retries in one place: it requires the subscription to be
on_hold. A past_due subscription in a grace period fails this check. Automatic retries keep running for other non-active statuses. See Subscription Status Transitions.Retry Limits
Each renewal invoice allows 3 manual retries, with a cooldown between them:
The limits apply in both test mode and live mode. When the limit refuses a retry, the API returns
MANUAL_RETRY_LIMIT_REACHED (HTTP 429), and the error body carries only code and message. To learn when the next retry opens, check the retry state and read retry_available_at. It is null once all three retries are spent.
Automatic retries don’t count toward this limit, and manual retries don’t count toward the 8 attempts of the automatic schedule.
Manual vs. Automatic Retries
The two retry paths differ in these ways:Retrying via the API
Check eligibility first, then send the retry. Both endpoints take the ID of a failed payment.Check Whether a Payment Can Be Retried
GET /payments/{payment_id}/retry doesn’t return an error for an ineligible payment. It returns can_retry: false with the reason code instead, so your own dashboard or support tooling can show the same state as the Dodo Payments dashboard. It requires the Viewer role.
Response
Send a Manual Retry
POST /payments/{payment_id}/retry creates a new payment and charges the saved payment method. It requires the Editor role. The SDK examples reuse the client from the previous example.
Response
Error Responses
When a retry is not allowed,POST returns one of these HTTP statuses:
The Error Codes reference describes every code.
Webhooks
A manual retry creates an ordinary payment, so the same webhooks fire as for any renewal attempt:
On the payment object in these events,
retry_attempt is 1 or higher and subscription_id is set, the same as for an automatic retry. The payment object has no field that marks a manual attempt, so keep the payment_id from the retry response if you need to tell a manual attempt apart from a scheduled one.
Payment Webhook Payloads
Full payload schemas for payment events.
Related
Subscription Payment Retries
The automatic back-off schedule that runs alongside manual retries.
Subscription Dunning
Email the customer to update their payment method after a hard decline.
Handle Payment Failures
Read decline codes and decide when a retry is worthwhile.
Error Codes
Every
MANUAL_RETRY_* code, its trigger, and its message.