How to build a composable CDP on a data warehouse
Learn how to build a composable CDP on a data warehouse with identity resolution, semantic layers, and reverse ETL best practices.
Quick Answer
A composable CDP is assembled from best-in-class components sitting directly on your cloud data warehouse: identity resolution logic in SQL, a semantic layer in dbt, and reverse ETL for activation. You build it by treating the warehouse as the system of record, modeling customer entities natively, and syncing curated audiences out to operational tools rather than duplicating data into a black-box vendor.
Introduction
Traditional customer data platforms were designed for a world where the warehouse was slow, expensive, and inaccessible to marketing teams. That world no longer exists. Snowflake, BigQuery, and Databricks now handle sub-second queries on billions of events, dbt has become the default modeling layer, and reverse ETL vendors have matured into production-grade activation pipelines. The result is that a warehouse native CDP can outperform a legacy platform on cost, flexibility, and data ownership, provided the team commits to owning the architecture end to end.
Key Takeaways:
A composable CDP treats the cloud data warehouse as the single source of truth for customer data, replacing black-box vendor storage.
Identity resolution, semantic modeling, and reverse ETL are the three non-negotiable pillars of any warehouse-native customer data platform.
Composable wins on flexibility and cost at scale, but demands mature data engineering and disciplined event taxonomy design.

Laying the Warehouse Foundation
Every composable CDP starts with a deliberate choice of warehouse. This decision constrains every downstream component, from how identity graphs are computed to how quickly audiences reach downstream tools, so it deserves more scrutiny than most teams give it.
Choosing the Right Cloud Data Warehouse
The warehouse is not a storage detail; it is the runtime for your entire customer data platform. Evaluate candidates against workload patterns, cost predictability, and ecosystem support for the modern data stack.
Snowflake: Strong ecosystem for reverse ETL and dbt, predictable virtual warehouse scaling, best for teams prioritizing tooling maturity.
BigQuery: Serverless pricing rewards spiky event workloads, native ML functions help with probabilistic identity stitching.
Databricks: Lakehouse pattern shines when you need to blend structured events with unstructured product telemetry or ML features.
Redshift: Cost-effective for AWS-native shops already invested in Kinesis and Glue, though concurrency demands careful tuning.
Warehouse vs Lakehouse Tradeoffs
The lakehouse pattern has closed most of the historical gap between lakes and warehouses, and for CDP workloads the choice often comes down to whether your team runs ML features alongside marketing activations. Recent research on lakehouse architecture highlights how unified storage layers reduce the pipeline sprawl that plagues traditional two-tier stacks. For most SaaS teams building a composable CDP, a pure warehouse is simpler to operate, while a lakehouse pays off once feature engineering and BI must share the same substrate. Either way, commit to one substrate and resist the urge to split customer data across systems.

Identity, Modeling, and Activation
Once the warehouse is chosen, the composable stack takes shape through three tightly coupled layers: identity resolution, a semantic layer, and reverse ETL. Skipping or half-building any one of them collapses the architecture back into fragmented spreadsheets and ad-hoc SQL.
Identity Resolution and Semantic Modeling
Identity resolution is the hardest problem in any customer data platform, and warehouse-native architectures handle it better because the logic is transparent, versioned, and reproducible. Deterministic stitching using email, user_id, and device_id covers the majority of authenticated traffic, while probabilistic methods fill gaps for anonymous sessions. The academic literature on identity resolution is worth reviewing before choosing a method, and TrackRaptor's breakdown of deterministic vs probabilistic identity resolution covers the tradeoffs data engineers hit in production. Build the identity graph as an incremental dbt model that outputs a canonical person_id, and let every downstream mart join to it. The semantic layer sits on top of that identity graph and defines customer entities, metrics, and traits that every team consumes. Use dbt to codify definitions like active_user, mrr_contributor, or churn_risk_score as version-controlled SQL rather than tribal knowledge scattered across dashboards. A well-designed semantic layer for data teams turns "what is a qualified lead?" from a Slack argument into a pull request. This is also where dbt modeling for event data pays dividends: normalize raw event streams into fct_events, then build aggregated user and account marts on top.
Reverse ETL and Component Comparison
Reverse ETL is what turns your warehouse from a passive analytics store into an active operational system. It syncs curated tables to Salesforce, HubSpot, Braze, Iterable, and dozens of ad platforms on a schedule or via change data capture. According to industry definitions of reverse ETL, the pattern specifically inverts the traditional ELT direction to push warehouse-modeled data into the tools where sales, support, and marketing actually work. Reverse ETL pipeline best practices call for idempotent syncs, explicit primary keys, and monitoring on row-level diffs so downstream tools never receive stale or duplicated records. A short comparison of the core components helps clarify how they fit together.
Layer | Purpose | Typical Tools | Owner |
|---|---|---|---|
Warehouse | System of record for events and entities | Snowflake, BigQuery, Databricks | Data engineering |
Identity graph | Resolve users across devices and channels | dbt, custom SQL | Data engineering |
Semantic layer | Define metrics, traits, and audiences | dbt, Cube, MetricFlow | Analytics engineering |
Reverse ETL | Activate data into operational tools | Hightouch, Census, RudderStack | Data + growth |
Event capture | Ingest client and server events | Snowplow, Rudder, custom SDKs | Product engineering |
The takeaway is that ownership is distributed, but the substrate is shared, which is exactly the opposite of a traditional CDP where one vendor owns everything. Teams evaluating best reverse ETL tools should weigh sync frequency, observability, and destination coverage over marketing claims.
Governance and When to Choose Composable
A composable CDP only works if governance keeps pace with the pipes. Without disciplined event taxonomy and clear ownership, the warehouse becomes a swamp of inconsistent naming and orphaned models within a quarter.
Event Taxonomy and Governance
Event taxonomy design is where most composable CDP projects quietly fail. Define a naming convention (object_action, past tense, snake_case), enforce it in CI with a tracking plan schema, and reject PRs that introduce untyped properties. TrackRaptor has published detailed guidance on event taxonomy best practices that data teams can adapt directly. For high-scale environments, treat the tracking plan as code, version it in Git, and generate SDK type definitions from it so client and server events stay in lockstep.
Composable vs Traditional CDP Decision
The CDP vs reverse ETL debate is largely settled for technical teams: reverse ETL plus a warehouse covers 90% of what a traditional CDP does, at a fraction of the cost, once you have the engineering capacity to operate it. The remaining 10% (real-time personalization under 100ms, non-technical audience builders, out-of-the-box consent management) still favors packaged platforms for some use cases. TrackRaptor's analysis of warehouse-native CDP vs traditional platforms lays out where each approach wins, and the broader composable CDP architecture pros and cons discussion clarifies which teams should not attempt this path. Choose composable when you have at least two data engineers, a mature dbt project, and destinations that tolerate batch or micro-batch sync latency. Choose a traditional CDP when you need sub-second activation, have no data team, or when compliance requires a vendor-audited pipeline.

Conclusion
Building a composable CDP is an exercise in architectural discipline, not tool selection. The warehouse holds the truth, dbt models the entities, reverse ETL activates the audiences, and a strict event taxonomy keeps the whole thing coherent as it scales. Teams that commit to this pattern gain full data ownership, lower unit economics at volume, and the flexibility to swap any single component without rebuilding the stack. For deeper practitioner guides on warehouse-native customer data platforms and modern tracking infrastructure, TrackRaptor publishes ongoing analysis for data engineers navigating exactly these decisions.
Ready to pressure-test your composable architecture before you commit engineering cycles? Explore TrackRaptor's deep-dive library for reference architectures, taxonomy templates, and honest tool comparisons built for practitioners.
Frequently Asked Questions (FAQs)
What is a warehouse native CDP?
A warehouse native CDP is a customer data platform architecture where the cloud data warehouse serves as the primary storage and processing layer, with identity resolution, modeling, and activation built as composable components on top.
How to build a composable CDP on a data warehouse?
Start with warehouse selection, add an identity graph in dbt, build a semantic layer of customer entities and metrics, connect reverse ETL for activation, and enforce a versioned event taxonomy across all producers.
Can reverse ETL replace a traditional CDP?
Reverse ETL replaces most traditional CDP functionality for batch and micro-batch use cases but does not yet match packaged CDPs for sub-second real-time personalization or non-technical audience-building interfaces.
How to perform identity resolution with fragmented data?
Combine deterministic stitching on shared keys like email and user_id with probabilistic matching on device fingerprints and session behavior, then materialize the result as an incremental dbt model producing a canonical person_id.
How to create a semantic layer in dbt?
Define reusable entities and metrics as version-controlled dbt models or MetricFlow definitions, layered above your fact and dimension tables so every downstream tool consumes the same customer definitions.
How to build an event taxonomy for large scale?
Adopt an object_action naming convention, codify the tracking plan as a schema in Git, generate typed SDK bindings from it, and validate every event in CI before it reaches production.
How do SaaS teams in Europe approach composable CDP architecture?
European SaaS teams typically prioritize data residency and GDPR-compliant consent flows, favoring warehouse-native architectures hosted in EU regions with strict pseudonymization in the identity graph.
About the Author
Noah Richardson is a SaaS Metrics Advisor who writes about KPIs, retention analysis, and revenue-focused analytics for modern product teams. His work focuses on translating customer lifecycle measurement into concrete data architecture decisions, making him a natural voice on composable CDP design and warehouse-native tracking strategy.
