01Migration from SQL Server, Oracle and spreadsheets
Catalogue the source estate from the information schema, DDL, query logs and job schedules, then write a source-to-target mapping per object: target table and layer, data types, transformation rules, keys, grain and historical scope. Spreadsheet reporting is handled the same way, with the rules that live in formulas written down before they are modelled. Each load is reconciled against the legacy figures so cutover happens on evidence rather than on a date.
02Raw, staging, curated and reporting layers
Design Snowflake as four separated layers: raw as it arrived, staging typed and conformed, curated facts and dimensions, and reporting views shaped for the tools that read them. Each layer has an owner, a refresh dependency and a check that proves it loaded, which is what keeps the warehouse maintainable after the project ends.
03Fact and dimension models for Power BI
Build fact and dimension tables at an agreed grain, with conformed dimensions, bridge tables for many-to-many relationships and source-load tracking, then the curated views Power BI imports or queries directly. Existing Power BI and DAX models are profiled first, so a rebuild is a justified decision rather than a default.
04Views and curated datasets
Publish curated datasets analysts can query without writing joins: consistent naming, a description on every column, technical fields hidden and governed measures kept apart from someone's own analysis. Secure views and role-based grants control who sees what without copying the data.
05Validation and reconciliation across sources
Automated comparison at each stage: record counts, date coverage, nulls, duplicates, control totals and metric-level comparison of the figures people report, across the source systems, Snowflake and the BI layer. Differences are explained rather than rounded away, and each one ends as a fix or a documented, deliberate change.
06Cost and performance tuning
Reduce what each query reads and what each warehouse costs: clustering keys chosen against real query patterns, warehouse sizes and auto-suspend settings taken from the query history rather than guesswork, incremental loads in place of full refreshes, and materialised results where a report reads the same aggregate every hour. The before-and-after is measured on your own queries and credit consumption.
07Salesforce CRM Analytics and Azure Data Factory ingestion
Where reporting already lives in Salesforce CRM Analytics, handle the datasets, recipes, dataflows and field mapping so Snowflake and CRM Analytics agree on the same figures. Where sources sit in Azure, build Azure Data Factory pipelines through Blob Storage into Snowflake with incremental loads, retries and logging, and Python and SQL ingestion elsewhere.
08Handover and operating documentation
Mappings, ER diagrams, validation results, refresh schedules, the role and grant model, cost monitoring and runbooks, written for the people who will run Snowflake after the engagement. Handover is part of the scope, not an extra.