Concatenated billing attempts refused since 2026-09-24 (API 2026-01)
Summary
Since 2026-09-24 01:04 UTC, subscriptionBillingAttemptCreate refuses a billing attempt on a contract whose billing cycle has other contracts’ cycles concatenated onto it, whenever one of the involved cycles was already billed. The same calls were accepted until at least 2026-09-22, and we found no changelog entry for the change.
- Error: “A billing cycle concatenated with this one has already been billed, or has a billing attempt that hasn’t finished. Wait for any unfinished attempt, then dissolve the concatenation before charging.” (
userErrors, fieldsubscriptionContractId, codeINVALID) - Impact: in our first nightly run after the change, 41 combined orders could not be charged. The 30 days before had none.
- API version: 2026-01.
- Still working: a plain billing attempt (no concatenation) on an already billed cycle is accepted.
How we create a combined order
We charge all due subscription contracts of one customer as one order: the other contracts’ cycles are concatenated onto the lead contract’s current cycle, then the lead is billed.
subscriptionBillingCycleContractEditon the lead contract, selector{date: <now>}subscriptionBillingCycleContractDraftConcatenatewith each other contract, selector{date: <now>}subscriptionBillingCycleContractDraftCommitsubscriptionBillingAttemptCreateon the lead contract, with an idempotency key and nobillingCycleSelector- After the attempt, successful or not, we remove the cycle edits again with
subscriptionBillingCycleEditsDelete.
We set next billing dates ourselves (customer requests, delivery planning), so they do not follow Shopify’s billing-cycle schedule. The cycle that contains “now” can therefore already have been billed by an earlier order.
Previous behaviour (until at least 2026-09-22)
The same calls were accepted when the lead’s current cycle already held an earlier order inside its date range. In production, combined orders were accepted this way on 2026-09-10, 2026-09-13, 2026-09-17, 2026-09-18, 2026-09-21 and 2026-09-22.
On our development store, two contracts were billed together 12 times inside one billing cycle between 2026-09-01 and 2026-09-17. All 12 were accepted.
Current behaviour (since 2026-09-24)
The first refusal came at 2026-09-24 01:04:44 UTC. That night, 41 combined billing attempts were refused on every one of their 5 tries. The other 426 combined billing attempts that night did not get this error.
In all 41, at least one involved cycle (the lead’s, or a concatenated one) had status BILLED from an earlier order. In the cases we checked, those earlier attempts had finished (ready, with an order), so nothing was left to wait for.
Example: two contracts were billed together on 2026-09-07 and share a cycle running 2026-09-06 → 2026-11-15. Their combined billing on 2026-09-24 was refused.
Reproduction on a development store
We reproduced it on 2026-09-24 (API version 2026-01) with contracts created that day on a 4-week billing policy. “Billed” means the cycle already carried an order.
| Test | Setup | Result |
|---|---|---|
| 1 | Lead cycle unbilled, other contract’s cycle unbilled, concatenated by date | Accepted, one order |
| 2 | Lead cycle unbilled, other contract’s cycle billed, concatenated by date | Refused with the error above |
| 3 | As test 2, but the other contract concatenated by its next unbilled cycle (selector by index) | Accepted |
| 4 | Lead cycle billed, other contract’s cycle unbilled | Refused with the error above |
| 5 | Lead cycle billed, other contract concatenated by its next unbilled cycle | Refused with the error above |
| 6 | Bill the lead’s next unbilled cycle now (billingCycleSelector by index) |
Refused: ORIGIN_TIME_OUT_OF_RANGE |
| 7 | Move that cycle’s billing date to now (subscriptionBillingCycleScheduleEdit) |
Refused: OUT_OF_BOUNDS |
| 8 | Bill the next cycle with originTime inside it |
Accepted, but the order is scheduled for that future date |
| 9 | Plain billing attempt, no concatenation, on a billed cycle | Accepted |
So a combined order is only possible when the lead’s cycle and every concatenated cycle are unbilled.
Questions
- Was this validation introduced on purpose between 2026-09-22 and 2026-09-24? Is there an announcement we missed?
- What is the supported way to bill several contracts of one customer as one order when a cycle involved was already billed earlier? Apps that set billing dates themselves run into this regularly.
- Can concatenation onto an already billed cycle be allowed again, as it was until 2026-09-22? If not, is there a supported way to get an unbilled cycle for “now”, for example by re-anchoring the billing-cycle schedule?
- When we bill a future cycle with
originTimeinside it, can the order be fulfilled right away instead of being scheduled for that date?
We can share store, contract and order IDs privately with Shopify staff.