Current time is 2025-11-19T17:00:00Z
Let’s say I create a simple subscription contract using subscriptionContractAtomicCreate:
"subscriptionContract": {
"id": "gid://shopify/SubscriptionContract/45075956005",
"status": "PAUSED",
"createdAt": "2025-11-19T17:00:00Z",
"nextBillingDate": "2025-11-20T08:00:00Z",
"billingPolicy": {
"interval": "MONTH",
"intervalCount": 1,
"minCycles": null,
"maxCycles": null
}
}
If I query subscription billing cycles, I get:
"subscriptionBillingCycles": {
"nodes": [
{
"cycleIndex": 1,
"cycleStartAt": "2025-11-19T17:00:00Z",
"cycleEndAt": "2025-11-20T08:00:00Z",
"billingAttemptExpectedDate": "2025-11-20T08:00:00Z",
"skipped": false,
"status": "UNBILLED"
},
{
"cycleIndex": 2,
"cycleStartAt": "2025-11-20T08:00:01Z",
"cycleEndAt": "2025-12-20T08:00:00Z",
"billingAttemptExpectedDate": "2025-12-20T08:00:00Z",
"skipped": false,
"status": "UNBILLED"
},
{
"cycleIndex": 3,
"cycleStartAt": "2025-12-20T08:00:01Z",
"cycleEndAt": "2026-01-20T08:00:00Z",
"billingAttemptExpectedDate": "2026-01-20T08:00:00Z",
"skipped": false,
"status": "UNBILLED"
},
...
]
}
So far everything looks good and works as expected.
The problem arises if I try to update this subscription contract.
Let’s say I want to change the billingPolicy.maxCycles
I create subscription contract draft:
"subscriptionContractUpdate": {
"draft": {
"id": "gid://shopify/SubscriptionDraft/580998136101",
"nextBillingDate": "2025-11-20T08:00:00Z",
"billingCycle": null,
"billingPolicy": {
"interval": "MONTH",
"intervalCount": 1,
"minCycles": null,
"maxCycles": null
},
"concatenatedBillingCycles": {
"nodes": []
}
},
"userErrors": []
}
And then I run a simple subscriptionDraftUpdate mutation for the draft:
"subscriptionDraftUpdate": {
"draft": {
"id": "gid://shopify/SubscriptionDraft/580998267173",
"nextBillingDate": "2025-11-20T08:00:00Z",
"billingCycle": null,
"billingPolicy": {
"interval": "MONTH",
"minCycles": 2,
"maxCycles": 10
},
"concatenatedBillingCycles": {
"nodes": []
}
},
"userErrors": []
}
Once I commit the changes using subscriptionDraftCommit:
"subscriptionDraftCommit": {
"contract": {
"id": "gid://shopify/SubscriptionContract/45075956005",
"nextBillingDate": "2025-11-20T08:00:00Z",
"orders": {
"nodes": []
}
},
"userErrors": []
}
When I query the billing cycles again I can see that the next billing cycle (cycleIndex: 1) billingAttemptExpectedDate jumps to December - the billingCycle for November is skipped:
"subscriptionBillingCycles": {
"nodes": [
{
"cycleIndex": 1,
"cycleStartAt": "2025-11-19T17:00:00Z",
"cycleEndAt": "2025-12-19T17:00:00Z",
"billingAttemptExpectedDate": "2025-12-19T17:00:00Z",
"skipped": false,
"status": "UNBILLED"
},
{
"cycleIndex": 2,
"cycleStartAt": "2025-12-19T17:00:01Z",
"cycleEndAt": "2026-01-19T17:00:00Z",
"billingAttemptExpectedDate": "2026-01-19T17:00:00Z",
"skipped": false,
"status": "UNBILLED"
},
{
"cycleIndex": 3,
"cycleStartAt": "2026-01-19T17:00:01Z",
"cycleEndAt": "2026-02-19T17:00:00Z",
"billingAttemptExpectedDate": "2026-02-19T17:00:00Z",
"skipped": false,
"status": "UNBILLED"
}
]
}

