Launch a new Bundle.
From draft composition to a purchasable, fully-priced plan — with the publish-gap check standing between you and a subscription that can’t resolve a price.
01Start from published Modules
A Bundle composes Modules, so the Modules come first — each with its tiers, feature flags, and Variable Component refs already published. If a capability the new plan needs doesn't exist yet, publish that Module before touching the bundle.
02Compose the Bundle as a draft
Catalog → Bundles → New. Pin the Module versions the plan includes, add any bundle-level feature flags (say, priority-support on Enterprise only), attach extra Variable Components that only this plan carries, and choose the billing periods it can be sold on. Everything stays in Draft — nothing is purchasable yet.
03Ship a price in every currency you sell in
Set the bundle's base price, then make sure every Variable Component reachable from the bundle resolves to a price in every supported currency — a Global default is usually enough, with a bundle-scope override where this plan prices a component differently (setBundleComponentPrice, optionally per region and per billing term).
04Run the publish-gap check
publishGapCheck renders a per-component, per-currency coverage matrix for the draft. isPublishable is true exactly when no row has a missing currency — a component with no resolvable EUR price will fail EUR subscriptions later, so this gate is not optional.
05Publish
publishBundleDraftVersion validates the price chain and freezes the draft as an immutable new version. Existing subscriptions are untouched — they keep the version they pinned. The new version is what new subscriptions will pin from now on.
06Sell it
Create a subscription against the new bundle (createSubscriptionWithPricing) — it pins the bundle version, freezes the base price in the customer's currency, and emits a CREATED lifecycle event. If existing customers should move onto the new plan, that's a migration — see the versioning guide.