Combine currency pricing, reusable country Markets, and selectable price variants.
Commet has two complementary pricing layers:
| Layer | Use it for |
|---|---|
| Currency Pricing | Define plan, balance, and overage values in one presentment currency |
| Markets | Group countries that should resolve explicit price and currency overrides |
Currency Pricing remains the fallback. Add Markets when country segmentation or selectable variants require it.
A Market is a top-level Sales resource. It does not require a plan or price.
const argentina = await commet.markets.create({
name: 'Argentina',
countryCodes: ['AR'],
})
const southernCone = await commet.markets.create({
name: 'Southern Cone',
countryCodes: ['BO', 'PY', 'UY'],
})Countries can belong to only one active Market. The v9 REST paths are /markets and /markets/{id}.
The base amount remains the fallback for every country without a Market override.
const basePrice = await commet.plans.addPrice({
id: 'pln_pro',
billingInterval: 'monthly',
price: 4900,
isDefault: true,
marketPrices: [
{ marketGroupId: argentina.id, currency: 'ars', price: 6490000 },
{ marketGroupId: southernCone.id, currency: 'usd', price: 3900 },
],
})At checkout, Commet resolves the Market from the request country. Sandbox checkout lets you change Country to test another Market; live checkout ignores that override.
A variant inherits one base price and overrides only Markets already configured on that base:
const foundingCustomers = await commet.plans.addPrice({
id: 'pln_pro',
billingInterval: 'monthly',
inheritsFromPriceId: basePrice.id,
metadata: { name: 'Founding customers' },
marketPrices: [
{ marketGroupId: argentina.id, currency: 'ars', price: 3990000 },
],
})Pass priceId only when the customer deliberately selects that variant:
await commet.subscriptions.create({
customerId: 'user_123',
planCode: 'pro',
priceId: foundingCustomers.id,
})Omitting priceId keeps normal default-price and Market resolution.
Accepted Offer phases are a separate immutable snapshot; the selected catalog price remains editable.
API 2026-07-24 and SDK v8 keep /pricing/market-groups and commet.pricing.*. API 2026-07-31 and SDK v9 use the top-level Market surface.
How is this guide?