The week-by-week build log of a healthcare data warehouse: EHR, PM, and billing unified in Snowflake in under three weeks — what each week actually contained, what the timeline driver really was, and the two surprises that cost days. Public excerpt; the full log lives in the Builder library.
This is the log of the build behind a number we cite a lot: one client group, 15 disconnected spreadsheets, to a live Snowflake warehouse with real-time Tableau dashboards, in under three weeks. The point of publishing the shape of it: the timeline is reproducible, but only if you spend the weeks on the right things.
Week 1 — Access and landing. No modeling, no dashboards. The entire week is data access: API credentials for the EHR and PM system, export paths for billing, and the compliance envelope stood up first — BAAs, encrypted transport, role-scoped service accounts, audit logging. Then raw data landing on schedule. Rule of thumb: the calendar risk in a healthcare warehouse build is almost never engineering. It's credentialing and vendor access queues, so you start every one of those conversations on day one.
Week 2 — Identity and modeling. Patient and provider identity resolution across systems, then the definitions layer: one modeled meaning each for "patient," "visit," "collection." This week also contains the spreadsheet autopsy — every one of the 15 gets an interview with its maintainer, because spreadsheets in clinics are never just data. They're workflow systems wearing a data costume.
Week 3 — Dashboards and cutover. Tableau on the modeled layer, reconciliation against the numbers finance already believes, and the cutover ritual: the old spreadsheet process runs in parallel for one cycle, both outputs side by side, discrepancies explained line by line. Trust is built in that meeting, not in the pipeline.
A vendor API with an undocumented export ceiling. The EHR's API paginated cheerfully up to a point, then silently truncated historical pulls. Row counts against source-system reports caught it; nothing in the API response did. Standing rule since: every extraction job asserts expected volumes against an independent source count, and a silent truncation becomes a loud alert.
The spreadsheet that was also a to-do list. One "data" spreadsheet mixed records with reminders — rows that were tasks, not patients, distinguishable only by tribal knowledge. Migrating it as data would have seeded the warehouse with ghosts. The maintainer interview caught it; the schema didn't and couldn't.
The full build log — the day-level sequence, the credentialing checklist that protects week one, the parallel-run reconciliation template, and the spreadsheet-autopsy question list — lives in the Builder library.
Implementation detail, checklists, and the parts we'd rather not have public — for members.
Unlock with Builder