Add-ons
Offer optional features customers can activate on their subscriptions for an additional price.
Add-ons are optional features with their own price and consumption model that customers activate on their subscriptions. They extend a subscription without modifying the base plan — think SSO, SMS channels, or premium support.
How add-ons work
| Aspect | Description |
|---|---|
| Pricing | Fixed base price per billing period, prorated on activation |
| Charge on activation | Immediate charge for remaining days in current period |
| Recurring billing | Base price added to the plan's invoice each cycle |
| Deactivation | No refund — the feature stops immediately |
| Feature access | The add-on's feature appears alongside plan features |
Each add-on maps to exactly one feature. When activated, that feature becomes available through features.get, features.check, and features.list — no different from a plan feature.
Consumption models
Add-ons declare their own consumption model. Boolean add-ons are compatible with any plan. All other models require matching the plan's model.
| Model | Description | Compatible Plans | Example |
|---|---|---|---|
| Boolean | Unlocks access, no usage tracking | All plans | SSO, HIPAA compliance |
| Metered | Included units + overage at period end | Metered plans | SMS: 1000 included, $0.03/extra |
| Credits | Usage consumes from the plan's credit pool | Credits plans | AI summaries: 5 credits/use |
| Balance | Usage deducts from the plan's balance pool | Balance plans | Image processing: $0.015/unit |
Credits and balance add-ons consume from the plan's shared pool — there's no separate pool for the add-on. If the pool runs out, the add-on's feature is blocked too.
Create add-ons in the dashboard
Go to Add-ons and click Create Add-on. Configure the name, base price, feature, and consumption model. For metered add-ons, set included units and overage rate. For credits, set the credit cost per unit.
The feature dropdown only shows features not already assigned to another add-on. Once created, the add-on is available to any customer whose plan is compatible.
Availability by subscription status
Add-ons can be activated on any subscription with a payment method:
| Status | Can activate add-ons |
|---|---|
| Active | Yes |
| Trialing | Yes — card was captured during trial checkout |
| Free plan | Yes — first purchase prompts for a payment method |
Manage add-ons
Add-ons are managed through the dashboard and the customer portal. Activation and deactivation are not available via the API or SDK.
| Action | Where |
|---|---|
| Create / archive add-ons | Dashboard → Add-ons |
| Activate / deactivate | Dashboard (subscription detail) or Customer Portal |
| List active add-ons | API, Dashboard, or Customer Portal |
Feature access
Add-on features work exactly like plan features — no special handling needed:
const customer = commet.customer('user_123')
// Check boolean add-on
const sso = await customer.features.get('sso')
// { access: true, type: 'boolean', enabled: true }
// Track metered add-on usage
await customer.usage.track('sms_messages', 50)
// List all features (plan + add-ons combined)
const features = await customer.features.list()customer = commet.customer('user_123')
# Check boolean add-on
sso = customer.features.get('sso')
# { 'access': True, 'type': 'boolean', 'enabled': True }
# Track metered add-on usage
customer.usage.track('sms_messages', value=50)
# List all features (plan + add-ons combined)
features = customer.features.list()customer := client.Customer("user_123")
// Check boolean add-on
sso, _ := customer.Features.Get(ctx, "sso")
// sso.Data.Access == true, sso.Data.Type == "boolean"
// Track metered add-on usage
customer.Usage.Track(ctx, "sms_messages", commet.WithValue(50))
// List all features (plan + add-ons combined)
features, _ := customer.Features.List(ctx)CustomerContext customer = commet.customer("user_123");
// Check boolean add-on
ApiResponse<Feature> sso = customer.features().get("sso");
// sso.getData().isAccess() == true
// Track metered add-on usage
customer.usage().track(
TrackParams.builder("sms_messages").value(50).build()
);
// List all features (plan + add-ons combined)
ApiResponse<List<Feature>> features = customer.features().list();$customer = $commet->customer('user_123');
// Check boolean add-on
$sso = $customer->features->get('sso');
// [ 'access' => true, 'type' => 'boolean', 'enabled' => true ]
// Track metered add-on usage
$customer->usage->track('sms_messages', value: 50);
// List all features (plan + add-ons combined)
$features = $customer->features->list();# Check boolean add-on
curl "https://commet.co/api/features/sso?customerId=user_123" \
-H "x-api-key: $COMMET_API_KEY"
# Track metered add-on usage
curl -X POST https://commet.co/api/usage/events \
-H "x-api-key: $COMMET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"feature": "sms_messages",
"customerId": "user_123",
"value": 50
}'
# List all features (plan + add-ons combined)
curl "https://commet.co/api/features?customerId=user_123" \
-H "x-api-key: $COMMET_API_KEY"Billing behavior
Activation charge
When a customer activates a $50/month add-on on day 11 of a 31-day period (20 days remaining):
| Value | |
|---|---|
| Full price | $50.00 |
| Prorated | $50 × (20/31) = $32.26 |
| Invoice type | addon_activation |
The charge goes through Stripe immediately with its own invoice.
Recurring invoices
Starting from the next full billing cycle, the add-on base price appears as a separate line in the plan's invoice:
Plan Pro (base) $99.00
API Calls: 12,500 (2,500 overage × $0.01) $25.00
Add-ons
SMS Channel (base) $15.00
SMS: 1,800 (800 overage × $0.03) $24.00
SSO $50.00
Subtotal $213.00Multi-currency
Add-on prices are defined in USD. For non-USD subscriptions, the price is converted using the plan's exchange rate — the same mechanism used for plan base prices.
Customer portal
Customers can self-service add-ons from the portal:
- Available add-ons — see compatible add-ons with pricing
- Activate — confirmation dialog with prorated charge preview
- Active add-ons — manage active add-ons
- Deactivate — instant, no refund
Add-ons whose feature already exists in the customer's plan are hidden from the portal automatically.
Learn more
Related
- Consumption Models — Metered, Credits, and Balance explained
- Configure Features — Define features that add-ons can unlock
- Credit Packs — Another way to extend plan capabilities
- Manage Subscriptions — Subscription lifecycle and management
- Customer Portal — Where customers activate add-ons
How is this guide?