▶️ Open a fresh Claude chat named "Phase 2 — Data layer," paste this whole page, and say: "Walk me through building this one step at a time, starting with task 1."

What we're doing & why

Today the dashboard gets each school's ad numbers from Google Sheets that a tool called Coefficient fills in — it's clunky and fails quietly. The project's goal is to pull numbers straight from the ad platforms instead. Before touching any single platform, we build one flexible "data layer" that decides where each number comes from. That lets us switch one school or one channel at a time, and if anything fails it quietly falls back to the old Coefficient sheet so nothing breaks.

What's already true (context for Claude)

The design (Janet-provided)

Your tasks (Kenzie + Claude)

  1. Build the source-picker + the common data shape, and route the pipeline's channel reads through it — without changing any numbers yet.
  2. Add the per-channel health tag (did the last pull work? which source did it use?).

✅ Data-realness check (do not skip)

Have Claude build a parity report: for all 4 schools, the period numbers before this change vs after — spend, leads/clicks, CPL/CPC — side by side with match ✅ / mismatch ❌. The whole point of this phase is that nothing changes yet, so every row must be ✅. Any ❌ = a bug in the refactor; stop and fix before moving on.

🛑 STOP gate

This is one of the three sign-off gates. Janet (or a technical reviewer) eyeballs the parity report and confirms it's all green before this is merged to production. Don't skip — a wrong number here would flow into every later phase.

Done when

The pipeline runs through the new data layer, the parity report is all green on all 4 schools, each channel reports its source + health, and Janet has signed off. Nothing visible changes — that's success.