Install the Commet v8 to v9 migration skill so your coding agent can remove Offer price bindings, update Market paths, and verify subscription Offer Applications.
npx skills add commet-labs/skills --skill migrate-commet-v8-to-v9API 2026-07-31 and SDKs v9 finish the model introduced in v8: an Offer is now the reusable economic agreement itself, independent from the plan and the channel that distributes it.
Offers define terms, channels define selection
Create one Offer without purpose or planPriceIds:
const launchOffer = await commet.offers.create({
name: 'Launch sequence',
phases: [
{ type: 'free_trial', durationDays: 14 },
{ type: 'percentage', durationCycles: 3, percentage: 5000 },
{ type: 'percentage', durationCycles: null, percentage: 2000 },
],
})Then choose how customers receive it:
| Channel | Selection behavior |
|---|---|
| Introductory | Attach a compatible Offer to one base price in the Dashboard for automatic eligible-customer selection |
| Promotional | Pass any compatible Offer directly with offerId |
| Promo Code | Reference a single percentage or amount_off Offer from a customer-entered code |
Trials are free_trial Offer phases. A direct Offer can combine a trial with multiple paid phases; a Promo Code remains intentionally limited to one discount phase.
Accepted terms are explicit
Subscription responses expose immutable Offer Applications with their accepted phases, source, and target under appliesTo. The response can represent plan_price, addon, and credit_pack targets without another breaking shape change. Current public subscription channels create plan_price applications.
Editing or archiving the catalog Offer changes future applications only.
Markets move to Sales
Markets are no longer nested under Pricing in the v9 API and SDK:
const argentina = await commet.markets.create({
name: 'Argentina',
countryCodes: ['AR'],
})The REST surface is now:
POST /markets
GET /markets
GET /markets/{id}
PATCH /markets/{id}
DELETE /markets/{id}Plan-price inputs still use marketGroupId when assigning Market-specific prices. Only the Market resource path and SDK namespace changed.
CLI
CLI v5 mirrors the new v9 SDK resources:
commet offers create --name "Launch" --phases '[{"type":"percentage","percentage":2500,"durationCycles":3}]'
commet markets create --name "Argentina" --country-codes '["AR"]'
commet markets listRemove --purpose and --plan-price-ids from Offer commands. Replace commet pricing *-market-group commands with commet markets create|list|get|update|delete.
Migration and compatibility
| v8 | v9 |
|---|---|
Offer purpose | Distribution channel |
Offer planPriceIds | Intro placement, direct offerId, or Promo Code |
/pricing/market-groups | /markets |
commet.pricing.*MarketGroup | commet.markets.* |
| Legacy subscription offer fields | Target-aware Offer Applications |
API 2026-07-24 and SDK v8 remain available at their existing routes and shapes. The compatibility transform lives at the API-version boundary; the internal model and v9 surface use independent Offers.
See Offers, Markets and Regional Pricing, Manage Subscriptions, and API versioning.