Configuring retry attempts
When a renewal payment fails, the plugin doesn't give up immediately. It schedules retries with exponential backoff, sends dunning emails to the customer, and only marks the subscription as cancelled once the retry budget is exhausted. This page covers the default policy, the admin toggles, and the manual-payment escape hatch.
Default retry policy
Out of the box, when a renewal charge fails the plugin schedules up to 3 retries:
| Attempt | When | What happens |
|---|---|---|
| Original | Scheduled renewal time | Subscription moves to on-hold, dunning email sent. |
| Retry 1 | +1 day | Re-charge. On success → active. On failure → schedule next retry. |
| Retry 2 | +3 days | Re-charge. Same logic. |
| Retry 3 | +7 days | Final attempt. If it fails, subscription moves to cancelled. |
Total grace window: ~11 days. Long enough for a customer to update an expired card, short enough to keep your churn books honest.
Admin settings
Find the toggles in WooCommerce → Settings → Advanced Subscriptions → Payments:
- Enable automatic retry of failed attempts
- Master switch (
aswc_enable_automatic_retry_failed_attempts). Off = renewal fails once and the subscription is cancelled immediately. Recommended: on. - Cancel after N failed attempts
- The threshold (
aswc_after_no_failed_attempt_cancel). Default 3. Increase if you want a longer grace period, decrease if you want to cut off bad accounts faster. - Accept manual payment
- (
aswc_enbale_accept_manual_payment— typo in the option key is intentional, it ships that way.) Adds a "Pay now" button in the customer's My Account so they can rescue a failed renewal without waiting for the next retry. Recommended: on.
Dunning emails
The customer receives an email on the original failure and (optionally) on each retry attempt:
- First failure: "Your renewal payment failed. We'll retry in 24h. Click here to pay manually now."
- Last retry exhausted: "We couldn't process your renewal. Your subscription has been cancelled. Reactivate button."
Templates live in /includes/loader/emails/ and can be overridden via your theme (your-theme/woocommerce/emails/). See Emails overview.
The manual-payment escape hatch
With Accept manual payment on, the customer sees a Pay now button on the failed renewal order in My Account. Clicking it:
- Opens a one-page form pre-filled with the renewal amount and the saved payment method.
- Lets the customer optionally pick a different payment method (e.g. a fresh card).
- Attempts the charge on-session (so 3DS challenges work).
- On success, marks the renewal paid and re-activates the subscription. All scheduled retries for this renewal are cancelled.
This is the single most effective recovery mechanism. Most "wallet" failures (expired card, blocked card, low balance) are resolved when the customer is told and given a one-click fix.
Customising the policy from code
You can override the retry schedule per-subscription with a filter:
// VIP customers: more retries, longer window
add_filter( 'aswc_retry_schedule', function ( $schedule, $subscription ) {
if ( $subscription->get_user()->has_role( 'vip' ) ) {
return [ '+2 days', '+7 days', '+14 days', '+30 days' ];
}
return $schedule;
}, 10, 2 );
Relevant hooks
aswc_renewal_payment_failed— fires on every failed renewal attempt.aswc_after_no_failed_attempt_cancel— filter the retry threshold per-subscription.aswc_retry_schedule— override the backoff schedule.