[{"data":1,"prerenderedAt":857},["ShallowReactive",2],{"post-/post/open-sourced-our-flagship-product":3},{"id":4,"title":5,"body":6,"date":844,"description":845,"discussionLinks":846,"extension":847,"image":846,"meta":848,"modifiedDate":846,"navigation":345,"path":849,"seo":850,"showHeaderNumbers":851,"showSidenotes":345,"showToc":345,"stem":852,"tags":853,"visibility":856,"wordCount":846},"post/post/open-sourced-our-flagship-product.md","Open Sourcing Our Flagship Product",{"type":7,"value":8,"toc":837},"minimal",[9,13,16,27,30,39,46,49,64,67,79,91,103,109,112,115,118,121,124,129,132,135,147,150,153,156,159,162,165,172,176,179,182,185,188,191,194,197,201,204,219,228,284,287,290,294,297,304,316,523,530,536,539,759,762,776,779,791,794,798,801,804,807,820,823,826,833],[10,11,12],"p",{},"\"I've got a rogue idea. You around?\"",[10,14,15],{},"With a newborn at home, I've learned not to trust my 3am brainwaves. But I had trouble shaking this one, even as daylight crept around, and I wanted to run it by my co-founder, Nick.",[10,17,18,19,26],{},"The idea: open source our cancel flow. The first product ",[20,21,25],"a",{"href":22,"rel":23},"https://churnkey.co",[24],"nofollow","Churnkey"," ever shipped, the one we'd spent five years refining and selling, and still our flagship today. I wanted to give it away, free, to anyone who wanted it. Competitors and churning customers included.",[10,28,29],{},"I expected Nick to talk me off the ledge. But he didn't balk, he was fully on board. \"The moat is moving,\" he said. \"Let's get in front of it.\"",[10,31,32,33,38],{},"Six long weeks later, the deed is done — our open source cancel flow is live at ",[20,34,37],{"href":35,"rel":36},"https://sdk.churnkey.co",[24],"sdk.churnkey.co",".",[40,41,43],"custom-video",{"src":42},"/media/churnkey-cancel-flow.webm",[10,44,45],{},"The open source Churnkey cancel flow. The showcase page shows all of the available components.",[10,47,48],{},"Is this the right move? We won't know for a while. In the short term, I'm sure it'll be messy. But I have real conviction about why we're doing it, and where that comes from isn't a Churnkey story as much as an open-ended question for all SaaS founders: what's a sustainable software moat in this new world where code is close to free?",[10,50,51,52,63],{},"Admittedly, open sourcing our flagship is a strange way to answer that. The fashionable move seems to be the opposite.",[53,54,56,57,62],"sidenote-ref",{"number":55},"1","Cal.com ",[20,58,61],{"href":59,"rel":60},"https://cal.com/blog/cal-com-goes-closed-source-why",[24],"pulled its production codebase private"," a month ago, after five years in the open. They cited security concerns; AI makes open code too easy to scan for vulnerabilities and exploit. Other speculators think it's more simply defense against cheap clones. Either way, we're reacting to the same shift, but went the other direction."," And here we are, going the other way. Why? The short version is that we have never really been selling our cancel flow.",[10,65,66],{},"To get into the more nuanced version, I need to back up a bit and fill in some details about Churnkey. Our cancel flow, very intentionally, isn't the kind that asks you 15 different questions and makes it a royal PITA to cancel your subscription. Quite the opposite. It set out to do two things, as well and as painlessly as possible:",[68,69,72,76],"ol",{"className":70},[71],"ck-alpha",[73,74,75],"li",{},"figure out why a customer is canceling, in a way that's most useful to the product team",[73,77,78],{},"if it makes sense, make an optimal offer, usually a discount, plan change, or pause, instead of an outright cancellation",[10,80,81,82,86,87,90],{},"None of that is complicated on its face. But the ",[83,84,85],"em",{},"if it makes sense"," and the ",[83,88,89],{},"optimal offer"," do a lot of heavy lifting. I'll come back to those later.",[10,92,93,94,98,99,102],{},"For a long time, I think I would have told you our edge was the difficulty of building an effective cancel flow combined with a layer of nice-to-have features that take time to get right. We have a polished interface for pause, downgrade, and discount offers. The order of the steps was tuned over hundreds of A/B tests.",[53,95,97],{"number":96},"2","There's a catch with A/B testing a cancel flow: a variant that lifts the save rate while tanking downstream LTV looks like a win until the cohort data comes in. Reaching significance takes most teams far longer than they expect."," Every step is completely customizable, down to the merge fields in the copy. On top of that, we take care of the billing integration. If there's one thing all software teams are hesitant to touch, it's the billing code. People will gladly pay for something that ",[83,100,101],{},"just works",". When you tell a customer you'll automatically surface their existing Stripe coupons inside the flow, or handle pauses the way Stripe recommends, you can feel them relax.",[10,104,105],{},[106,107,108],"strong",{},"Like a lot of good SaaS, we aren't exactly putting a man on the moon, but we've built a production-ready, battle-tested piece of software that installs easily and does exactly what it says it will from day one.",[10,110,111],{},"In the time that followed our launch, we doubled down on our two core criteria, insightful feedback and optimizing retention offers. We built beautiful dashboards that show you, as clearly as possible, why customers are leaving, including a layer of synthesized AI feedback. We added A/B testing, customer segmentation so you weren't stuck showing the same flow to everyone, automated FTC compliance, translation, and more recently, adaptive offers which pick the right offer for each individual customer. We've been dutifully filing all of these items as \"features\", the layer sitting on top of the main event. The cancel flow was the product. The intelligence was the upsell.",[10,113,114],{},"And it worked. We built a real company on it, filled with great people, and recovered over $200M for our customers.",[10,116,117],{},"On a note of personal context that's relevant this next sequence: for me, code has always been a means to an end. I got into coding because I love what you can build from your kitchen table, not for the code itself. The craftsmanship I do care about mostly lives in the end-user experience – data visualization, instantly loading dashboards, new discount optimization models. Which is why Cursor and Claude Code excited me more than they scared me. We adopted both early, and the team was shipping faster than it ever had.",[10,119,120],{},"That's all to say, we were far from naive about the SaaS-AI phase shift. Most of us didn't buy into the LinkedIn version, the daily sermon about AI swallowing Salesforce and every other SaaS with a great swiftness. But underneath the noise, we could tell something was happening that would change what software is worth paying for.",[10,122,123],{},"How long before a customer would just build the cancel flow themselves? To our surprise, for a long time, it didn't seem like anyone. No of our customers or prospective buyers brought it up and company numbers continued to rise. We filed our concerns under \"someday\" and put our heads back down.",[125,126,128],"h2",{"id":127},"bro-cant-i-just-vibe-code-this","Bro, can't I just vibe code this?",[10,130,131],{},"\"Someday\" showed up early this year, and, fittingly, it came through our own cancel flow (naturally, we dogfood Churnkey at Churnkey).",[10,133,134],{},"A few of the cancellation reasons we saw this year from our SMB accounts:",[136,137,138,141,144],"ul",{},[73,139,140],{},"\"Moving cancel flows in-house\"",[73,142,143],{},"\"Built a slimmed in-app cancel flow instead\"",[73,145,146],{},"\"Built our own cancel flow with Claude, wanted to eliminate recurring tooling costs\"",[10,148,149],{},"As anticipated, the tools we'd been using to ship faster were now being used to build us out of the picture.",[10,151,152],{},"A competent engineer with an LLM can stand up a serviceable cancel flow in an afternoon. I'd argue not as polished as ours, but for most small businesses, good enough.",[10,154,155],{},"SaaS sales have always been grounded in the same build vs buy equation: initial build out + ongoing maintenance vs. the monthly cost to buy it. For teams with plenty of capital and plenty of work on their plates, buying has been a good answer. Companies racing to ship don't want their best engineers spending hours on a cancel flow instead of working on their Pied Piper.",[10,157,158],{},"As the initial build out cost has collapsed, the inevitable question started to pop up on sales calls. \"Bro, can't we just vibe code this?\"",[10,160,161],{},"Frankly, maybe.",[10,163,164],{},"I didn't love that answer, so my instinct was to argue with it. \"Our flow has years of polish.\" \"Our billing integration handles edge cases you won't hit for months.\" \"How are you going to handle A/B testing and segmentation?\" \"Are you tracking what happens to customers after they accept an offer, or just optimizing for initial save rate?\"",[10,166,167,168,171],{},"But the truth is, it's an uphill battle to argue against ",[83,169,170],{},"good enough and nearly free",". So how much longer was the spot we were defending going to hold?",[125,173,175],{"id":174},"reading-our-best-customers","Reading Our Best Customers",[10,177,178],{},"The SMB cancellations became the newest and loudest signal we were receiving.",[10,180,181],{},"A starter-plan customer building their own cancel flow has the least to lose and the simplest needs. It makes sense that an afternoon with Claude is enough for them. They were always going to be the first to leave any tool the moment building got cheap. Watching any churn come in stings (we should know), but in reality it didn't tell us much we hadn't already expected.",[10,183,184],{},"I think the more interesting story is about our best customers. The companies we serve who have teams of elite engineers that could have built a cancel flow in a sprint years before Claude existed. Why were they deciding to buy from us month after month?",[10,186,187],{},"One of these enterprise accounts, in particular, is a company that obsesses over design. They have a team that holds every pixel to a standard most software companies don't bother with. Our cancel flow ships as a JavaScript embed; it's straightforward enough to restyle within reason, but even CSS has its limits. They ended up needing a pretty aggressive workaround to shoehorn custom logic into their flow, yet they had no interest in leaving Churnkey; they just wanted it to vanish into their own design.",[10,189,190],{},"When a company that can obviously build a thing keeps paying you for it, it's the clearest signal you'll ever get on where your value sits. Whatever your biggest customers are paying for, it almost certainly isn't code — code is no problem for them. It's something scarcer. For Churnkey, we've served 13 million cancellation sessions across over 3,000 subscription businesses, which is how we know the optimal offer for a given customer. That can't be reproduced no matter how good their engineers.",[10,192,193],{},"So, interestingly, we ended up in a situation with the two ends of our customer base telling us the same thing from opposite directions. SMB saying the UI isn't worth paying for, I'll build it myself. Enterprise saying the UI is in my way, let me build it myself, just give me the brain behind it.",[10,195,196],{},"For years we've sold the body and the brain joined at the hip. It seems obvious in retrospect that they were separable, but at the time it was always just \"here's a neat package of everything we've built, take it.\"",[125,198,200],{"id":199},"what-you-see-isnt-what-you-get","What You See Isn't What You Get",[10,202,203],{},"The cancel flow is what everyone sees. And the thing people see is the thing they think they're paying for. But what we we've been selling all along is customer retention. Nobody much cares too much about how that's delivered, as long as it's delivered.",[205,206,209],"founder-quote",{"name":207,"role":208},"Nick","Co-founder",[10,210,211,212,215,216,38],{},"Most of the features we're actually selling are ",[106,213,214],{},"no longer the cancel flow",". In 2021, we were selling a cancel flow. Now we're selling FTC compliance, localization, internationalization — all the long-tail things, anti-gamification. Every edge case we've had to build is now ",[106,217,218],{},"a reason not to build something yourself, but to use Churnkey",[10,220,221,222,224,225,227],{},"Back to the two phrases I said were doing the heavy lifting: showing a retention offer ",[83,223,85],{},", and making the ",[83,226,89],{},". This part runs on things not so easily seen, and not so easily built in an afternoon:",[136,229,230,240,246,252,261],{},[73,231,232,235,236],{},[106,233,234],{},"LTV over save rate",": optimizing for the long-term revenue a retained customer is worth, not just the initial save",[53,237,239],{"number":238},"4","Save rate is the most gameable number in retention. You can spike it overnight by offering 80% off to everyone heading for the exit. It only means something if those \"saves\" are still subscribed three and twelve months later.",[73,241,242,245],{},[106,243,244],{},"Adaptive offers",": segmentation that decides not only whether to show a pause, a discount, or a graceful exit, but the single best version of it for each customer",[73,247,248,251],{},[106,249,250],{},"A no-code builder and dashboard",": your CS team edits flows and runs A/B tests without filing an engineering ticket",[73,253,254,257,258,260],{},[106,255,256],{},"Billing glue",": Stripe, Braintree, Chargebee, Paddle, and Maxio — ",[83,259,101],{}," on day one",[73,262,263,266,267,283],{},[106,264,265],{},"Scale machinery",": discount cooldowns, session debouncing, post-offer revenue tracking, FTC compliance",[53,268,270,271,276,277,282],{"number":269},"5","\"Cancellation must be as easy as sign-up\" keeps getting written into law and then unwritten. The FTC's click-to-cancel rule was ",[20,272,275],{"href":273,"rel":274},"https://www.cooley.com/news/insight/2025/2025-07-11-click-to-cancel-just-got-cancelled-eighth-circuit-vacates-entirety-of-ftcs-negative-option-rule",[24],"vacated by a federal appeals court"," in 2025 on a technicality, with a replacement already in the works — while Germany has mandated a literal two-click cancellation button (",[20,278,281],{"href":279,"rel":280},"https://stripe.com/resources/more/mandatory-cancellation-button-germany",[24],"§312k BGB",") since 2022. It's a moving target of compliance that has a significant ongoing maintenance cost.",", automatic translations",[10,285,286],{},"It would be cleaner to say we'd spent five years confusing the surface for the substance. But I think that's overly simplified, because the layer isn't worth the same to everyone. For a small company, one cancel flow shown to everyone claws back most of the revenue they were ever going to recover. And indeed, 64% of our SMB companies have just a single cancel flow, shown to all of their customers. Each optimization you can make with Churnkey adds a few points on top, and a few points on a small base doesn't justify a subscription. For a company doing serious volume, those few points are the whole game, and the pile of edge cases that comes with running retention at scale is exactly what the layer is for.",[10,288,289],{},"Which brings us to today. For most of our smaller customers, the flow and basic analytics get them most of what they need. That's also exactly what LLM coders can now produce for near nothing. The intelligence underneath, they can't. The surface is going free with or without us.",[125,291,293],{"id":292},"take-it-fork-it-ship-it","Take It, Fork It, Ship It",[10,295,296],{},"If people are going to build a cancel flow with Claude anyway, we'd rather give them one that's already saved over 2 million customers from leaving (and their weekend back), in hopes that one day they'll reach the point where buying a premium Churnkey subscription makes sense.",[10,298,299,300,303],{},"So, we've open sourced the very thing we've been selling for five years. It's at ",[20,301,37],{"href":35,"rel":302},[24],". MIT licensed, free forever, no usage caps. Yours to drop into your app this afternoon. Take it, fork it, ship it. You can run the SDK with no Churnkey account and never pay us a cent, and the hope is that plenty of people will.",[10,305,306,307,315],{},"No account, no platform lock-in. ",[20,308,311],{"href":309,"rel":310},"https://www.npmjs.com/package/@churnkey/react",[24],[312,313,314],"code",{},"npm install @churnkey/react",", and the whole flow is a single component:",[317,318,324],"pre",{"className":319,"code":320,"filename":321,"language":322,"meta":323,"style":323},"language-tsx shiki shiki-themes github-light github-dark","import { CancelFlow } from \"@churnkey/react\";\nimport \"@churnkey/react/styles.css\";\n\n\u003CCancelFlow\n  steps={[\n    {\n      type: \"offer\",\n      offer: {\n        type: \"plan_change\",\n        plans,\n      },\n    },\n    {\n      type: \"survey\",\n      reasons: [\n        {\n          id: \"expensive\",\n          label: \"Too expensive\",\n          offer: { type: \"discount\", couponId: \"SAVE20\", percentOff: 20 },\n        },\n        {\n          id: \"not-using\",\n          label: \"Not using it\",\n          offer: { type: \"pause\", months: 2 },\n        },\n      ],\n    },\n    { type: \"feedback\" },\n    { type: \"confirm\" },\n  ]}\n  handleDiscount={async (o) => myBilling.applyCoupon(o.couponId)}\n  handleCancel={async () => myBilling.cancel()}\n/>;\n","CancelButton.tsx","tsx","",[312,325,326,334,340,347,353,359,365,371,377,383,389,395,401,406,412,418,424,430,436,442,448,453,459,465,471,476,482,487,493,499,505,511,517],{"__ignoreMap":323},[327,328,331],"span",{"class":329,"line":330},"line",1,[327,332,333],{},"import { CancelFlow } from \"@churnkey/react\";\n",[327,335,337],{"class":329,"line":336},2,[327,338,339],{},"import \"@churnkey/react/styles.css\";\n",[327,341,343],{"class":329,"line":342},3,[327,344,346],{"emptyLinePlaceholder":345},true,"\n",[327,348,350],{"class":329,"line":349},4,[327,351,352],{},"\u003CCancelFlow\n",[327,354,356],{"class":329,"line":355},5,[327,357,358],{},"  steps={[\n",[327,360,362],{"class":329,"line":361},6,[327,363,364],{},"    {\n",[327,366,368],{"class":329,"line":367},7,[327,369,370],{},"      type: \"offer\",\n",[327,372,374],{"class":329,"line":373},8,[327,375,376],{},"      offer: {\n",[327,378,380],{"class":329,"line":379},9,[327,381,382],{},"        type: \"plan_change\",\n",[327,384,386],{"class":329,"line":385},10,[327,387,388],{},"        plans,\n",[327,390,392],{"class":329,"line":391},11,[327,393,394],{},"      },\n",[327,396,398],{"class":329,"line":397},12,[327,399,400],{},"    },\n",[327,402,404],{"class":329,"line":403},13,[327,405,364],{},[327,407,409],{"class":329,"line":408},14,[327,410,411],{},"      type: \"survey\",\n",[327,413,415],{"class":329,"line":414},15,[327,416,417],{},"      reasons: [\n",[327,419,421],{"class":329,"line":420},16,[327,422,423],{},"        {\n",[327,425,427],{"class":329,"line":426},17,[327,428,429],{},"          id: \"expensive\",\n",[327,431,433],{"class":329,"line":432},18,[327,434,435],{},"          label: \"Too expensive\",\n",[327,437,439],{"class":329,"line":438},19,[327,440,441],{},"          offer: { type: \"discount\", couponId: \"SAVE20\", percentOff: 20 },\n",[327,443,445],{"class":329,"line":444},20,[327,446,447],{},"        },\n",[327,449,451],{"class":329,"line":450},21,[327,452,423],{},[327,454,456],{"class":329,"line":455},22,[327,457,458],{},"          id: \"not-using\",\n",[327,460,462],{"class":329,"line":461},23,[327,463,464],{},"          label: \"Not using it\",\n",[327,466,468],{"class":329,"line":467},24,[327,469,470],{},"          offer: { type: \"pause\", months: 2 },\n",[327,472,474],{"class":329,"line":473},25,[327,475,447],{},[327,477,479],{"class":329,"line":478},26,[327,480,481],{},"      ],\n",[327,483,485],{"class":329,"line":484},27,[327,486,400],{},[327,488,490],{"class":329,"line":489},28,[327,491,492],{},"    { type: \"feedback\" },\n",[327,494,496],{"class":329,"line":495},29,[327,497,498],{},"    { type: \"confirm\" },\n",[327,500,502],{"class":329,"line":501},30,[327,503,504],{},"  ]}\n",[327,506,508],{"class":329,"line":507},31,[327,509,510],{},"  handleDiscount={async (o) => myBilling.applyCoupon(o.couponId)}\n",[327,512,514],{"class":329,"line":513},32,[327,515,516],{},"  handleCancel={async () => myBilling.cancel()}\n",[327,518,520],{"class":329,"line":519},33,[327,521,522],{},"/>;\n",[10,524,525],{},[526,527],"img",{"alt":528,"src":529},"Two recipes built on the SDK — a discount promo banner and a stacked plan-change offer, both restyled well past the defaults","/images/posts/churnkey-sdk/discount-plan-change.png",[10,531,532,533,535],{},"Our intelligence layer is unlocked with a premium account. The experiments, the adaptive offers, automated compliance, visual flow builder, customer segmentation, LTV tracking, AI cancellation reason insights, all of that is available and a component prop away. Some of our open source users will reach the point where knowing the ",[83,534,89],{}," is worth more than the price of the platform, and they'll reach for the key. We'd rather earn that than gate the front door.",[10,537,538],{},"The first two columns are free: the SDK runs with no Churnkey account at all, and a free account turns on the analytics. You only pay if you're interested in the third column",[540,541,542,582],"table",{},[543,544,545],"thead",{},[546,547,548,552,564,573],"tr",{},[549,550,551],"th",{},"Feature",[549,553,555,556,559],{"align":554},"center","Open Source",[557,558],"br",{},[327,560,563],{"className":561},[562],"th-note","no account",[549,565,566,567,569],{"align":554},"Analytics",[557,568],{},[327,570,572],{"className":571},[562],"free account",[549,574,575,576,578],{"align":554},"Connected",[557,577],{},[327,579,581],{"className":580},[562],"paid account",[583,584,585,598,609,620,631,642,653,664,675,686,697,708,719,733,746],"tbody",{},[546,586,587,591,594,596],{},[588,589,590],"td",{},"The cancel flow component",[588,592,593],{"align":554},"✓",[588,595,593],{"align":554},[588,597,593],{"align":554},[546,599,600,603,605,607],{},[588,601,602],{},"Custom step + offer types",[588,604,593],{"align":554},[588,606,593],{"align":554},[588,608,593],{"align":554},[546,610,611,614,616,618],{},[588,612,613],{},"Headless hook for full UI control",[588,615,593],{"align":554},[588,617,593],{"align":554},[588,619,593],{"align":554},[546,621,622,625,627,629],{},[588,623,624],{},"Themable (CSS vars, classNames, overrides)",[588,626,593],{"align":554},[588,628,593],{"align":554},[588,630,593],{"align":554},[546,632,633,636,638,640],{},[588,634,635],{},"Save rate dashboard",[588,637],{"align":554},[588,639,593],{"align":554},[588,641,593],{"align":554},[546,643,644,647,649,651],{},[588,645,646],{},"Cancel-reason breakdown with trends",[588,648],{"align":554},[588,650,593],{"align":554},[588,652,593],{"align":554},[546,654,655,658,660,662],{},[588,656,657],{},"Test mode for staging traffic",[588,659],{"align":554},[588,661,593],{"align":554},[588,663,593],{"align":554},[546,665,666,669,671,673],{},[588,667,668],{},"Boosted revenue tracking",[588,670],{"align":554},[588,672],{"align":554},[588,674,593],{"align":554},[546,676,677,680,682,684],{},[588,678,679],{},"No-code editor for flow edits",[588,681],{"align":554},[588,683],{"align":554},[588,685,593],{"align":554},[546,687,688,691,693,695],{},[588,689,690],{},"A/B tests on offer order and copy",[588,692],{"align":554},[588,694],{"align":554},[588,696,593],{"align":554},[546,698,699,702,704,706],{},[588,700,701],{},"Segments by plan, tenure, MRR, metadata",[588,703],{"align":554},[588,705],{"align":554},[588,707,593],{"align":554},[546,709,710,713,715,717],{},[588,711,712],{},"Offer cooldowns",[588,714],{"align":554},[588,716],{"align":554},[588,718,593],{"align":554},[546,720,721,727,729,731],{},[588,722,723,724],{},"Adaptive Offers ",[83,725,726],{},"(Intelligence add-on)",[588,728],{"align":554},[588,730],{"align":554},[588,732,593],{"align":554},[546,734,735,740,742,744],{},[588,736,737,738],{},"Feedback AI ",[83,739,726],{},[588,741],{"align":554},[588,743],{"align":554},[588,745,593],{"align":554},[546,747,748,753,755,757],{},[588,749,750,751],{},"Automatic AI translations ",[83,752,726],{},[588,754],{"align":554},[588,756],{"align":554},[588,758,593],{"align":554},[10,760,761],{},"Inevitably, the first people we'll hear from will be existing customers asking why they're paying for something that's now public. And we want them to ask.",[205,763,765],{"name":764,"role":208},"Baird",[10,766,767,768,771,772,775],{},"It's probably going to ",[106,769,770],{},"change pricing in the customer's eyes",". But the antidote for that is just ",[106,773,774],{},"more focus on the places where we're driving value",", versus just showing the cancel flow off.",[10,777,778],{},"The interesting risk here isn't necessarily the obvious one. Yes, we open sourced the commoditized layer and kept the one with margin — that part is plain economics. The risk on our side is more in distribution. We've spent five years making Churnkey a known quantity in our market, and we're spending some of that hard-won recognition to land in far more codebases than a closed product could ever reach.",[205,780,781],{"name":207,"role":208},[10,782,783,784,787,788],{},"There's probably ",[106,785,786],{},"a huge swath of the market"," out there — newer SaaS companies, growing fast, building this in-house. We have no way of measuring that today. Open-sourcing finally gives us ",[106,789,790],{},"eyes into how much of it would rather roll their own.",[10,792,793],{},"More installs means a bigger top of funnel, and a fraction of those teams grow into the volume where the intelligence layer pays for itself, and convert. If we've misread what stays valuable, we'll find out soon enough, but we'd rather be early and wrong than late and right.",[125,795,797],{"id":796},"what-stays-paid","What Stays Paid",[10,799,800],{},"Zooming out: SaaS isn't dying. I'm pretty sure people will still be paying for software for a long, long time. But they'll probably pay for less of it, and definitely get sharper about which parts.",[10,802,803],{},"The bar for what's worth paying for is rising fast. Anything a good engineer and an LLM can produce in an afternoon is no longer a defense, no matter how hard it was to build the first time. The cost of producing that thing has collapsed, your customers know it has collapsed, and eventually they'll act on it.",[10,805,806],{},"Raw code isn't a moat anymore. It never was with enterprise accounts, which is why I think they're a great north star for finding AI-proof value. This looks like network effects, data loops, and infrastructure. And there's one more moat that hasn't gotten as much limelight because it's harder to put your finger on — good judgment, and good taste. LLMs collapsed the cost of producing artifacts to near zero, but left the cost of knowing which artifact to produce relatively untouched. In a new world of bloated software, this looks like restraint. Conviction over both configuration and convention.",[205,808,810],{"name":809,"role":208},"Scott",[10,811,812,813,816,817],{},"It's scary. ",[106,814,815],{},"Scary when Rob and I agree so strongly."," At first I thought it came out of nowhere, but now it just makes complete sense. And ",[106,818,819],{},"the faster we admit the reality to ourselves, the faster we can move.",[10,821,822],{},"With the ground shifting beneath our feet, there's a lot of uncertainty, but also a ton of opportunity. As a startup bringing in real profit, it's unnerving to acknowledge that the game has changed and take a swing where we might hit ourselves on the back of the head.",[10,824,825],{},"In all my years of building software, this is the first library I've ever open sourced, and parts of it still feel strange. But the logic held up the morning after, once the newborn delirium had worn off and Nick and I looked at it clearly. The moat is moving. We'd rather get in front of it than defend the spot it used to be.",[10,827,828,829,832],{},"If you build subscription software, the open source cancel flow is available at ",[20,830,37],{"href":35,"rel":831},[24],". And if you want the part that knows which offer to make, you know where to find us.",[834,835,836],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":323,"searchDepth":342,"depth":342,"links":838},[839,840,841,842,843],{"id":127,"depth":336,"text":128},{"id":174,"depth":336,"text":175},{"id":199,"depth":336,"text":200},{"id":292,"depth":336,"text":293},{"id":796,"depth":336,"text":797},"2026-05-31","What stays paid when code is nearly free",null,"md",{},"/post/open-sourced-our-flagship-product",{"title":5,"description":845},false,"post/open-sourced-our-flagship-product",[854,855],"work","AI","public",1780359577838]