---
updatedAt: 2026-04-14T05:29:57.000Z
agentTools:
  projectIndex: https://docs.developers.convert.com/llms.txt
---

# Credit Card Gated Free Trial

```javascript Node.js
// --- Server Implementation ---

// 1. Global Initialization (Run once at app startup)
import { ConvertSDK } from '@convertcom/js-sdk';

const convert = new ConvertSDK({
  sdkKey: 'YOUR_SDK_KEY',
  dataStore: null,
});

// 2. Per-Request Logic (Run for each signup request)
async function handleSignupFlow(req, res) {
  await convert.onReady();
  const user = req.user;

  const context = convert.createContext(user.id);
  const variation = context.runExperience('credit-card-gate-test');

  let requireCard = false;
  let allowSkip = true;

  if (variation && variation.key === 'soft-gate') {
    requireCard = true;
    allowSkip = true;
  } else if (variation && variation.key === 'hard-gate') {
    requireCard = true;
    allowSkip = false;
  }

  // Store the gate decision in the user record
  await db.users.update(user.id, {
    creditCardGate: requireCard,
    creditCardSkipAllowed: allowSkip,
    trialRequiresPayment: requireCard && !allowSkip,
  });

  res.render('signup', {
    showCreditCardForm: requireCard,
    allowSkip,
    trialDays: user.trialDays,
  });
}


// --- Goal Tracking ---

// Called when the trial converts to a paying subscription
const context = convert.createContext(user.id);

context.trackConversion('trial-to-paid-conversion');
```
```typescript TypeScript
// --- Server Implementation ---

// 1. Global Initialization
import { ConvertSDK, Context } from '@convertcom/js-sdk';

const convert = new ConvertSDK({
  sdkKey: 'YOUR_SDK_KEY',
  dataStore: null,
});

// 2. Per-Request Logic
async function handleSignupFlow(req: any, res: any) {
  await convert.onReady();
  const user = req.user;

  const context: Context = convert.createContext(user.id);
  const variation = context.runExperience('credit-card-gate-test');

  let requireCard = false;
  let allowSkip = true;

  if (variation && variation.key === 'soft-gate') {
    requireCard = true;
    allowSkip = true;
  } else if (variation && variation.key === 'hard-gate') {
    requireCard = true;
    allowSkip = false;
  }

  await db.users.update(user.id, {
    creditCardGate: requireCard,
    creditCardSkipAllowed: allowSkip,
    trialRequiresPayment: requireCard && !allowSkip,
  });

  res.render('signup', {
    showCreditCardForm: requireCard,
    allowSkip,
    trialDays: user.trialDays,
  });
}


// --- Goal Tracking ---

// Called when the trial converts to a paying subscription
const context: Context = convert.createContext(user.id);

context.trackConversion('trial-to-paid-conversion');
```

# Overview

<!-- javascript@4-10 -->

**Type:** `a/b_fullstack` | **Key:** `credit-card-gate-test` | **Target:** `/signup`

**Category:** Activation

Test whether requiring a credit card before the trial starts increases the total number of paying customers.

# Per-Request Logic

<!-- javascript@12-44 -->

Gate credit-card capture on the variation key before starting the trial. Send a reminder email 1-2 days before the first charge to reduce chargebacks.

# Goal Tracking

<!-- javascript@46-51 -->

Track the conversion event when the user completes the target action.

# Hypothesis

We believe that asking users to add a credit card before starting a free trial will dramatically increase overall paying customers. While signups will dip, the users who proceed are high-intent and far more likely to convert. Making the gate optional (soft gate) captures most of the conversion lift with minimal signup loss.

# Targeting

All new users during the trial registration flow, after account creation but before trial activation.

# Control

No credit card required. User signs up, free trial starts immediately.

# Variations

**Variation A (Soft Gate):** Credit card form appears before the trial starts. A 'Skip' option is available but de-emphasized. A timeline shows: Today → Start free trial; Day 5 → Reminder email; Day 7 → First charge.

**Variation B (Hard Gate):** Credit card is required. No skip option. Same timeline as Variation A.

# Primary Metric

Number of paying customers after the trial ends (not just conversion rate — total paying customers is the headline number).

# Guardrail Metric

Trial start rate. Monitor the drop in signups; the test wins only if the increase in paying customers outweighs the signup dip.

# Benchmark

Free-to-paid conversion jumped from 5% to 35%. Overall paying customers doubled despite a dip in signups. Winner was declared after only 8 days. (Source: Fyxer)

# Key Considerations

- Inspired by Canva's checkout flow: show a clear timeline of what happens and when the charge occurs to reduce anxiety.
- Send a reminder email 1-2 days before the trial ends — this significantly reduces chargebacks and support tickets.
- The 'soft gate' variant (optional credit card) gave Fyxer most of the uplift with less friction — test this first.
- Track trial start rate as a guardrail. If it drops more than 50%, the gate may be too aggressive for your audience.
- This test should be concluded quickly (1-2 weeks). Fyxer concluded theirs in 8 days.