Open source · Pay only when you get paid

Turn more free trials into paying customers.

trial2pay holds the card at signup and captures it the moment the trial ends. Industry benchmarks show trial-to-paid conversion jumps from 12–18% to 45–60% when a card is on file. No product changes. No take rate. We only charge when your customer pays you.

No credit card required. Self-host is free forever.

+30–40pp
conversion lift
$0.50
only when captured
10 min
to integrate

Conversion lift sourced from ProfitWell / Paddle 2023 aggregated SaaS trial data. Read on GitHub ↗

// On signup — from your server
await fetch("https://trial2pay.com/api/v1/trials", {
  method: "POST",
  headers: { Authorization: `Bearer ${API_KEY}` },
  body: JSON.stringify({
    trial_config_id: "cfg_pro_7d",
    customer_email: "alex@acme.dev",
  }),
});

// → 201 Created
// {
//   "trial_id": "tr_01hr...",
//   "checkout_url": "https://trial2pay.com/c/tr_01hr...",
//   "capture_at": "2026-04-24T17:00:00Z"
// }
Real response · test mode200 OK · 148 ms

The problem

Your free trial is leaking revenue — and inviting abuse.

Every trial without a card on file is a coin flip your product didn't need to make. The fix is a mental-model change at signup, not a product change.

Most trials never convert.

SaaS trials convert at 12–18% when no card is collected. Signing up costs nothing, so nothing is on the line. By the time the trial ends, your would-be customer has already moved on.

Free-tier abuse scales with you.

Throwaway emails, multi-account farming, and "forever free" loopholes cost more the more popular you get. A card at signup makes abuse economically pointless — not technically impossible, just not worth it.

Willing buyers forget to convert.

With a card on file, the trial captures automatically the moment it ends. Fewer abandoned trials, fewer refund requests, fewer chargebacks — and customers who wanted the product don't lose it by accident.

Typical trial (no card)
12–18%
convert to paid
Card-on-file trial
45–60%
convert to paid

Source: ProfitWell / Paddle — 2023 aggregated SaaS trial data. Range varies by price point; lower ACVs (<$20) see smaller lift.

Revenue impact

Boost revenue without shipping a new feature.

The math is the same across every price point. Drop in trial2pay, the card is on file at signup, and more of your pipeline converts on day one of paid — while the $0.50-per-capture fee stays vanishingly small against the plans you actually sell.

Plan price
$29 / mo
Trials / month1,000
Before (15% convert)150 paid
After (45% convert)450 paid
Monthly revenue lift
+$8,700 / mo
Plan priceTypical
$99 / mo
Trials / month500
Before (15% convert)75 paid
After (45% convert)225 paid
Monthly revenue lift
+$14,850 / mo
Plan price
$499 / mo
Trials / month100
Before (15% convert)15 paid
After (45% convert)45 paid
Monthly revenue lift
+$14,970 / mo
The math, in plain language: at every tier the revenue lift dwarfs the fee. You earn $29–$499 per conversion; trial2pay earns 50 cents — and only when your customer actually pays. On a $99 plan that's a ~0.5% effective take, no MRR bands, no surprise overages. Assumes conversion moves from 15% (no card) to 45% (card on file), the midpoint of the ProfitWell / Paddle benchmark. Your numbers will vary.

How it works

Three API calls. The full PaymentIntent lifecycle, automated.

Under the hood of the revenue lift is one week of payments work you don't have to do. We handle PaymentIntents, capture scheduling, webhook retries, idempotency, and the full audit trail — so you write three calls and move on.

Authorize at signup

Your signup calls POST /api/v1/trials. We create a PaymentIntent with capture_method: 'manual'. The card is validated and funds are held.

await trial2pay.trials.create({
  trial_config_id: "cfg_pro_7d",
  customer_email: user.email,
});
// → status: "authorized"

Hold for the trial

Funds remain authorized for up to 7 days (Stripe's hard limit). Customer uses your product. You handle usage, we handle the hold.

// Nothing on your side.
// Stripe keeps the auth live.
// You get webhook: trial.authorized

Capture or release

pg_cron triggers capture at trial end. Cancel to void. Every state change is HMAC-signed, retried on failure, logged.

// Auto-capture at trial_ends_at
// → webhook: trial.captured

// Or refund before:
await trial2pay.trials.cancel(id);
Cards never touch our servers
Entered into Stripe Elements (iframe). We only see a pm_ token.
Your Stripe. Your money.
Funds flow end-user → Stripe → your balance. Nothing in between.
Every call, logged
Open source + per-trial audit log. Auditable by design.

Why open source matters for payments

You wouldn't route card data through an AI-branded black‑box. Neither do we.

Closed payment SaaS ask you to trust a growth dashboard with the most sensitive part of your business. trial2pay is the opposite: a thin, auditable layer on top of Stripe — so the only thing between you and your customer's bank is Stripe itself.

Your Stripe, not ours
You paste a restricted Stripe key during onboarding. Every Stripe call runs on your account, with your keys, against your balance. trial2pay never holds funds.
Every call, inspectable
Each Stripe API call is logged with endpoint, duration, and Stripe request ID — viewable per-trial in your dashboard. You can reproduce every charge.
Fork it, run it, change it
MIT licensed. Self-host on Supabase + Vercel in one afternoon. No vendor lock-in: swap hosted for self-hosted in an hour, or vice versa.
Leave any time
Your merchant data, trial configs, and audit log export cleanly to SQL. Canceling stops captures; it doesn't ransom your data.

Integrations

Drop in wherever your checkout lives.

Three embedded SDKs keep the card form on your domain. One hosted redirect handles zero-JS stacks. All four flow through the same server pipeline, so you can change frontends without touching anything else.

@trial2pay/react
<Trial2PayCheckout trialId={...} />
Recommended
@trial2pay/vue
Composable wrapper · same props
Vue 3
@trial2pay/core
One <script> tag, any framework
Vanilla · CDN
Hosted redirect
res.redirect(trial.checkout_url)
Zero JS

Pricing

Priced so we only earn when you earn.

Self-host free forever. On the hosted plan you pay $0.50 per successfully captured trial — not per signup, not per API call, not monthly. If no trial converts, you pay $0.

Self-host

$0forever

MIT licensed. Fork it, run it, own it.

  • Full source on GitHub
  • Self-host on Supabase + Vercel
  • All SDKs + hosted checkout page
  • Community support on GitHub Discussions
  • No trial cap, no feature gates
Read on GitHub ↗

Hosted

Recommended
$0.50per successful capture

We run the infra. You write three API calls. Paid only when you get paid.

  • Charged only on trial.captured — not signups, not API calls
  • If a trial doesn't convert, you pay $0
  • 99.9% uptime SLA (target)
  • Managed capture scheduler + Stripe webhook retries
  • Rate-limited + audited API · email support
  • Free until your first capture succeeds
Start free →
You earn / we earn. On a $99 plan, you keep $99 when a trial converts — we take 50¢. That's a ~0.5% effective fee, and only on trials that actually pay. Zero MRR bands, zero take rate on your plan price, zero surprise overages.
When hosted makes sense: trials with ACV of $20/mo or higher. At $0.50 per capture, effective take is ~0.1% on a $500 plan, ~2.5% on a $20 plan. For sub-$10 plans we honestly recommend self-hosting — the fixed fee doesn't pencil out and the setup is a single afternoon.

FAQ

Questions worth asking about a payments tool.

Will this actually increase my revenue?

Yes, in almost every ACV range. Benchmarks from ProfitWell / Paddle (2023) put no-card trial conversion at 12–18% and card-on-file at 45–60%. That's a 3–4x multiplier on the same top-of-funnel. See the Revenue Impact table above — at a $99 plan with 500 trials/month, that's roughly $15K/mo in recovered revenue that was leaking out of a no-card flow.

How does this stop free-trial abuse?

A card at signup means every trial has a real cost to create, so throwaway emails and multi-account farming stop being free. Stripe's own fraud signals apply to the pre-auth — CVC, AVS, and Radar all run on the hold. You keep the ergonomic 7-day free trial; you lose the abuse economics.

When am I actually charged the $0.50?

Only on trial.captured — the moment money actually moves into your Stripe balance. Auth failures, voluntary cancels, expired holds, and refunds within the same billing period are not billable. If no trial converts in a month, your invoice from us is $0.

What actually happens to my customer's card data?

It enters Stripe's iframe directly via Stripe Elements — trial2pay never sees the raw card number. Your server receives only a `pm_...` token and Stripe holds the card. PCI scope stays at SAQ-A (the lowest bucket) because we never transit or store card data.

Where does the money actually go?

Customer → Stripe → your Stripe balance. trial2pay is never a payee. We use your restricted Stripe key to orchestrate the PaymentIntent, but funds settle to your account, under your Stripe business profile.

Can I audit every Stripe call you make on my behalf?

Yes. Every Stripe API call hits `stripe_audit_log` with endpoint, request ID, duration, and response status. Per-trial view is on the trial detail page. Full-index viewer is on the roadmap; the data is there today via SQL.

What if trial2pay goes down?

New trials stop authorizing until we recover. Existing authorizations are already in Stripe — they capture on schedule even if our scheduler is down (Stripe retries). You can also self-host in parallel and failover by swapping a DNS record. No vendor lock-in, ever.

Why wouldn't I just build this myself?

You can. It's a good week of work: PaymentIntent with `capture_method: manual`, Vault or KMS for keys, pg_cron or a queue for capture, HMAC on outbound webhooks, exponential backoff, idempotency keys, plus the audit log. trial2pay is that week, already debugged and MIT-licensed — so you can crib whatever you want.

Do you charge if the trial auth fails?

No. $0.50 is charged only on `trial.captured` — the moment money actually moves into your Stripe balance. Auth failures, voluntary cancels, expired holds, and refunds within the same billing period are not billable.

Ship your trial flow today

Stop losing trials. Start capturing revenue.

10 minutes to integrate. $0 until your customer pays you. Open source and audit-ready from day one — so your finance team, your SOC reviewer, and your future self all get the same answers.