Shopify Subscription Billing Attempt Timeout
Root cause
A subscriptionBillingAttemptCreate mutation was submitted but the async billing job did not complete within the expected window — either due to a Shopify platform delay, payment gateway timeout, or a polling implementation that stopped checking before the job resolved.
Symptoms
- • subscriptionBillingAttemptCreate returns a billing attempt ID but the attempt remains in pending state for more than 15 minutes
- • Polling subscriptionBillingAttempt shows ready: false after 30+ minutes
- • No success or failure webhook has been delivered for the billing attempt
- • The subscription contract remains ACTIVE with no order created and no error recorded
How to fix it
Poll the billing attempt status for up to 30 minutes
Shopify's subscription billing jobs are asynchronous and can take up to 15 minutes to resolve under load. Poll subscriptionBillingAttempt every 2 minutes for up to 30 minutes after creating the attempt. Check the ready field: false means still processing, true means resolved (check errorCode for success or failure). Do not abandon polling before the 30-minute window — premature abandonment causes state drift.
Check Shopify Status for platform incidents
If a billing attempt has not resolved after 30 minutes, check status.shopify.com for active incidents affecting subscription billing or payment processing. Shopify platform incidents can delay billing job resolution by hours. If an incident is active, wait for it to resolve before creating a new billing attempt — creating a duplicate attempt during an incident can result in double-billing.
Open in admin →Implement a dead-letter queue for unresolved billing attempts
Store every created billing attempt ID with a creation timestamp. Run a daily job that checks any billing attempt older than 2 hours that has not resolved to success or failure. For these dead-letter attempts, query Stripe directly to determine if a charge was created. If Stripe shows no charge, create a new billing attempt. If Stripe shows a successful charge, create the Shopify order manually.
Frequently asked questions
Is it safe to create a new billing attempt if the original one timed out?
Only after verifying in Stripe that no charge was created for the original attempt. If the original billing attempt created a Stripe charge (even if Shopify did not confirm it), creating a new billing attempt will double-charge the customer. Always check Stripe for an existing charge on the same day before creating a replacement billing attempt.
How do I prevent billing attempt timeouts from causing silent revenue loss?
Never assume a billing attempt resolved successfully because you did not receive a failure webhook — timeouts create a third state where the attempt neither succeeded nor failed. Implement a billing attempt tracker that stores IDs with timestamps and alerts on any attempt older than 2 hours without a confirmed outcome.
Detect this error automatically
Free cross-stack scan finds all billing errors in 60 seconds.
Run Free Scan →