Every update shipped to CancelFlow — features, fixes, and improvements.
Removes Rewardful scripts, referral tracking from checkout flow, affiliate footer link, and privacy policy references.
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
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
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.
SEO-optimised comparison covering pricing, features, integration complexity, save rates, and target audience. Includes FAQ schema for rich snippets.
- 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
Adds Rewardful to third-party services and updates cookie section to reflect the referral attribution cookie.
r.wdfl.co was blocked by CSP script-src, preventing the affiliate tracking script from loading.
This reverts commit 49de43025625405d7ca10028fd3bbc86d0d785b1.
Loads Rewardful script globally, captures referral ID on checkout, and passes it to Stripe as customer metadata and client_reference_id.
Covers the 7 most common cancel reasons with data, retention strategies for each, and a breakdown chart image.
- 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
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.
SEO pillar post covering churn formulas, benchmarks by segment, and reduction strategies ranked by impact. Includes featured image and FAQs.
Generated multi-size ICO (16/32/48/64px), favicon-32.png, and apple-touch-icon.png from logo-icon.png using sharp.
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.
- 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
- 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
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.
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.
Replace deprecated coupon param with discounts array, which works for both standard and flexible billing_mode subscriptions.
stripe.invoices.retrieveUpcoming was removed in SDK v16+. Switch to stripe.invoices.createPreview with the new subscription_details param structure.
- 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
- 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.)
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.
- 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
- 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
- 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)
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.
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.
- 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