01Planning, Inventory & Dependency Mapping

I mapped 1,200 objects before I let anyone touch a pipeline.

How I mapped 1,200 objects, established governance, and built the wave migration strategy — before a single line of conversion code got written.

Setting up the wave plan & critical artifacts

The Core Focus

Before I let anyone start building, I needed the mandate, the scope, and the decision rights nailed down. This is the unglamorous phase where a migration is either set up to succeed or quietly set up to fail six months out.

Earning the mandate

I wrote the charter myself and took it to Steering rather than waiting for someone to hand me one. It named the outcome in numbers I'd be held to: ~1,200 objects across 8 functions, zero-defect reconciliation on every financial metric, adoption by ~4,500 users before I'd agree to decommission anything.

Artifact · Charterv1.0 · my draft, approved by Steering
Why I pushed for this
The legacy SQL Server EDW was at end-of-life — capacity-bound at peak, expensive to keep licensed, and unable to support what the business was starting to ask of it.
What I scoped in
Finance, Sales, Marketing, Manufacturing Ops, Supply Chain, Services, Quality, Compliance — every data object, every ETL/code conversion, every report.
What I scoped out
Retired/duplicate reports (I'll get to why below), source operational systems, and any net-new analytics — I pushed those to a post-migration backlog on purpose.
Roles I set
Me as Program Lead/TPM, accountable end to end. Workstream leads under me for Data Engineering, BI/Reporting, Testing, and Change Management.
Approach I picked
Wave-based, hybrid Waterfall/Agile. Phase gates govern the program; sprints deliver the build inside each wave. A dual-run period de-risks the switchover.

Picking an approach — and rejecting two of them

I put three options on the table myself, because I wanted the trade-offs on record before anyone could relitigate them mid-program.

Artifact · Options analysismy recommendation: hybrid
ApproachWhat it isWhy I rejected or kept itVerdict
Lift & shiftReplicate the SQL Server schema as-is on Snowflake.Fastest, but I'd be carrying every legacy flaw and un-tuned model into the new platform. I killed this one.Rejected
Re-architectRedesign the full data model for Snowflake from scratch.Best end state on paper, but the timeline and risk ballooned past what the business would tolerate. I killed this one too.Rejected
HybridMigrate structure faithfully; selectively re-model high-value domains and retire dead objects.Balanced speed and quality — and the rationalization I did up front paid for itself before we built anything.What I recommended

Getting decision rights straight before delivery starts

I built the RACI myself and forced every workstream lead to sign off on it in the same room. Ambiguous decisions resolve once, in the forum I designed for it — not repeatedly, at the keyboard, three weeks apart.

Why this artifact

Without a written RACI, "who decides" defaults to whoever's loudest or most senior in the room — and that person changes by meeting. This is what let me point to a document instead of re-arguing authority every time.

Artifact · RACIR responsible · A accountable · C consulted · I informed
Key decision / deliverableMe (TPM)Exec SponsorData Eng LeadFunction SMEBI LeadChange Lead
Field-mapping sign-offAICRCI
Report disposition (migrate/retire)RIIACI
UAT sign-offAICRCI
Go / no-go decisionRACCCC
Legacy decommissionRACCII

Cutting scope before writing a line of code

I inventoried every report and who actually used it before I let anyone touch a migration plan. Nobody thanks the TPM who faithfully migrates 400 reports when 150 of them haven't been opened in a year — so I didn't let that happen here.

400
Reports I inventoried
150
I retired (dead / duplicate)
250
I carried into scope

Golden thread

The Sales/Revenue close-amount report is one I confirmed as high-use and kept in scope. I named its owner — a Sales Finance SME — right here, and held them accountable for the field's meaning all the way through mapping, UAT, and cutover.

Sequencing the waves

I sequenced functions in dependency order — shared dimensions before the facts that depend on them — so no wave sat blocked waiting on another. I also protected the financial close calendar myself: no cutover ever got scheduled during month-end, full stop.

Why this artifact

A wave plan isn't a Gantt chart for show — it's the sequencing logic made checkable. Anyone could see why their function landed where it did, which is what let me defend "you're Wave 3" without it sounding like an excuse.

Artifact · Wave roadmap~9 months · my sequencing
Workstream
M1
M2
M3
M4
M5
M6
M7
M8
M9
Mobilize + Discover
Foundations
Wave 1 · Shared dims
Build → Reconcile
Wave 2 · Finance
Finance
Wave 3 · Sales + Mktg
Sales · Mktg
Wave 4 · Ops + Supply
Ops · Supply
Wave 5 · Svcs/Qual/Comp
Remaining
Cutover + Hypercare
Go-live

The most important document

Establishing the master dependency & object matrix

This is the one document I refused to let go stale. Every object's wave assignment, and my reasoning for it, lived in one place — so nobody could argue sequencing on a hunch after the fact.

Why this artifact

Sequencing lives in someone's head until it's written down — and heads leave the room, get pulled onto other fires, or just forget. This matrix is what let a new engineer, three months in, understand why Wave 4 couldn't start early without asking me.

Artifact · Dependency & object matrixexcerpt · shared dims vs. facts
Object / domainUpstream dependencyWave I assignedWhy it couldn't move earlier
DIM_ACCOUNT, DIM_DATE, DIM_PRODUCTNone — root objectsWave 1Every downstream fact joins to these. Get them wrong and the error replicates across every wave that follows.
FACT_GL_TRANSACTIONS (Finance)Shared dims + Chart of AccountsWave 2Finance's close calendar drove the earliest cutover-safe window — I sequenced it right after the shared dims, not before.
FACT_OPPORTUNITY (Sales/Marketing)DIM_ACCOUNT, DIM_DATEWave 3Can't reconcile revenue against an account dimension that hasn't itself been validated yet.
FACT_SHIPMENT (Supply Chain)DIM_PRODUCT, DIM_ACCOUNTWave 4Waits on the Wave 1 product-dimension rebuild landing clean.

Scar tissue

What I actually decided here

What I Actually Decided Here

Decision: I overrode the domain-based migration order that Sales and Marketing both wanted, and held the line on a strict dependency-first wave strategy instead.

Friction: Domain leads wanted their functions prioritized immediately — nobody wants to hear "you're Wave 3" when they think their number matters most. I held the line on sequencing by upstream dependency, not by whoever asked loudest.

Outcome: It prevented upstream pipeline rework we would have paid for twice, and it meant Wave 1 laid a foundation the other four waves could actually build on without replaying the same fixes.