Faster, and more flexible migrations (and related changes & deprecations) - Jan 2026

Last updated: January 10, 2026

We’re rolling out two major improvements to migrations, along with a small set of deprecations and behavior changes to enable them. Changes will take effect on March 13, 2026 (60 days from Jan 12th) and you can opt-in early to take advantage of the improvements.

What’s improving

Faster migration performance

Migrations will complete faster, reducing wait times when rolling out pricing changes. We're continuously working to improve migration speed, and this rollout includes some of these improvements. You can opt in now to get the benefits early, or they'll apply automatically on March 13, 2026.

More flexible pricing changes

Currently making an immediate pricing change could conflict with scheduled migrations. With our improvements, immediate and scheduled changes work independently, you can do both without one affecting the other. This enables you to:

1) Respond immediately without disrupting planned scheduled migrations: React quickly to market changes, competitive pressure, or customer requests by adding a new SKU or adjusting pricing immediately, without canceling, or pulling forward planned future-dated migrations. Urgent changes take effect right away, while scheduled pricing transitions continue as scheduled.

2) Reduce coordination across teams: Operate independently across teams by scheduling future-dated migrations (for renewals or end-of-term changes) while applying immediate pricing updates, without coordinating timing or worrying about conflicts.

What’s changing to enable these improvements

To allow these improvements, we’re making changes to Webhooks, Subscription Version (UI implications shown below), and an API endpoint, all detailed below. 

Webhook Deprecations

We will stop sending the following webhooks:

  • subscription.plan_version_change_scheduled (docs

  • subscription.plan_version_changed (docs

Subscription Version changes

Today: The subscription version matches the plan version you're currently being billed on. If your subscription shows Version 1, that means Version 1's prices are active.

When you schedule a migration with a future effective date, Orb sets up the new pricing immediately, but keeps your subscription on its current version until billing switches over.

With this change: The subscription version will reflect what's been configured, not what's currently billing. So your subscription might show Version 2 while you're still being billed on Version 1's prices. The version shows what's configured; the effective date controls when billing starts.

The underlying billing logic, price interval calculations, effective dates, and invoice generation remain the same. Changes only affect how version information is displayed and represented in the API and UI.

In short:

  • Subscription version used to answer: "What am I being charged for right now?"

  • Now it answers: "What is my subscription's pricing configuration, including what's scheduled?"

Example

Scenario: You have a customer on Plan A, Version 1. On December 12 you schedule a migration to Plan Version 2 of Plan A, with an effective date of January 1.

Currently 

With changes

On December 12 (migration created)

Subscription shows Version 1 -> 2

Subscription shows Version 2

When price intervals are created

On the date you made the change (December 12)

Same as before: On the date you made the change (December 12)

When new prices start billing

January 1

Same as before: January 1

On January 1 (effective date)

Subscription updates to Version 2

No change, subscription is already on Version 2

API change

The endpoint (GET /v1/subscriptions/<subscription_id>/schedule, docs) will only return plan changes and will not include plan version migrations. 

Example: For a subscription that has a plan change from A → B, then plan‑version change from Bv1 → Bv2 → Bv3 a sample response would be:

Current response:

{

  "data": [

    {

      "start_date": T0,

      "end_date": T1,

      "created_at": T0,

      "plan": {

        "id": "A",

        "external_plan_id": "abc123",

        "name": "Plan A"

      }

    },

    {

      "start_date": T1,

      "end_date": T2,

      "created_at": T1,

      "plan": {

        "id": "B",

        "external_plan_id": "def456",

        "name": "Plan B"

      }

    },

    {

      "start_date": T2,

      "end_date": T3,

      "created_at": T2,

      "plan": {

        "id": "B",

        "external_plan_id": "def456",

        "name": "Plan B"

      }

    },

    {

      "start_date": T4,

      "end_date": null,

      "created_at": T4,

      "plan": {

        "id": "B",

        "external_plan_id": "def456",

        "name": "Plan B"

      }

    },

  ]

}

New response after changes: we will continue to return plan changes but not plan version migrations.

{

  "data": [

    {

      "start_date": T0,

      "end_date": T1,

      "created_at": T0,

      "plan": {

        "id": "A",

        "external_plan_id": "abc123",

        "name": "Plan A"

      }

    },

    {

      "start_date": T1,

      "end_date": null,

      "created_at": T1,

      "plan": {

        "id": "B",

        "external_plan_id": "def456",

        "name": "Plan B"

      }

    }

  ]

}

Impact and recommended actions:

  • If you rely on the subscription.plan_version_scheduled or subscription.plan_version_changed webhooks for downstream processing, please plan to remove those dependencies.

  • If you infer plan version migrations from multiple adjacent entries of the same plan in the subscription schedule (via the GET /v1/subscriptions/<subscription_id>/schedule), be aware those entries will not be returned anymore.

  • No changes are required if you only consume plan‑level changes or use the schedule for display without interpreting version transitions.

UI changes

Subscriptions show a single current version with scheduled indicators removed. Pricing history remains fully visible with added ability to see which plan version introduced each price and custom search to see which prices were active during a certain time period (see below for detail of UI changes).

Current behavior 

Future behavior 

Today is Dec 12, customer is scheduled to move to version 2 of plan on Dec 24 

Today is Dec 15, customer is scheduled to move to version 3 of plan on Dec 24 

Subscriptions Tab

Under Version, shows 1 > 2, will be update to version 2 on Effective date

image.png

Subscriptions Tab

Subscription is on version 3, the future dated version 

image.png

Subscription page 

A clock icon with tooltip "this subscription is scheduled to migrate to Version 2” is displayed

image.png

Subscription timeline

Timeline marker showing “Migration to Version 2, Dec 24”

image.png




View details > pricing configuration

See active and upcoming prices only

image.png

Subscription page 

Subscription is on Version 3, clock icon and the tool tip are no longer shown/applicable

image.png

Subscription timeline

Timeline marker doesn’t show the future dated version since subscription is on this version now. For each price, the hover tooltip shows the plan version that introduced that price

image.png

View details > pricing configuration

Can Custom Search to find the prices that were active during a specific time period

image.png

Timeline and Roll out plan

  • Opt‑in availability: Effective immediately. We can enable these changes on your account ahead of the global rollout.

  • Standard rollout: March 13 (60 days from now). If you do not opt in early, we will apply these changes to your account on or after this date.