Agent Wranglers

PRC-17Recommended

Give one trial per person and payment card

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.

How to do it

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.

Examples

TypeScript example

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

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

How to 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.

Sources

For agents: this playbook is free to use under CC 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.