Skip to main content
Updating a plan price changes how it is charged going forward. Depending on what you change, the system either mutates the price in place or creates a new price version. After updating pricing fields, you need to run the price sync workflow to propagate the change to existing subscribers.

The Update Price API

All fields are optional. Only include the fields you want to change.

Available Fields

Fields You Cannot Change

These are immutable after a price is created:

Two Update Paths

Path A — Metadata-only update (in-place)

If you only update display_name, description, lookup_key, metadata, or group_id, the price is updated in place. No new price version is created. No sync is needed.
Response: the updated price object. Done.

Path B — Pricing field update (new version created)

If you update any pricing field (amount, billing_model, tiers, tier_mode, transform_quantity, price_unit_amount, price_unit_tiers), the system:
  1. Terminates the current price — sets its end_date to effective_from (or now if not provided)
  2. Creates a new price — starts exactly at effective_from, with the updated values
  3. Returns the new price in the response (with a new id)
Response: the new price object (id will be different from the original).
Save the new price id from the response. Existing subscription line items still reference the old price ID. The sync workflow creates new line items referencing the new price.

Syncing the Change to Existing Subscribers

After a pricing field update, existing subscriptions are not automatically updated. You must run the price sync workflow to propagate the new price to all active subscribers on the plan.

Why Manual Sync?

The sync workflow can affect large numbers of subscriptions. Triggering it automatically on every price update would be unpredictable. Doing it explicitly gives you control over timing.

Safe Sync Sequence

Step 1 — Update the price
Note the plan ID associated with this price (needed for sync). Step 2 — Check for a running sync
  • If pagination.total > 0 — a sync is already running. Do not trigger another. Poll GET /workflows/{workflow_id}/{run_id} every 30 seconds until status is Completed or Failed, then continue to Step 3.
  • If pagination.total == 0 — proceed to Step 3.
Step 3 — Trigger sync
Response:
Step 4 — Poll until complete
Poll every 30 seconds. Terminal states: Step 5 — Verify (optional) Check the sync summary in the completed workflow response:
line_items_terminated = old price line items closed. line_items_created = new price line items added.

What Sync Does After a Price Update

When you update a price, the old price gets an end_date and a new price is created. The sync workflow:
  1. Terminates existing line items that reference the old price (their end_date is set to match the old price’s end_date)
  2. Creates new line items for the new price on all subscriptions that don’t have one yet
Subscriptions with overridden line items (custom pricing) are not affected — their line items point to subscription-scoped prices, not the plan price you just updated.

Using effective_from

effective_from controls when the old price expires and the new one starts.
The sync workflow creates new line items with start_date = price.start_date. If you set effective_from: "2026-04-01", the new line items will start on April 1 and the old ones will end on April 1.

Examples

Update a flat fee amount

Then sync: POST /plans/plan_growth/sync/subscriptions

Update usage tiers

Update metadata only (no sync needed)

No sync required.