Manchester City fan-verification dashboard
- for
- Manchester City, via Veritran
- when
- 2026
- Problem
- A dashboard over fan-verification data, with no defined scope.
- My contribution
- Owned the product and technical decisions for a verification dashboard, iterating directly with Veritran's customer-success lead and other stakeholders.
- Decision
- Give every record one of four outcomes (verified, pending, failed, duplicated) and validate that view in a Snowflake prototype with Veritran stakeholders before building the production dashboard.
- Delivered
- A production dashboard, built after a Snowflake prototype that Veritran stakeholders validated.
- Result
- First version in two weeks, final in one month, still in use. My point of contact reported that its country view informed enabling onboarding in two more countries.
- Status
- in ongoing use · 2026
+2countries in an onboarding decision the dashboard informed
what I foundThe records already existed. What was missing was a view of what happened to them: verified, pending, failed or duplicated.
- Snowflake prototype · validated by stakeholders
- v1 · 2 weeks
- final · 1 month
- ongoing use
how it works
Every record ends in one of four outcomes
SYN-0001latest output code is a match→ verifiedSYN-0028the same person shows up as a second fan record→ duplicatedSYN-0004steps started, no final output yet→ pendingSYN-0012a step returned an error→ failed
reconstruction, illustrative
- one query per fanlatest output code and step flags
- Python/Flask aggregationdurations capped at 3 h, zero durations excluded from averages
- React/TypeScript dashboardfunnel, breakdowns, record drill-down with export
try it
The dashboard, on synthetic data
A replica of the dashboard
invented records, not client results- records60
- verified3660.0%
- pending1423.3%
- failed610.0%
- duplicated46.7%
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
-
- document read
- selfie captured
- face match
-
- document read
- selfie retried
- face match
-
- document read
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- match under review
-
- document read
- selfie retried
- face match
-
- document read
- selfie captured
- no face match
-
- document read
- selfie retried
- face match
-
- document read
- selfie retried
- face match
-
- document read
- selfie captured
-
- document read
- selfie captured
- face match
-
- document read
- selfie retried
- face match
-
- document unreadable
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- no face match
-
- document read
- selfie captured
- face match
-
- document unreadable
-
- document unreadable
-
- document read
- second attempt, same synthetic person
-
- document read
- already verified as another synthetic record
-
- document read
- selfie captured
- face match
-
- document read
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
-
- document read
- selfie captured
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- match under review
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- match under review
-
- document read
- selfie retried
- face match
-
- document read
- selfie captured
- face match
-
- document read
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
-
- document read
- second attempt, same synthetic person
-
- document read
- selfie captured
-
- document read
- selfie captured
- face match
-
- document read
- already verified as another synthetic record
-
- document read
-
- document read
- selfie captured
- match under review
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- no face match
-
- document read
- selfie captured
- face match
-
- document read
- selfie captured
- face match
no synthetic records match
Pending does not mean abandoned.
ownership
Who did what, and when
- Snowflake prototypevalidated by stakeholders
- v12 weeks
- final1 month
- ongoing use
- MeWhole implementation, product and technical decisions
- Veritran's Chief Customer Success OfficerIterated with me on every version
- A second Veritran stakeholderFed same-day iterations before production
- A frontend teammateRefined the visuals later
- The two-country decisionMade by Veritran
- Face-scanning technologyNot built or fixed by me
What shipped
No defined scope at the start. One outcome per record by the end.
Method and caveats
Totals, charts, table and CSV on this page are a synthetic demo, not client results.
- Client data and totals are not published