Guide · free trial abuse
Free trial abuse: how to detect it and stop it without losing real users
Much free trial abuse is low-tech: the same Gmail inbox with a new dot or +tag, a throwaway address, a VPN. That makes it detectable. Here is how the tricks work, how to catch each one, and how hard to push back.
By the Vetto team · Updated
Quick answer
Free trial abuse is one person collecting many free trials, or one script creating many trial accounts. To stop it, check every signup for the same inbox in disguise, throwaway domains, cloud and VPN networks, and bursts from one IP. Warn on what might be innocent, block what cannot be, and keep the signup fast for everyone else.
How people abuse free trials
Six common tactics, in rough order of effort:
| Tactic | Looks like | Detect with |
|---|---|---|
| Gmail dots and +tags | j.a.n.e+trial2@gmail.com | Normalized email key |
| googlemail.com | jane@googlemail.com | Normalized email key |
| Throwaway inboxes | x7@mailinator.com | Disposable-domain list + MX check |
| A fresh real address per trial | jane.trial.may@outlook.com | IP, network, device or card reuse |
| VPN or cloud server | New IP for every signup | ASN lookup, time zone mismatch |
| Scripted account creation | 20 signups in an hour | Honeypot, per-IP limits, signed form tokens |
Gmail dots, +tags and googlemail.com
The cheapest trick. Gmail ignores dots in the local part (Google), delivers jane+anything@gmail.com to jane@gmail.com (Google), and treats googlemail.com as gmail.com (Google). Every variant passes email confirmation, because it lands in the same inbox. A 2026 study of alias abuse found 9 of 18 popular platforms had no defense against aliases from any provider (Wu et al., NDSS 2026).
The checker below groups addresses by the inbox they reach (try the sample, which collapses four variants into janedoe@gmail.com):
8 addresses · 4 distinct inboxes · 4 aliases
Same inbox: janedoe@gmail.com
- jane.doe@gmail.com
- janedoe+trial2@gmail.com
- j.a.n.e.d.o.e@googlemail.com
- JaneDoe+promo@Gmail.com
Same inbox: sam@outlook.com
- sam@outlook.com
- sam+test@outlook.com
Rules: +tags are stripped for every provider; dots are ignored only on gmail.com; googlemail.com counts as gmail.com and protonmail.com as proton.me. Dots do matter on Google Workspace and other domains.
Throwaway inboxes
Disposable email services hand out a working inbox in seconds, long enough to confirm an account. Check the domain against our disposable email domains list, or test a single address in the disposable email checker.
A new real account for every trial
Some people create a fresh Outlook or Gmail account each time. No email rule can link jane.trial.may@outlook.com to jane.trial.june@outlook.com. This is where you need signals outside the address: the IP and network, the device, or the payment card.
VPNs, cloud servers and scripts
A VPN gives each trial a new IP; a script on a cloud server creates dozens of accounts an hour. Both leave traces: a hosting or VPN network, a browser time zone that does not match the IP, and signups faster than humans type. Our guide to detecting fake signups has code for each of these checks.
How to detect free trial abuse on a website
1. Enforce one trial per inbox, not per string
Keep the address exactly as typed for login and email, and store a normalized matching key next to it. Lowercase it, fold googlemail.com into gmail.com, drop the +tag, and remove dots on consumer Gmail only (on Google Workspace domains, dots matter). Then put the unique index on the key:
-- Keep the address as typed; enforce "one trial per inbox" on the key.
ALTER TABLE users ADD COLUMN email_key text;
CREATE UNIQUE INDEX users_email_key ON users (email_key);
// On signup (aliasKey: lowercase, googlemail.com -> gmail.com,
// drop the +tag, drop dots on gmail.com only)
const key = aliasKey(email);
const existing = await db.users.findOne({ email_key: key });
if (existing) return res.status(409).json({ message: 'You already have an account. Sign in instead?' });The full aliasKey() function is on the Gmail alias checker page. To find the alias clusters already in your database, run a user export through the free email list audit.
2. Block throwaway and dead domains
A set lookup against a disposable-domain list, plus a DNS check that the domain has a mail server. Throw in a typo check while you are there, so jane@gmial.com gets a one-click fix instead of a dead account (try the email typo checker).
3. Watch the network and the pace
Look up the signup IP's network (ASN) and flag hosting providers, VPNs and Tor. Count signups per IP per hour and act on bursts. Neither proves abuse on its own, but together with a repeat inbox they make a strong case.
4. Use the card, if you collect one
If your trial asks for a card, the processor can tell you when the same card number comes back. Stripe, for example, returns a fingerprint on each card payment method that uniquely identifies the card number; for Apple Pay and Google Pay it may reflect the tokenized number instead (Stripe docs):
// After the customer adds a card for the trial (Stripe)
const pm = await stripe.paymentMethods.retrieve(paymentMethodId);
const seen = await db.trials.findOne({ card_fingerprint: pm.card.fingerprint });
if (seen) {
// Same card number already used for a trial: start a paid plan, not a trial.
}What to do when you catch it: friction vs blocking
A repeat signup is a risk signal, not proof. The same inbox signs up twice for honest reasons: an agency opening a workspace for a client, a founder who forgot last year's trial, a couple sharing one address. Match the response to the confidence:
| Signal | Response | Why |
|---|---|---|
| Same inbox as an existing account | Warn and point to sign-in; allow a second submit | Teams and forgotten trials are common |
| Throwaway inbox or dead domain | Block with a clear message | Nobody can confirm the account |
| Datacenter or VPN IP | Flag; require email confirmation before the trial starts | Privacy-minded customers use VPNs |
| Burst from one IP | Block the excess and alert yourself | Leave room for shared office IPs |
| Card already used for a trial | Offer the paid plan instead of a new trial | Needs card-on-trial |
Soft friction is often enough. A message such as "You already have an account. Sign in instead?" nudges casual repeaters to sign in, and people with a real reason click through. You can also limit what a trial unlocks until the email is confirmed, so an abuser gets less for each new account.
The card-on-trial trade-off
- For: stops casual abuse, catches card reuse, and filters for people ready to pay.
- Against: fewer people start a trial, the signup has more steps, and prepaid or virtual cards still get through.
For most indie SaaS products, start with a no-card trial plus email and network checks. Add a card later if abuse still costs real money.
Best tools to detect free trial abuse
There is no single best tool, only categories that catch different tactics. We describe categories rather than quote other vendors' prices, which change.
| Approach | Catches | Misses | Setup | Cost model |
|---|---|---|---|---|
| DIY rules | Aliases, throwaways, dead domains, bursts: whatever you build | Fresh real addresses; anything you have not coded | Days of work plus upkeep | Your time |
| Auth-provider settings | Some providers block +tag addresses or throwaway domains at sign-up (Clerk documents both) | Depends on the provider; usually no network or velocity signals | A toggle, if your provider has it | Included in your auth plan |
| Email verification APIs | Invalid mailboxes (SMTP), disposable and role flags; Kickbox also returns typo suggestions | Built for deliverability, not repeat-signup detection: check each vendor’s docs for alias handling | API call in your signup handler | Usually per verification credit |
| Fraud and device-fingerprinting platforms | The same device or browser behind many accounts, risky IPs, broader fraud | Usually the cheap email-level fixes (typo rescue) | SDK plus backend integration | Varies by vendor; see their pricing pages |
| Payment checks | The same card used for several trials (card fingerprint) | Everything, if you do not ask for a card | Card-on-trial flow | Your payment processor’s fees |
| Vetto | Aliases and repeats, throwaways, dead and lookalike domains, typos, datacenter/VPN, bursts, bots | Device fingerprinting, SMTP mailbox checks, payment fraud | One script tag; optional /v1/verify on your server | Free on 1 site; Pro $12/mo; Lifetime $69 once |
The auth-provider row refers to Clerk's documented restrictions; for a closer look at one verification API, read Vetto vs Kickbox. A sensible setup: a lightweight gate on the form first, and a fraud platform or card checks only if abuse at scale justifies the cost.
Vetto: the lightweight option for indie SaaS
Vetto is a free trial abuse prevention layer you add with one script tag. It normalizes every address the same way as the alias checker above, remembers inboxes for 90 days as salted hashes (never plain emails), and warns when the same inbox comes back. It also blocks throwaway and dead domains, rescues typos, and on Pro flags datacenter and VPN networks and blocks signup bursts.
- Free: 1 site, 1,000 checks a month. Alias, datacenter and burst signals run in shadow mode, so you see how many repeat trials you get before you pay.
- Pro: $12/month or $99/year. Repeat warnings on, custom actions per signal, Slack and Discord alerts, and a server-side API: a signed token checked with
POST /v1/verify, orPOST /v1/checkwith your secret key for signups that never touch a browser. - Founding Lifetime: $69 once for the first 100 buyers, until November 27, 2026. See pricing.
If Vetto does not answer within 800 ms, the form submits as if it were not installed. It does not do device fingerprinting or payment fraud; it handles the cheap, common tricks.
Frequently asked questions
What is free trial abuse?
Free trial abuse is when one person or group signs up for many free trials to use a paid product without paying, usually with email aliases, throwaway inboxes, new accounts or a VPN. It also covers bots that create trial accounts in bulk.
How do I detect free trial abuse on my website?
Normalize each email to the inbox it reaches (Gmail dots, +tags, googlemail.com) and check it against existing accounts, block disposable domains, and count signups per IP and network. Card fingerprints and device signals catch the people who use a fresh real address each time.
Should I require a credit card for my free trial?
It is a trade-off. A card stops most casual abuse and lets you spot a reused card, but it also turns away genuine people who are not ready to pay. Many indie SaaS products keep a no-card trial and add email and network checks instead.
Is there a free trial abuse prevention API?
Vetto Pro exposes POST /v1/check, which your server calls with a secret key to get a verdict (including the repeat count) for an email address, and POST /v1/verify, which checks the signed token its script adds to your form. Fraud platforms and email verification APIs offer their own APIs with different scopes.
Will blocking aliases annoy real customers?
It can, which is why the default should be a warning, not a wall. Point the person to sign-in and let a second submit through. Vetto warns on repeats by default and lets you choose allow, flag, warn or block per site.
Give your signup form sharp eyes.
Free on one site. One line of HTML. Remove it any time and your form works exactly as before.
Founding offer: Pro for life for $69 once, first 100 buyers, until Nov 27.