Written by
Halkwinds Editorial Team
Halkwinds Research & Editorial

Data Quality Management: Preventing Bad Data from Costing You
How to build data quality checks, monitoring, and incident response into your data pipeline before bad data reaches dashboards.
Every data engineer has lived through it: a dashboard that quietly shows revenue dropping 40% overnight, a machine learning model that starts making bizarre predictions, or a finance team that loses trust in your numbers after a single bad reconciliation. The root cause is almost never the query or the visualization — it's the data itself. A nullable column that suddenly went null, a currency field that switched from dollars to cents, an upstream API that changed its schema without warning. Data quality management is the discipline of catching these problems before they reach the people who make decisions with your data. This article walks through how to design, implement, and operate data quality controls that actually work in production.
- Background / Why This Matters
- Core Concepts and Architecture
- Implementation Strategy
- Scaling and Operational Considerations
- Common Mistakes / What to Avoid
- Frequently Asked Questions
- Conclusion
Background / Why This Matters
Bad data is expensive in ways that don't show up on a single line item. Estimates vary widely, but research from firms like Gartner has repeatedly suggested that poor data quality costs organizations millions annually through wasted engineering time, incorrect decisions, and eroded trust. The insidious part isn't the cost — it's the invisibility. A broken pipeline throws an error you can see. Bad data flows through silently and looks exactly like good data until someone notices the numbers don't add up.
For data engineers specifically, the pain points cluster in three areas:
- Data quality — Are the values correct, complete, and consistent? Did a join silently duplicate rows? Did a percentage field arrive as 0.5 instead of 50?
- Data observability — Do you find out about problems before your stakeholders do, or do you learn about them in an angry Slack message?
- Pipeline testing — Can you make schema and transformation changes confidently, or does every deploy feel like a gamble?
The shift over the past few years has been from treating data quality as an afterthought — a cleanup task run occasionally — to treating it as a first-class engineering concern with the same rigor as application testing and monitoring. That's the mental model that pays off.
Takeaway: Bad data doesn't announce itself. If your only detection mechanism is a stakeholder noticing something looks wrong, you have already lost the trust battle.
Core Concepts and Architecture
Effective data quality management rests on a few distinct but complementary layers. Confusing them is a common source of gaps — teams that invest heavily in one layer often assume they're covered when they aren't.
The Four Dimensions of Data Quality
- Completeness — Are expected records and fields present? (No missing rows, no unexpected nulls.)
- Validity — Do values conform to expected types, ranges, and formats? (Emails look like emails, dates are in range.)
- Consistency — Do related values agree across tables and systems? (Order totals match the sum of line items.)
- Timeliness — Did the data arrive when expected? (Freshness — the table updated within its SLA window.)
Testing vs. Observability
These two concepts are frequently conflated. Testing is assertion-based: you declare what you expect ("this column should never be null," "this table should have between 10,000 and 12,000 rows daily") and the system fails loudly when reality violates it. Observability is anomaly-based and learns patterns over time: it flags when today's row count deviates significantly from the historical norm even if you never wrote an explicit rule.
You need both. Tests catch the failures you can anticipate. Observability catches the ones you didn't think to write a rule for — which, in practice, is most of them.
Where Checks Live in the Pipeline
Place checks at three points:
- At ingestion — Validate raw data as it enters. Catch schema drift and source-side breakage early, before it contaminates downstream models.
- During transformation — Test the output of each transformation step. This is where dbt tests shine, sitting directly alongside your models.
- Before serving — Gate the final tables that power dashboards and ML features. Nothing bad should pass this checkpoint.
Tool Landscape
| Tool | Primary Strength | Best Fit | Model |
|---|---|---|---|
| dbt tests | Assertion tests colocated with transformations | Teams already using dbt for modeling | Declarative, code-defined |
| Great Expectations | Rich, expressive validation suites and data docs | Complex validation logic, cross-source checks | Programmatic, Python-native |
| Monte Carlo | Automated anomaly detection and lineage | Broad observability across many tables with low config | ML-driven, monitoring-first |
These are not mutually exclusive. A common mature setup uses dbt tests for baseline assertions in transformations, Great Expectations for deeper custom validation at critical boundaries, and Monte Carlo (or an open-source equivalent) for automated observability across the whole warehouse.
Takeaway: Assertion testing and observability solve different problems. Budget for both — relying on one leaves half your failure modes uncovered.
Implementation Strategy
Don't try to boil the ocean. The fastest way to kill a data quality initiative is to write 400 tests, generate constant noise, and train the team to ignore alerts. Start narrow and expand deliberately.
Step 1: Map Your Critical Data Assets
Identify the 10–20 tables that directly feed executive dashboards, financial reporting, and production ML features. These are your "tier 1" assets. Concentrate your strongest controls here first. The obscure staging table nobody queries can wait.
Step 2: Establish Baseline Tests
For every tier 1 model, start with the cheap, high-value dbt tests that catch the most common failures:
- not_null on required columns
- unique on primary keys (this alone catches most fan-out join bugs)
- accepted_values on categorical/status fields
- relationships to verify referential integrity between tables
These four built-in tests, applied consistently, eliminate a surprising share of real-world incidents. You can add them to a dbt project in an afternoon.
Step 3: Add Custom and Semantic Checks
Now layer in the checks that require domain knowledge. This is where Great Expectations or dbt's custom generic tests earn their keep:
- Revenue this period should be within a plausible range of last period.
- The sum of line items must equal the order total.
- Daily active users should never exceed total registered users.
- No records with a future transaction date.
Step 4: Layer in Observability for Freshness and Volume
Automated monitoring for freshness (did the table update on schedule?) and volume (is the row count within a normal band?) catches the silent upstream failures that assertion tests miss. Tools like Monte Carlo learn these patterns automatically; if you're cost-conscious, dbt's source freshness feature plus a simple row-count history table covers the basics.
Step 5: Wire Up Incident Response
A failing check that nobody sees is worthless. Route failures to a dedicated channel, assign ownership, and define severity tiers. A tier 1 freshness failure should page someone; a low-priority validity warning should not. This is exactly the kind of end-to-end pipeline design work our team at Halkwinds handles when helping clients stand up production-grade Data & Analytics platforms — the tooling is the easy part; the operational discipline is where projects succeed or fail.
Takeaway: Ship four built-in dbt tests on your top 20 tables this week. That single move will catch more incidents than any six-month roadmap you haven't started yet.
Scaling and Operational Considerations
What works for 20 tables breaks at 2,000. As your data quality program grows, a new set of challenges emerges.
Alert Fatigue Is the Silent Killer
The moment your team starts reflexively closing alerts, your entire investment is worthless. Combat this aggressively:
- Tier alerts by severity and route them differently — page for tier 1, digest for the rest.
- Set thresholds based on historical variance, not arbitrary round numbers.
- Track and review your false-positive rate as a first-class metric. If it climbs, tune before adding more checks.
Test Coverage as a Metric
Treat data test coverage like code coverage. Track the percentage of tier 1 columns with at least one test, and the percentage of critical tables with freshness and volume monitoring. Make these numbers visible on a dashboard your team actually looks at.
Cost Management
Validation queries consume warehouse compute, and observability platforms carry per-table pricing. On a large Snowflake or BigQuery footprint, indiscriminate testing gets expensive. Run heavy checks incrementally on new/changed partitions rather than full-table scans, and reserve continuous monitoring for genuinely critical assets.
Lineage for Faster Diagnosis
When an incident fires, the first question is always "what's the blast radius?" Column-level lineage — available in dbt's docs, Monte Carlo, and dedicated catalogs — lets you instantly see which downstream dashboards and models are affected by a broken source, turning a two-hour investigation into a two-minute one.
Takeaway: A data quality system that generates noise is worse than none at all. Guard your team's trust in alerts as carefully as your stakeholders' trust in the data.
Common Mistakes / What to Avoid
- Testing everything at once. Broad, shallow coverage produces noise and burnout. Go deep on critical assets first.
- Only testing at the end. If your only checks are on final serving tables, you'll spend hours tracing failures back upstream. Test at ingestion too.
- Ignoring freshness. Teams obsess over value validity and forget that stale-but-valid data
Related Research
Industry Research & Benchmarks
Enterprise AI Adoption Trends 2026
Enterprise AI has crossed the operational threshold. Seventy-two percent of Fortune 500 organizations now run at least one AI system in production — and the average enterprise manages 3.4 concurrent AI initiatives. This report maps the state of enterprise AI across healthcare, manufacturing, financial services, retail, and beyond.
Read reportSaaS Development Benchmarks 2026
What does it actually cost to build and scale a SaaS product in 2026? This report benchmarks engineering team size, deployment frequency, infrastructure spend, and time-to-market across 521 SaaS companies — from $1M ARR seed-stage startups to $100M+ enterprise SaaS leaders.
Read reportAI Agent Adoption Report 2026
AI agents are the most transformative enterprise technology category of the 2025–2026 cycle. This dedicated report examines architecture patterns, deployment economics, governance approaches, and the emerging multi-agent production landscape across 634 organizations — the most comprehensive agent-specific enterprise research available.
Read reportExplore Further