---
title: "Give one trial per person and payment card · Agent Wranglers"
url: https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers/one-trial-per-person
id: PRC-17
level: Recommended
applies: payments
updated: 2026-10-27
build: a2a6bdfed830
tokens: 916
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Give one trial per person and payment card

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Plan changes, trials and free tiers](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-27.

- ID: PRC-17
- Level: Recommended
- Chapter: [Plan changes, trials and free tiers](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers.md)
- Rule: Grant a free trial only when no earlier trial used the same verified email, payment card fingerprint or organisation domain. Record each trial with these keys, and refuse a second one before it starts.
- Check: A test starts a trial, then signs up a second account with the same card and a new email. The second trial is refused. A third account with the same email in upper case and a plus tag is refused too.
- Applies when: The project takes payments.
- How: Repeat trials cost you the plan's model calls and support, and they cut paid conversion. A new account per trial is cheap, so key trials to the person and the card, not the account. Payment providers give a fingerprint per card number, the same across customers, so a card used for one trial is known on the next. Normalise emails before you compare them, such as lower case and no plus tags for providers that ignore them. Offer a paid plan at once when a trial is refused, not an error alone. Free tiers without a card follow [Limit the free tier per person instead of per account](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers/free-tier-abuse.md).

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### TypeScript example

```ts
export async function mayStartTrial(db, signup: { email: string; cardFingerprint: string }) {
  const email = normaliseEmail(signup.email)
  const earlier = await db.query(
    'SELECT 1 FROM trials WHERE email_normalised = $1 OR card_fingerprint = $2 LIMIT 1',
    [email, signup.cardFingerprint],
  )
  return earlier.rowCount === 0
}
```

### Python example

```python
def may_start_trial(db, email: str, card_fingerprint: str) -> bool:
    earlier = db.execute(
        "SELECT 1 FROM trials WHERE email_normalised = %s OR card_fingerprint = %s LIMIT 1",
        (normalise_email(email), card_fingerprint),
    ).fetchone()
    return earlier is None
```

## Sources

- [Stripe, card fingerprint on the PaymentMethod object](https://docs.stripe.com/api/payment_methods/object)

## Related rules

- PRC-6 [Limit the free tier per person instead of per account](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers/free-tier-abuse.md) in Pricing, plans and entitlements

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers/one-trial-per-person">Agent Wranglers pricing, plans and entitlements playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Keep old prices as archived catalogue prices with an end date](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers/grandfathered-prices.md)
- [Plan changes, trials and free tiers](https://agentwranglers.se/playbook/pricing/plan-changes-trials-and-free-tiers.md)
