Commet
  • Pricing
Log InTry out

Plans and features structure

We simplified how plans are created and added feature-availability checks for every customer

G
Guido Irigoyen·@guidooirigoyen·December 11, 2025
Changelog

When we started Commet, we made a few decisions optimized purely for time-to-market.

One of them was our original model: Events → Products → Subscriptions.

It's the default model for classic PSPs (Stripe, Lemon Squeezy, Nuvei, etc.). It makes sense for their era and for the type of customers they were built for.

But it didn't make sense for our users.

Commet powers subscriptions for AI and SaaS tools with usage-based pricing. So we rebuilt the model from the ground up.

(Decker, our CTO, wrote a deep-dive on this change if you want the full reasoning.)

New Entities

This redesign introduced two entities we didn't have before:

  • Features
  • Plans

Features

Features are the atomic building blocks of a pricing model. They represent capabilities a user can access:

  • Boolean features: Custom Branding, SSO, API Access
  • Metered features: API Calls, Emails Sent, Storage Used
  • Seat features: Team Members, Admin Users, Editor Seats

Plans

Plans are reusable bundles of features with a price per billing period. You can assign the same plan to N customers without redefining anything.

A subscription now exists only as the result of assigning a Plan to a Customer.

The new model is: Features → Plans → Subscriptions

Plans and features demonstration

SDK Changes

Features

The Feature model lets us:

Check whether a specific user has access to a feature

const { data } = await commet.features.canUse('team_members', 'user_123')

if (!data.allowed) {
  return { error: 'Upgrade to add more members' }
}

if (data.willBeCharged) {
  // Show overage confirmation
}

Check usage and remaining availability for any metered feature

const feature = await commet.features.get('team_members', 'user_123')

Subscriptions

To create a subscription, you now pass the plan code directly into the subscription method.

const subscription = await commet.subscriptions.create({
  customerId: 'user_123',
  planCode: 'pro',
})

redirect(subscription.data.checkoutUrl)

Conclusion

We can now support our users' pricing models much more effectively.

Plans are easier to create, easier to manage, and scale cleanly as your product grows.

Developers

  • Documentation
  • Templates
  • GitHub

Frameworks

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

Resources

  • Blog
  • Changelog
  • Pricing

AI

  • Agents
  • MCP Server
  • Agent Skills
  • Claude Code
  • Codex

Learn

  • Guides
  • Glossary
  • Solutions
  • Billing for AI Models
  • Comparison

Company

  • About
  • Open Source
  • Terms
  • Privacy
XLinkedInGitHub