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.
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.
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"
// }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.
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.
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.
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.
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);
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.
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.
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
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
Hosted
RecommendedWe 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
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.