Commet
  • Pricing
Log InTry out
Introduction

Quickstart

Integrate with Next.jsIntegrate with RemixIntegrate with NuxtIntegrate with SvelteKitIntegrate with AstroIntegrate with ExpressIntegrate with HonoIntegrate with Bun

Learn

Resources

SDK ReferenceAPI VersioningError HandlingTestingCLI

Plugins

Better Auth
System status
DocumentationKnowledge BaseBuild with AIAPI ReferenceWebhooks

Integrate with Hono

Add billing and payments to your Hono application.

Install the Commet Skill so your coding agent can integrate the current SDK and verify its work against the live API contract.

npx skills add commet-labs/skills --skill commet

Install

pnpm add @commet/node hono
npm install @commet/node hono
bun add @commet/node hono

Configure

.env
COMMET_API_KEY=ck_sandbox_xxx
src/commet.ts
import { Commet } from '@commet/node'

export const commet = new Commet({
  apiKey: process.env.COMMET_API_KEY!,
})

Subscribe

src/routes/billing.ts
import { Hono } from 'hono'
import { commet } from '../commet'

const billing = new Hono()

billing.post('/subscribe', async (c) => {
  const { customerId, email } = await c.req.json()

  await commet.customers.create({ email, id: customerId })

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

  return c.json({ checkoutUrl: subscription.checkoutUrl ?? null })
})

export default billing

Check Access

src/routes/billing.ts
billing.get('/subscription/:customerId', async (c) => {
  const subscription = await commet.subscriptions.getActive({ customerId: c.req.param('customerId') })

  if (!subscription) {
    return c.json({ error: 'no_active_subscription' }, 404)
  }

  return c.json({ status: subscription.status })
})

billing.get('/features/:feature/:customerId', async (c) => {
  const access = await commet.featureAccess.get({
    code: c.req.param('feature'),
    customerId: c.req.param('customerId'),
  })

  return c.json({ allowed: access.allowed })
})

Track Usage

src/routes/billing.ts
billing.post('/usage', async (c) => {
  const { customerId } = await c.req.json()

  await commet.usage.track({
    customerId,
    featureCode: 'api_calls',
    value: 1,
  })

  return c.json({ tracked: true })
})

Usage is aggregated and billed at end of period.

Customer Portal

src/routes/billing.ts
billing.get('/portal', async (c) => {
  const customerId = c.get('customerId')

  const portal = await commet.portal.getUrl({ customerId })

  return c.redirect(portal.portalUrl)
})

Start Server

src/index.ts
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import billing from './routes/billing'

const app = new Hono()

app.route('/billing', billing)

serve({ fetch: app.fetch, port: 3000 })
src/index.ts
import { Hono } from 'hono'
import billing from './routes/billing'

const app = new Hono()

app.route('/billing', billing)

export default app

Related

  • Subscriptions
  • Track Usage
  • Customer Portal
  • SDK Reference

How is this guide?

Integrate with Express

Add billing and payments to your Express application.

Integrate with Bun

Add billing and payments to your Bun application.

On this page

Install
Configure
Subscribe
Check Access
Track Usage
Customer Portal
Start Server
Related