Test accounts
Scope: who you test as, on which stack. How to mint a token for an account is real-token HTTP testing; the things you test against are the Clerk dev instance and the deployed test stack.
Two Clerk instances — accounts never cross
Local dev authenticates against one Clerk dev instance; the deployed test
stack (optolink-test) runs on a different one. The same email can
exist on both with different passwords and different user ids. Never
cross-point a backend, DB, or portal publishable key between the two.
Account state below is runtime fact — recorded, not provable by grep, except where a line names its source. Re-verify live on next use (recorded 2026-09-13 → 2026-10-06).
Local dev — seed-owned accounts
pnpm prisma db seed (idempotent) creates/finds both accounts in the Clerk
dev instance and mirrors them into the DB:
| Account | Password | State |
|---|---|---|
demo@optolink.io | QAvr9TaaxuZ2BXDn — a seed re-run resets the Clerk password to TestPassword123! | owner of Demo Org (seeded: 5 links, 200 click events), plan starter |
admin@optolink.io | same reset behavior | owner of OptoLink Ops (the seeded ops org — CLERK_OPS_ORG_ID in backend .env) |
Password-reset behavior source-checked against optolink-backend @ 29f8589 (
prisma/seed.ts—CLERK_USER_PASSWORD = 'TestPassword123!'). TheQAvr9TaaxuZ2BXDninitial password and the account states are recorded.
Ad-hoc personas — mint, don't share
- All shared
qa-*accounts were purged 2026-09-13 (13 users + 8 QA orgs, local instance + local DB). Flow audits mint purpose-built users via Recipe B (real-token HTTP testing); do not resurrect shared accounts. - Org cap: max 5 memberships including pending invites — plan fixture orgs accordingly.
- Stamp roles AFTER creation. A membership created directly via the
Backend API (no pending invitation) is stamped
ownerbyresolveAndStampRoleonorganizationMembership.created; re-patch the membershippublicMetadata.roleAND the DBOrgMember.roleafterwards, then sign in fresh — mechanism on team management. - Orgless accounts hit Clerk's mandatory choose-organization task
(
/login/tasks/choose-organization) after password sign-in. To re-test sign-in, sign out from that prebuilt page first — it clears the pending session (recorded v2.2.0 portal behavior, 2026-09).
Recorded QA fixtures (local)
Purpose-built orgs from the flow audits; states drift as later audits flip them — re-verify before reuse, and re-seed whatever a test destroyed.
- QA Billing Org (FLOW-012; clerkOrgId
org_3JGphj83espIVgqvwTtwkPTDhhU, orgKeyqabil012): plangrowth, IOS AppConfig, 165 links, subscription rowqa_sub_flow012(GROWTH · ACTIVE · PAYMOB, fake gateway sub id — deliberately Paymob so cancel/resume/downgrade stay local DB writes). Ownerqa-flow012-owner@test.com/Xq7-flow012!1789297378Aa; viewerqa-flow012-viewer@test.com(same password). DB flips used by the audit (re-apply as needed):UPDATE subscriptions SET status='PAST_DUE'/scheduled_plan='SOLO'/cancel_at_period_end=true. Key the row byid='qa_sub_flow012'— itsgateway_subscription_iddrifts over time (observedqa_fixture_gwsub→608880561). - QA Flow013 Org (settings general; clerkOrgId
org_3JJ7Eo2OmENkaDcYvdupafaKJbg): plangrowth, IOS AppConfig withoutteamId+ ANDROID with fingerprints (the pill states + fingerprint-wipe repro). owner/dev/viewerqa-flow013-{owner,dev,viewer}@test.com/Xq7-flow013!1789367205Aa. Re-seed the AppConfig rows after any wipe test — a settings save destroys the fingerprints (FLOW-013 FB-1).
Deployed test stack — seeded personas
Two purpose-built demo orgs on optolink-test (portal
https://dashboard.optoapp.link); all three accounts use password
TestPassword123!. Existing orgs (demo/opl4/myte/myug/qali) untouched.
| Account | Org (orgKey) | Plan | Seeded state (2026-09-22 snapshot) |
|---|---|---|---|
andrew@tambe.com | Tambe (tamb) | STARTER (free) | 7/10 links · 622/1,000 clicks · domains 1/1 + seats 1/1 "limit reached" · no subscription/invoices/ledger |
ahmed@elevate.com | Elevate (elev) | SOLO — Stripe USD | 34/50 links · 6,251/10,000 clicks · 2/3 domains · 3/5 templates · SOLO sub ACTIVE + USD 19.00 PAID invoice |
aliaa@elevate.com | Elevate (elev) | — | DEVELOPER member (fills seats 2/2) |
- State drifts with use: Elevate's click window rolls at period end (the clicks bar falls toward 0); re-run the seed script to re-anchor (scripts + stack gotchas: deployed test stack).
- Racemate (
heba@racemate.ai, orgrace, added 2026-10-04): password lives only in the browser credential manager + Clerk — never in files or chat.