Commet
  • Pricing
Log InTry out
Introduction

Quickstart

Learn

Manage PlansConfigure FeaturesConsumption ModelsAdd-onsCredit PacksPromo CodesPlan GroupsRegional PricesOne-Time PaymentsTrial PeriodsIntroductory Offers

Resources

SDK ReferenceAPI VersioningError HandlingTestingCLI

Plugins

Better Auth
DocumentationKnowledge BaseBuild with AIAPI ReferenceWebhooks

Trial Periods

Offer free trials on paid plans in Commet with automatic billing when the trial ends.

A trial period lets customers use your product before being charged. Configure trial days on a plan and every new subscription gets a trial automatically.

Trial components

ComponentDescriptionExample
Trial DaysFree trial duration before billing7, 14, 30
Per IntervalEach billing interval can have different trial daysMonthly: 14 days, Yearly: 30 days
Skip TrialBypass trial for specific customers via SDKskipTrial: true

Configure trial days in the dashboard

In the dashboard, go to Plans, edit a plan, and set Trial Days on each price interval. Trial days are configured per plan price, not per customer. Each interval (monthly, quarterly, yearly) can have its own trial duration. Free plans cannot have trials.

Create a subscription with trial

No code changes needed to enable trials. The subscription starts in trialing status automatically when the plan has trial days configured.

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

// data.status → 'trialing'
// data.trialEndsAt → '2026-01-15T00:00:00.000Z'
redirect(data.checkoutUrl)
response = commet.subscriptions.create(
    customer_id='user_123',
    plan_code='pro',
)

# response.data['status'] → 'trialing'
# response.data['trial_ends_at'] → '2026-01-15T00:00:00.000Z'
redirect(response.data['checkout_url'])
result, err := client.Subscriptions.Create(ctx, &commet.CreateSubscriptionParams{
    CustomerID: "user_123",
    PlanCode:   "pro",
})

// result.Data.Status → "trialing"
// result.Data.TrialEndsAt → "2026-01-15T00:00:00.000Z"
// redirect(result.Data.CheckoutURL)
ApiResponse<Subscription> result = commet.subscriptions().create(
    CreateSubscriptionParams.builder("user_123").planCode("pro").build()
);

// result.getData().getStatus() → "trialing"
// result.getData().getTrialEndsAt() → "2026-01-15T00:00:00.000Z"
// redirect(result.getData().getCheckoutUrl())
$result = $commet->subscriptions->create(
    customerId: 'user_123',
    planCode: 'pro',
);

// $result->data['status'] → 'trialing'
// $result->data['trialEndsAt'] → '2026-01-15T00:00:00.000Z'
redirect($result->data['checkoutUrl']);
curl -X POST https://commet.co/api/subscriptions \
  -H "x-api-key: $COMMET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "user_123",
    "planCode": "pro"
  }'

Skip a trial

const { data } = await commet.subscriptions.create({
  customerId: 'user_123',
  planCode: 'pro',
  skipTrial: true,
})
response = commet.subscriptions.create(
    customer_id='user_123',
    plan_code='pro',
    skip_trial=True,
)
skipTrial := true
result, err := client.Subscriptions.Create(ctx, &commet.CreateSubscriptionParams{
    CustomerID: "user_123",
    PlanCode:   "pro",
    SkipTrial:  &skipTrial,
})
ApiResponse<Subscription> result = commet.subscriptions().create(
    CreateSubscriptionParams.builder("user_123").planCode("pro").skipTrial(true).build()
);
$result = $commet->subscriptions->create(
    customerId: 'user_123',
    planCode: 'pro',
    skipTrial: true,
);
curl -X POST https://commet.co/api/subscriptions \
  -H "x-api-key: $COMMET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "user_123",
    "planCode": "pro",
    "skipTrial": true
  }'

skipTrial is the only way to bypass a plan's trial for a specific customer.

Check trial status

const { data } = await commet.subscriptions.getActive({ customerId: 'user_123' })

if (data.status === 'trialing') {
  const trialEnd = new Date(data.trialEndsAt)
}
response = commet.subscriptions.get_active(customer_id="user_123")

if response.data['status'] == 'trialing':
    trial_end = datetime.fromisoformat(response.data['trial_ends_at'])
result, err := client.Subscriptions.GetActive(ctx, &commet.GetActiveSubscriptionParams{CustomerID: "user_123"})

if result.Data.Status == "trialing" {
    trialEnd, _ := time.Parse(time.RFC3339, result.Data.TrialEndsAt)
    _ = trialEnd
}
ApiResponse<Subscription> result = commet.subscriptions().getActive(GetActiveSubscriptionParams.builder("user_123").build());

if ("trialing".equals(result.getData().getStatus())) {
    Instant trialEnd = Instant.parse(result.getData().getTrialEndsAt());
}
$result = $commet->subscriptions->getActive('user_123');

if ($result->data['status'] === 'trialing') {
    $trialEnd = new DateTime($result->data['trialEndsAt']);
}
curl "https://commet.co/api/subscriptions/active?customerId=user_123" \
  -H "x-api-key: $COMMET_API_KEY"

Learn more

  • How Do Trial Periods Work

Related

  • Manage Plans — Configure trial days on plan prices
  • Manage Subscriptions — Subscribe customers to plans
  • Handle Failed Payments — What happens after trial ends

How is this guide?

One-Time Payments

Sell lifetime access or one-time purchases with a single charge and no recurring billing.

Introductory Offers

Configure automatic discounts on the first billing cycles for new customers in Commet.

On this page

Trial components
Configure trial days in the dashboard
Create a subscription with trial
Skip a trial
Check trial status
Learn more
Related