stripekit — your Stripe account, in one file | stripekit
// the create-next-app of Stripe<br>Your Stripe account,<br>in one file.<br>Declare your catalog in stripe.config.ts. stripekit sets up your Stripe account to match — and gives you billing code you own.<br>Get started$ npx stripekit init⧉<br>MIT · early v0.2·Next.js scaffold·vs other tools
stripekit push<br>$ stripekit push<br>Plan: 3 to create, 1 to replace, 0 to destroy
+ product Pro<br>+ price pro_monthly $20.00 / month<br>~ price pro_yearly $192 → $160 / year (replace)<br>+ webhook /api/stripe/webhook 12 events<br>+ portal cancellations, plan switching
Apply these changes? › yes<br>✓ Applied in 1.4s — account matches config▍
// zero to paid<br>Three commands, start to finish.<br>01$ stripekit init<br>Scaffold stripe.config.ts and correct-by-construction billing code into your Next.js app.
02$ stripekit plan<br>Preview a terraform-style diff of every product, price, and webhook change — before anything moves.
03$ stripekit push<br>Create the products, prices, webhook endpoint, and portal. Idempotent — run it twice, nothing breaks.
// your catalog, as code<br>One file is the source of truth.<br>Change an amount and run push — stripekit mints the new price, moves the lookup key onto it, and archives the old one. Your checkout code never changes, because it references the stable lookup key, not a price ID.<br>Prices replaced, never mutated<br>Removals archived, never deleted<br>The same file targets test and live
stripe.config.ts<br>import { defineConfig } from 'stripekit'
export default defineConfig({<br>products: {<br>pro: {<br>name: 'Pro',<br>prices: {<br>monthly: { amount: 2000, interval: 'month' },<br>yearly: { amount: 19200, interval: 'year' },<br>},<br>features: { seats: 5, projects: 'unlimited' },<br>},<br>},<br>portal: { cancellations: true, planSwitching: true },<br>webhooks: { path: '/api/stripe/webhook' },<br>})
// why teams pick it<br>Correct by construction.<br>Your Stripe, not ours<br>Not a merchant of record. Not a hosted control plane. State lives in your own database — there's nothing to depend on at runtime.
Webhooks that can't corrupt state<br>The generated handler verifies signatures, dedupes events, and funnels everything through one sync function — so out-of-order delivery can't wreck you.
Idempotent & immutable-safe<br>Prices are replaced, never mutated. Removals are archived, never deleted. Apply a plan, re-plan, and you get zero changes.
One config, test & live<br>The same file targets both modes. push --live promotes your catalog — which is what kills test/live drift for good.
// or hand it to your agent<br>Same tool. One click for your agent.<br>No wrapper, no glue code. stripekit runs as an MCP server, so your coding agent calls plan / push / pull / check directly — and can't hallucinate a webhook handler.<br>Published to the MCP registry as io.github.rafaelcg/stripekit. Full setup →
Add to Cursor Claude Code<br>/plugin marketplace add rafaelcg/stripekit<br>/plugin install stripekit@stripekit-marketplace ⧉