Shopify Subscription Next Billing Date in the Past
Root cause
The subscription contract's nextBillingDate field was set to a date that has already passed — typically caused by a subscription pause without a resume date recalculation, a store migration, or a bug in the billing date update logic.
Symptoms
- • Shopify subscriptionBillingAttemptCreate fails or returns unexpected errors for specific subscriptions
- • The subscriptionContract query shows nextBillingDate is weeks or months in the past
- • Recharge has been attempting to charge on the correct schedule but Shopify rejects the billing attempt
- • Revenue for these subscriptions has been silently missing for the duration of the stale date
How to fix it
Query all contracts with past nextBillingDate
Use the Shopify Admin API to query subscriptionContracts where status is ACTIVE and nextBillingDate is before today's date. GraphQL: query subscriptionContracts with filter {status: ACTIVE} and check nextBillingDate in the response. Build a list of all affected contract IDs — this is your remediation queue.
Update each contract's nextBillingDate to the next valid future date
For each affected contract, use subscriptionContractUpdate to set nextBillingDate to the next correct billing date calculated from today. The correct next billing date = today + billingPolicy.intervalCount billing periods. For example, a monthly subscription that should have billed 2 months ago should be updated to bill within the next 1–3 days (not immediately, to avoid overwhelming payment retries).
Stagger the billing attempts to avoid gateway rate limits
If you have many contracts with stale dates, do not update all nextBillingDates to the same day. Stagger them across 3–5 days to distribute billing load. A sudden spike of subscription renewals can trigger issuer-level velocity limits and artificially inflate your failure rate. Prioritize the subscriptions with the oldest stale dates first.
Frequently asked questions
Will updating nextBillingDate automatically trigger a charge?
No. Updating nextBillingDate via subscriptionContractUpdate only changes the scheduled date — it does not immediately create a billing attempt. Shopify will create the billing attempt when the nextBillingDate is reached. If you want to bill immediately for a missed cycle, use subscriptionBillingAttemptCreate directly after updating the date.
How do stale billing dates typically go undetected for months?
Most subscription monitoring looks at failed payment attempts — but a stale nextBillingDate means no attempt is ever created, so there is no failure to detect. The subscription shows ACTIVE, no error fires, and no revenue is collected. The only way to catch this is to actively query contracts and compare nextBillingDate against today's date — passive error monitoring will always miss it.
Detect this error automatically
Free cross-stack scan finds all billing errors in 60 seconds.
Run Free Scan →