Skip to main content
skill CX Codex

convex-billing — Claude Code skill: what it does, how to install

Adds Stripe payments and subscriptions to a Convex app using @convex-dev/stripe with checkout sessions, webhooks, and subscription gating.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add convex/agent-skills --skill convex-billing -a claude-code
Open on GitHub

What convex-billing does

The skill configures Stripe billing in Convex via the @convex-dev/stripe package. It mounts the component in convex/convex.config.ts and registers the webhook route inside convex/http.ts. It also generates checkout and subscription-gating logic in convex/billing.ts.

Webhook signature verification runs internally inside the component, so manual constructEvent calls are unnecessary. Access gating relies on the isSubscribed server query reading component tables directly. You need STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET stored in Convex environment variables.

Convex bundler strictly requires importing from @convex-dev/stripe/convex.config.js with the .js extension. An import with .ts will break the build.

What it helps with

  • integrate Stripe subscription checkouts into Convex
  • handle Stripe webhooks with automatic signature verification
  • gate backend features using server-side subscription queries
  • map Convex user identities to Stripe customer records

Example prompts for the agent

  • Set up Stripe billing in my Convex project using convex-billing
  • Add subscription checkout and webhook verification to Convex
  • Create the isSubscribed gating query with convex-billing

How to install convex-billing

1Skills CLI (Vercel)

npx skills add convex/agent-skills --skill convex-billing -a claude-code

2Manually: put the files in place

~/.claude/skills/convex-billing/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/convex-billing/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about convex-billing

How to install convex-billing in Claude Code?

Run npx skills add convex/agent-skills --skill convex-billing -a claude-code.

What does convex-billing do?

It configures the @convex-dev/stripe component, registers an HTTP webhook endpoint, and adds checkout actions alongside server queries to check subscription status.

Which environment variables are required?

You must store STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET in your Convex environment variables.

Source text

SKILL.md · Apache-2.0
---
name: convex-billing
description: "Add Stripe billing/payments to the Convex app via @convex-dev/stripe (checkout + webhook + gating)."
---

<!-- GENERATED from convex-agents content/capabilities/billing.json — do not edit by hand. -->

# Add billing / payments

Wire Stripe to Convex using @convex-dev/stripe: a checkout action, an httpAction webhook registered by the component (signature-verified automatically), subscription state stored in the component's tables, and server-side gating via a query.

## Workflow

1. Install the component: `npm install @convex-dev/stripe`.
2. Create `convex/convex.config.ts`:
   ```ts
   import { defineApp } from 'convex/server';
   import stripe from '@convex-dev/stripe/convex.config.js';
   const app = defineApp();
   app.use(stripe);
   export default app;
   ```
3. Store Stripe keys in Convex env (use the `env` micro power): `STRIPE_SECRET_KEY` (sk_test_… / sk_live_…) and `STRIPE_WEBHOOK_SECRET` (whsec_…).
4. Create `convex/http.ts` to register the webhook route (the component handles signature verification automatically):
   ```ts
   import { httpRouter } from 'convex/server';
   import { components } from './_generated/api';
   import { registerRoutes } from '@convex-dev/stripe';
   const http = httpRouter();
   registerRoutes(http, components.stripe, { webhookPath: '/stripe/webhook' });
   export default http;
   ```
5. Create `convex/billing.ts` with a checkout action and a subscription-gate query:
   ```ts
   import { action, query } from './_generated/server';
   import { components } from './_generated/api';
   import { StripeSubscriptions } from '@convex-dev/stripe';
   import { v } from 'convex/values';
   const stripeClient = new StripeSubscriptions(components.stripe, {});
   export const createSubscriptionCheckout = action({
     args: { priceId: v.string() },
     returns: v.object({ sessionId: v.string(), url: v.union(v.string(), v.null()) }),
     handler: async (ctx, args) => {
       const identity = await ctx.auth.getUserIdentity();
       if (!identity) throw new Error('Not authenticated');
       const customer = await stripeClient.getOrCreateCustomer(ctx, { userId: identity.subject, email: identity.email, name: identity.name });
       return await stripeClient.createCheckoutSession(ctx, { priceId: args.priceId, customerId: customer.customerId, mode: 'subscription', successUrl: `${process.env.SITE_URL ?? 'http://localhost:3000'}/?success=true`, cancelUrl: `${process.env.SITE_URL ?? 'http://localhost:3000'}/?canceled=true`, subscriptionMetadata: { userId: identity.subject } });
     },
   });
   export const isSubscribed = query({
     args: {},
     returns: v.boolean(),
     handler: async (ctx) => {
       const identity = await ctx.auth.getUserIdentity();
       if (!identity) return false;
       const subscriptions = await ctx.runQuery(components.stripe.public.listSubscriptionsByUserId, { userId: identity.subject });
       return subscriptions.some((sub) => sub.status === 'active' || sub.status === 'trialing');
     },
   });
   ```
6. Run `npx convex dev --once` — it will install the component and push the functions. Verify output shows `✔ Installed component stripe.`
7. In Stripe Dashboard → Webhooks: add endpoint `https://<deployment>.convex.site/stripe/webhook`, subscribe to `checkout.session.completed`, `customer.subscription.*`, `invoice.*`, `payment_intent.*`. Copy the signing secret as `STRIPE_WEBHOOK_SECRET`.

## Rules

- Use @convex-dev/stripe (npm: @convex-dev/stripe@^0.1.4) — it handles webhook signature verification internally via registerRoutes; do NOT write a manual constructEvent webhook.
- Stripe keys live in Convex env (use the `env` micro power): STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET.
- Gate on server-stored subscription state via isSubscribed query (reads component tables), not client claims.
- convex/convex.config.ts must import from '@convex-dev/stripe/convex.config.js' (not .ts) — the .js extension is required by the Convex bundler.

© convex · Apache-2.0 · convex/agent-skills

Similar skills

Everything for Backend and APIs →

From the same set32

convex-env This skill sets and wires Convex deployment environment variables and secrets. Use it when actions need deployment-specific values without putting secrets in code. CX Codex +1 36,000installs convex-seed Populates Convex database tables with sample rows or imports external datasets. Useful when preparing dev environments without manual data entry. CX Codex +1 35,800installs convex-verify convex-verify tests a Convex feature with seeded data, multiple mocked identities, and negative authorization checks. Use it for a specific feature you have built or changed. CX Codex +1 35,800installs convex-monitor This skill blocks on the next event in a Convex app — a dev error, a prod error or a feature request — and hands it to the agent. CX Codex +1 35,800installs convex-domains Walks your agent through DNS records at your registrar, attaching the domain to a Convex app, and rebinding the auth origin. CX Codex +1 35,800installs convex-launch-readiness Runs four Convex audits into one readiness report with a score and an ordered fix plan. Useful when the backend is about to ship and you need to know what to fix first. CX Codex +1 35,900installs convex-explain-app Maps an existing Convex backend using schema and exported functions. It helps you understand data models, public APIs, and auth before making changes. CX Codex +1 35,900installs convex-backup Sets up Convex snapshot exports and runs a restore drill into a throwaway preview, so you find out whether recovery actually works. CX Codex +1 35,900installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor