Bill every price in a plan with one call

Sell a plan's recurring, one-time, and metered prices as one price bundle. When you activate the bundle for a customer, Billing creates the subscriptions, charges the one-time items, attaches the usage meters, and applies the coupons from that one API call.

Define a plan once and bill any customer for it in one request

A software plan can combine a monthly subscription, a one-time setup fee, and metered API usage. When you bill those pieces one at a time, you will need a separate API call for each of them. Once you define the plan as a price bundle, however, Billing bills any customer for every piece of it in a single request.

What you can put in a bundle and change later

Named price bundles

Group subscription prices, one-time charges, and metered usage prices into a bundle with a name and a reference. Each price in the bundle has its own type, amount, and interval, along with a flag that marks it as required or optional.

One-call billing

Billing sets up every price in the bundle for a customer from one API call that names the bundle reference, whether the price is a subscription, a one-time charge, or a usage meter.

Optional items and quantity overrides

Mark a price as optional so that the customer can add or skip that add-on at checkout. For a seat-based or a usage-based item, override the quantity at checkout and keep the same bundle.

Upgrade and downgrade strategies

Move a customer from one bundle to another with the upgrade strategy that you choose, such as replace. Billing replaces the old subscriptions with new ones and credits or charges the prorated difference under the proration_behavior that you set.

Bundle-level coupons

Billing applies a coupon that you attach to a bundle across every price in that bundle, and it applies percentage and fixed-amount coupons alike to recurring and one-time items.

Immutable versioning

Billing saves each edit to a bundle as a new version, while customers on an older version keep paying its prices. When you publish an earlier version, Billing makes it the current version again.

1
API call to bill

Billing creates the subscriptions, invoices, and meters from one request

One bundle
For every price type

Recurring, one-time, and metered prices in one definition

Immutable
Version control

Billing versions each edit and leaves existing customers on their version

Build faster with solutions designed for real-world needs

Bill mixed price types from one bundle definition

Define the Ottermill Pro bundle with the seat subscription, the onboarding fee, the metered API price, and an SSO add-on marked required: false. When a customer completes checkout from the PricingTable component, Billing bills that customer for every required price, along with any add-on that the customer selects.

Impact

In the sample, the admin action defines Ottermill Pro once, with its launch coupon. The pricing page then passes only the entity ID and the bundle reference to PricingTable and sends the customer to the welcome page once checkout completes.

Prompt for a coding agent: Define the Pro bundle with seats, onboarding, metered API, and an optional SSO add-on.

Conjoin IDE

Select a file to view its contents

Upgrade a customer from one bundle to another

Deactivate the customer's current bundle, then activate the new one with the proration behavior that you choose. Billing cancels the old subscriptions, credits the unused time, creates the new subscriptions with proration, and charges any new one-time items.

Impact

When Theodora Markou moves Pinegate Logistics from Starter to Growth, the app deactivates the Starter activation and activates the Growth bundle with prorated charges. The screen then shows the ID of the new activation.

Prompt for a coding agent: Move this customer from the Starter bundle to Growth with prorated charges.

Conjoin IDE

Select a file to view its contents

Change prices for new customers while existing customers keep theirs

When you update a bundle with new prices or items, Billing saves the change as a new version. Existing customers keep their current version while new customers receive the latest one. To roll back, publish an earlier version.

Impact

In the sample, Wrenstone Education refreshes the Wrenstone Team bundle with a new team price and an optional analytics add-on. Billing returns the bundle ID and the time of the update, which the sample logs.

Prompt for a coding agent: Give the Team bundle a new price and an optional analytics add-on for new customers.

Conjoin IDE

Select a file to view its contents

Pre-fill checkout from a bundle reference

Pass a bundle reference to checkout. On the hosted checkout page, Billing fills in every item in the bundle, with a toggle for each optional item and a quantity field for each seat-based item. From your own page, pass the same reference to the checkout call with a quantity override. In both cases, Billing sets up every item in the bundle together when the customer completes checkout.

Impact

In the sample, Greta picks a team size between 1 and 250 editors for Briarchurch Studios. The server function checks that range again before it passes the count to the activate call as the quantity of the editor seat price.

Prompt for a coding agent: Let customers pick from 1 to 250 editor seats, and check that range on the server.

Conjoin IDE

Select a file to view its contents

Build your next app on Conjoin

Conjoin will open with a free Build tier, while the pricing page already lists the launch prices for Pro and Business. If you tell us what you're building, we'll talk you through early access.