Equity Engine is a UK health-equity research platform run by Unwritten Health Ltd. It turns community-reported health experiences into evidence health organisations can act on. MVP 2.0 is production-ready and in private beta , verified email delivery, full anti-fraud stack, automated voucher fulfilment, plain-English everywhere.
Between version 1 and 2.0, Equity Engine moved from a working prototype to a live production platform with bank-grade verification, automated rewards, and inclusive language , built for the communities health research usually misses.
Four user types, each with their own surface, permissions and data slice.
| Persona | What they do | Where they live |
|---|---|---|
| Participant | Members of the public who share their health experiences via surveys, earn points, redeem rewards, and see how their community compares. | /, /community, /community/:slug, /profile |
| Client / Provider | Health charities, NHS bodies, public-interest organisations. Get a scoped dashboard filtered to the disease areas they care about, with PDF export. | / (provider variant), drill-down modals |
| Academic partner | Free credited access in exchange for citing Equity Engine. Same provider dashboard plus citation card with BibTeX. | /academic-access apply, then / |
| Admin (Unwritten Health) | Approves signups, configures organisations and surveys, edits the demographic schema, runs analytics, fulfils reward redemptions. | /admin/* |
From a public visitor to an approved, profiled participant, with multiple defensive layers against fake signups.
Public /register page in brand standard. Invitation-request flow: no password chosen at signup, set after admin approval.
Invisible CAPTCHA token verified server-side on every registration submit. Blocks scripted abuse without user friction.
Hidden field, minimum-time-on-form check, per-IP rate limit. Catches the bulk of low-effort bots before Turnstile even matters.
Server checks the email domain against a maintained blocklist of throwaway providers. Blocked with a friendly message.
Confirmation link emailed before the admin queue. Idempotent, refresh the page or click the link twice, same result.
Clean signups auto-approved at confirm-time and emailed an invitation immediately. Flagged signups (IP cluster, country mismatch, fast confirm) drop into the admin review queue.
Soft signals on the admin pending row: IP cluster count, country mismatch with declared, fast-confirm time, disposable domain, registration source.
Every signup is checked against a real-time IP intelligence service. Suspicious networks (VPNs, anonymisers, known abuse sources) are flagged for review. Declared region is cross-checked for honesty.
Two-stage check ensures the address really exists and accepts mail. Catches typo'd addresses, made-up domains, and dead mailboxes before any email is sent.
Privacy-respecting device fingerprint catches "fifty accounts from one laptop" patterns. First-party; not used for tracking; never sold.
Higher-trust actions trigger an optional one-time SMS code. Phone numbers stored only as one-way hashes after verification , we never keep the raw number.
Spots scripted form submissions: repetitive patterns, low-effort field completion, velocity clusters. Surfaces them for human review without auto-rejecting.
The signup form on equityengine.health is scored live the moment it's submitted , no email-forward queue, no batch processing.
Every account remembers how it arrived (organic web, ad campaign, marketing form, academic application, bulk invite). Lets us apply the right trust gates to the right cohorts.
Auto-sent after email confirmation when a signup hits the admin queue. Keeps the human in the loop while admin reviews.
Approved users get an email with a one-click link to set their password. Token-gated /invitation page styled to brand standard.
Three-step stepper for age, condition areas, region, ethnicity, etc. Form is fully data-driven from the DemographicField collection.
Three soft snoozes allowed before the form becomes mandatory. Keeps low-friction without abandoning data quality.
Persistent sitewide banner on participant pages while profile is <90% complete. One-click deep-link into the right step.
14 languages available in a dropdown in the header. Preserved across pages via local storage.
Mission-first, low-friction. Designed to feel like meaningful contribution, not paid microtasks.
Smart copy adapts to state: first visit gets a 3-card welcome (profile ยท how it works ยท icebreaker), returning users see live surveys + earnings.
3-question, 10-point starter survey auto-assigned at approval so every new participant has something to do immediately.
Published surveys automatically assigned to matching participants based on declared disease areas / regions / age groups / ethnicities. Backfills on approval.
Question-by-question survey UI with progress bar, skip-back, autosave per response. Read-only view post-completion.
Each survey carries a point value. Running total visible on home. Four redemption tiers: ยฃ5, ยฃ10, ยฃ25, ยฃ50.
Inline confirmation, server creates pending Redemption, admin queue fulfils with a voucher code. Participant history disclosure.
Encrypted gift-card inventory with industry-standard at-rest security. Redemptions auto-fulfil within seconds. Low-stock alerts so the team never runs out.
Users who arrived via ad campaigns must verify a phone before their first reward redemption. Kills reward-farming spam without friction for organic users.
Per-participant view of the community formed by people with the same condition. Tier ladder visualisation across thresholds 50/250/1000 unlocks more insight as community grows.
Explore any condition's community at /community/:slug. Same tier-gated insight unlock model regardless of whether you're a member.
Edit demographic answers any time. Polished page with clear sections, sign-out, language switcher.
WCAG 2.1 AA: skip links, visible focus rings, aria-required / aria-invalid / aria-describedby, role='alert' on errors, role='status' on confirmations.
Participant, provider AND admin surfaces all verified at 375px iPhone SE width: no horizontal page overflow, tap targets โฅ44px, text readable, tables horizontal-scroll inside cards. Admin can triage approvals from a phone.
Replaced full-screen blocking loaders with content-shaped skeletons. App feels instant even on cold cache.
A premium dashboard a client can confidently share with their executive team. Designed to look like an award-winning research product.
Bento grid with refined gradient hero (multi-stop radial on #03332B + SVG dot pattern), glass-morphism stat card, orange accent line under eyebrow.
Top-line metrics with embedded sparklines, RadialBarChart gauges, coverage rings, ThemeStack bars.
AreaChart showing community sentiment over time on a -1 to +1 scale, gradient fill, hover tooltip with date + score.
Bipolar bar chart per condition, your provider's area highlighted in brand orange. Instant relative comparison.
RadialBarChart showing average trust scores (1โ5 scale) by organisation type, GP, hospital, charity, etc.
Conic-gradient donut (hand-built, not Recharts) for fine design control. Legend + percentages alongside.
Top themes ranked by mention count. Each row clickable, opens drill-down modal.
Modal "Quotes" tab shows real anonymised participant quotes that contributed to the theme.
Three ranked breakdowns, region, ethnicity, condition. Quick read on which segments are over-represented in the theme.
National vs local sentiment for the provider's disease area. Calls out where the area diverges from the UK average.
Plain-English explanation of how scores are calculated. Includes SentimentScaleLegend and TrustScaleLegend visualising the scales.
Every metric gets an (i) icon โ Popover with explanation. Library covers sentiment, matching, comparison, trust, themes, regions, ethnicity, sentiment-by-disease.
One-click download of dashboard as branded PDF. Backend renders via puppeteer-core with the org's auth token, returns a blob, frontend triggers the download.
Appears only when org.isAcademic. Includes formatted citation + BibTeX with copy-to-clipboard buttons.
Each client only sees participants matching the disease areas configured on their organisation record. Filter applied server-side at every endpoint.
The Unwritten Health team's surface for running the platform end-to-end.
Searchable table of all users with role, approval status, organisation, last activity. CRUD via /admin/user/:id.
Confirmed-but-not-yet-approved signups with soft risk signals visible per row. Approve / reject with one click, triggers invitation email.
Paste a CSV/TSV list of emails; preview parses + dedupes; one click sends invitations in batch.
Create/edit client orgs. Configure disease areas (drives data scoping), description, master-data-steward flag, academic partner toggle.
Editable list of demographic fields stored in MongoDB. Drives the participant onboarding form dynamically, change a field, the form updates everywhere.
Create, edit, publish, archive surveys. Draft/published gate enforced on backend. Targeting fields (disease areas, regions, age groups, ethnicities) drive auto-assignment.
Admin endpoint to re-run targeting for a specific survey if criteria changed after publication.
Premium-grade dashboard mirroring provider aesthetic: hero, KPI strip, region cards, top themes grid, embedded Metabase iframe with friendly empty / loading / error states.
Interactive UK map. Toggle between 5 metrics: response volume, "research designed for me", avg NHS trust, avg sentiment, % with long-term condition.
Most-positive and most-negative regions surfaced as gradient cards (green/red), with delta vs national average.
Cross-platform themes with mention count, sample quote, and click-to-drill-down into full breakdown modal.
Pending reward redemptions listed for fulfilment. Admin enters voucher code or cancels with reason; participant is notified.
Academic-tier applications submitted via /academic-access appear as pending Organisations marked isAcademic. Admin approves the org + the contact in one flow.
What's actually in the database, and how it surfaces.
1,204 anonymised UK community survey responses imported under HRA-style consent practice as the founder cohort to validate the dashboards. No raw PII stored, source files destroyed post-import.
Free-text answers run through our AI sentiment engine for sentiment scoring and theme mining. Idempotent re-runs supported. PII stripped before any analysis call.
Response volume, "research designed for me" agreement, avg NHS trust, avg sentiment, long-term condition prevalence, all by region.
Themes mined from free-text answers, mention count rolled up across all responses. Drives ThemesList and TopThemesGrid.
Sentiment, trust, and themes broken down by region, ethnicity, disease area, organisation type. Drives the "who is saying this?" view.
Sampled per theme, anonymised, surfaced in drill-down modal. Includes the contributing question and demographic tags (e.g. "Female, 35โ44, North West").
Local Metabase on port 3000 connected to Managed database (EU/UK region). Embed-token endpoint signs dashboards into provider/admin iframes. Starter native queries documented.
Question IDs are stable across re-imports so saved Metabase queries and charts don't break when the dataset refreshes.
Backend exposes platform-overview, provider-overview, community-overview, disease-area-overview, region-stats, theme-detail, all PII-free.
A best-in-class AI engine reads what participants write and finds the patterns , so partners get real qualitative insight, not just numbers.
Every long-form answer is analysed for emotional sentiment, then surfaced alongside the structured data so partners can read mood at a glance.
Themes mined from open-ended answers, normalised across the dataset so "long GP wait times" said five different ways still cluster together.
Names, emails, and any identifying details are stripped from text before it ever reaches the AI engine. Special-category data never flows out of our own infrastructure unless explicitly necessary.
Long-running analysis jobs are safe to interrupt and resume. Already-scored responses are skipped on re-runs, so we never double-bill the AI provider or re-process unchanged data.
Mailjet for transactional delivery. All templates restyled to brand standard.
Sent immediately after public signup. Single-click confirm link with token.
"You're on the waitlist" sent after email confirmation for signups that hit admin review.
Internal email to admin team when a confirmed signup needs human review.
Sent on approval. Token-gated link to /invitation for password setup.
Standard request-reset flow with anti-enumeration (same success response whether email exists or not).
Optional email to participant when a new survey targets their profile. Currently triggered by survey-matching engine.
Monthly per-condition digest email summarising new responses, top themes, sentiment shifts. Manual sender via scripts/send-community-digest.mjs with --to and --dry flags.
Generic transactional template (e.g. reward fulfilled, profile change required). Same brand container.
Designed so participants stay anonymous and clients only see aggregates that can't be reverse-engineered.
Short-lived access tokens with secure refresh rotation. Industry best-practice for session security.
Passwords stored as per-user salted one-way hashes. No plaintext or reversible storage anywhere , we couldn't tell you your password if we wanted to.
Each partner organisation only sees responses relevant to their configured disease areas. Filters enforced at the data layer, not just the UI , can't be bypassed.
Password-reset returns the same response whether the email exists or not. No leak of who's on the platform.
Any imported data strips identifying details. Source files destroyed post-import. Email kept only as a hash where uniqueness matters.
Partner dashboards return aggregations (counts, means, sampled quotes) , never individual identifiable records. PII boundary enforced at the data-serving layer.
All sensitive credentials rotated post-launch, on a recurring schedule going forward. Secrets never live in source control.
Every page wrapped in defensive error boundaries so a transient failure never strands a user with a blank screen.
Get in touch
Whether you're an NHS body, charity, academic researcher or potential partner , we'd love to talk about how Equity Engine can help your work hear the voices that get missed.
Swan Buildings, 20 Swan Street, Manchester, M4 5JW, United Kingdom