Methodology
How these numbers are produced, and the questions this data can and cannot answer.
Source
The official CFPB Consumer Complaint Database, retrieved via the bulk CSV archive — 17,119,590 published complaint records from December 2011 onward. This is an observed public complaint dataset: a record of complaints that met publication criteria, not a statistical sample of consumer experience.
What this dataset cannot support
- How long a company took to respond. The dataset publishes no company response timestamp. The only two dates are when the complaint was received and when it was routed to the company — separated by seconds for modern web submissions.
- A dispute signal. The "Consumer disputed?" field was removed from exports in June 2026 and is not in the current schema.
- Customer satisfaction, root cause, or market-wide prevalence. None of these are derivable from published complaint categories.
- Individual scoring or company rankings. There is no denominator — customer count, account count, or transaction volume — to normalize against, and this product does not score people.
Publication lag
Complaints are published before their record is complete, so the most recent days of any volume series taper toward zero as an artifact of publication rather than a real decline. Every period comparison in this product excludes that trailing window. It can be toggled back on in Explore, where it is labelled as incomplete.
Decisioning
Every recommendation is deterministic — traceable to one or more documented policy rules, each carrying reason codes and a confidence value. "No action needed" is a first-class outcome, not a fallback to avoid.
Signal confidence
| Value | Meaning |
|---|---|
| High | Directly observed source field |
| Medium | Deterministic derived signal with documented methodology |
| Limited | Affected by coverage, publication lag, or denominator limits |
| Not supported | A conclusion the public data cannot defensibly establish |
Data quality
30 of 17,119,590 source rows (0.000175%) contain an unescaped comma inside a free-text field — a genuine formatting violation in the source file. Different parsers recover from it differently; this was found by comparing a full-population profile against the actual warehouse load rather than trusting either alone. Affected rows are excluded from every downstream model, with a test that fails the build if that excluded count ever grows past a small documented ceiling.
Full documentation
Complete provenance, architecture, decisioning policy, and decision records are in the project repository.