Billing cycle start date behavior after updating billing policy

Hi,
I have a business scenario where I want to cover updates and downgrades of digital product subscriptions (delivery policy intervals are equal to billing policy intervals for each separate selling plan or subscription contract).

Let’s assume that I want to update billing cycle of the contract from 30 DAYS to 1 YEAR billing cycle.
Let’s also assume that current billing cycle starts at 01.01.2024(cycleStartAt) and ends at 30.01.2024(cycleEndAt) with cycleIndex=1.
I can successfully update billing policy and delivery policy by using subscriptionDraftUpdate GraphQL call.

mutation {
  subscriptionDraftUpdate(
    draftId: "gid://shopify/SubscriptionDraft/12345679", input :{
			billingPolicy: {
				interval: YEAR
				intervalCount: 1
			}
			deliveryPolicy: {
				interval: YEAR
				intervalCount: 1
			}
		}
  ) {
    draft {
      id
    }
    userErrors {
      field
      message
    }
  }
}

Let’s assume that date of committing a subscription contract draft is 15.01.2024.

I can see 2 different behaviors for current billing cycle:

  1. After update yearly billing cycle ‘overrides’ 30 days billing cycle as a result there is a single billing cycle with dates 01.01.2024(cycleStartAt) ends at 01.01.2025(cycleEndAt) with cycleIndex=1.
  2. After update yearly billing cycle creates new billing cycle and terminates previous at the moment of update so I end up with 2 billing cycles:
    a) 01.01.2024(cycleStartAt) and ends at 15.01.2024(cycleEndAt) with cycleIndex=1
    b) 15.01.2024(cycleStartAt) and ends at 15.01.2025(cycleEndAt) with cycleIndex=2

On what conditions which scenario applies?
I am unable to find consistency between both behaviors so I suspect there is some logic behind the scenes which chooses one solution over another.
I search through the documentation and forum and was unable to find that information.
Thanks in advance.

When the billing and delivery policies change for the source subscription contract:

  • The current billing cycle will be adjust to end at the new cycle time
  • The future billing cycles will adjust to the length of the cycle -
    The past billing cycles remain unchanged

Here is an example on how it will work:

  • Current billing cycle (monthly cycle) starts on 2024-03-01, and end on 2024-03-30

  • Next billing cycle starts on 2024-03-30, and end on 2024-04-01

  • When cycle change to weekly:

  • Current billing cycle will change to starts on 2024-03-01, and end on 2024-03-08

  • Next billing cycle will change to starts on 2024-03-08, and end on 2024-03-15

You can read more here.
I also would like to recommend using the subscriptionBillingCycleContractEdit to make changes to the billing cycles.

Thank you,

Chase Dougherty

Thanks for the clarification @ChaseKaneki . This helps understanding how the billing cycles work.

As the current billing cycle adjusts to be the end of new cycle, it imposes some limitations. For example, say if a user has a subscriptionContract at with an interval of 3 months and their first billing cycle as:

  • “cycleStartAt”: “2024-03-07T15:57:54Z”,

  • “cycleEndAt”: “2024-06-05T09:00:00Z”,

  • “billingAttemptExpectedDate”: “2024-06-05T09:00:00Z”

If the user then requests to have their first billing/shipment on 2024-04-07, I believe we can’t currently really achieve that (consistently). If I update the contract to have anchors with a day of “7” , an interval of “MONTH” and an intervalCount of “3”, the billing cycle will become:

  • “cycleStartAt”: “2024-03-07T15:57:54Z”,
  • “cycleEndAt”: “2024-06-07T09:00:00Z”,
  • “billingAttemptExpectedDate”: “2024-06-07T09:00:00Z”, ← nextBillingCycleDate - not what the customer wanted.

We could use subscriptionBillingCycleContractEdit for a specific billing cycle, but what if they want to change all of them? Doing the mutation for 10 billing cycles isn’t really ideal, and what happens to following billing cycles?

Is there anyway to change the current cycle to exactly what we want, and make the following billing cycles change with the current interval?