An entire data platform, from scratch.
The company had a new CTO with a vision: build an enterprise technology platform for fiscal sponsorship. The centerpiece was a data warehouse to consolidate 21 disconnected source systems. There was no warehouse, no pipelines, no governance. I evaluated Fabric, Snowflake, and Databricks. Fabric won because it gave us the entire stack in one platform (notebooks, pipelines, warehouse, Power BI) within Azure. For a team that would shrink to one or two people after the build phase, operational simplicity mattered more than raw power.
I hired a team of 8, structured for the full scope: data engineers, DevOps, Power BI, BA, and a scrum master. We built a medallion architecture across three business domains and stood up 125 pipelines across 3 environments. The platform now serves 400+ users and runs every morning before anyone logs in.
- Interviewed stakeholders from CEO to operations staff to understand how each business unit thinks about data. This had never been done before.
- Modeled three domains: Revenue, Cost, and Capacity. Revenue was the most complex because fiscal sponsorship and consulting recognize revenue differently. Cost was the hardest to learn (new domain for me). Capacity was the most strategically important (and eventually led to the $7.6M discovery).
- Produced a Kimball-style dimensional model: 12 conformed dimensions, 10 fact tables across 4 domains.
- The completed data model was the first deliverable. It gave leadership confidence that we understood the business deeply enough to build the platform.
- Built a config-driven PySpark framework: every source follows the same architectural pattern. Adding a new source means one notebook and a config entry, not a new codebase.
- Each source has its own extraction logic (OAuth, Basic Auth, REST pagination, SOQL cursors, batch parquet), but the framework standardizes how data lands: MD5 content hashing for change detection, bidirectional schema evolution, and a 10% soft-delete safety threshold that prevents API failures from mass-deleting real data.
- Parallel fetching with sequential writes (Spark isn't thread-safe), circuit breakers on high-volume APIs, and exponential backoff with retry.
- 21 source systems consolidated into one lakehouse: Salesforce, NetSuite, Paycor, OpenAir, HubSpot, Ignite, Active Directory, QuickBooks, Airtable, Certinia, and more.
- Silver applies business rules and schema contracts. Every notebook starts with a PySpark StructType definition so the shape of the data is explicit, not inferred. Rows that fail validation get marked inactive with a reason code (never deleted).
- Gold is where conformed business entities live. Config-driven stored procedure generation: define the entity and its rules, the system generates the T-SQL. SCD Type 4 (current + history + audit tables) tracks every column-level change across 11 entities.
- Cross-system entity resolution with 10+ ID columns per entity (Salesforce ID, NetSuite ID, OpenAir ID, etc.). Deterministic surrogate keys via SHA-256.
- Post-write reconciliation on every notebook. If counts don't match, the pipeline stops. Dollar-tolerance gates on financial data ($1.00 threshold).
- 36 KPIs across 5 domains (Finance, Capacity, Projects, Pipeline, Workforce Planning). Pushed back when different business units wanted different formulas for the same metric and drove a single unified calculation.
- 15+ Power BI dashboards for C-suite and LOB leadership. Trained 20+ users across 8 workshops using live, in-progress dashboards so the sessions doubled as feedback rounds.
- Automated report builders (6,400+ lines of Python): utilization scorecards, gross profit reports, and revenue scorecards. Each has built-in reconciliation gates; reports won't publish if the numbers don't tie.
- Event-driven financial reporting: the pipeline checks NetSuite's accounting period table nightly. When it detects a new closed month, everything downstream triggers automatically. Reporting turnaround went from 5-6 days to same-day. No human handoff needed.
Bronze: raw, as it landed
| source | client_name | hours | rate | _content_hash |
|---|---|---|---|---|
| salesforce | aCme corp | 42.0 | NULL | a3f9… |
| salesforce | Acme Corp dup | 42.0 | NULL | a3f9… |
| ramp | Meridian LLC | 16 | 210 | 77c1… |
| paycor | northstar health | -8 flag | 185 | e04d… |
145 tables land here exactly as the source systems sent them. Nothing is edited. Every row gets a content hash, so the next run only moves what actually changed.
Silver: cleaned and conformed
| source | client_name | hours | rate | _content_hash |
|---|---|---|---|---|
| salesforce | Acme Corp | 42.0 | 165 | a3f9… |
| ramp | Meridian LLC | 16.0 | 210 | 77c1… |
19 conformed tables with 10 data-quality rules on the way in. Bad rows get quarantined with a reason code instead of silently dropped, so nothing disappears without a trace.
Gold: analytics-ready
70+ tables shaped for the business: 12 dimensions and 10 facts, plus the history audit and delta tables behind them, with full lineage from source system to dashboard. This is what 400+ people report from.
Ask it anything: the bridge
Every layer above exists so this one can work: an AI analytics layer where anyone can ask a question about the data and get a real answer backed by SQL, without writing any themselves. That's the next project.
Sample data. The traced record is highlighted in gold.





