Trust score
The trust score is a single number, 0–100, that summarises your track record on Cambridge TCG. It influences your trade limits (per-trade and daily), your escrow tier (Direct, Verified, Full), whether escrow inspection is required, and your payout hold days.
The score is computed by code, not by humans, against data the platform has already collected about your behavior. You can see your own score and its components on /account/standing. This page documents the formula.
Where this lives in code. The canonical implementation is atapps/storefront/src/lib/escrow/trust-engine.ts(functioncalculateTrustScore). When the formula changes, this page is updated in the same PR.
Components (positive — up to 100 points)
1. Trade completion rate — up to 30 points
The fraction of your trades that ended with escrow_status = completed, scaled to 30. A user with 9 of 10 trades completed gets 27 points; 10 of 10 gets the full 30. Cancelled and disputed trades count against completion (in the denominator but not the numerator). New users with zero trades get 0 here — the score grows as you trade.
2. Review score — up to 25 points
Average rating across reviews you've received as a counterparty, scaled to 25 (so a 5-star average yields the full 25, a 3-star average yields 15).
Reviewer-trust weighting. Each review's contribution is multiplied by a weight depending on the reviewer's own trust score:
| Reviewer's trust | Weight |
|---|---|
| ≥ 80 (Veteran/Elite) | 1.0 |
| ≥ 50 (Trusted) | 0.8 |
| ≥ 20 (Starter) | 0.6 |
| < 20 (New) | 0.4 |
This is anti-farming. A 5-star from a Veteran counts more than a 5-star from a brand-new account. The effective weight is persisted on each review row so you can see — on /account/reviews — exactly how much each review counted.
3. Trade volume — up to 15 points
Logarithmic. Total cumulative volume (in £) is taken as log10(total) × 5, capped at 15. £100 → 10 points; £1,000 → 15; £10,000 → also 15 (capped). The log scale is deliberate — going from £0 to £100 matters more than going from £10,000 to £20,000. Trust accrues with experience, not deal size.
4. Account age — up to 10 points
Months since your first trade, capped at 5 months for the maximum 10 points (2 points per month). Tracks experience-on-the-platform, not calendar age. A user who registered a year ago but only started trading last week is still "new."
5. Verification — up to 10 points
Either 0 or 10. UK-verified (full KYC: legal name, address, phone, bank verified) → 10. Unverified → 0. Binary by design.
6. External reputation — up to 10 points
5 points per verified cross-platform reputation entry, capped at 10. Linking and verifying your eBay or CardMarket account contributes here.
Penalties (subtracted from the positive total)
| Trigger | Penalty |
|---|---|
| Active dispute (open) | −10 per open dispute |
| Dispute lost (resolved against you) | −15 per lost dispute |
| Dispute resolved as split | −8 per split (half-credit) |
| Unresolved fraud signal of medium severity or higher | −20 per signal |
Penalties stack. Win/loss attribution depends on role. If you were the seller and the dispute resolved as release_seller, you won. If it resolved as refund_buyer or return_card, you lost. The split outcome credits half a loss to both sides.
Final score and tiers
raw_score = completion + review + volume + age + verification + external_rep
final_score = max(0, min(100, raw_score - penalties))The final score is mapped to a tier, which determines limits and routing:
| Tier | Min score | Trade limit | Daily limit | Inspection? | Payout hold |
|---|---|---|---|---|---|
| New | 0 | £50 | £100 | yes | 7 days |
| Starter | 20 | £150 | £500 | yes | 5 days |
| Trusted | 50 | £500 | £2,000 | no | 3 days |
| Veteran | 80 | £2,000 | £10,000 | no | 1 day |
| Elite | 95 | £10,000 | £50,000 | no | 0 days |
Tier table source: apps/storefront/src/lib/escrow/types.ts (TRUST_TIERS).
Recompute cadence
Your trust score is recomputed automatically when:
- A trade you're part of completes, cancels, or is disputed.
- A review of you is submitted, hidden, or restored.
- A fraud signal against you is raised or resolved.
- An external reputation entry is verified or removed.
- The maintenance sweep runs (every minute) — drains pending recomputes.
The maintenance cron lives at apps/storefront/src/app/api/cron/maintenance and dispatches the recompute via apps/storefront/src/lib/escrow/trust-recompute.ts. The trust_profiles.last_calculated_at column tracks the most recent recompute.
Disputing your score
There is no "appeal the score itself" — the score is a function of inputs, so the appeal lives at the inputs:
- Reviews — appeal via /account/reviews (per-review).
- Fraud signals — appeal path on /account/standing.
- Disputes — own resolution flow.