A one-time price charges the customer once at checkout and never bills again for the plan base. Use it for lifetime deals or any plan where recurring billing doesn’t apply.
This page covers one-time charges billed as a plan. To charge a customer once with no subscription or plan — a standalone invoice with tax and receipt — use Accept One-Time Payments instead.
Configure in the dashboard
In the dashboard, go to Plans, edit a plan, and add a price with interval One-time (lifetime). You can combine one-time prices with recurring intervals on the same plan — each price has its own interval.Create a one-time subscription
- TypeScript
- Python
- Go
- Java
- PHP
- cURL
billingInterval must be one_time and the plan must have a one-time price configured. If the plan’s default price is already one-time, you can omit the billingInterval parameter.
Invoicing
The initial invoice includes the plan base price as a one-time charge. After that, subsequent billing cycles only generate invoices for overage — the plan base is never charged again.
If there’s no overage or additional charges at a billing cycle, no invoice is generated.
Customer portal
In the Customer Portal, one-time subscriptions display the interval as Lifetime. The cancel button is hidden since cancellation is not allowed. Customers can still change plans if the plan belongs to a Plan Group.Sell a period without renewal
To sell a month, a year, or any period of access that ends on its own, create the subscription on a recurring price withcancelAtPeriodEnd: true. The customer pays once at checkout, and the subscription ends after the paid period without renewing with any payment method.
prepaidPeriods. Pay in Advance explains how each period is priced.
- The cancellation is scheduled from creation: the response already shows
cancelAtPeriodEnd: trueandcancellationbefore the customer pays. - The purchase keeps ending even if the customer saves a card through a payment method update link, and the Customer Portal doesn’t offer Keep subscription for it.
- Free trials don’t combine with it:
customTrialDaysabove0returns400and the price’s trial is skipped. - When the purchase ends, Commet emits
subscription.canceled.
POST /v1/subscriptions/{id}/uncancel. If the customer paid with a method Commet can’t charge again, such as OXXO, and has no saved card, the request returns 409 subscription_uncancel_failed.