1import{_ as ie}from"./BgaZPQza.js";import{_ as Re}from"./CMLDHYo4.js";import{l as Ae,s as x,A as $e,u as Te,c as i,a as e,e as y,b,w as M,F as p,j as h,x as G,G as H,i as n,aV as de,d as m,t as o,o as r,q as c,v as T,aq as I,f as _,n as ce}from"./DWapjPlr.js";import{_ as Pe}from"./DLn4sZoJ.js";import Fe from"./BqNW0L2e.js";import qe from"./DzU6KKzQ.js";import Oe from"./B5qogA4o.js";import C from"./BPlYpZz3.js";/* empty css */import{u as Ie}from"./BhG1XtBR.js";import{u as De,a as We,b as ze}from"./DGWaUM4D.js";import{u as Be}from"./pDz1CjoB.js";import"./7RuT8WPl.js";const Me={class:"relative overflow-hidden pt-24 pb-24 px-5 bg-gray-25"},Ve={class:"absolute inset-0 pointer-events-none"},Ue={class:"relative text-center mx-auto max-w-4xl"},Ee={class:"flex items-center justify-center mt-6 hero-fade-in",style:{"animation-delay":"0.35s"}},Le={class:"py-24 px-5"},Ne={class:"max-w-screen-xl mx-auto"},Ye={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5 mt-16"},Ge={class:"text-lg font-semibold text-gray-900"},He={class:"text-sm sm:text-md text-gray-600 mt-2"},Ke={id:"calculator",class:"scroll-mt-8"},Qe={class:"my-24 px-0 sm:px-6"},Je={class:"max-w-screen-xl mx-auto bg-white border border-gray-100 sm:rounded-xl overflow-hidden shadow-card-container"},Xe={class:"grid grid-cols-1 lg:grid-cols-2"},Ze={class:"px-6 py-8 sm:p-12 space-y-10 lg:border-r border-gray-100"},et={class:"mt-3 flex items-center rounded-lg ring-1 ring-inset ring-gray-200 bg-white px-3 focus-within:ring-gray-300"},tt={class:"mt-3 flex items-center justify-between text-sm font-medium text-gray-500"},st={class:"tabular-nums font-semibold text-gray-900"},at={class:"tabular-nums font-semibold text-gray-900"},ot={class:"px-6 py-8 sm:p-12 bg-gray-25 flex flex-col justify-center"},nt={class:"mt-2 text-6xl font-semibold text-gray-950 tabular-nums"},rt={class:"text-sm sm:text-md text-gray-500 mt-5 leading-relaxed"},lt={class:"mt-8 flex flex-col sm:flex-row items-stretch sm:items-center gap-3"},it={id:"report",class:"my-24 scroll-mt-8"},dt={class:"-mt-4 px-0 sm:px-6 mb-20"},ct={class:"max-w-screen-xl mx-auto bg-white border border-gray-100 sm:rounded-xl overflow-hidden shadow-card-container"},ut={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 md:divide-x divide-y lg:divide-y-0 divide-gray-100"},pt={class:"h-10 w-10 rounded-lg flex items-center justify-center mb-4 bg-yellow-50 ring-1 ring-inset ring-yellow-200"},ht={class:"text-lg font-semibold text-gray-900 mb-2"},mt={class:"text-gray-500"},gt={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 md:divide-x divide-y lg:divide-y-0 divide-gray-100 border-t border-gray-100"},ft={class:"h-10 w-10 rounded-lg flex items-center justify-center mb-4 bg-yellow-50 ring-1 ring-inset ring-yellow-200"},yt={class:"text-lg font-semibold text-gray-900 mb-2"},xt={class:"text-gray-500"},bt={id:"insight",class:"my-24 px-0 sm:px-6 scroll-mt-8"},vt={class:"max-w-screen-xl mx-auto bg-brand-soft-sand border border-gray-200/50 sm:rounded-xl overflow-hidden shadow-card-container px-6 py-8 sm:p-12"},wt={class:"mt-10"},kt={class:"overflow-x-auto ring-1 ring-gray-900/10 rounded-lg bg-white/80 backdrop-blur-sm"},_t={class:"block sm:table-row-group"},Ct={class:"block sm:table-cell px-4 pt-3 pb-1 sm:py-3 text-md text-gray-700"},St={class:"block sm:table-cell px-4 pb-3 pt-0 sm:py-3 sm:border-l border-gray-900/10"},jt={class:"flex flex-wrap items-center gap-x-3 gap-y-1"},Rt={key:0,class:"text-xs font-semibold text-yellow-700 bg-yellow-200 px-2 py-0.5 rounded-full"},At={class:"mt-24 lg:mt-40 mb-24 px-6 2xl:px-12"},$t={class:"max-w-screen-xl mx-auto"},Tt={class:"grid grid-cols-1 md:grid-cols-2 gap-5 mt-16"},Pt=["href"],Ft={class:"text-lg sm:text-xl text-gray-900 font-medium leading-relaxed flex-auto"},qt={class:"mt-6 flex items-center gap-3 border-t border-gray-100 pt-5"},Ot={class:"min-w-0"},It={class:"text-sm font-semibold text-gray-900"},Dt={class:"text-sm text-gray-500 truncate"},Wt={class:"py-24 px-6 2xl:px-12"},zt={class:"max-w-screen-xl mx-auto"},Bt={class:"grid grid-cols-1 lg:grid-cols-2 gap-x-20 gap-y-16 mt-16"},Mt={class:"text-lg font-semibold text-gray-900 flex items-center gap-2"},Vt={class:"text-sm sm:text-md text-gray-500 mt-1"},Ut={class:"mt-6 flex flex-1 flex-col overflow-hidden rounded-2xl border border-gray-100 bg-gray-50"},Et={class:"flex items-center justify-between border-b border-gray-100 bg-gray-25 px-4 py-2"},Lt={class:"hidden sm:inline font-mono text-[11px] text-gray-600"},Nt={class:"relative isolate flex flex-1 items-center justify-center overflow-hidden bg-gray-50 px-6 py-10"},Yt={class:"pointer-events-none absolute inset-0 z-[-1] overflow-hidden","aria-hidden":"true"},Gt=["src"],Ht={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 2 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},Kt={key:1,class:"ck-step ck-step-survey"},Qt={class:"ck-reason-list",role:"radiogroup","aria-label":"Why are you leaving?"},Jt=["aria-checked","onClick"],Xt={"aria-hidden":"true",class:"ck-reason-badge"},Zt={key:0,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none"},es={class:"ck-reason-label"},ts=["disabled"],ss={key:2,class:"ck-step ck-step-feedback"},as={class:"py-24 px-6 2xl:px-12"},os={class:"max-w-screen-xl mx-auto"},ns={class:"grid grid-cols-1 lg:grid-cols-2 gap-x-20 gap-y-16 mt-16"},rs={class:"text-lg font-semibold text-gray-900 flex items-center gap-2"},ls={class:"text-sm sm:text-md text-gray-500 mt-1"},is={class:"relative isolate mt-6 flex flex-1 flex-col overflow-hidden rounded-2xl border border-gray-100 bg-gray-50"},ds={class:"pointer-events-none absolute inset-0 z-[-1] overflow-hidden","aria-hidden":"true"},cs=["src"],us={class:"flex items-center justify-between border-b border-gray-100 bg-gray-25 px-4 py-2"},ps={class:"hidden sm:inline font-mono text-[11px] text-gray-600"},hs={class:"flex justify-center px-4 py-3 sm:overflow-x-auto"},ms={class:"flex w-full flex-col gap-1 rounded-lg bg-white p-1 ring-1 ring-inset ring-gray-200 sm:inline-flex sm:w-auto
2sm:flex-row sm:shrink-0"},gs=["onClick"],fs={class:"grid flex-1 px-6 py-10"},ys={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 3 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},xs={key:1,class:"ck-step ck-step-offer"},bs={class:"ck-step-title"},vs={class:"ck-step-description"},ws={class:"ck-offer-card ck-pause-card"},ks={class:"ck-pause-date"},_s={key:0},Cs={key:1,class:"inline-block w-28","aria-hidden":"true"},Ss={class:"ck-pause-chips"},js=["aria-pressed","onClick"],Rs=["onClick"],As=["onClick"],$s={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 4 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},Ts={key:1,class:"ck-step ck-step-offer"},Ps={class:"ck-step-title"},Fs={class:"ck-step-description"},qs={class:"ck-offer-card"},Os={class:"ck-offer-details ck-plan-grid"},Is=["disabled","aria-pressed","onClick"],Ds={class:"ck-plan-name"},Ws={key:0,class:"ck-plan-current-badge"},zs={class:"ck-plan-price-row"},Bs={class:"ck-plan-amount"},Ms={class:"ck-plan-period"},Vs={key:0,class:"ck-plan-msrp"},Us={class:"ck-plan-features"},Es=["onClick"],Ls=["onClick"],Ns={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 5 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},Ys={key:1,class:"ck-step ck-step-offer"},Gs={class:"ck-step-title"},Hs={class:"ck-step-description"},Ks={class:"ck-offer-card"},Qs={class:"ck-offer-details ck-trial-block"},Js={class:"ck-trial-end-date"},Xs={key:0},Zs={key:1,class:"inline-block w-20","aria-hidden":"true"},ea=["onClick"],ta=["onClick"],sa={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 6 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},aa={key:1,class:"ck-step ck-step-offer"},oa={class:"ck-step-title"},na={class:"ck-step-description"},ra={class:"ck-offer-card"},la=["onClick"],ia=["onClick"],da={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 7 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},ca={key:1,class:"ck-step ck-step-offer"},ua={class:"ck-step-title"},pa={class:"ck-step-description"},ha={class:"ck-offer-card"},ma={class:"ck-offer-rebate"},ga={class:"ck-offer-rebate-row ck-offer-rebate-credit"},fa={class:"ck-offer-rebate-row ck-offer-rebate-total"},ya=["onClick"],xa=["onClick"],ba={class:"ck-cancel-flow",style:{width:"100%","max-width":"440px",background:"var(--ck-color-surface, #fff)","border-radius":"var(--ck-radius-xl, 16px)","box-shadow":`0 10px 15px rgba(12, 10, 9, 0.05), 8 0 4px 6px rgba(12, 10, 9, 0.04)`,padding:"24px 20px 20px"}},va={key:1,class:"ck-step ck-step-offer"},wa={class:"ck-step-title"},ka={class:"ck-step-description"},_a={class:"ck-offer-card"},Ca={class:"ck-offer-details ck-offer-discount"},Sa={class:"ck-offer-discount-phrase"},ja=["onClick"],Ra=["onClick"],Aa={class:"my-24 px-0 sm:px-6"},$a={class:"max-w-screen-xl mx-auto bg-white border border-gray-200/50 sm:rounded-xl overflow-hidden shadow-card-container"},Ta={class:"px-6 py-8 sm:p-12"},Pa={class:"divide-y divide-gray-100"},Fa={class:"flex items-center justify-between gap-4 mb-2"},qa={class:"text-sm text-gray-500 tabular-nums"},Oa={class:"font-semibold text-green-600"},Ia={class:"font-semibold text-gray-900"},Da={class:"space-y-1.5"},Wa={class:"relative h-3 w-full overflow-hidden rounded-full bg-gray-100"},za={key:0,class:"relative h-3 w-full overflow-hidden rounded-full bg-gray-100"},Ba={class:"mt-10 flex justify-center"},Ma={class:"my-24 px-0 sm:px-6"},Va={class:"max-w-screen-xl mx-auto border border-gray-200/50 sm:rounded-xl overflow-hidden px-6 py-8 sm:p-12"},Ua={class:"grid grid-cols-1 lg:grid-cols-[1fr_1.5fr] gap-5 md:gap-20 items-center"},Ea={class:"h-full flex items-center justify-center border border-gray-200/50 sm:rounded-xl overflow-hidden p-6 bg-gray-50"},La={class:"my-24 px-0 sm:px-6"},Na={class:"max-w-screen-xl mx-auto"},Ya={class:"relative overflow-hidden bg-gradient-to-b from-brand-soft-sand to-brand-sand sm:rou
8nded-2xl"},Ga={class:"relative z-10 flex flex-col justify-between gap-8 px-6 py-10 sm:px-12 sm:py-14 lg:flex-row lg:items-center"},Ha={class:"grid grid-cols-1 sm:grid-cols-3 gap-4 lg:max-w-3xl flex-1"},Ka=["href"],Qa={class:"text-md font-semibold text-gray-900 flex items-center gap-1.5"},Ja={class:"text-sm text-gray-500 mt-1"},Xa={class:"my-24 px-0 sm:px-6"},Za={class:"max-w-screen-xl mx-auto border border-gray-200/50 sm:rounded-xl overflow-hidden divide-y divide-gray-200/50"},eo={class:"px-6 py-8 sm:p-12"},to={class:"grid grid-cols-1 lg:grid-cols-[1.2fr_1fr] gap-8 md:gap-16 items-center"},so={class:"rounded-xl overflow-hidden"},ao={class:"px-6 py-8 sm:p-12"},oo={class:"grid grid-cols-1 lg:grid-cols-2 gap-8 md:gap-16 items-center"},no={class:"order-2 lg:order-1"},ro={class:"px-6 py-8 sm:p-12"},lo={class:"grid grid-cols-1 lg:grid-cols-2 gap-8 md:gap-16 items-center"},io={class:"rounded-xl overflow-hidden"},co={class:"px-6 py-8 sm:p-12"},uo={class:"grid grid-cols-1 lg:grid-cols-2 gap-8 md:gap-16 items-center"},po={class:"order-1 lg:order-1 rounded-xl overflow-hidden"},ho={class:"bg-brand-soft-sand px-6 py-8 sm:p-12"},mo={class:"grid grid-cols-1 lg:grid-cols-2 gap-8 md:gap-16 items-center"},go={class:"w-full max-w-48 ml-auto"},fo={class:"grid grid-cols-10 gap-1",role:"img","aria-label":"27 of every 100 failed payments recovered"},yo={class:"my-24 px-6 2xl:px-12"},xo={class:"max-w-screen-xl mx-auto"},bo={class:"sm:-mx-6"},Oo={__name:"index",setup(vo){const ue=[{title:"APIs & backend services",description:"Payments, auth, comms, and the APIs apps are built on.",icon:"fas fa-code",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"},{title:"Observability & monitoring",description:"Logs, metrics, tracing, and error tracking.",icon:"fas fa-gauge-high",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"},{title:"Databases & data infra",description:"Managed databases, pipelines, and data tooling.",icon:"fas fa-database",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"},{title:"CI/CD & DevOps",description:"Build, deploy, and the delivery pipeline.",icon:"fas fa-arrows-spin",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"},{title:"Docs & diagramming",description:"Developer docs, diagrams, and API references.",icon:"fas fa-file-code",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"},{title:"Coding & IDE tools",description:"Editors, coding assistants, and dev libraries.",icon:"fas fa-laptop-code",iconWrap:"bg-blue-100 ring-blue-200",iconColor:"text-blue-600"}],{churnedRevenue:V,voluntaryPct:P,savedByCF:pe,recoveredByPR:he,keptPerYear:me,formatUSD:U}=Ie({cancelFlowSaveRate:.242,paymentRecoveryRate:.265}),K=[{title:"The bill spiked",icon:"fas fa-bolt",body:"A usage spike shows up as a surprise invoice, and the tool becomes the first thing on the chopping block."},{title:"Great tool, priced out",icon:"fas fa-dollar-sign",body:"They love the developer experience and leave anyway once it costs more than what it runs on."},{title:"Usage slid to zero",icon:"fas fa-ghost",body:"A team stops calling the API. They do not file a ticket, they just open a new tab."},{title:"They self-hosted it",icon:"fas fa-server",body:"An open-source path exists, so they migrate off for cost and control."},{title:"They built it themselves",icon:"fas fa-hammer",body:"For a technical team, cobbling together a replacement can take just a weekend."},{title:"Only needed it for one project",icon:"fas fa-calendar-xmark",body:"The project shipped. The dependency, and the subscription, went with it."},{title:"The deal changed",icon:"fas fa-file-contract",body:"A quiet change to limits or pricing reads as broken trust, and the base leaves fast."},{title:"Too expensive at scale",icon:"fas fa-arrow-trend-up",body:"It was fine at ten seats. Across the whole org, finance starts asking questions."}],Q=x(null),J=x(null),X=x(!1),E=x(!1),F=x(null);Ae(()=>{F.value=Date.now()}),De(()=>[{el:Q.value,flag:X},{el:J.value,flag:E}]);const ge=[{label:"Under $50 / month",pct:23,highlight:!0},{label:"$50 to $249",pct:45},{label:"Over $250",pct:70}],fe=[{label:"Company A",cf:28.6,pr:null},{label:"Company B",cf:26.2,pr:36.5},{label:"Company C",cf:22.8,pr:13.3},{label:"Company D",cf:22.7,pr:null},{label:"Company E",cf:20.6,pr:29.8},{label:"Average estimate",cf:24.2,pr:26.5,estimate:!0}],ye=[{quote:"Overages are never a good thing for your customer.",name:"Ryan Seams",role:"AssemblyAI",source:"Churn.fm",href:"https://www.churn.fm/episode/from-plg-pains-to-ai-gains-rethinking-retention"},{quote:"We are in the retention business. And the trust business.",name:"Karri Saarinen",role:"CEO, Linear",source:"Lenny's",href:"https://github.com/ChatPRD/lennys-podcast-transcripts/blob/main/episodes/karri-saarinen/transcript.md"},{quote:"Usage is a leap of faith. I believe that you will find this product useful.",name:"James Hawkins",role:"CEO, PostHog",source:"Churn.fm",href:"https://www.churn.fm/episode/navigating-growth-and-retention-lessons-from-posthogs-ceo"},{quote:"Usage-based companies see 9% higher net revenue retention than the broader SaaS market.",name:"Activant Capital",role:"citing OpenView",source:"Usage-based billing",href:"https://www.activantcapital.com/research/usage-based-billing"}],xe=[{title:"React SDK",description:"Open-source component you fully control, with optional analytics.",icon:"fas fa-cube",href:"https://sdk.churnkey.co",color:"bg-purple-100 text-purple-600"}
8,{title:"Hosted flow",description:"A hosted page with the full retention feature set. Requires no engineering lift.",icon:"fas fa-window-maximize",href:"/feature/hosted-cancel-flows",color:"bg-blue-100 text-blue-600"},{title:"Embed",description:"Drop-in script for any web app, with an advanced no-code builder.",icon:"fas fa-code",href:"/feature/cancel-flows",color:"bg-green-100 text-green-600"}],be=x([{question:"What tools do you integrate with?",answer:"Churnkey connects natively to Stripe, Chargebee, Maxio, Paddle, and Braintree. We also offer a custom integration framework that connects Churnkey to any payment provider or subscription management system. Usage signals like credits consumed and feature adoption can be piped in from your billing provider or sent directly.",isOpen:!1},{question:"Can Churnkey use my usage data as well as billing?",answer:"Yes. Send events like API calls, builds, and active projects with Churnkey's Event Tracking API, then segment Cancel Flows and score customer health on real usage. An account whose usage has slid to zero can be treated differently from one still shipping every day.",isOpen:!1},{question:"How do I get started, and how long does it take?",answer:"Three steps. <strong>Connect</strong> your billing provider, <strong>configure</strong> your Cancel Flow and recovery sequence, then <strong>go live</strong> with a dashboard showing save rates, recovered revenue, and campaign performance. Hosted Cancel Flows and Precision Retries require no engineering lift, so most teams are up and running in days.",isOpen:!1},{question:"What are my deployment options?",answer:'Three ways to work with Churnkey: the open-source <a href="https://sdk.churnkey.co" target="_blank" rel="noopener" class="underline">React SDK</a> you fully control, a <a href="/feature/hosted-cancel-flows" class="underline">fully hosted flow</a>, or a <a href="/feature/cancel-flows" class="underline">drop-in embed</a> with a no-code builder.',isOpen:!1},{question:"Is my data secure and compliant?",answer:"Yes. Churnkey is SOC 2 Type I and GDPR compliant.",isOpen:!1}]),L=x(""),N=x(!1),S=x(null),ve=[{id:"too-expensive",label:"Too expensive at scale"},{id:"not-using",label:"We stopped using it"},{id:"self-hosted",label:"We self-hosted instead"},{id:"missing",label:"Missing a capability we need"},{id:"one-project",label:"Only needed it for one project"},{id:"other",label:"Other"}],D=[{texture:"/images/use-cases/halftone/blob01.png",style:{width:"100%",top:"0%",left:"0%",transform:"rotate(-12deg)"}},{texture:"/images/use-cases/halftone/blob02.png",style:{width:"100%",right:"0%",bottom:"0%",transform:"rotate(16deg)"}},{texture:"/images/use-cases/halftone/blob03.png",style:{width:"90%",top:"0%",right:"-10%",transform:"rotate(0deg)"}},{texture:"/images/use-cases/halftone/blob04.png",style:{width:"100%",bottom:"0%",left:"0%",transform:"rotate(-20deg)"}},{texture:"/images/use-cases/halftone/blob05.png",style:{width:"100%",top:"0%",left:"0%",transform:"rotate(22deg)"}},{texture:"/images/use-cases/halftone/blob06.png",style:{width:"100%",right:"0%",bottom:"0%",transform:"rotate(-10deg)"}},{texture:"/images/use-cases/halftone/blob07.png",style:{width:"100%",top:"0%",right:"0%",transform:"rotate(14deg)"}},{texture:"/images/use-cases/halftone/blob02.png",style:{width:"100%",bottom:"0%",left:"0%",transform:"rotate(-16deg)"}}],we=[{heading:"Via a survey step",icon:"far fa-list-check",frameTitle:"Cancel survey",description:"Collects why the user is leaving."},{heading:"And a freeform feedback",icon:"far fa-comment-dots",frameTitle:"Feedback",description:"Free text captures the nuance behind why users actually leave."}],Y=[{tab:"Between projects",headline:"Pause and keep your setup intact.",subtext:"Your API keys, integrations, and configuration stay exactly as you left them. Resume when the next project starts.",durations:[{label:"1 month",months:1},{label:"2 months",months:2},{label:"3 months",months:3}],cta:"Pause my plan"},{tab:"Quiet quarter",headline:"Freeze billing while usage is low.",subtext:"Stop paying during a slow stretch without tearing down what you built. Everything is ready when you ramp back up.",durations:[{label:"1 month",months:1},{label:"2 months",months:2},{label:"3 months",months:3}],cta:"Pause billing"}],w=x([0,0,0,0,0,0]),q=x(0);function ke(f,t){w.value[f]=t,f===0&&(q.value=0),f===1&&(z.value=1)}const Z=ce(()=>{if(F.value===null)return"";const f=Y[w.value[0]].durations[q.value],t=new Date(F.value),$=f.months?ze(t,f.months):t;return f.weeks&&$.setDate($.getDate()+f.weeks*7),$.toLocaleDateString("en-US",{month:"long",day:"numeric"})}),{surveyOutcome:W,offerOutcome:u,completeSurveyStep:ee,resetSurveyPreview:_e,acceptOffer:j,declineOffer:R,resetOfferPreview:A}=We();function Ce(f){_e(f),f===0&&(S.value=""),f===1&&(L.value="")}
8const te=[{tab:"For a usage cap",headline:"Cap your spend, keep your setup.",subtext:"Move to a plan with a predictable ceiling so a spike in usage never surprises you on the next invoice.",plans:[{name:"Scale",amount:"$299",period:"/month",current:!0,features:["Usage-based pricing","No hard limits","Bills on what you run"]},{name:"Team",amount:"$99",period:"/month",msrp:"$299",features:["A fixed monthly ceiling","Predictable invoices","Upgrade anytime"]}],cta:"Switch to Team"},{tab:"For lighter usage",headline:"Right-size to what you actually run.",subtext:"Move to a lighter tier and keep the integrations and history that matter most.",plans:[{name:"Pro",amount:"$149",period:"/month",current:!0,features:["Full API access","Every integration","Unlimited seats"]},{name:"Starter",amount:"$49",period:"/month",msrp:"$149",features:["Core API access","The integrations you use","Upgrade anytime"]}],cta:"Switch to Starter"}],z=x(1),se=[{tab:"For evaluating",headline:"Take the time to finish your build.",subtext:"Most teams that stop here were mid-integration. Take 30 more days on us to ship it.",cta:"Extend my access"},{tab:"For a proof of concept",headline:"See the proof of concept through.",subtext:"Thirty more days, no charge, to get real usage in front of your team.",cta:"Extend my trial"}],ae=ce(()=>F.value===null?"":new Date(F.value+30*864e5).toLocaleDateString("en-US",{month:"short",day:"numeric"})),oe=[{tab:"For integration help",headline:"Stuck on the integration? Let us help.",subtext:"A short call with an engineer maps the fastest path to getting your setup into production.",cta:"Book a session"},{tab:"For a technical review",headline:"Get a second set of eyes on your setup.",subtext:"Bring your architecture to a solutions engineer and leave with a plan that scales.",cta:"Book a review"}],ne=[{tab:"For new teams",headline:"Your next month is on us.",subtext:"The first weeks decide whether a tool sticks in the stack. Stay on and your next month is free.",phrase:"100% off for 1 month",cta:"Claim my free month"},{tab:"For long-time teams",headline:"You have been building with us a while.",subtext:"Keep your plan at 30% off for the next full year.",phrase:"30% off for 12 months",cta:"Claim 30% off"}],re=[{tab:"For a quiet month",headline:"This month, on us.",subtext:"A credit toward this month while your usage ramps back up.",back:"â$50.00",net:"$49.00"},{tab:"For loyalty",headline:"A thank-you credit.",subtext:"A one-time credit for building with us this long.",back:"â$25.00",net:"$74.00"}],Se=[{heading:"Pause",icon:"far fa-circle-pause",variants:Y,description:"A pause halts billing for a set number of months and auto-resumes. Teams between projects or in a quiet quarter stay set up without paying for time they cannot use."},{heading:"Plan switch",icon:"far fa-right-left",variants:te,description:"A plan switch moves the account to a plan with a predictable ceiling, or to a lighter tier. When the bill no longer matches the usage, it keeps them on at a price that makes sense."},{heading:"Trial extension",icon:"far fa-calendar-plus",variants:se,description:"A trial extension grants more time before the next charge. It gives a team still mid-integration the room to ship before they decide."},{heading:"Onboarding help",icon:"far fa-headset",variants:oe,description:"An onboarding offer routes the account to a real engineer or a solutions review. When the problem is a stuck integration rather than the product, a nudge brings them back."},{heading:"Adaptive Offers",icon:"far fa-wand-magic-sparkles",variants:ne,description:"Adaptive Offers uses machine learning to find the right discount amount and duration for each account rather than a fixed percentage, so a save protects your margin."},{heading:"Account credit",icon:"far fa-coins",variants:re,description:"A credit applies a one-time amount to the account rather than cutting the recurring price, giving the team a reason to stay without a permanent change."}],v={title:"Retention software for developer tools and infrastructure | Churnkey",description:"Churnkey helps developer tools and infrastru
8cture companies understand why accounts leave, recover failed payments, and turn churn into recurring revenue.",image:"https://churnkey.co/images/use-cases/devtools-cover.png"};Be({headline:v.title,description:v.description,image:v.image,datePublished:"2026-07-27",dateModified:"2026-07-27"});const je=$e();return Te({title:v.title,meta:[{name:"description",content:v.description},{property:"og:image",content:v.image},{property:"og:title",content:v.title},{property:"og:type",content:"website"},{property:"og:url",content:`https://churnkey.co${je.path}`},{property:"og:description",content:v.description},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:title",content:v.title},{name:"twitter:description",content:v.description},{name:"twitter:image",content:v.image}]}),(f,t)=>{const $=ie,le=ie,O=Re;return r(),i("div",null,[e("section",Me,[e("div",Ve,[b(Oe,{"color-back":"#FFFBF8","color-front":"#E2D2C2",size:70,radius:1.05,contrast:1.4,scale:.8,speed:.45,grid:"hex"})]),t[11]||(t[11]=e("div",{class:"absolute inset-0 pointer-events-none",style:{background:`radial-gradient( 9 ellipse 75% 85% at 50% 45%, 10 rgba(255, 251, 248, 0.98) 0%, 11 rgba(255, 251, 248, 0.92) 42%, 12 rgba(255, 251, 248, 0.5) 75%, 13 rgba(255, 251, 248, 0) 100% 14 )`}},null,-1)),e("div",Ue,[t[8]||(t[8]=e("h1",{class:"heading-6xl hero-fade-in",style:{"animation-delay":"0.2s"}}," Retention software for developer tools and infrastructure. ",-1)),t[9]||(t[9]=e("p",{class:"text-lg text-gray-500 mt-4 hero-fade-in",style:{"animation-delay":"0.3s"}}," In developer tools, a spike in the bill is often what makes a team leave. Churnkey saves the customers about to cancel and recovers the payments that fail. ",-1)),e("div",Ee,[b($,{to:"/use-case",class:"inline-flex items-center gap-2 text-sm font-medium text-gray-400 hover:text-gray-700 transition-colors"},{default:M(()=>[...t[7]||(t[7]=[e("i",{class:"fas fa-arrow-left text-xs"},null,-1),m(" All use cases ",-1)])]),_:1})]),t[10]||(t[10]=y('<div class="flex flex-col sm:flex-row items-center justify-center gap-6 mt-10 w-full hero-fade-in" style="animation-delay:0.4s;"><a href="/schedule-a-demo" class="bg-blue-800 text-center w-full justify-center sm:w-auto text-white px-4 py-3 rounded-lg inline-flex items-center gap-2 text-sm font-medium shadow-[0px_4px_4px_0px_rgba(0,0,0,0.08)] hover:bg-blue-900 hover:-translate-y-0.5 transition-all duration-200"><span>Request a demo</span><i aria-hidden="true" class="fas fa-arrow-right text-blue-200 text-xs"></i></a><a href="#calculator" class="bg-gray-25 text-center w-full sm:w-auto text-gray-900 px-4 py-3 rounded-lg inline-flex items-center justify-center gap-2 text-sm font-medium shadow-[0px_4px_4px_0px_rgba(0,0,0,0.04),0px_0px_0px_1px_rgba(60,51,42,0.08)] hover:bg-gray-50 hover:-translate-y-0.5 transition-all duration-200"><span>See the numbers</span><i class="fas fa-arrow-down text-gray-400 text-xs"></i></a><a href="/pricing" class="bg-gray-25 text-center w-full sm:w-auto text-gray-900 px-4 py-3 rounded-lg inline-flex items-center justify-center gap-2 text-sm font-medium shadow-[0px_4px_4px_0px_rgba(0,0,0,0.04),0px_0px_0px_1px_rgba(60,51,42,0.08)] hover:bg-gray-50 hover:-translate-y-0.5 transition-all duration-200"><span>View pricing</span><i aria-hidden="true" class="fas fa-arrow-right text-gray-400 text-xs"></i></a></div>',1))])]),e("section",Le,[e("div",Ne,[t[12]||(t[12]=e("div",{class:"space-y-4 flex justify-center flex-col items-center"},[e("p",{class:"eyebrow eyebrow-sm eyebrow-blue"},[e("i",{class:"fas fa-bolt"}),e("span",null,"Who we serve")]),e("h2",{class:"heading-4xl text-center"},"Built for every kind of developer tool")],-1)),e("div",Ye,[(r(),i(p,null,h(ue,s=>e("div",{key:s.title,class:"flex flex-col rounded-2xl bg-white p-6 shadow-card border border-gray-100"},[e("div",{class:c(["mb-4 flex h-10 w-10 items-center justify-center rounded-lg ring-1 ring-inset",s.iconWrap])},[e("i",{class:c([s.icon,s.iconColor])},null,2)],2),e("h3",Ge,o(s.title),1),e("p",He,o(s.description),1)])),64))])])]),e("div",Ke,[e("section",Qe,[e("div",Je,[t[23]||(t[23]=y('<div class="border-b border-gray-100 bg-gradient-to-tr from-gray-25 to-gray-50 px-6 py-8 sm:p-12 space-y-4"><p class="eyebrow eyebrow-sm bg-gray-950 text-gray-25"><span class="h-1.5 w-1.5 rounded-full bg-yellow-400"></span><span>ROI calculator</span></p><h2 class="heading-4xl max-w-3xl">See what Churnkey could save you</h2><p class="text-sm sm:text-md text-gray-500 max-w-2xl"> Drop in your monthly churned revenue and watch what our developer-tools accounts would recover and save on it. </p></div>',1)),e("div",Xe,[e("div",Ze,[e("div",null,[t[15]||(t[15]=e("label",{for:"ck-churned",class:"text-md font-semibold text-gray-950"},"Monthly churned revenue",-1)),e("div",et,[t[13]||(t[13]=e("span",{class:"text-gray-400 text-xl"},"$",-1)),G(e("input",{id:"ck-churned","onUpdate:modelValue":t[0]||(t[0]=s=>de(V)?V.value=s:null),type:"number",min:"0",step:"1000",class:"w-full py-3 px-2 text-2xl font-semibold text-gray-900 tabular-nums bg-transparent outline-none border-0! rounded-none!"},null,512),[[H,n(V),void 0,{number:!0}]]),t[14]||(t[14]=e("span",{class:"text-gray-400 text-sm shrink-0"},"/ mo",-1))])]),e("div",null,[t[18]||(t[18]=e("label",{for:"ck-split",class:"text-md font-semibold text-gray-950"},"How that churn breaks down",-1)),G(e("input",{id:"ck-split","onUpdate:modelValue":t[1]||(t[1]=s=>de(P)?P.value=s:null),type:"range",min:"0",max:"100",step:"1",class:"mt-3 w-full accent-blue-600 cursor-pointer"},null,512),[[H,n(P),void 0,{number:!0}
14]]),e("div",tt,[e("span",null,[e("span",st,o(n(P))+"%",1),t[16]||(t[16]=m(" cancellations",-1))]),e("span",null,[e("span",at,o(100-n(P))+"%",1),t[17]||(t[17]=m(" failed payments",-1))])])])]),e("div",ot,[t[21]||(t[21]=e("p",{class:"text-sm font-medium text-gray-500"},"Revenue kept per year",-1)),e("p",nt,o(n(U)(n(me))),1),e("p",rt," Across our developer-tools accounts, Churnkey saves 24.2% of cancellations and recovers 26.5% of failed payments. On your numbers, that is "+o(n(U)(n(pe)))+" saved and "+o(n(U)(n(he)))+" recovered every month. ",1),t[22]||(t[22]=e("p",{class:"text-sm sm:text-md text-gray-500 mt-4"}," Based on Churnkey's developer-tools accounts, trailing 12 months. ",-1)),e("div",lt,[b(le,{to:"/schedule-a-demo",class:"bg-blue-800 text-center w-full justify-center sm:w-auto text-white px-4 py-3 rounded-lg inline-flex items-center gap-2 text-sm font-medium shadow-[0px_4px_4px_0px_rgba(0,0,0,0.08)] hover:bg-blue-900 hover:-translate-y-0.5 transition-all duration-200"},{default:M(()=>[...t[19]||(t[19]=[e("span",null,"Request a demo",-1),e("i",{"aria-hidden":"true",class:"fas fa-arrow-right text-blue-200 text-xs"},null,-1)])]),_:1}),b(le,{to:"/pricing",class:"bg-white text-center w-full sm:w-auto text-blue-800 px-4 py-3 rounded-lg inline-flex items-center justify-center gap-2 text-sm font-medium shadow-[0px_4px_4px_0px_rgba(0,0,0,0.04),0px_0px_0px_1px_rgba(60,51,42,0.04)] hover:bg-gray-50 hover:-translate-y-0.5 transition-all duration-200"},{default:M(()=>[...t[20]||(t[20]=[e("span",null,"View pricing",-1),e("i",{"aria-hidden":"true",class:"fas fa-arrow-right text-blue-800 text-xs"},null,-1)])]),_:1})])])])])])]),e("div",it,[e("section",dt,[e("div",ct,[t[24]||(t[24]=y('<div class="col-span-2 border-b border-gray-100 bg-gradient-to-tr from-gray-25 to-gray-50"><div class="space-y-4 px-6 py-8 sm:p-12"><p class="eyebrow eyebrow-sm bg-gray-950 text-gray-25"><span class="h-1.5 w-1.5 rounded-full bg-yellow-400"></span><span>The churn problem</span></p><h2 class="heading-4xl max-w-4xl">There are eight reasons developer teams churn</h2></div></div>',1)),e("div",ut,[(r(!0),i(p,null,h(K.slice(0,4),s=>(r(),i("div",{key:s.title,class:"px-6 py-8 sm:p-10"},[e("div",pt,[e("i",{class:c([s.icon,"text-yellow-600"])},null,2)]),e("h3",ht,o(s.title),1),e("p",mt,o(s.body),1)]))),128))]),e("div",gt,[(r(!0),i(p,null,h(K.slice(4,8),s=>(r(),i("div",{key:s.title,class:"px-6 py-8 sm:p-10"},[e("div",ft,[e("i",{class:c([s.icon,"text-yellow-600"])},null,2)]),e("h3",yt,o(s.title),1),e("p",xt,o(s.body),1)]))),128))])])])]),e("section",bt,[e("div",vt,[e("div",null,[t[29]||(t[29]=e("p",{class:"eyebrow eyebrow-sm bg-yellow-300 text-yellow-900"},[e("i",{class:"fas fa-lightbulb text-yellow-900"}),e("span",null,"The insight")],-1)),t[30]||(t[30]=e("h3",{class:"heading-4xl mt-4 max-w-4xl"},"Retention gets worse as price falls.",-1)),t[31]||(t[31]=e("p",{class:"text-sm sm:text-md text-gray-500 max-w-3xl mt-4"}," Self-serve, low-priced developer tools have the lowest gross revenue retention, while enterprise and infrastructure accounts retain and expand at the top. ",-1)),e("div",wt,[e("div",kt,[t[27]||(t[27]=e("div",{class:"sm:hidden bg-gray-900 text-white px-4 py-3 border-b border-gray-900/10"},[e("p",{class:"text-md font-semibold"},"Gross revenue retention"),e("p",{class:"text-sm font-medium text-white/70 mt-0.5"},"By price point (%)")],-1)),e("table",{ref_key:"insightTable",ref:Q,class:"w-full block sm:table"},[t[25]||(t[25]=e("caption",{class:"sr-only"}," Gross revenue retention by price point, showing lower-priced tools lowest ",-1)),t[26]||(t[26]=e("thead",{class:"hidden sm:table-header-group"},[e("tr",{class:"bg-gray-900 text-white"},[e("th",{scope:"col",class:"sm:w-[28rem] px-4 py-3 text-left text-md font-semibold border-b border-gray-900/10"}," Gross revenue retention "),e("th",{scope:"col",class:"px-4 py-3 text-left text-md font-semibold border-l border-b border-gray-900/10"}," By price point (%) ")])],-1)),e("tbody",_t,[(r(),i(p,null,h(ge,(s,a)=>e("tr",{key:s.label,class:c(["block sm:table-row border-b border-gray-900/10 last:border-b-0",a%2===1&&"bg-white"])},[e("td",Ct,o(s.label),1),e("td",St,[e("div",jt,[e("div",{"aria-hidden":"true",class:c(["h-3.5 rounded-full shrink-0 origin-left transition-[width,transform] duration-700 ease-out motion-reduce:transition-none",[s.highlight?"bg-yellow-400":"bg-gray-200",X.value?"scale-x-100":"scale-x-0"]]),style:I({width:s.pct/78*75+"
14%"})},null,6),e("span",{class:c(["text-md font-semibold tabular-nums",s.highlight?"text-yellow-700":"text-gray-900"])},o(s.pct)+"%",3),s.highlight?(r(),i("span",Rt,"Highest churn")):T("",!0)])])],2)),64))])],512)]),t[28]||(t[28]=e("p",{class:"text-xs text-gray-400 mt-3"},[m(" Source: "),e("a",{href:"https://chartmogul.com/reports/saas-retention-the-ai-churn-wave/",target:"_blank",rel:"noopener",class:"underline underline-offset-2 hover:text-gray-600"},"ChartMogul"),m(" gross revenue retention by price point, 2025. ")],-1))])])])]),e("section",At,[e("div",$t,[t[33]||(t[33]=e("div",{class:"space-y-4 flex justify-center flex-col items-center"},[e("p",{class:"eyebrow eyebrow-sm eyebrow-green"},[e("i",{class:"fas fa-microphone-lines"}),e("span",null,"Industry voices")]),e("h2",{class:"heading-4xl text-center"},"Retention is the hard part of every developer tool")],-1)),e("div",Tt,[(r(),i(p,null,h(ye,s=>e("a",{key:s.name,href:s.href,target:"_blank",rel:"noopener",class:"group flex flex-col rounded-2xl bg-white p-6 sm:p-8 shadow-card border border-gray-100 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-card-container motion-reduce:hover:translate-y-0 motion-reduce:transition-none"},[e("blockquote",Ft," â"+o(s.quote)+"â ",1),e("div",qt,[e("div",Ot,[e("p",It,o(s.name),1),e("p",Dt,[s.role?(r(),i(p,{key:0},[m(o(s.role)+" · ",1)],64)):T("",!0),m(o(s.source),1)])]),t[32]||(t[32]=e("i",{class:"fas fa-arrow-up-right-from-square text-xs text-gray-300 ml-auto shrink-0 group-hover:-translate-y-0.5 group-hover:text-gray-500 transition-all"},null,-1))])],8,Pt)),64))])])]),e("section",Wt,[e("div",zt,[t[42]||(t[42]=e("div",{class:"space-y-4 flex justify-center flex-col items-center"},[e("p",{class:"eyebrow eyebrow-sm eyebrow-purple"},[e("span",{class:"eyebrow-dot bg-purple-600"},"1"),e("span",null,"Ask")]),e("h2",{class:"heading-4xl flex items-center gap-2 text-center"},[e("span",null,"Understand why users leave")])],-1)),e("div",Bt,[(r(),i(p,null,h(we,(s,a)=>e("div",{key:s.heading,class:"flex flex-col"},[e("h3",Mt,[e("i",{class:c([s.icon,"text-purple-600"])},null,2),m(o(s.heading),1)]),e("p",Vt,o(s.description),1),e("div",Ut,[e("div",Et,[t[34]||(t[34]=e("div",{class:"flex items-center gap-1.5"},[e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"}),e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"}),e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"})],-1)),e("span",Lt,o(s.frameTitle),1),t[35]||(t[35]=e("span",{class:"h-2.5 w-12"},null,-1))]),e("div",Nt,[e("div",Yt,[e("div",{class:"absolute aspect-square",style:I(D[a].style)},[e("img",{src:D[a].texture,alt:"",class:"h-full w-full object-cover",loading:"lazy",decoding:"async"},null,8,Gt)],4),t[36]||(t[36]=e("div",{class:"absolute inset-0 bg-gray-50/40"},null,-1))]),e("div",Ht,[n(W)[a]?(r(),_(C,{key:0,tone:n(W)[a].tone,title:n(W)[a].title,description:n(W)[a].description,onReset:l=>Ce(a)},null,8,["tone","title","description","onReset"])):a===0?(r(),i("div",Kt,[t[38]||(t[38]=e("p",{class:"ck-step-title"},"Why are you leaving?",-1)),t[39]||(t[39]=e("p",{class:"ck-step-description"},"Your feedback helps us improve.",-1)),e("div",Qt,[(r(),i(p,null,h(ve,(l,g)=>e("button",{key:l.id,type:"button",role:"radio","aria-checked":S.value===l.id,class:c(["ck-reason-button",S.value===l.id&&"ck-reason-button--selected"]),onClick:d=>S.value=l.id},[e("span",Xt,[S.value===l.id?(r(),i("svg",Zt,[...t[37]||(t[37]=[e("path",{d:"M20 6L9 17l-5-5",stroke:"#fff","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)])])):(r(),i(p,{key:1},[m(o(String.fromCharCode(65+g)),1)],64))]),e("span",es,o(l.label),1)],10,Jt)),64))]),e("button",{type:"button",class:"ck-button ck-button-primary",disabled:!S.value,onClick:t[2]||(t[2]=l=>n(ee)(0))}," Continue ",8,ts)])):(r(),i("div",ss,[t[40]||(t[40]=e("p",{class:"ck-step-title"},"Anything else we should know?",-1)),t[41]||(t[41]=e("p",{class:"ck-step-description"},"Honest feedback helps us improve. We read every reply.",-1)),e("div",{class:c(["ck-feedback-field",N.value&&"ck-feedback-field--focused"])},[G(e("textarea",{"onUpdate:modelValue":t[3]||(t[3]=l=>L.value=l),class:"ck-textarea",placeholder:"Tell us what we could have done betterâ¦",rows:"3",onFocus:t[4]||(t[4]=l=>N.value=!0),onBlur:t[5]||(t[5]=l=>N.value=!1)},null,544),[[H,L.value]])],2),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:t[6]||(t[6]=l=>n(ee)(1))}," Continue ")]))])])])])),64))])])]),e("section",as,[e("div",os,[t[54]||(t[54]=e("div",{class:"space-y-4 flex justify-center flex-col items-center"},[e("p",{class:"eyebrow eyebrow-sm eyebrow-blue"},[e("span",{class:"eyebrow-dot bg-blue-600"},"2"),e("span",null,"Offer")]),e("h2",{class:"heading-4xl flex items-center gap-2 text-center"},[e("span",null,"Give them a reason to stay")])],-1)),e("div",ns,[(r(),i(p,null,h(Se,(s,a)=>e("div",{key:s.heading,class:"flex flex-col"},[e("h3",rs,[e("i",{class:c([s.icon,"text-blue-700"])}
14,null,2),m(o(s.heading),1)]),e("p",ls,o(s.description),1),e("div",is,[e("div",ds,[e("div",{class:"absolute aspect-square",style:I(D[a+2].style)},[e("img",{src:D[a+2].texture,alt:"",class:"h-full w-full object-cover",loading:"lazy",decoding:"async"},null,8,cs)],4),t[43]||(t[43]=e("div",{class:"absolute inset-0 bg-gray-50/40"},null,-1))]),e("div",us,[t[44]||(t[44]=e("div",{class:"flex items-center gap-1.5"},[e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"}),e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"}),e("span",{class:"h-2.5 w-2.5 rounded-full bg-gray-200"})],-1)),e("span",ps,o(s.heading)+" "+o(s.variants[w.value[a]].tab.toLowerCase()),1),t[45]||(t[45]=e("span",{class:"h-2.5 w-12"},null,-1))]),e("div",hs,[e("div",ms,[(r(!0),i(p,null,h(s.variants,(l,g)=>(r(),i("button",{key:l.tab,type:"button",class:c(["whitespace-normal sm:whitespace-nowrap rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-200",w.value[a]===g?"bg-blue-600 text-white shadow-sm":"text-gray-600 hover:text-gray-900"]),onClick:d=>ke(a,g)},o(l.tab),11,gs))),128))])]),e("div",fs,[a===0?(r(),i(p,{key:0},h(Y,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",ys,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,description:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",xs,[e("p",bs,o(l.headline),1),e("p",vs,o(l.subtext),1),e("div",ws,[t[46]||(t[46]=e("div",{class:"ck-pause-eyebrow"},"We'll see you back on",-1)),e("div",ks,[Z.value?(r(),i("span",_s,o(Z.value),1)):(r(),i("span",Cs,"Â "))]),e("div",Ss,[(r(!0),i(p,null,h(l.durations,(d,k)=>(r(),i("button",{key:d.label,type:"button",class:c(["ck-pause-chip",k===q.value&&"ck-pause-chip--selected"]),"aria-pressed":k===q.value,onClick:B=>q.value=k},o(d.label),11,js))),128))])]),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)},o(l.cta),9,Rs),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," Continue cancelling ",8,As)]))])],2)),64)):a===1?(r(),i(p,{key:1},h(te,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",$s,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,description:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",Ts,[e("p",Ps,o(l.headline),1),e("p",Fs,o(l.subtext),1),e("div",qs,[e("div",Os,[(r(!0),i(p,null,h(l.plans,(d,k)=>(r(),i("button",{key:d.name,type:"button",disabled:d.current,class:c(["ck-plan-card",k===z.value&&"ck-plan-card--selected",d.current&&"ck-plan-card--current"]),"aria-pressed":k===z.value,onClick:B=>z.value=k},[e("div",Ds,[m(o(d.name)+" ",1),d.current?(r(),i("span",Ws,"Current")):T("",!0)]),e("div",zs,[e("span",Bs,o(d.amount),1),e("span",Ms,o(d.period),1),d.msrp?(r(),i("span",Vs,o(d.msrp),1)):T("",!0)]),e("ul",Us,[(r(!0),i(p,null,h(d.features,B=>(r(),i("li",{key:B,class:"ck-plan-feature"},[t[47]||(t[47]=e("span",{class:"ck-plan-feature-check"},[e("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none"},[e("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"})])],-1)),m(" "+o(B),1)]))),128))])],10,Is))),128))]),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)},o(l.cta),9,Es),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," Continue cancelling ",8,Ls)])]))])],2)),64)):a===2?(r(),i(p,{key:2},h(se,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",Ns,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,description:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",Ys,[e("p",Gs,o(l.headline),1),e("p",Hs,o(l.subtext),1),e("div",Ks,[e("div",Qs,[t[49]||(t[49]=e("div",{class:"ck-trial-badge"},[e("div",{class:"ck-trial-days"},"+30"),e("div",{class:"ck-trial-unit"},"days")],-1)),e("div",null,[t[48]||(t[48]=e("div",{class:"ck-trial-end-label"},"New end date",-1)),e("div",Js,[ae.value?(r(),i("span",Xs,o(ae.value),1)):(r(),i("span",Zs,"Â "))])])]),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)},o(l.cta),9,ea),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," Continue cancelling ",8,ta)])]))])],2)),64)):a===3?(r(),i(p,{key:3},h(oe,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",sa,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,de
14scription:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",aa,[e("p",oa,o(l.headline),1),e("p",na,o(l.subtext),1),e("div",ra,[e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)},o(l.cta),9,la),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," Continue cancelling ",8,ia)])]))])],2)),64)):a===5?(r(),i(p,{key:4},h(re,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",da,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,description:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",ca,[e("p",ua,o(l.headline),1),e("p",pa,o(l.subtext),1),e("div",ha,[e("div",ma,[t[52]||(t[52]=e("div",{class:"ck-offer-rebate-row"},[e("span",null,"You paid this period"),e("span",null,"$99.00")],-1)),e("div",ga,[t[50]||(t[50]=e("span",null,"Money back",-1)),e("span",null,o(l.back),1)]),e("div",fa,[t[51]||(t[51]=e("span",null,"Your net for this period",-1)),e("span",null,o(l.net),1)])]),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)}," Apply my credit ",8,ya),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," No thanks, continue cancelling ",8,xa)])]))])],2)),64)):(r(),i(p,{key:5},h(ne,(l,g)=>e("div",{key:l.tab,class:c(["col-start-1 row-start-1 flex items-center justify-center",w.value[a]!==g&&"invisible pointer-events-none"])},[e("div",ba,[n(u)[a]?(r(),_(C,{key:0,tone:n(u)[a].tone,title:n(u)[a].title,description:n(u)[a].description,onReset:d=>n(A)(a)},null,8,["tone","title","description","onReset"])):(r(),i("div",va,[e("p",wa,o(l.headline),1),e("p",ka,o(l.subtext),1),e("div",_a,[e("div",Ca,[t[53]||(t[53]=e("div",{class:"ck-offer-discount-eyebrow"},"Limited-time offer",-1)),e("div",Sa,o(l.phrase),1)]),e("button",{type:"button",class:"ck-button ck-button-primary",onClick:d=>n(j)(a)},o(l.cta),9,ja),e("button",{type:"button",class:"ck-button-link",onClick:d=>n(R)(a)}," No thanks, continue cancelling ",8,Ra)])]))])],2)),64))])])])),64))])])]),t[70]||(t[70]=y('<section class="py-24 bg-gradient-to-b from-white via-purple-100/60 via-70% to-white px-6 2xl:px-12"><div class="max-w-screen-xl mx-auto"><div class="space-y-4 flex justify-center flex-col items-center"><p class="eyebrow eyebrow-sm eyebrow-purple"><span class="eyebrow-dot bg-purple-600">3</span><span>Segment</span></p><h2 class="heading-4xl text-center">Every account is at a different depth. Treat them that way</h2></div><div class="grid grid-cols-1 md:grid-cols-3 gap-5 mt-16"><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-purple-100 ring-1 ring-inset ring-purple-200"><i class="fas fa-hourglass-half text-purple-600"></i></div><h3 class="text-lg font-semibold text-purple-900">Segment by how deep the integration goes</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> A team still evaluating on day one has not put your API into production yet. Route the tire-kicker differently from the account you are load-bearing for. </p></div><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-purple-100 ring-1 ring-inset ring-purple-200"><i class="fas fa-gauge-high text-purple-600"></i></div><h3 class="text-lg font-semibold text-purple-900">Segment on real usage, alongside billing</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> Send API calls, builds, and active projects to Churnkey with Event Tracking. Then treat an account whose usage dropped to zero differently from one shipping every day. </p></div><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-purple-100 ring-1 ring-inset ring-purple-200"><i class="fas fa-layer-group text-purple-600"></i></div><h3 class="text-lg font-semibold text-purple-900">Segment by plan and scale</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> A hobby project on the free tier and an org on an enterprise contract need different offers. Segment on plan, usage, and seat count. </p></div></div></div></section><section class="py-24 bg-gradient-to-b from-white via-blue-100/60 via-70% to-white px-6 2xl:px-12"><div class="max-w-screen-xl mx-auto"><div class="space-y-4 flex justify-center flex-col items-center"><p class="eyebrow eyebrow-sm eyebrow-blue"><span class="eyebrow-dot bg-blue-600">4</span><span>Optimize</span></p><h2 class="heading-4xl text-center">Test, watch, and stay compliant</h2></div><div class="grid grid-cols-1 md:grid-cols-3 gap-5 mt-16"><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 ring-1 ring-inset ring-blue-200"><i class="fas fa-vials text-blue-600"></i></div><h3 class="text-lg font-semibold text-blue-900">A/B test your flows</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> Run a pause against a downgrade for the same cancel reason. Let the data decide which one keeps more users on the product. </p></div><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 ring-1 ring-inset ring-blue-200"><i class="fas fa-shield-check text-blue-600"></i></div><h3 class="text-lg font-semibold text-blue-900">Stay compliant</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> Self-serve SaaS subscriptions fall under the FTC's click-to-cancel rules, and enterprise contracts carry their own renew
14al and cancellation terms. Churnkey's compliance mode keeps your Cancel Flow aligned with those requirements without your team tracking every update. </p></div><div class="flex flex-col rounded-2xl bg-white p-6 shadow-card"><div class="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 ring-1 ring-inset ring-blue-200"><i class="fas fa-circle-play text-blue-600"></i></div><h3 class="text-lg font-semibold text-blue-900">Session recordings</h3><p class="text-sm sm:text-md text-gray-600 mt-2"> Watch exactly how users move through the Cancel Flow. See where they hesitate, what they skip, and what makes them stay. </p></div></div></div></section>',2)),e("section",Aa,[e("div",$a,[t[60]||(t[60]=y('<div class="space-y-4 px-6 pt-8 sm:px-12 sm:pt-12"><p class="eyebrow eyebrow-sm eyebrow-green"><i class="fas fa-chart-line"></i><span>Churnkey Data</span></p><h2 class="heading-4xl">What Churnkey does for developer-tools companies</h2><p class="text-sm sm:text-md text-gray-500 max-w-3xl"> Across our developer-tools accounts, Cancel Flows save 24.2% of attempted cancellations and Payment Recovery reclaims 26.5% of failed payments. </p></div>',1)),e("div",Ta,[e("div",{ref_key:"benchTable",ref:J,class:"bg-white/80 backdrop-blur-sm rounded-lg ring-1 ring-gray-900/10 overflow-hidden"},[t[58]||(t[58]=y('<div class="flex flex-wrap items-center gap-x-5 gap-y-2 px-4 sm:px-6 py-3 border-b border-gray-100 text-sm font-medium text-gray-600"><span class="inline-flex items-center gap-2"><span class="h-2.5 w-2.5 rounded-full bg-green-500"></span>Cancel Flows (voluntary)</span><span class="inline-flex items-center gap-2"><span class="h-2.5 w-2.5 rounded-full bg-green-800"></span>Payment Recovery (involuntary)</span></div>',1)),e("div",Pa,[(r(),i(p,null,h(fe,s=>e("div",{key:s.label,class:c(["px-4 sm:px-6 py-4",s.estimate&&"bg-gray-50"])},[e("div",Fa,[e("p",{class:c(["text-md",s.estimate?"text-gray-900 font-semibold":"text-gray-700 font-medium"])},o(s.label),3),e("p",qa,[e("span",Oa,o(s.cf)+"%",1),t[57]||(t[57]=m(" voluntary",-1)),s.pr!==null?(r(),i(p,{key:0},[t[55]||(t[55]=m(" · ",-1)),e("span",Ia,o(s.pr)+"%",1),t[56]||(t[56]=m(" involuntary",-1))],64)):T("",!0)])]),e("div",Da,[e("div",Wa,[e("div",{class:c(["h-full bg-green-500 origin-left transition-transform duration-700 ease-out motion-reduce:transition-none",E.value?"scale-x-100":"scale-x-0"]),style:I({width:s.cf+"%"})},null,6)]),s.pr!==null?(r(),i("div",za,[e("div",{class:c(["h-full bg-green-800 origin-left transition-transform duration-700 delay-100 ease-out motion-reduce:transition-none",E.value?"scale-x-100":"scale-x-0"]),style:I({width:s.pr+"%"})},null,6)])):T("",!0)])],2)),64))])],512)]),e("div",Ba,[b($,{to:"/schedule-a-demo",class:"w-full sm:w-auto text-center inline-flex justify-center items-center gap-2 rounded-lg bg-blue-800 px-4 py-3 text-md font-semibold text-white transition-all duration-200 ease-in-out hover:scale-105 hover:bg-blue-900"},{default:M(()=>[...t[59]||(t[59]=[m(" Request a demo ",-1),e("i",{"aria-hidden":"true",class:"fas fa-arrow-right text-blue-200 text-xs"},null,-1)])]),_:1})])])]),e("section",Ma,[e("div",Va,[e("div",Ua,[t[61]||(t[61]=y('<div><div class="space-y-4"><p class="eyebrow eyebrow-sm eyebrow-purple"><i class="fas fa-brain"></i> Understand </p><h2 class="heading-4xl">The nuance is in the comments</h2></div><p class="text-md text-gray-500 mt-6"> You are getting thousands of free-text cancel responses every month. Reading them by hand is impossible. Feedback AI reads every response for you and tells you whether the churn is price, a missing capability, or a team that built it themselves. </p><div class="mt-10 space-y-8"><div><h3 class="text-lg font-semibold text-gray-900 flex items-center gap-2"><i class="fas fa-list-ul text-purple-600"></i> Automatic categorization </h3><p class="text-sm sm:text-md text-gray-500 mt-1"> Freeform feedback is grouped into emergent categories and themes for prioritization and analysis. </p></div><div><h3 class="text-lg font-semibold text-gray-900 flex items-center gap-2"><i class="fas fa-chart-line text-purple-600"></i> MRR connection </h3><p class="text-sm sm:text-md text-gray-500 mt-1"> Rank the impact of each cancel reason on your bottom line so you know
14where to focus your product roadmap. </p></div><div><h3 class="text-lg font-semibold text-gray-900 flex items-center gap-2"><i class="fas fa-search text-purple-600"></i> Intelligent search </h3><p class="text-sm sm:text-md text-gray-500 mt-1"> Use natural language to search for specific feedback, themes, and customers. </p></div></div></div>',1)),e("div",Ea,[b(O,{src:"/images/illustrations/intelligence-feature-thumb-feedback-ai.svg",alt:"Feedback AI clusters free-text cancel responses into named, countable reasons",class:"object-cover",loading:"lazy",width:"572",height:"320",sizes:"xs:100vw lg:50vw xl:572px",format:"webp",quality:"80"})])])])]),e("section",La,[e("div",Na,[e("div",Ya,[t[64]||(t[64]=e("img",{loading:"lazy",class:"absolute inset-0 h-full w-full object-cover",src:Pe,alt:""},null,-1)),e("div",Ga,[t[63]||(t[63]=y('<div class="max-w-md"><h2 class="heading-3xl">Get started with Cancel Flows</h2><p class="text-md text-gray-600 mt-3"> There are three ways to deploy Churnkey Cancel Flows in your stack. Pick one, or request a demo. </p><a href="/schedule-a-demo" class="mt-6 w-full sm:w-auto text-center sm:text-left inline-flex justify-center items-center gap-2 rounded-lg bg-blue-800 px-4 py-3 text-md font-semibold text-white transition-all duration-200 ease-in-out hover:scale-105 hover:bg-blue-900"> Request a demo <i aria-hidden="true" class="fas fa-arrow-right text-blue-200 text-xs"></i></a></div>',1)),e("div",Ha,[(r(),i(p,null,h(xe,s=>e("a",{key:s.title,href:s.href,class:"group rounded-xl border border-gray-100 bg-white p-5 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-card-container motion-reduce:hover:translate-y-0 motion-reduce:transition-none"},[e("div",{class:c([s.color,"h-9 w-9 rounded-lg flex items-center justify-center mb-4"])},[e("i",{class:c([s.icon])},null,2)],2),e("h3",Qa,[m(o(s.title)+" ",1),t[62]||(t[62]=e("i",{"aria-hidden":"true",class:"fas fa-arrow-right text-xs group-hover:translate-x-0.5 transition-transform"},null,-1))]),e("p",Ja,o(s.description),1)],8,Ka)),64))])])])])]),e("section",Xa,[e("div",Za,[e("div",eo,[e("div",to,[t[65]||(t[65]=y('<div><p class="eyebrow eyebrow-sm eyebrow-blue"><i class="fas fa-rotate"></i><span>Payment Recovery</span></p><h2 class="heading-4xl mt-4">Most failed payments are recoverable</h2><p class="text-md text-gray-500 mt-6"> Up to <a href="/feature/payment-recovery" class="underline decoration-gray-300 underline-offset-2 hover:
14decoration-gray-600">40%</a> of churn is involuntary. Most of it comes from soft declines, like a low balance or a bank timeout, that clear on their own with a well-timed retry. Churnkey reads every decline code, retries the payments that can still succeed, and only asks the customer to update a card when one truly needs it. </p><div class="mt-8 grid grid-cols-2 gap-4"><div><p class="text-3xl font-semibold text-gray-950 tabular-nums"><a href="https://churnkey.co/blog/stripe-smart-retries/" target="_blank" rel="noopener" class="underline decoration-gray-300 underline-offset-4 hover:decoration-gray-500">+20%</a></p><p class="text-sm text-gray-500 mt-1">more recovered when Churnkey runs alongside Stripe</p></div><div><p class="text-3xl font-semibold text-gray-950 tabular-nums"><a href="https://churnkey.co/blog/launch-sms-payment-recovery/" target="_blank" rel="noopener" class="underline decoration-gray-300 underline-offset-4 hover:decoration-gray-500">98%</a></p><p class="text-sm text-gray-500 mt-1">SMS open rate, against roughly 20% on email</p></div></div></div>',1)),e("div",so,[b(O,{src:"/images/samples/features/failed-payments/precision-retries.jpg",alt:"Churnkey Precision Retries recovering a failed payment automatically",class:"w-full h-auto object-cover",loading:"lazy",width:"2560",height:"1536",sizes:"xs:100vw lg:50vw xl:608px",format:"webp",quality:"80"})])])]),e("div",ao,[e("div",oo,[e("div",no,[b(O,{src:"/images/samples/features/failed-payments/retry-hero.png",alt:"A failed payment moving from the card-issuing bank through the card network and billing provider to Churnkey, where a retry clears it",class:"w-full h-auto",loading:"lazy"})]),t[66]||(t[66]=y('<div class="order-1 lg:order-2"><p class="eyebrow eyebrow-sm eyebrow-blue"><i class="fas fa-wand-magic-sparkles"></i><span>Precision Retries</span></p><h3 class="heading-3xl mt-4">Precision Retries find the moment a card will actually clear</h3><p class="text-md text-gray-500 mt-6"> Card issuers allow only a handful of retry attempts before they start blocking you, so each one has to count. Churnkey's models, trained on tens of millions of transactions, pick the time, day, and method most likely to clear for each card type, decline code, and processor. </p><ul class="mt-6 space-y-3"><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Works alongside Stripe to recover about <a href="https://churnkey.co/blog/stripe-smart-retries/" target="_blank" rel="noopener" class="underline decoration-gray-300 underline-offset-2 hover:
14decoration-gray-600">20%</a> more failed-payment revenue.</span></li><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Too many retries make banks flag you, so Churnkey caps and spaces them to protect your approval rate.</span></li></ul></div>',1))])]),e("div",ro,[e("div",lo,[t[67]||(t[67]=y('<div><p class="eyebrow eyebrow-sm eyebrow-blue"><i class="fas fa-tower-broadcast"></i><span>Omnichannel dunning</span></p><h3 class="heading-3xl mt-4">When a retry cannot win, we reach the customer everywhere</h3><p class="text-md text-gray-500 mt-6"> Expired and closed cards need the customer to act. Churnkey runs that outreach for you across email, SMS, and an in-app payment wall, all on your own verified domain and branding. Campaigns are segmented by plan, language, time zone, and payment method, and routed to the right billing contact on the account. </p><ul class="mt-6 space-y-3"><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>SMS opens at <a href="https://churnkey.co/blog/launch-sms-payment-recovery/" target="_blank" rel="noopener" class="underline decoration-gray-300 underline-offset-2 hover:
14decoration-gray-600">98%</a>, and in our pilots recovered three to four times what email did.</span></li><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>One-tap, pre-authenticated links, so bypassing the login removes the friction entirely.</span></li><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Fixed fees, never a percentage of what you recover.</span></li></ul></div>',1)),e("div",io,[b(O,{src:"/images/illustrations/generated/dunning-sms.png",alt:"Churnkey recovering a failed payment over SMS with a one-tap payment link",class:"w-full h-auto object-cover",loading:"lazy",width:"1376",height:"768",sizes:"xs:100vw lg:50vw xl:608px",format:"webp",quality:"80"})])])]),e("div",co,[e("div",uo,[t[68]||(t[68]=y('<div class="order-2 lg:order-2"><p class="eyebrow eyebrow-sm eyebrow-blue"><i class="fas fa-shield-halved"></i><span>Payment Recovery Wall</span></p><h3 class="heading-3xl mt-4">When the emails go unread, ask inside the product</h3><p class="text-md text-gray-500 mt-6"> Some customers never open the email. The Wall asks for the card update inside your product, where they already are, and holds back access until the payment clears. It uses your brand styles and your wording, and you decide how firm it gets. </p><ul class="mt-6 space-y-3"><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Lifts recovery of failed payments by <a href="/feature/payment-recovery" class="underline decoration-gray-300 underline-offset-2 hover:
14decoration-gray-600">4% to 12%</a>.</span></li><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Soft restriction toggles set how much of the product stays usable.</span></li><li class="flex gap-3 text-md text-gray-700"><i class="fas fa-circle-check text-blue-600 mt-1"></i><span>Past-due customers stop running up usage you are not paid for.</span></li></ul><a href="/feature/payment-recovery" class="mt-8 inline-flex items-center gap-2 text-sm font-semibold text-blue-700 hover:text-blue-900 transition-colors"> Explore the Payment Recovery Wall <i aria-hidden="true" class="fas fa-arrow-right text-xs"></i></a></div>',1)),e("div",po,[b(O,{src:"/images/samples/features/failed-payments/payment-wall.png",alt:"Churnkey's Payment Recovery Wall asking a past-due customer to update their card inside the product",class:"w-full h-auto object-contain",loading:"lazy",width:"2560",height:"1536",sizes:"xs:100vw lg:50vw xl:608px",format:"webp",quality:"80"})])])]),e("div",ho,[e("div",mo,[t[69]||(t[69]=y('<div class="space-y-4"><p class="eyebrow eyebrow-sm eyebrow-yellow"><i class="fas fa-chart-line text-yellow-400"></i><span>Churnkey Data</span></p><h2 class="heading-4xl"> Churnkey recovers about <span class="text-yellow-600">27%</span> of failed payments in developer tools </h2></div>',1)),e("div",go,[e("div",fo,[(r(),i(p,null,h(100,s=>e("span",{key:s,class:c(["aspect-square rounded-full",s<=27?"bg-yellow-400":"bg-brand-dark-sand"])},null,2)),64))])])])])])]),e("section",yo,[e("div",xo,[e("div",bo,[b(qe,{faqs:be.value,title:"Common questions",eyebrow:"Got questions?","auto-close-others":!0},null,8,["faqs"])])])]),b(Fe,{"primary-label":"Request a demo",title:"Your tool is already in their stack. Keep it there.",description:"Churnkey is the retention infrastructure for developer-tools and infrastructure companies. Save cancellations, recover failed payments, and turn churn into recurring revenue."})])}}};export{Oo as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.