I’m encountering a significant issue with subscriptionBillingCycleContracts when using 3DS verification. Currently, there is no effective way to cancel billingAttempts that are pending a 3DS verification. This creates a critical problem when applying temporary edits using subscriptionBillingCycleContracts.
The Problem:
Temporary Edits Blocked: When there’s a pending billingAttempt on a cycleContract, it becomes impossible to modify the subscription, update the contract, or remove the temporary edits.
Potential for Permanent Lock: In scenarios where the 3DS verification emails are lost or simply forgotten, the pending billingAttempt never expires. This leaves the contract effectively “bricked” until all the nextAction URLs are resolved manually.
Impact on Workflow: This issue poses a serious risk in production environments, as it prevents necessary adjustments and can lead to prolonged disruptions in the billing cycle process.
Request: It would be immensely helpful if Shopify could introduce a mechanism to cancel or automatically expire pending 3DS billingAttempts. This change would not only improve the flexibility of temporary edits but also help avoid situations where contracts are inadvertently locked due to unresolved verifications.
Any feedback on potential workarounds or plans to address this issue would be greatly appreciated. Thanks in advance for looking into this matter!
This happens because when a billing attempt requires 3DS verification, Shopify keeps the subscriptionBillingAttempt in a pending state until the authentication flow is completed. Unfortunately, Shopify does not currently provide a mutation to cancel or expire a pending 3DS billing attempt directly through the GraphQL Admin API.
A few workarounds that some developers use:
Wait for Shopify’s internal expiration
In some cases the pending attempt eventually expires automatically, but this can take a long time and isn’t reliable for production workflows.
Create a new billing attempt for the next cycle
If the contract is blocked by the pending attempt, some apps generate a new billing attempt for the following cycle and allow the failed one to remain unresolved. This isn’t ideal but can keep the subscription operational.
Avoid temporary edits while a billing attempt is pending
Before applying subscriptionBillingCycleContracts edits, check if a billing attempt exists and is awaiting a nextActionUrl. If so, pause the update workflow until the authentication is completed.
Merchant intervention
In some cases the merchant needs to complete the 3DS authentication link from the nextActionUrl to unblock the contract.
At the moment, many developers have requested a mutation to cancel or expire pending billing attempts, so hopefully Shopify introduces this in a future API update.
If anyone from Shopify can confirm whether a cancellation mechanism or expiration parameter is planned, that would greatly help developers working with subscription contracts.