Card-Required vs No-Card Trials: Conversion Trade-offs
This decision sets the shape of your entire top of funnel: require a card to start a trial and you collect fewer, higher-intent leads that convert at a high rate; ask for no card and you collect many more leads that convert at a fraction of that rate. The engineer usually inherits this as a product call but owns the consequences β abuse controls, reminder timing, and the conversion charge all differ by model. This page sits under Trial Period Management and lays out the trade-off concretely, then shows the controls each path needs. The mechanics of the conversion charge itself are in Handling Free Trial Conversions Without Payment Friction.
Trade-offs
The two models optimize different metrics. Card-required maximizes trial-to-paid rate on a smaller pool; no-card maximizes raw qualified signups at a lower conversion rate. The right choice depends on whether your product proves value during the trial (favoring no-card, since users self-select after seeing it) or requires high intent to even start (favoring card-required).
| Dimension | Card-required (card up front) | No-card (email only) |
|---|---|---|
| Trial signups (volume) | Lower β the card form is a hard gate | Much higher β often 2β5x more starts |
| Trial-to-paid conversion | High β typically 40β60% of starts | Lower β typically 10β25% of starts |
| Net paid customers | Fewer trials Γ high rate | More trials Γ low rate (often comparable or higher) |
| Lead quality | High intent, pre-qualified | Mixed; many tire-kickers |
| Trial abuse / repeat trials | Hard β card fingerprint deters | Easy β disposable emails enable serial trials |
| Fraud exposure | Card on file; stolen-card risk at conversion | Minimal during trial; deferred to checkout |
| Conversion friction | None at expiry (silent charge) | High β full checkout required to convert |
| SCA / 3DS handling | Done early via SetupIntent | Deferred to conversion checkout |
| Support load | Lower (auto-convert is clean) | Higher (manual conversion, βI forgotβ churn) |
| Best for | High-ACV B2B, sales-assisted, complex products | Self-serve PLG products that demo their own value |
The non-obvious point in the table: more no-card signups at a lower rate frequently yield more paying customers in absolute terms, because the gate removed at the top compounds. But it shifts work onto you β abuse prevention and a real conversion checkout β that card-required avoids. Card-required trades total volume for operational simplicity and pre-qualified intent.
Step-by-Step Implementation
1. Gate provisioning on the model you chose
The branch is at trial start. Card-required attaches a payment method before granting entitlements; no-card grants immediately and defers collection.
async function startTrial(req: TrialRequest): Promise<TrialSub> {
if (TRIAL_MODE === 'card_required') {
if (!req.setupIntentConfirmed) {
throw new TrialGateError('card required before trial starts'); // β block
}
return provisionTrial(req.customerId, req.priceId, req.paymentMethodId);
}
// no-card: provision immediately, no payment method yet
return provisionTrial(req.customerId, req.priceId, /* paymentMethodId */ null);
}
2. Collect the card early on the card-required path
Use a SetupIntent so the card is vaulted and SCA is satisfied while the customer is present, enabling a silent off-session charge at conversion.
const setupIntent = await stripe.setupIntents.create({
customer: customer_id,
usage: 'off_session', // β
mandate for the later conversion charge
});
// Entitlements granted only after the client confirms this intent
3. Add abuse controls on the no-card path
Without a card, the only friction against serial trials is identity. Normalize emails and fingerprint signups so the same person cannot loop trials indefinitely.
import hashlib, re
def trial_fingerprint(email: str, ip: str, device_id: str) -> str:
# normalize: lowercase, strip +tags and gmail dots
local, _, domain = email.lower().partition("@")
local = re.sub(r"\+.*$", "", local)
if domain in {"gmail.com", "googlemail.com"}:
local = local.replace(".", "")
normalized = f"{local}@{domain}"
return hashlib.sha256(f"{normalized}|{ip}|{device_id}".encode()).hexdigest()
def can_start_trial(fp: str) -> bool:
prior = TrialFingerprint.objects.filter(fingerprint=fp).count()
return prior == 0 # β οΈ rate-limit / review if a fingerprint reappears
4. Time reminders to the model
Card-required reminders nudge toward cancellation awareness (you will be charged); no-card reminders nudge toward action (add a card to keep access). Both anchor to the immutable trial deadline, as covered in subscription lifecycle states.
REMINDERS = {
"card_required": [("D-3", "you will be charged on {date}"),
("D-1", "final reminder before billing")],
"no_card": [("D-7", "add a card to keep access"),
("D-3", "your trial ends {date}"),
("D-1", "last day β add a card now")],
}
Verification & Testing
Instrument the metric that matters: trial-start to paid conversion, segmented by model, not raw trial starts. Card-required correctness tests assert that provisioning is impossible without a confirmed SetupIntent (attempt to start with no payment method and assert the gate rejects it). No-card abuse tests assert that a normalized duplicate email β user+test@gmail.com after u.ser@gmail.com β produces the same fingerprint and is blocked on the second attempt. For both, run an A/B holdout if you can, and reconcile cohort revenue rather than comparing top-line signup counts, which always favor no-card and mislead.
Gotchas & Production Pitfalls
- Comparing signup counts proves nothing. No-card always wins on starts. Only trial-to-paid and cohort LTV settle the question; instrument those before switching models or you will optimize the wrong number.
- Email normalization is harder than lowercasing. Plus-addressing and Gmail dot-aliasing let one person generate infinite distinct-looking emails. Strip them, or your no-card trial is effectively unlimited.
- Card-required still needs a fraud check at conversion. A vaulted card can be stolen. The charge at conversion is where chargeback risk lands, so score it; card-on-file does not mean fraud-free.
- Donβt let card-required gate the aha moment. If users must understand your product before a card makes sense, the gate suppresses exactly the high-intent leads you wanted. Some products convert better by showing value first (no-card) then collecting at conversion.
- No-card conversion is a real checkout, not a silent charge. Because no payment method exists, conversion requires a full SCA-eligible checkout. Budget for that flow and its drop-off; it is the cost of the larger top of funnel.