Source
Structured public complaint data
- Consumer Complaint Database
- Bulk CSV extract
- Published complaint records
- Product, issue, response, date and state fields
From structured public data to decision-ready intelligence
A batch ELT pipeline loads CFPB complaint data into Snowflake, transforms it through a dependency-driven dbt model DAG, applies analytical and decisioning logic, and publishes curated data for exploration.
Structured public complaint data
Source-preserving load into Snowflake RAW
A dependency-driven model DAG, executed inside Snowflake
stg_cfpb_complaintsint_complaint_status_contextint_issue_daily_volumeint_issue_trendsint_resolution_signalsint_company_issue_patternsdim_issue_taxonomyfct_complaintsfct_issue_daily_metricsoperations_overview_metricsagent_case_contextint_priority_policy_applicationresolution_action_queueWhere dbt models are materialized and served
The analytical fields the product needs, and nothing else
Two consumption surfaces on one analytical platform
Snowflake stores and serves the analytical data, dbt transforms and tests it, dbt Cloud orchestrates production runs, and the application consumes curated analytical outputs.
Each model has a defined grain and a specific analytical responsibility. The dependency graph is generated from dbt ref() relationships, so the visual reflects the actual project DAG. Columns are build order; hover a model to isolate its dependencies.
Cleans and standardizes the source fields once, so nothing downstream repeats it.
stg_cfpb_complaints1 published complaint record, as received
Types every field once and drops rows missing anything decision-critical
Materialized as a view · feeds int_complaint_status_context, dim_issue_taxonomy
Joins records, calculates metrics and derives the analytical context.
int_complaint_status_context1 published complaint record
Labels each record's completeness so nothing downstream re-derives it
Materialized as a view · feeds int_issue_daily_volume, int_company_issue_patterns, fct_complaints, int_resolution_signals
int_issue_daily_volume1 calendar date x product x issue
Counts complaints per day, product and issue — the grain every trend uses
Materialized as a view · feeds int_issue_trends
int_company_issue_patterns1 calendar date x company x product x issue
Bounded company context, constrained so it cannot become a ranking
Materialized as a view
int_issue_trends1 calendar date x product x issue x trend policy
Rolling window, baseline, change and share — decides what qualifies as emerging
Materialized as a view · feeds fct_issue_daily_metrics, int_resolution_signals
int_resolution_signals1 published complaint record
Joins each record to the pattern it belongs to
Materialized as a view · feeds int_priority_policy_application, resolution_action_queue, agent_case_context
Publishes the reusable datasets everything else reads.
dim_issue_taxonomy1 product x sub-product x issue x sub-issue combination
The canonical product and issue label set
Materialized as a table · 2,642 rows · feeds fct_complaints
fct_complaints1 canonical published complaint record
The canonical fact table every population count is taken from
Materialized as a table · 17,119,581 rows · feeds agent_case_context
fct_issue_daily_metrics1 calendar date x product x issue
The trusted daily metric layer; its count is the only one safe to sum across dates
Materialized as a table · 314,733 rows · feeds operations_overview_metrics
operations_overview_metrics1 metric date x dashboard dimension x metric name
Pre-aggregated display metrics so the app never recomputes at read time
Materialized as a table · 328,994 rows
agent_case_context1 published complaint record
The agent-safe surface: factual context per record, no narrative text
Materialized as a table · 17,119,581 rows
Evaluates the policies and turns analytical signals into one action per record.
int_priority_policy_application1 complaint record x policy rule evaluated
Evaluates all six policies against every record and keeps each result
Materialized as a view · feeds resolution_action_queue
resolution_action_queue1 complaint record x final recommendation run
Applies precedence and lands one action per record with its reason codes
Materialized as a table · 17,119,581 rows · feeds operations_overview_metrics, agent_case_context
The path a single published record takes, and the model responsible at each step.
A published CFPB complaint enters the pipeline.
Types and required fields are standardized.
stg_cfpb_complaintsThe complaint's product and issue contribute to daily volume.
int_issue_daily_volumeThe issue is compared against its own historical baseline.
int_issue_trendsThe defined priority rules are evaluated against the record.
int_priority_policy_applicationPolicy precedence produces one recommendation with supporting reason codes and confidence.
resolution_action_queue