342 legacy submissions became 2,289 attributed rows across 55 members. Identity is now resolved through an alias table rather than assumed, which closes the fault that let a shared link show the wrong person's profile. All three gaps named in the first draft are now closed. One page fault and one data-quality decision remain.
The old tracker was a 57-column Gravity Form. Every column collapsed into a single row shape — one row per thing measured, per day, per person — so that a legacy answer, a manual entry typed tomorrow and a future watch reading all share one structure.
| Track | What came across | Rows |
|---|---|---|
| MOVE It | Steps, miles, walking, cardio, strength, stretching, meditation, plus which activity and which session was opened | 1,034 |
| SERVE It | Volunteer minutes, dollars, in-kind value, blood units, how and who they served | 511 |
| EARN It | Award type, name, level, whether it earned media | 271 |
| My Goal | Goal chosen and how it was measured | 231 |
| LEARN It | Learning minutes and the kind of activity | 211 |
| EAT It | Balanced meals, fruit & veg, hydration, reduced sugar | 31 |
491 rows carry a number. 1,798 carry what the member chose or typed. Text was imported because 12 members submitted nothing but text — a numeric-only migration would have erased them from the platform entirely.
Every entry predates any device integration. No wearable, no HealthKit, no clinic, insurer or employer contributed a single value. This is consumer wellness journaling collected under terms accepted at signup — and that character is now provable from the database itself rather than from anyone's memory.
The original alarm was a shared link showing the wrong person's profile. The investigation found two distinct problems, both now fixed.
| Problem | Cause | Fix | State |
|---|---|---|---|
| Shared link showed Coach Lucy's profile to another signed-in user | Stale reviewer identity cached in the browser, overriding the live session | Gate keys purged and reconciled against the signed-in session on every load | Live |
| Nine people had a profile and a login under one email but different IDs | Profiles created years before Supabase logins existed; nothing tied them together | Identity resolved through an alias table instead of assuming ID equality | Live |
| 38 logins had no profile at all — they signed in to nothing | Signups were not reliably creating a profile record | Backfilled, and a trigger now makes it deterministic | Live |
The repair deliberately did not rewrite anyone's primary key. Rewriting a key that other tables point at is how a migration becomes an outage, and a key you have rewritten is one you can no longer reconcile against the old system. Nothing moved; the lookup simply stopped assuming and started asking.
This Explainer was drafted before the three gaps below were closed. They are now built, tested and deployed. The record of what was missing is kept because the reasoning behind each decision still matters.
A replacement entry form Deployed
A Log a Day tab on LIVE It Trackers. Every question and dropdown option was recovered from the 342 real legacy submissions rather than invented, so anyone who used the old tracker recognises it. It writes the same one-row shape the migration used, resolves the member through the alias table rather than assuming the session ID matches the profile, and saving a day replaces that day — so correcting an entry cannot silently double a total.
Multiple simultaneous streak challenges Deployed
Challenge settings moved from a single stored object to a list. Choosing a metric now switches to that challenge or starts a new one, and never touches another. The previous configuration migrates forward on first load. Verified by test: a 14-day, 9,000-step challenge survives two metric switches and a page reload with its goal, length and progress intact.
Heart metrics Deployed
Heart rate, resting heart rate and heart rate variability now exist, with the identifiers the mobile build needs. All three are track-only: they display and trend, but cannot be set as a numeric streak target. Resting heart rate is better lower, so a streak would nudge a member to drive it down. HRV swings with illness, alcohol and stress, so a broken HRV streak reads as failure when it is usually biology. And for anyone on a beta blocker or with an arrhythmia, both numbers mean something else entirely. Displaying the data is sound; gamifying it is health advice this platform is not positioned to give.
On the LIVE It Trackers page the Supabase script tags sit inside a JavaScript string, so the browser never executes them. The page ends up with the namespace present but no working database client — which means every check that tests for the namespace passes while nothing works. It is why the new form rendered perfectly and then failed to save.
The LIVE It modules now detect this and rebuild the client themselves, so the form works today. The underlying page fault is still there, and anything else on that page that expects a database client — including the navigation's sign-in state — is still getting nothing. That deserves its own fix rather than every module carrying a workaround.
Yes. The first release was artwork and member-facing copy only, which is why the app looked unchanged. The behaviour has since been built and deployed: several challenges can now run at once, and the entry form feeds them.
Yes, as of this release. The configuration is now a list rather than a single object. Each challenge holds its own metric, goal, length and start date, and choosing a different metric moves between them instead of overwriting.
It was never added — this was a build gap, not a sync failure. The metrics now exist, with the identifiers the mobile build needs. They are deliberately display-and-trend only, for the clinical reasons set out above.
A recommendation rather than a finding: reward the behaviour, not the sync. Award coins once for connecting a device, then for what the member does. Paying per data pull turns a passive background process into an earnings stream and makes the coin economy impossible to defend later.
Yes, on two independent layers — the browser no longer lets a cached reviewer identity override a live session, and the database now resolves identity itself rather than trusting the session ID to match the profile.
Across ten members: 7,000 minutes of learning on one date (117 hours), and repeated clusters at exactly 717–720 minutes of cardio, stretching, strength and meditation. The clustering and the concentration around two dates in March 2025 point to either a form fault or a few people running up numbers.
The migration imported them faithfully, which was correct. The open question is whether they should count. The recommendation is to flag them the way ten are already flagged — visible, labelled, excluded from totals, nothing deleted or altered, fully reversible. The thresholds are a judgement call about members' own records, so they should be set deliberately rather than quietly.
Worth recording, because each was caught before it reached a member: