+1
Revenue

Trial and free to paid conversion audit

Measure trial to paid and free to paid conversion properly by cohorting on trial start date, then split genuine non-conversion from trials that wanted to pay but whose first charge failed. Covers trial conversion rate, time to convert, trial length comparison and trial abuse screening.

  • +2
    What's our trial to paid conversion rate?
  • +2
    How many trials failed their first payment instead of choosing not to buy?
  • +2
    Does a 7 day trial convert better than a 14 day trial for us?

The playbook

Most trial conversion numbers answer the wrong question because they treat every non-conversion as a buying decision. A trial whose first charge failed is not a verdict on the product, it is a billing failure, and conflating the two is the central error here. This audit cohorts on trial start, requires a settled payment before counting a conversion, and splits non-conversion into buckets that lead to different fixes.

Steps

  1. Resolve plan and trial identity before building any cohort. stripe.list_prices with type: "recurring" and active: true, paged fully, to build a map of price to unit_amount, recurring.interval, recurring.interval_count and recurring.trial_period_days. Pair with stripe.list_products for readable names, falling back to product or price metadata when nickname is null. On Polar, call polar.get_metrics once to confirm which trial slugs this workspace populates. On Dodo, call dodo_payments.list_products and read trial_days off the subscription rather than the plan. Never infer trial length from the plan alone: a subscription can override the price's trial period.

  2. Build the cohort by trial start date. stripe.list_subscriptions with status: "all" and created_gte / created_lte bracketing the cohort month plus the full trial length, paged on starting_after until exhausted. Keep trial_start, trial_end, status, cancel_at_period_end, canceled_at, cancellation_details, latest_invoice and items. On Polar use polar.list_subscriptions; on Dodo use dodo_payments.list_subscriptions with created_at_gte / created_at_lte. Separately pull status: "trialing" for the live pipeline and value it as pipeline, not revenue.

  3. Require a settled payment for the numerator. A status change is not a conversion. For each cohort member, confirm a real paid first invoice via stripe.list_invoices with subscription: <id> and status: "paid", or a succeeded intent via stripe.list_payment_intents. Run this only against the ambiguous subset, not the whole cohort, to keep page counts sane. On Polar, polar.list_orders with status: ["paid"] serves the same purpose, and polar.get_customer_state resolves single accounts under discussion.

  4. Decompose non-conversion into four buckets. Explicit cancel during trial: cancel_at_period_end set while trialing, or cancelled before trial_end. No payment method: Stripe status paused, which it reaches only when a trial ends without a payment method. Attempted and failed first charge: incomplete, or past_due immediately after trial_end, with attempt_count at 1 or more. Hard expired: incomplete_expired, reached when the first invoice goes unpaid for 23 hours, which is terminal. Read decline reasons from dodo_payments.list_payments with status: "failed" and its error_code, from polar.list_payments, or from last_payment_error.decline_code on stripe.list_payment_intents. Buckets two and three are recoverable and are the entire reason this audit exists.

  5. Measure time to convert, trial length and abuse. Distribution of days from trial_start to first settled payment, so trial length can be tuned to where the mass actually sits. Compare conversion across the trial lengths genuinely in use, detected from trial_start to trial_end deltas rather than assumed, and treat a mid-period trial length change as a series break. Screen for repeat trials on the same email domain or card fingerprint and for trials that reached trial_end with zero product usage: use stripe.search with resource: "customers" or resource: "subscriptions" for metadata and name matching, and posthog.query or postgres.query (after postgres.get_schema) for the activation side. Keep the abuse bucket out of the honest conversion rate rather than deleting it.

  6. Report. One row per trial start cohort with columns: cohort month, trials started, converted with settled payment, conversion rate, cancelled in trial, ended with no payment method, failed first charge, hard expired, abuse-flagged, median days to convert, converted MRR, recoverable MRR in the failed and no-payment-method buckets. Then deliver one judgement: state the conversion rate against the model-matched Growth Unhinged benchmark (8% median overall, 30% when a card is required up front), and name how many points of the shortfall are a billing failure rather than a buying decision.

Gotchas

  • A failed first charge is not a non-conversion. This is the trap the whole playbook exists for. Stripe's revenue recovery analytics explicitly exclude the first invoice payment following a trial, so these failures appear in neither the conversion funnel nor the dunning dashboard. Report them as their own line and price them, because they convert with an email, not with a product change.
  • Trial subscriptions emit $0.00 invoices. Counting invoices to count conversions counts every trial twice, once at zero and once at the real price. Count distinct subscriptions with a settled non-zero payment instead.
  • The 23 hour fuse on incomplete_expired. Stripe moves a subscription to incomplete_expired if the first invoice is not paid within 23 hours, and the status is terminal. A cohort pulled the next morning shows these as permanently lost even though an intervention at hour 20 would have worked, so always report the age of the window you pulled.
  • paused means no payment method, not customer paused. Stripe enters paused only when a trial ends without a payment method. Reading it as a voluntary pause hides a pure collections problem. Separately, pause_collection does not change status at all, so those accounts still read active.
  • Cohort on trial start, and watch the timezone cut. Conversions lag the cohort by the trial length, so a conversion-dated numerator over a start-dated denominator mechanically breaks the newest month. Stripe filters are UTC epoch seconds, Polar takes an IANA timezone, Dodo takes ISO timestamps, so a trial starting at 23:00 UTC on the last day of the month lands in a different cohort for a US team.
  • Minor units, interval_count and multi-currency. Amounts are integer minor units, so divide by 100 once and not at all for zero-decimal currencies such as JPY. Monthly normalisation is unit_amount divided by 100 divided by the months in the interval, and forgetting interval_count triples a quarterly plan. Never sum trial MRR across currencies without stating the FX source.
  • Test clocks and status spellings. Trial logic is the most test-clocked part of any billing integration, so filter on livemode and drop non-null test_clock. Dodo spells the cancelled state with two Ls while Stripe spells it canceled, and a status comparison written for one silently returns zero rows against the other. On Polar, prefer the pre-computed trial_monthly_recurring_revenue and checkouts_conversion slugs over recomputing from raw orders; on a Stripe-only or Dodo-only account state plainly that there is no checkout-step rate available and the measurement starts at the trial subscription.

Sequel CLI

Install Sequel skills into your agent

One command connects your agent to Sequel and installs the Sequel skill, so it knows this playbook exists and reads it when a question matches. The CLI signs you in, provisions a scoped API key and writes the config for you.

Already have an MCP client?

https://api.sequel.sh/mcp

Point it at this URL and sign in when prompted, or send an API key from Settings as a Bearer token. Skills come with it; nothing else to install. Manual setup per client

  1. 1

    Install the Sequel CLI

    One line installs the latest CLI with whatever package manager you have.

    curl -fsSL https://sequel.sh/install | sh
  2. 2

    Sign in

    Authenticate in your browser and pick an organization.

    sequel login
  3. 3

    Install into your agent

    Writes the MCP config and installs the Sequel skill file for agents that support skills. Pick an agent from the list, or target one directly by its slug.

    sequel install
    • Claude Code
      sequel install claude-code
    • Claude
      sequel install claude
    • Cursor
      sequel install cursor
    • VS Code
      sequel install vscode
    • Windsurf
      sequel install windsurf
    • Zed
      sequel install zed
    • Codex
      sequel install codex
    • OpenClaw
      sequel install openclaw
    • Hermes
      sequel install hermes

FAQ

Frequently asked questions

What is a good trial to paid conversion rate?
Growth Unhinged's 2026 free to paid conversion report, covering 200 B2B software products measured within six months of signup, puts the median at 8% with a 10x spread between the top and bottom quintiles. Products requiring a card up front convert at 30%, more than 5x those that do not, and 80% of free trials do not require a card. Compare like with like before judging your number.
How do I calculate trial to paid conversion rate?
Cohort by trial start date, not by conversion date, then divide trials that reached active status with a successful first payment by all trials started in that cohort. The numerator requires a settled payment, not just a status change, because a subscription can move from trialing to active before the first charge clears. Conversions lag by the trial length, so a conversion-dated numerator over a start-dated denominator makes the newest cohort look broken.
Why do trial conversions fail at the first payment?
Expired or declined cards, cards added months before the charge, and deliberate trial hopping on burner cards. Stripe treats a trial ending with no payment method as status paused, moves an unpaid first invoice to the terminal incomplete_expired after 23 hours, and excludes the first post-trial invoice from its revenue recovery analytics, which is why these failures are usually invisible in both the conversion report and the dunning dashboard.
What is the difference between free trial and freemium conversion benchmarks?
In the Growth Unhinged 2026 sample, 20% of free trial products convert below 2.5% and 23% convert above 25%, while freemium is tighter: 25% below 2.5%, 29% at 2.5 to 7.5%, 25% at 10 to 15%, and above 15% is rare. Only 7% of surveyed products use a reverse trial. Pick the distribution matching your model rather than the blended 8% median.
Can an AI agent audit trial to paid conversion?
Yes. With Stripe, Polar or Dodo Payments connected the agent builds trial start cohorts, requires a settled payment for the numerator, and decomposes non-conversion into explicit cancel, no payment method, failed first charge and hard expiry. Adding PostHog separates customers who never got value from customers who did and whose card declined. Sequel provides the Stripe, Polar, Dodo Payments and PostHog connections over MCP and the trial-conversion-audit playbook.

Put this playbook to work

Connect a source, ask the question, and the agent follows these steps. Free to start.