dbt-nexus Documentation
A comprehensive dbt package for entity resolution, event tracking, and entity management with advanced state management capabilities.
Welcome to the dbt-nexus package documentation! This package provides a standardized, source-agnostic solution for building unified customer data platforms with powerful entity resolution and state management capabilities.
What is dbt-nexus?
dbt-nexus is a way of structuring all company data in your data warehouse so it's operationally useful, not just good for dashboards. It's designed to help you actually close sales, speed up customer support, and reduce churn.
Specifically, it's a dbt package that lets data engineers quickly merge and organize any data source into a combined view of people, companies, and events - creating a complete timeline of everything you know about your customers.
dbt-nexus helps you:
- 🔗 Resolve identities across multiple data sources and systems
- 📊 Track events with standardized event logging that creates actionable timelines
- 👥 Manage entities including persons, groups, subscriptions, contracts, and their relationships
- 🏷️ Track state over time with SCD2 state management for dimensions (lifecycle status) and measurements (MRR, contract value)
- 📈 Efficient time-series queries via precomputed deltas on entity states — no date-spine joins needed
- ⚡ Scale efficiently with incremental processing and optimized queries
- 🎯 Drive operations - support teams, sales teams, and AI tools get complete customer context
Quick Start
Get up and running with dbt-nexus in minutes:
# packages.yml
packages:
- local: path/to/dbt-nexus
dbt deps
→ Follow the complete installation guide
Architecture Overview
Image

Mermaid
Final Tables
erDiagram
nexus_events {
string event_id PK
timestamp occurred_at
string event_type
string event_name
string source
}
nexus_entities {
string entity_id PK
string entity_type
string email "dynamic trait"
string name "dynamic trait"
string domain "dynamic trait"
}
nexus_relationships {
string relationship_id PK
string entity_a_id FK
string entity_b_id FK
string relationship_type
boolean is_active
}
nexus_entity_participants {
string entity_participant_id PK
string entity_id FK
string event_id FK
string entity_type
string role
}
nexus_entity_states {
string entity_state_id PK
string entity_id FK
timestamp valid_from
timestamp valid_to
boolean is_current
string ___ "dynamic dimensions"
numeric ___ "dynamic measurements"
numeric ___ "dynamic deltas"
}
nexus_event_measurements {
string event_measurement_id PK
string event_id FK
string measurement_name
numeric value
string value_unit
}
%% Relationships
nexus_entities ||--o{ nexus_relationships : "entity_a"
nexus_entities ||--o{ nexus_relationships : "entity_b"
nexus_entities ||--o{ nexus_entity_participants : "participates in"
nexus_entities ||--o{ nexus_entity_states : "state timeline"
nexus_events ||--o{ nexus_entity_participants : "has participants"
nexus_events ||--o{ nexus_event_measurements : "has measurements"
Full
graph TD
%% Raw Data Layer
subgraph RawData["Raw Data"]
RSD[raw_source_data<br/>• id: string PK<br/>• ...: string]
end
%% Source Event Log Layer
subgraph SourceLog["Source Event Log"]
SET[source_entity_traits<br/>• id: string PK<br/>• event_id: string FK<br/>• trait_name: string<br/>• trait_value: string]
SEI[source_entity_identifiers<br/>• id: string PK<br/>• event_id: string FK<br/>• identifier_type: string<br/>• identifier_value: string]
SE[source_events<br/>• event_id: string PK<br/>• event_name: string<br/>• ...: string]
SEM[source_event_measurements<br/>• event_id: string FK<br/>• measurement_name: string<br/>• value: numeric]
SRD[source_relationship_declarations<br/>• event_id: string FK<br/>• entity_a_identifier: string<br/>• entity_b_identifier: string<br/>• relationship_type: string]
end
%% Core Event Log Layer
subgraph CoreLog["Core Event Log"]
E[nexus_events<br/>• event_id: string PK<br/>• occurred_at: timestamp<br/>• event_type: string<br/>• event_name: string<br/>• source: string]
EID[nexus_entity_identifiers<br/>• entity_type: string<br/>• identifier_type: string<br/>• identifier_value: string<br/>• event_id: string FK]
ET[nexus_entity_traits<br/>• entity_type: string<br/>• trait_name: string<br/>• trait_value: string<br/>• event_id: string FK]
EM[nexus_event_measurements<br/>• event_measurement_id: string PK<br/>• event_id: string FK<br/>• measurement_name: string<br/>• value: numeric]
RD[nexus_relationship_declarations<br/>• relationship_declaration_id: string PK<br/>• entity_a_identifier: string<br/>• entity_b_identifier: string<br/>• relationship_type: string]
end
%% Entity Resolution Layer
subgraph Identity["Entity Resolution"]
RPI[resolved_person_identifiers<br/>• person_id: string<br/>• identifier_type: string<br/>• identifier_value: string]
RGI[resolved_group_identifiers<br/>• group_id: string<br/>• identifier_type: string<br/>• identifier_value: string]
RET[resolved_entity_traits<br/>• entity_id: string<br/>• trait_name: string<br/>• trait_value: string]
RRD[resolved_relationship_declarations<br/>• entity_a_id: string<br/>• entity_b_id: string<br/>• relationship_type: string]
end
%% Final Tables Layer
subgraph Final["Final Tables"]
ENT[nexus_entities<br/>• entity_id: string PK<br/>• entity_type: string<br/>• email: string<br/>• name: string<br/>• domain: string]
REL[nexus_relationships<br/>• relationship_id: string PK<br/>• entity_a_id: string FK<br/>• entity_b_id: string FK<br/>• relationship_type: string]
EP[nexus_entity_participants<br/>• entity_participant_id: string PK<br/>• entity_id: string FK<br/>• event_id: string FK<br/>• role: string]
end
%% Data Flow Connections
RSD -->|derives| SET
RSD -->|derives| SEI
RSD -->|derives| SE
RSD -->|derives| SEM
RSD -->|derives| SRD
SET -->|unions all sources| ET
SEI -->|unions all sources| EID
SE -->|unions all sources| E
SEM -->|unions all sources| EM
SRD -->|unions all sources| RD
E -->|has many| EID
E -->|has many| ET
E -->|has many| EM
E -->|has many| RD
EID -->|resolves| RPI
EID -->|resolves| RGI
ET -->|resolves| RET
RD -->|resolves| RRD
RPI -->|materializes| ENT
RGI -->|materializes| ENT
RET -->|enriches| ENT
RRD -->|materializes| REL
ENT -->|entity_a| REL
ENT -->|entity_b| REL
ENT -->|references| EP
E -->|references| EP
Interactive database schema diagram showing the dbt-nexus data model structure with the five-layer architecture: Raw Data, Source Event Log, Core Event Log, Entity Resolution, and Final Tables.
Note: To view the original diagram, open
docs/assets/images/database-diagram.xmlin diagrams.net.
Quick Start Guides
- How to Generate Nexus IDs - Complete guide for creating unique identifiers
- How to Format Events - Guide for formatting events for Nexus
- Event Schema Quick Reference - Quick reference for event schema