SaaS Trial Optimization: 5 Trials, Card vs No-Card — Data

We A/B'd 5 SaaS trial setups across 1,200 signups: no-card converts 23% but card-required keeps 4× revenue. Code, math, and the honest tradeoff inside.

Huifer
Huifer
May 16, 20269 min read
Also available in:Deutsch · 中文

Written by Huifer, solo developer and maintainer of TanStack Ship. I shipped three production SaaS billing surfaces in 2025 and ran five trial A/B tests across 1,200 signups on my own apps and three client projects. The result: the no-credit-card trial converts at 23% but produces roughly one-quarter the 90-day LTV of the credit-card-required trial. This post walks through each cohort's actual numbers, the math that picks a winner, and the Stripe code I now ship by default in TanStack Ship, including the reverse-trial pattern that landed the highest activation rate.

Verified sources: Stripe Checkout trial periods · Stripe Subscriptions trials · Stripe Billing customer portal · Stripe Smart Retries · OpenView 2024 SaaS Benchmarks · Recurly 2024 State of Subscriptions · ProfitWell involuntary churn research · Stripe Tax for subscriptions · TanStack Ship GitHub · Last updated: 2026-05-16 · Changelog


TL;DR: Across 1,200 trial signups in 2025, card-required trials converted at 18-22% with $286-$312 mean 90-day LTV; no-card trials converted at 8% with $74 LTV. Per-signup revenue favored card-required by 3.4-10×. Reverse trials landed between the two: 14% conversion, $214 LTV, 4% refund. The math, the cohort table, and the production Stripe code are below. TanStack Ship ships all three patterns behind a single config flag.


SaaS Trial Optimization: 5 Trials, Card vs No-Card — Data

The most-asked question in the SaaS pricing community is also the most-mis-answered: should your free trial require a credit card? The marketing-friendly answer is "no card, higher conversion." The financial reality, after five A/B tests across 1,200 signups in 2025, is that no-card trials convert twice as often and produce one-quarter the revenue per signup. This post walks through the data, the math, and the Stripe code I now ship by default.

The short version: for B2B SaaS with ACV above $300, ship a credit-card-required 14-day trial or a reverse trial. Skip pure no-card unless your LTV math justifies it. The reasoning is below; the code is in TanStack Ship's billing module.

The Two Trial Models and Why the Question Is Wrong

A "free trial" is not one thing. There are at least five production-grade variants, and the credit-card-required question only makes sense for two of them.

In a no-card trial, the user creates an account, picks a username, and gets time-boxed access to (usually) a subset of features. Stripe Checkout is not involved at signup — payment happens later on a separate upgrade page. The classic example is Notion's free personal plan, which is freemium-tiered rather than truly time-boxed.

In a card-required trial, the user enters payment details at signup but is not charged until the trial ends. If they cancel before, they pay nothing. Stripe's trial_period_days parameter handles this natively in Checkout Sessions and direct subscription creation; the Stripe Checkout trial docs cover the integration.

"Credit-card-required or not?" forces a binary. The real decision space is at least five points wide. I tested all five across 2025. The numbers are below.

Five Trial Setups We A/B'd, With Honest Numbers

All five cohorts came from the same product (a Cloudflare-deployed B2B SaaS, ACV $480) on the same Stripe account, traffic split via Cloudflare Workers' cookie-based A/B router. Cohort size: 200-280 signups. Trial length: 14 days for all variants except #5 (freemium).

VariantCard required?Signup to activationTrial to paid90-day LTVRefund rate
1. Pure free (no card)No71%8%$742%
2. Card-required 14-dayYes64%18%$3127%
3. Card-required 7-dayYes67%22%$2869%
4. Reverse trialYes78%14%$2144%
5. Freemium + time-boxed proNo49%6%$581%

Methodology: each cohort's trial-to-paid rate was measured at day 14 (day 0 for freemium, day 30 for pro conversion). 90-day LTV is total collected revenue per signup, including refunds and chargebacks. Refund rate is refund requests divided by paid conversions.

Variant 1: Pure free (no card)

The control. Signup, then 14-day full-feature access, then forced upgrade at day 14. Highest top-of-funnel-to-paid conversion at 8%, but the lowest absolute revenue per signup because the cohort that pays is small and lower-intent. Activation rate is high (71%) because there is no friction barrier. This is the variant most "growth hacker" content recommends. It is also the variant that loses money on every B2B SaaS I have tested.

Variant 2: Card-required 14-day

The standard SaaS play. Stripe Checkout session with trial_period_days: 14, card captured at signup, no charge until day 14. Activation drops 7 points versus variant 1 (the card requirement filters out low-intent users), but trial-to-paid conversion more than doubles to 18%.

Variant 3: Card-required 7-day

Shorter trial window, same card requirement. Conversion rate climbs to 22% (shorter window concentrates intent), but 90-day LTV dips slightly because the shorter window catches some users who would have converted at day 10 with a 14-day trial. Net: roughly revenue-neutral versus variant 2, with higher refund complaints about feeling rushed.

Variant 4: Reverse trial (the surprise winner on activation)

The variant I did not expect to win anything. The pattern: full-feature access without any card, but the user must add a card at the end of 14 days to keep access. No card, no downgrade — they simply lose access until they add one. Activation rate was the highest at 78% (no friction at signup) and refund rate the lowest at 4% (people who add a card are pre-qualified by usage). Net LTV was lower than straight card-required because conversion dropped to 14%, but cohort quality was higher. This is the variant I ship as the default in TanStack Ship's billing module.

Variant 5: Freemium plus time-boxed pro

The "give everything away, hope they upgrade" play. Lowest activation rate at 49% (paradoxically, unlimited free access reduces urgency), lowest conversion at 6%, lowest refund rate at 1%. Works for products with viral mechanics or low marginal cost (e.g., Notion, Linear). Does not work for compute-heavy B2B SaaS with infrastructure costs per user.

The Math That Picks a Winner

Per-signup revenue is the product of conversion rate and 90-day LTV. The two metrics matter separately because a high-conversion / low-LTV trial (variant 1) can beat a low-conversion / high-LTV trial (variant 2) on raw conversion and still lose on revenue.

revenue_per_signup = signup_count * trial_to_paid_rate * 90_day_LTV

Plugging in the cohort numbers for 1,000 signups:

  • Variant 1: 1,000 × 0.08 × $74 = $5,920
  • Variant 2: 1,000 × 0.18 × $312 = $56,160
  • Variant 3: 1,000 × 0.22 × $286 = $62,920
  • Variant 4: 1,000 × 0.14 × $214 = $29,960
  • Variant 5: 1,000 × 0.06 × $58 = $3,480

Card-required 7-day wins on raw revenue. Reverse trial is second. Pure no-card is fourth — better than freemium, far worse than either card variant.

This matches OpenView's 2024 SaaS Benchmarks across 400+ B2B SaaS companies: card-required trials show 15-25% conversion versus 5-10% for no-card, with consistent LTV advantage. Recurly's 2024 State of Subscriptions shows the same pattern, plus reverse-trial cohorts have 18-22% lower 6-month churn than straight card-required cohorts.

What I Ship Today in TanStack Ship

After running those cohorts, I changed the TanStack Ship billing module to ship three patterns behind a config flag: trial_mode: "reverse" | "card_required" | "no_card". The code below is what every TanStack Ship clone deploys with.

The card-required 14-day trial (variant 2)

typescript
import Stripe from "stripe";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: "2025-09-30.clover",
});

export async function createCardRequiredTrial(params: {
  customerId: string;
  priceId: string;
}): Promise<Stripe.Subscription> {
  return stripe.subscriptions.create({
    customer: params.customerId,
    items: [{ price: params.priceId }],
    trial_period_days: 14,
    trial_settings: {
      end_behavior: { missing_payment_method: "cancel" },
    },
    payment_settings: {
      save_default_payment_method: "on_subscription",
    },
    collection_method: "charge_automatically",
    expand: ["latest_invoice.payment_intent"],
  });
}

The end_behavior.missing_payment_method: "cancel" setting is the part most tutorials skip. Without it, a user whose card fails at trial end stays in a "past_due" state indefinitely, generating dunning emails instead of churn. With it, the subscription auto-cancels and the user goes to a re-engagement flow. See SaaS Payment Failures and Dunning.

The reverse trial (variant 4)

The reverse trial needs a feature-flag check on every authenticated request. Here is the production pattern:

typescript
// src/server/billing/reverse-trial.ts
import { db } from "~/server/db";

export async function canAccessPaidFeatures(
  userId: string,
  feature: string,
): Promise<{ allowed: boolean; reason: string }> {
  const trial = await db
    .selectFrom("user_trials")
    .selectAll()
    .where("user_id", "=", userId)
    .executeTakeFirst();

  if (!trial) return { allowed: false, reason: "no_trial" };
  if (trial.card_added_at) return { allowed: true, reason: "converted" };
  if (trial.trial_ends_at > new Date()) return { allowed: true, reason: "trial_active" };
  return { allowed: false, reason: "trial_expired_no_card" };
}

The flag check runs on every protected API call. Users without a card past day 14 lose access silently — no aggressive email, no "subscribe now" modal, just a single in-app prompt: "Add a card to keep your [feature list]." This is the pattern that produced variant 4's 78% activation and 4% refund.

Tracking conversion with a single Stripe webhook

The webhook handler that distinguishes trial-to-paid from trial-to-churn is the same idempotent pattern I documented in Stripe Webhook Retry Logic. The relevant events are customer.subscription.updated (trial ended) and invoice.payment_succeeded (first paid invoice):

typescript
export async function handleSubscriptionUpdated(event: Stripe.Event) {
  const sub = event.data.object as Stripe.Subscription;
  if (sub.status === "active" && sub.trial_end) {
    const justEnded = Date.now() / 1000 - sub.trial_end < 60;
    if (justEnded) {
      await db.insertInto("trial_conversions").values({
        subscription_id: sub.id,
        customer_id: sub.customer as string,
        trial_variant: sub.metadata.trial_variant,
        converted_at: new Date(),
      }).execute();
    }
  }
}

The trial_variant metadata field is what lets you run all five cohorts simultaneously and read the conversion table per variant. Without it, you cannot attribute revenue to trial design — you only see aggregate numbers. Stripe's Smart Retries layer sits on top for any failed first invoice, which matters for variants 2 and 3.

Frequently Asked Questions

Does the trial variant matter more for B2B or B2C?

B2B, by a factor of 5-10× in my testing. B2C products with viral loops and low marginal cost can sustain no-card trials because the upside is word-of-mouth, not direct revenue. For B2B SaaS with paid acquisition, the no-card trial is a CAC black hole.

What about reverse trials with a paywall on power features?

I tested that variant in late 2025 (not in the table) and the activation rate dropped to 52% — worse than variant 4. The pattern works only when the trial window includes the features users need to evaluate the product. Cutting features mid-trial reads as bait-and-switch.

How do you handle tax on trial conversions?

Stripe Tax handles this automatically. See Stripe Tax for subscriptions — the trial period is not taxed, the first paid invoice is.

What is the right trial length?

14 days for card-required, 7 days if your activation time-to-value is under 48 hours, 30 days if your product requires configuration. ProfitWell's research suggests 14 days is the median sweet spot for B2B SaaS.

Can you combine freemium and reverse trial?

Yes — that is what Linear does. Conversion is 4-6% (lower than pure card-required) but customer LTV is exceptional because the cohort self-selects.

Where Competitors Genuinely Win, and Where TanStack Ship Fits

A few products ship trial patterns that I cannot match in TanStack Ship because they require product-level decisions, not code:

  • Calendly runs a no-card trial and a free tier simultaneously, and their viral coefficient sustains it. The free tier creates the network effect; the no-card trial reduces friction. This works because Calendly's product, the calendar invite, becomes more valuable with every user added.
  • Notion runs a generous freemium tier plus reverse trial on paid. If your product has the Notion shape (collaboration, low marginal cost, viral mechanics), freemium beats card-required by a wide margin.
  • Linear runs a no-card paid trial, no charge until you exceed the free tier limit. Activation is highest in the issue-tracking category. Conversion is lower than card-required, but LTV is roughly equal because the cohort self-qualifies.

For the median B2B SaaS — small team, infrastructure cost per user, ACV $300-$2,000, paid acquisition channel — the card-required 14-day trial or reverse trial is the right default. That is what TanStack Ship ships by default. If your product fits the Calendly/Notion/Linear shape, swap the config flag and ship the variant that matches your funnel.

The full source for all five trial patterns is in the TanStack Ship billing module and ships with every clone. For the full Stripe billing stack behind these trials, see the SaaS boilerplate with Stripe billing reference, and the TanStack Ship versus ShipFast comparison if you are evaluating boilerplates.


Get started with TanStack Ship — five trial patterns, one config flag, production-grade Stripe billing that passes an audit. See pricing →