A production-ready cancel flow for React. Open source. Optionally connects to Churnkey for analytics and AI-powered retention.
| Package | Description |
|---|---|
@churnkey/react |
The cancel flow. Drop-in component, headless hook, or core state machine. React 18 and 19. |
@churnkey/node |
Server-side token generation. Only needed if Churnkey is handling billing actions for you, or if you're using the hosted embed. |
@churnkey/mcp |
Model Context Protocol server. Lets Claude, Cursor, and other AI agents query your Churnkey data (sessions, analytics, DSR) using a Data API key. |
npm install @churnkey/reactimport { CancelFlow } from '@churnkey/react'
import '@churnkey/react/styles.css'
<CancelFlow
steps={[
{
type: 'survey',
title: 'Why are you leaving?',
reasons: [
{
id: 'expensive',
label: 'Too expensive',
offer: { type: 'discount', couponId: 'STRIPE_SAVE20', percentOff: 20, durationInMonths: 3 },
},
{ id: 'not-using', label: 'Not using it enough', offer: { type: 'pause', months: 2 } },
{ id: 'missing', label: 'Missing features' },
],
},
{ type: 'feedback', title: 'Anything else?' },
{ type: 'confirm' },
]}
handleDiscount={async (offer) => myBilling.applyCoupon(offer.couponId)}
handlePause={async (offer) => myBilling.pause({ months: offer.months })}
handleCancel={async () => myBilling.cancel()}
onClose={() => setOpen(false)}
/>@churnkey/react— full API reference, customization, headless usage, custom step types@churnkey/node—createTokenandauthHash@churnkey/mcp— MCP server for Claude / Cursor / Claude Desktop- Create a free Churnkey account — get an
appIdfor analytics - churnkey.co — dashboard, hosted embed, AI retention features
sdk/
├── packages/
│ ├── react/ @churnkey/react
│ ├── node/ @churnkey/node
│ └── mcp/ @churnkey/mcp
├── apps/
│ └── playground/ internal dev playground
└── scripts/ release + tooling helpers
pnpm install
pnpm --filter @churnkey/react build
pnpm --filter @churnkey/react testTo work against the playground:
pnpm --filter @churnkey/react dev # rebuilds on change
pnpm --filter @churnkey/playground dev # runs the playground appMIT