mirlyDownload

blog · 2026-05-14

Why we don't auto-renew (and why nobody else in this category can say that)

Half of Final Round AI's 1-star Trustpilot reviews are billing complaints. We built Mirly's pricing as the explicit inverse — opt-in renewal, 5-day reminder email, never a silent charge. Here's why we made it the headline.

The default for our category is broken

Open any review aggregator — Trustpilot, Reddit, AppExchange — and search for any of the major interview copilots' names plus "billing." The pattern is identical:

  • "I subscribed for one interview and forgot. Six months later, $244 charged."
  • "Cancelled twice. They charged me again. Refund refused."
  • "I have to go through 3 chat agents to cancel an annual plan."

For a £5-£75/month consumer product, billing dark patterns generate more 1-star reviews than the actual product quality. Half of Final Round AI's 1-star Trustpilot reviews mention auto-renewal or refund delays. The pattern is so common we built Mirly's pricing as the explicit inversion.

What "opt-in renewal" actually means

Most subscriptions in tech are opt-out — they charge by default; you have to actively cancel before each renewal. Even good companies do this; it's the industry default.

Mirly's Monthly plan is opt-in renewal:

  1. When you subscribe, Stripe stores cancel_at_period_end: true by default
  2. Five days before your period ends, we email you a one-click renew link
  3. If you don't click, nothing charges. Your subscription expires gracefully.
  4. If you do click, we extend one cycle — then flip the flag back to "cancel at end" so the next month works the same way.

The structure makes silent renewal architecturally impossible. There's no scenario where you get charged without clicking "renew" in an email.

The implementation, for the curious

This isn't a marketing claim — it's how the Stripe webhook handler is written. When a customer.subscription.created event fires, we immediately call:

stripe.UpdateAsync(subscriptionId, new SubscriptionUpdateOptions {
  CancelAtPeriodEnd = true
});

This sets the flag to cancel at the end of the current period. When the user clicks "renew" via our email link, we flip it to false for that cycle, then on the invoice.paid event we flip it back to true for the next cycle. The state machine forces a click at every renewal point.

Why no other category competitor offers this

Two reasons:

  1. It reduces LTV by ~30%. Forgetful subscribers are profitable subscribers. A pricing model that doesn't capture them is a smaller business — until trust compounds.

  2. It requires careful Stripe webhook handling. Every period boundary needs the flag flipped twice (false for the charge, true for the next cycle). It's not the default Stripe checkout flow — you have to implement it deliberately.

Both reasons are revenue-protective for incumbents. Neither is good for users.

The bet

We think the customer who buys £5 of credits, uses them, doesn't subscribe to monthly, and tells two friends — is worth more long-term than the customer who silently auto-renewed for six months and writes a 1-star Trustpilot review with their refund denial. The bet is on word-of-mouth and product quality, not on subscription inertia.

We could be wrong. If we are, monthly revenue numbers will tell us, and the industry default will keep winning. But we'd rather build a smaller honest business than a larger one that depends on people forgetting.

What this looks like inside the app

Open Mirly → Billing → if you have an active monthly sub, you'll see:

Subscription · ends in 6 days · won't auto-renew

[ Manage subscription → ]

Click Manage Subscription, the Stripe Customer Portal opens, you can cancel, update card, change plan. No support ticket. No 3-agent chat queue. The state of your subscription is always visible to you.

What this looks like in the email

Five days before each cycle ends, you get:

Subject: Your Mirly subscription ends in 5 days — renew if you'd like to continue

Hi,

Your Mirly monthly subscription ends on 2026-06-12.

Unlike most services, we don't auto-renew. If you'd like another month of interviews, click here to renew. No card re-entry, no charge until you click.

— the Mirly team

The renew link is a signed JWT with your user ID + subscription ID, valid for 14 days. One click extends one cycle.

How to verify the promise

Try it. Subscribe to a monthly plan. Wait 25 days. Watch the reminder email arrive. Don't click. On day 30, the sub expires; your card is not charged. Sign back in any time later to see your account in a clean expired state.

The trust isn't built on this blog post. It's built on the next time your renewal is supposed to happen, and we did exactly what we said.

Related reading