• Pricing
  • Blog
Log inBook a demo

Independent Offers & Markets

Build reusable Offer terms without price bindings, distribute them through explicit channels, and manage Markets as a top-level Sales resource with API 2026-07-31 and SDKs v9.

D
Decker Urbano·@0xDecker·July 31, 2026
Changelog

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-v9

API 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:

ChannelSelection behavior
IntroductoryAttach a compatible Offer to one base price in the Dashboard for automatic eligible-customer selection
PromotionalPass any compatible Offer directly with offerId
Promo CodeReference 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 list

Remove --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

v8v9
Offer purposeDistribution channel
Offer planPriceIdsIntro placement, direct offerId, or Promo Code
/pricing/market-groups/markets
commet.pricing.*MarketGroupcommet.markets.*
Legacy subscription offer fieldsTarget-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.

Subscription billing built for developers and agents

Get startedBook a demo

Accept global payments, handle usage-based pricing, subscriptions, and seats — without building your own infrastructure.

Status unavailable

Frameworks

  • Next.js
  • Remix
  • Nuxt
  • SvelteKit
  • Astro
  • Express
  • Hono
  • Django
  • FastAPI

Resources

  • Documentation
  • Guides
  • Blog
  • Templates
  • Changelog
  • Glossary
  • Billing for AI models

Company

  • Solutions
  • About
  • Open Source

Compare

  • Stripe Billing
  • Orb
  • Chargebee
  • Lago
  • Autumn
  • Yuno

AI

  • Commet Agents
  • MCP Server
  • Skills
  • Claude Code
  • Codex
  • Cursor
Follow us
© 2026 Commet Co.TermsPrivacy PolicyCookie Policy