---
title: "Upsert billing product plan"
method: PUT
path: "/plans/{plan_id}/billing_products"
tags: ["plans"]
---

# Upsert billing product plan

`PUT /plans/{plan_id}/billing_products`

## Path parameters

- `plan_id` string, required

## Request body

- UpsertBillingProductRequestBody
  - `billing_product_id` string, nullable
  - `billing_strategy` 'schematic_managed' | 'provider_managed' | 'no_billing'
  - `charge_type` 'free' | 'none' | 'one_time' | 'recurring', required
  - `currency` string, nullable
  - `currency_prices` PlanCurrencyPriceRequestBody[], nullable
    - `currency` string, required
    - `monthly_price` integer, nullable
    - `one_time_price` integer, nullable
    - `quarterly_price` integer, nullable
    - `yearly_price` integer, nullable
  - `is_trialable` boolean, required
  - `monthly_price` integer, nullable
  - `monthly_price_id` string, nullable
  - `one_time_price` integer, nullable
  - `one_time_price_id` string, nullable
  - `quarterly_price` integer, nullable
  - `quarterly_price_id` string, nullable
  - `trial_days` integer, nullable
  - `yearly_price` integer, nullable
  - `yearly_price_id` string, nullable

## Response `200`

OK

- object
  - `data` BillingProductPlanResponseData, required
    - `account_id` string, required
    - `billing_product_id` string, required
    - `billing_strategy` 'schematic_managed' | 'provider_managed' | 'no_billing', required
    - `charge_type` 'free' | 'none' | 'one_time' | 'recurring', required
    - `controlled_by` 'metronome' | 'orb' | 'schematic' | 'stripe', required
    - `environment_id` string, required
    - `is_trialable` boolean, required
    - `monthly_price_id` string, nullable
    - `one_time_price_id` string, nullable
    - `plan_id` string, required
    - `trial_days` integer, nullable
    - `yearly_price_id` string, nullable
  - `params` object, required — Input parameters

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `500` — Server error

## Changes

- **2026-06-05** `c0d7b479cd11` — 1 warning
  - added the new `metronome` enum value to the `data/controlled_by` response property for the response status `200`
- **2026-05-19** `9f854e7c7b1c` — 1 warning, 3 info
  - added the new `none` enum value to the `data/charge_type` response property for the response status `200`
  - added the new optional request property `billing_strategy`
  - added the new `none` enum value to the request property `charge_type`
  - added the required property `data/billing_strategy` to the response with the `200` status

[Change history](https://skmtc.dev/schematichq/apis/schematic-api/changes/plans/:plan_id/billing_products/put.md)

---

[API](https://skmtc.dev/schematichq/apis/schematic-api.md) · [All operations](https://skmtc.dev/schematichq/apis/schematic-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/schematichq/schematic-api/revisions/0b238e148fa1/schema)
