How renewals work
A renewal is the single most important event in a subscription's life — the moment the customer is charged again. This page walks through what happens, end to end: scheduling, off-session charging, success path, failure path, and where to look when something goes wrong.
The renewal cycle in one paragraph
When you create a subscription, the plugin schedules the next renewal in Action Scheduler (WooCommerce's job runner). At the scheduled time, the queued job fires, the plugin creates a new renewal order, and calls the gateway to charge the saved payment token off-session. If the charge succeeds, the order moves to processing/completed, the subscription stays active, and a fresh renewal is scheduled. If it fails, the subscription moves to on-hold, retries are scheduled with exponential backoff, and dunning emails go out.
The scheduler: Action Scheduler
Every scheduled renewal is an Action Scheduler job with the hook aswc_scheduled_subscription_payment (or the equivalent gateway-specific hook for the payment-bridges module). You can inspect the queue at:
WooCommerce → Status → Scheduled Actions.
Filter by the aswc_* hook prefix to see only subscription-related jobs. Each row shows status (pending / in-progress / complete / failed), the scheduled time and the parameters (typically the subscription ID).
Off-session charging
At the scheduled time, the plugin attempts to charge the saved payment method without the customer present. This is what payment professionals call "off-session". Two consequences:
- The gateway needs to support tokenisation (saving the payment method on the initial checkout for later reuse). All four natively-supported gateways do.
- The transaction is marked as MIT (Merchant-Initiated Transaction) in card schemes. SCA / 3DS still applies but follows the MIT exemption flow rather than challenging the customer.
The happy path
- Scheduled job fires.
- Plugin creates a renewal order with the same line items and amounts as the subscription.
- Plugin calls the gateway to charge the saved token.
- Gateway returns success. Order moves to processing or completed.
- Plugin updates the subscription's next payment date to the next interval (or anchor day).
- The renewal-invoice email goes out.
- Hook
aswc_after_renewal_paidfires.
The failure path
- Gateway returns declined (insufficient funds, expired card, 3DS challenge required without customer present, etc.).
- Subscription moves to on-hold.
- Plugin schedules a retry. Default policy: 3 attempts with exponential backoff (1 day, 3 days, 7 days). Configurable in admin (see Retry attempts).
- The dunning email "Renewal payment failed" goes out to the customer with a button to pay manually.
- If the customer pays manually (or the next retry succeeds), the subscription transitions back to active.
- If all retries fail, the subscription transitions to cancelled. Setting
aswc_after_no_failed_attempt_cancelcontrols the threshold.
Forcing a renewal manually
For testing or for one-off remediation, you can force a single renewal to run right now:
- Open the subscription in WooCommerce → Subscriptions.
- Change the Next payment date to a time within the next minute and save.
- Wait for the next Action Scheduler tick, or trigger it manually from WooCommerce → Status → Scheduled Actions.
Alternatively, in Scheduled Actions, find the pending job for that subscription and click Run. The renewal fires immediately.
Changing things between renewals
The plugin reads the current subscription state at the moment of the renewal — not at the moment of original purchase. So:
- Changing the customer's address updates tax on the next renewal.
- Customer changes payment method from My Account → next renewal uses the new method.
- Admin changes the price on the subscription detail screen → next renewal uses the new price (this is different from changing the product price, which doesn't propagate).
- Customer triggers a plan switch → next renewal is the new plan's price and cadence, with optional prorate.
Relevant hooks
aswc_scheduled_subscription_payment— Action Scheduler hook fired on every renewal attempt.aswc_after_renewal_paid— fires after a successful renewal.aswc_renewal_payment_failed— fires when a renewal charge fails.aswc_subscription_next_payment_date— filter to override the calculated next-payment timestamp.