A plain-English tour of what happens between someone booking a session on the website and a number appearing on a DataHub report — and why you can trust those numbers.
Every five minutes, the DataHub takes a copy of what's happening on the UK Therapy Guide website — orders, sessions, calls, form submissions — and files it away in its own vault. It then organises those copies into tidy, fast tables, and every report you open reads from those tables, never from the live website. That's why reports load instantly, why they don't slow the website down, and why the numbers still exist even after the website tidies up or deletes things.
Someone fills in the placement form, books a LUFT call, pays for sessions, subscribes to the 2×2. All of that lives in the website's own database, which is built for running the website, not for answering questions about it.
Every five minutes a small courier (we call it the puller) collects anything new or changed from about fifty of the website's tables and files it in the DataHub's vault. The crucial rule: the vault only ever adds — it never deletes. When the website clears old records (and it does, for tidiness and privacy), the vault keeps its copy. That has already mattered several times — more below.
Raw copies are awkward to work with, so the DataHub reorganises them into two kinds of tidy table. Facts record things that happened — one row per order, per session, per LUFT call, per coupon redemption — each carrying its numbers and dates. Dimensions describe things that exist — one row per client, per therapist, per calendar day — carrying names and labels. Drawn on a whiteboard, the facts sit in the middle with the dimensions around them like points of a star, which is why this classic layout is called a star schema. You can see ours drawn live at datahub.uktgdata.com/schema.
Each report has a small recipe that combines facts and dimensions into exactly the shape it needs — "LUFT calls per month per host", "failed renewals and how many recovered". These recipes are called marts. Because the heavy lifting happened in steps 2–3, a mart answers in milliseconds.
The screens on datahub.uktgdata.com read their marts and draw the tables and charts. Nothing you click ever touches the live website, so you can explore freely at any time of day.
The star layout sounds abstract, but it's how every report works underneath:
Orders (happened) grouped by the calendar (exists).
Sessions (happened) grouped by therapist (exists).
Calls (happened) matched to the clients they became (exist).
First orders (happened) grouped by ISO week (exists).
The facts hold the numbers; the dimensions hold the words you group them by. That's the whole trick.
When a report moves to the DataHub, we run the old report and the new one side by side and match them — usually to the penny — for every closed month before the new one goes live. Where they genuinely differ, it's investigated and written down, and so far every difference has been a flaw in the old report or data the website had deleted.
Three real examples. The website deletes its "failed renewal" marker once a payment recovers — so only a system that remembers can report recovery rates; the vault does. The old LUFT report was quietly missing two team members' calendars and under-counted follow-ups — found during reconciliation, fixed in the new one. And the old daily report's "last month" cards could point at a future month and show zeros; the new one can't.
"A client", "a therapist", "a week" are each defined once, in one dimension table, and every report uses that same definition. Two reports can't disagree about who counts as a new client, because they're reading the same card out of the same filing cabinet.
| Report | What it answers | |
|---|---|---|
| Revenue — Monthly | Platform revenue, orders, AOV and our net take by month | LIVE |
| Daily report | Placement forms → LUFT calls → new clients → revenue, day by day | LIVE |
| New clients — Cohorts | Each month's new clients and what they went on to spend and attend | LIVE |
| Client tracking | Every client's journey: first order → first session → follow-up call | LIVE |
| Coupon usage | Redemptions and discount given, per code, for any date range | LIVE |
| Failed payments | Failed 2×2 renewals and how many we recovered | LIVE |
| Subscription metrics | The 2×2 framework: renewals, stalls, survival depth, realised revenue | LIVE |
| LUFT monthly | Call volume, outcomes and per-host conversion, with fair comparisons | LIVE |
| Clients — Timeline | A read-only history of everything that touched a client | LIVE |
| Ops — Team queues | Things needing a human: failing renewals, no-matches, stuck orders | LIVE |
| Therapist & capacity reports | Economics, onboarding, slots — the next wave of migrations | NEXT |
| Marketing attribution | Paid & organic performance — needs ad/keyword data plumbed in first | LATER |
| The vault | Technically raw.records — the append-only store of website copies. Never deletes. |
| Fact | A table of things that happened: one row per order, session, call… with the numbers. |
| Dimension | A table of things that exist: one row per client, therapist, calendar day… with the names. |
| Star schema | Facts in the middle, dimensions around them — the layout that makes every "X by Y" question fast. |
| Mart | A saved recipe combining facts and dimensions into one report's exact shape. |
| Reconciled | Matched against the old report, closed month by closed month, before going live. |
| The puller | The courier that copies new/changed rows from the website every five minutes. |
DataHub · datahub.uktgdata.com · written 14 Jul 2026 — numbers ("18 facts, 26 marts") grow as reports migrate.