---
title: "Change Wix plan"
method: POST
path: "/api/billing/dynamic-offering/update-subscription"
---

# Change Wix plan

`POST /api/billing/dynamic-offering/update-subscription`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/billing/dynamic-offering/update-subscription`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Moves a Wix-billed workspace to another plan. Take `new_product_id` from `wix_product_id` in [List plans](/api-reference/list-plans). Only the workspace owner can change the plan.

<Warning>An upgrade takes effect now and charges the workspace's saved payment method right away, with no confirmation step. Check the amount first with [Preview Wix plan change](/api-reference/preview-wix-plan-change).</Warning>

- **Upgrade** (a bigger plan): the response has `invoice_id`. A declined card returns 402 with `detail.error_type` set to `payment_failed`, and an unpaid invoice on the plan returns 402 with `past_due`.
- **Downgrade** (a smaller plan): takes effect at the end of the billing period, and nothing is charged now. The response has `is_downgrade` set to `true`. A downgrade keeps the billing period, and only one change can be scheduled at a time. Undo it with [Cancel scheduled plan change](/api-reference/cancel-scheduled-plan-change).

You can switch from monthly to yearly billing, but not from yearly to monthly. A downgrade also turns a plan that's set to end back to renewing.

To retry an upgrade safely, send an `Idempotency-Key` header and repeat it on the retry: Wix then charges the order once. Without the header, each request is a new charge attempt, so check [Get billing info](/api-reference/get-billing-info) before you retry.

This works only for workspaces billed through Wix. For a Stripe-billed workspace, use [Change plan](/api-reference/change-plan). Wix billing is still rolling out, so this can return 404 for your account.

The base rate limit is 10 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

## Headers

- `Idempotency-Key` string: A key you generate for this plan change. Send the same key when you retry it, and a new one for every other change.

## Request body

- UpdateDynamicOfferingRequest
  - `new_product_id` string, required: Wix product of the plan to move to, from `wix_product_id` in [List plans](/api-reference/list-plans).
  - `period_unit` 'MONTH' | 'YEAR', required: Billing period of the new plan: `MONTH` or `YEAR`.

## Response `200`

The upgrade was charged, or the downgrade scheduled.

- WixPlanChangeResult: The outcome of a Wix plan change.
  - `success` boolean, required: Always `true`. A failure returns an error status instead.
  - `is_downgrade` boolean, nullable: `true` when the change is a downgrade scheduled for the end of the billing period. Not returned on an upgrade.
  - `invoice_id` string, nullable: ID of the invoice the upgrade was charged on. Not returned on a downgrade.

## Other responses

- `400`: `new_product_id` isn't a Base44 plan, the workspace isn't billed through Wix, the change isn't allowed (yearly to monthly billing, a downgrade that changes the billing period, or a Business plan cheaper than the current plan), or Base44 couldn't open a Wix billing session for you.
- `401`: Missing or invalid credentials. A read-only token gets this response too.
- `402`: The card was declined (`detail.error_type` is `payment_failed`), or the plan has an unpaid invoice (`past_due`).
- `403`: You aren't the workspace owner, a payment dispute is open on the workspace, or the plan you chose isn't available to you.
- `404`: Wix billing isn't available to your account yet.
- `409`: Another plan change is already scheduled (`detail.error_type` is `downgrade_not_allowed`).
- `422`: Validation Error
- `429`: Rate limit exceeded. The base rate limit is 10 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 66 revisions in range; 1 not diffed.

- **2026-10-26** `395a6758864a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/billing/dynamic-offering/update-subscription/post.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/d877a932dc19?raw)
