MAX_RETRIES_REACHED on Recharge Subscription — What Happens Next
Root cause
MAX_RETRIES_REACHED is the state when Recharge has exhausted all configured retry attempts in its dunning schedule without successfully collecting payment. Recharge fires the charge/max_retries_reached webhook and cancels the subscription on its side. The critical risk: Shopify's subscription contract may still show ACTIVE because Recharge does not always call subscriptionContractUpdate to sync the cancellation. This creates a ghost subscription — the customer may continue receiving product while no payment is collected.
Symptoms
- • Recharge fires charge/max_retries_reached webhook
- • Recharge subscription status changes to CANCELLED internally
- • Shopify subscription contract may still show ACTIVE
- • Customer continues to receive service but payment is not collected
- • No merchant-facing alert generated — silent revenue loss continues
How to fix it
Check Recharge Admin for max_retries_reached charges
In Recharge Admin, navigate to Charges and filter by status=ERROR. Sort by attempt count descending to find charges that have exhausted all retries. These are your MAX_RETRIES_REACHED subscriptions.
Open in admin →Identify ghost subscriptions by comparing states
For each MAX_RETRIES_REACHED charge, check the corresponding Shopify subscription contract status via the Admin API. If Recharge shows CANCELLED but Shopify shows ACTIVE, you have a ghost subscription. AltorLab automates this comparison and surfaces mismatches with revenue impact.
Contact affected customers before reconciling state
Before cancelling the Shopify contract, send affected customers a payment method update email. Some customers will update their payment and allow you to recover the subscription rather than losing it entirely. Use Recharge Admin > Customer record > Send Payment Update Email.
Open in admin →Reconcile Shopify contract state via subscriptionContractUpdate
For customers who do not respond or cannot recover, call the Shopify Admin GraphQL subscriptionContractUpdate mutation with status: CANCELLED for the affected contract. This stops service delivery and reconciles Shopify's state with Recharge's. Without this step, Shopify shows the customer as active and may continue fulfilling orders.
Frequently asked questions
What happens to a Shopify subscription contract when Recharge reaches max retries?
Recharge cancels the subscription on its side and fires the charge/max_retries_reached webhook. However, Recharge does not always update the Shopify subscription contract. The contract may remain ACTIVE in Shopify while Recharge stops billing — creating a ghost subscription where the customer receives service without payment.
Can I still recover a subscription after Recharge hits max retries?
Yes, if the customer updates their payment method before the Shopify contract is cancelled. After MAX_RETRIES_REACHED, the Recharge charge can still be manually retried via Recharge Admin or the /charges/{id}/process API endpoint once the customer provides a valid payment method.
How do I find subscriptions in the MAX_RETRIES_REACHED state?
In Recharge Admin, go to Charges > filter by status=ERROR > sort by attempt count. Charges with the maximum configured attempts are at MAX_RETRIES_REACHED. Cross-reference the corresponding Shopify subscription contract status to identify ghost subscriptions where Shopify still shows ACTIVE.
How do I prevent ghost subscriptions after Recharge max retries are exhausted?
Listen for the Recharge charge/max_retries_reached webhook. When it fires, immediately call Shopify's subscriptionContractUpdate GraphQL mutation to set the contract status to PAUSED or CANCELLED. This prevents service delivery continuing after Recharge has stopped billing the subscription.
Detect this error automatically
Free cross-stack scan finds all billing errors in 60 seconds.
Run Free Scan →