Changelog

What's new

Every update shipped to CancelFlow — features, fixes, and improvements.

27 May 2026
Remove affiliate program (Rewardful)

Removes Rewardful scripts, referral tracking from checkout flow, affiliate footer link, and privacy policy references.

4cf5874
18 May 2026
Add customer retention rate blog post and update llms.txt

New post: "Customer Retention Rate: How to Calculate, Benchmark, and Improve It" — targets "retention rate" keyword gap, links to retention-rate-calculator — 13 internal links, 6 data tables, 5 FAQ pairs — completes the metrics content cluster alongside churn rate benchmarks

d7f1ae4
15 May 2026
Add winback playbook blog post and update llms.txt

New post: "How to Win Back Churned SaaS Customers: A Reactivation Playbook" — completes the churn lifecycle content cluster (measure → prevent → recover) — 10 internal links to existing posts and calculator tools — 5 FAQ pairs for rich results

e0265eb
13 May 2026
Update llms.txt: add 3 missing blog posts and free tools section

Adds the 3 newest blog posts (why-customers-cancel, cancelflow-vs-churnkey, calculate-reduce-saas-churn) and a new Free Tools section listing all 11 SaaS calculator pages so AI crawlers can discover them.

780ae5a
Rework vs Churnkey post: add code snippets, lead with integration simplicity
18612f1
Add CancelFlow vs Churnkey comparison blog post

SEO-optimised comparison covering pricing, features, integration complexity, save rates, and target audience. Includes FAQ schema for rich snippets.

c95e2f4
12 May 2026
Add 11 SaaS calculator tools with CancelFlow toggle and Stripe integration

- Create /tools landing page with 3-column grid of all calculators - Refactor churn calculator with Manual/Stripe mode toggle + CancelFlow toggle - Add 10 new calculators: LTV, Retention Rate, Dollar Retention Rate, CAGR, Growth Rate, Growth Ceiling, Payback Period, Gross Margin, ARPU, Stickiness Ratio - Add Stripe integration to LTV, ARPU, and Retention Rate calculators (reuses existing API) - 7 calculators have CancelFlow toggle showing 34% churn reduction impact - Update footer nav: Churn Calculator → Free Tools - Update sitemap with all tool URLs - Add tool-card hover styles

077b461
11 May 2026
Remove Product Hunt badge from hero
70121ee
Add affiliate signup link to footer nav
24d650a
Update privacy policy to disclose Rewardful affiliate tracking

Adds Rewardful to third-party services and updates cookie section to reflect the referral attribution cookie.

2f3f023
Allow Rewardful domains in Content-Security-Policy

r.wdfl.co was blocked by CSP script-src, preventing the affiliate tracking script from loading.

c84e93b
Revert "Fix Rewardful script load order — queue before main script"

This reverts commit 49de43025625405d7ca10028fd3bbc86d0d785b1.

83506fb
Fix Rewardful script load order — queue before main script
49de430
Add Rewardful affiliate tracking integration

Loads Rewardful script globally, captures referral ID on checkout, and passes it to Stripe as customer metadata and client_reference_id.

8bbf028
Add blog post: Why Customers Cancel SaaS Subscriptions

Covers the 7 most common cancel reasons with data, retention strategies for each, and a breakdown chart image.

17461dd
SEO fixes + Product Hunt badge

- Remove deprecated FAQPage schema from homepage and blog posts - Add availability field to SoftwareApplication offer schema - Add churn calculator to sitemap - Add Product Hunt featured badge to hero

d0ba1c4
8 May 2026
Add churn calculator link to footer nav
272947b
Add churn calculator tool — free lead gen page

Connects to Stripe via restricted read-only key, calculates real churn rate, lost MRR, and projects CancelFlow recovery at 34% save rate. Key is never stored. Includes trust signals and setup instructions.

38d5a92
Add blog post: How to Calculate and Reduce SaaS Churn Rates

SEO pillar post covering churn formulas, benchmarks by segment, and reduction strategies ranked by impact. Includes featured image and FAQs.

0a2624a
5 May 2026
Replace Vercel default favicon with CancelFlow logo icon

Generated multi-size ICO (16/32/48/64px), favicon-32.png, and apple-touch-icon.png from logo-icon.png using sharp.

d4906a9
Fix favicon not displaying on Firefox/Windows and Safari/iOS

Add .ico as primary fallback before SVG — Firefox and Safari don't reliably load SVG favicons. Copy favicon.ico to public/ for direct /favicon.ico access. Reorder icon list: ico > png > svg.

f855571
Embed mobile drawer, SVG icons, legal overhaul, checkout fixes

- Embed: mobile bottom drawer (80vh, swipe-to-dismiss, drag handle), close button on desktop + mobile, inline SVG icons for cross-platform rendering, system font stack, Geist Mono for step labels - Legal: add Xyliase Technologies Ltd (SC888385) as operating entity, full disclaimer of warranties, limitation of liability, indemnification, Scots law jurisdiction, comprehensive privacy policy with all third-party services, cookie details, UK GDPR rights, international transfers - Checkout: fix double dollar sign, add retry on 401 for session race condition after OAuth redirect, remove debug console.logs

6e089d2
4 May 2026
Allow cdn.cancelflow.dev in font-src CSP for self-hosted embed font
c5035fa
3 May 2026
Wire up custom accent/bg/text colours to embed

- Return accentColor, bgColor, textColor from embed API - Add CSS variables (--cf-accent, --cf-accent-rgb, --cf-bg, --cf-text) to #cf-overlay with fallback defaults - Replace all hardcoded #f97316/rgba(249,115,22,...) / #111111 / #ededed in CSS with variables - Apply theme variables via A2() after overlay is mounted using config values

c6370ce
Add CSS reset to embed to prevent host-site style bleed

Host site global CSS (button resets, heading margins, etc.) was overriding embed styles. Scoped reset block on #cf-overlay elements gives a clean slate before CF's own rules apply.

83365a7
Exempt admin embeds from auto-deactivation on subscription webhooks

Admin account embeds were being deactivated whenever a subscription webhook fired with a non-active status. Add ADMIN_EMAIL exemption to both the subscription updated and subscription deleted handlers.

eb70b99
Fix discount coupon incompatible with flexible billing mode subscriptions

Replace deprecated coupon param with discounts array, which works for both standard and flexible billing_mode subscriptions.

1d38bd3
Fix upgrade preview using deprecated retrieveUpcoming

stripe.invoices.retrieveUpcoming was removed in SDK v16+. Switch to stripe.invoices.createPreview with the new subscription_details param structure.

89fa8e3
Fix MongoDB cold-start timeouts and cached rejected promise

- Add serverless-appropriate timeouts (10s connect, 45s socket) - Reset cached promise on failure so next request retries instead of immediately rejecting - Use a thenable wrapper to keep all 33 callers unchanged

9d23b92
Add checkout debug logs and fix embed cancel fallback

- Add detailed server logs to /api/stripe/checkout and /api/stripe/checkout/complete to diagnose first-attempt auth failures - Fix handleCancel in settings to fall back to Stripe portal when CancelFlow embed fails to show (inactive embed, API error, etc.)

fe7cef0
Fixfix(checkout): derive isTrial from intentType, remove premature trial copy

Previously isTrial defaulted to true, so users who already trialed saw "Start free trial" until the subscription fetch resolved. Now isTrial is derived from the checkout API's intentType (setup = trial, payment = not), which is already set atomically with clientSecret — no race condition.

e3239a6
revert(embed): restore mobile preview drawer to 06a6dcc state
c563c46
Fixfix(embed): drawer shows modal card directly, fixes height/styling, adds X

- Add drawer prop to ModalPreview: strips decorative wrapper (diagonal bg, dim overlay, minHeight) and renders just the modal card with padding - Drawer height now fits the card naturally with no overflow - Re-add X close button in the pill row (absolute right) as dismiss fallback

8822ad5
Fixfix(embed): simplify mobile preview drawer — no wrapper, height auto, full drag

- Remove scroll container and header; ModalPreview sits directly in drawer - Drawer height is auto (fits content, no internal scroll) - touchAction: none on overlay ensures browser doesn't fight the drag gesture - Removed scroll-position guard from touchmove (nothing to scroll) - Lowered dismiss threshold to 80px for more responsive feel - Drag from anywhere on overlay (drawer or backdrop) dismisses

e1e8625
Featurefeat: restart subscription + fix upgrade preview for cancel_at_period_end subs

- Add /api/stripe/reactivate endpoint to clear cancel_at_period_end - Pricing card: show "Restart subscription" + "Cancels soon" badge when current plan is pending cancellation; show "Upgrade" on higher plans - Settings page: add Restart button inside the cancellation warning banner - Upgrade preview: fallback to linear proration calc when Stripe's retrieveUpcoming fails (common edge case with cancel_at_period_end subs)

5e3d07f
Fixfix(embed): drag to dismiss from anywhere on drawer or backdrop

Listen on the whole overlay instead of just the header. Scroll area only intercepts the gesture when scrolled to top; otherwise lets content scroll normally. Backdrop drag also triggers dismiss.

06a6dcc
Fixfix(embed): make entire drawer header draggable, not just the pill
e86bb88
Fixfix(checkout): keep selected tab text visible on hover
a8d7f00
Fixfix(embed): replace Framer drag with native touch events for drawer dismiss

useDragControls + passive touch events caused background scroll instead of dismissing the drawer. Non-passive touchmove listener with e.preventDefault() on the handle now blocks scroll while dragging; CSS transform/transition handles enter/exit animation.

491b1b5
Featurefeat(embed): centred preview toggle button, 80vh drawer, swipe-down to dismiss

- Button centred at bottom so it doesn't overlap save button - Drawer is 80vh with spring enter/exit animation - Drag-to-dismiss via handle bar only (useDragControls) so drawer content stays scrollable; swipe >100px or fast flick closes it - Backdrop tap also closes

1b36d77