The best data quality tool for most teams in 2026 is the one already in your stack: dbt tests. If you're running dbt, you have not_null, unique, relationships, and accepted_values available right now, and they catch the majority of real data incidents. Beyond that, the right answer depends on how many tables you monitor, how much automation you need, and what you're willing to pay -- from free open-source to $100K+/year platforms.
Quick comparison
| Tool | Price | Approach | Best for |
|---|---|---|---|
| dbt tests | Free | Built-in schema + data tests | Teams already running dbt |
| Great Expectations | Free (open-source) | Python expectation suites | Complex validation logic |
| Soda | Free (open-source) + Cloud | YAML-based checks (SodaCL) | Teams that want simplicity |
| Elementary | Free (open-source) + Cloud | dbt-native observability | Anomaly detection inside dbt |
| Monte Carlo | $100K+/year | ML-based data observability | Enterprise data platforms |
| Datafold | Free tier + paid | Data diffing and regression | Testing dbt model changes |
| dbt-expectations | Free (dbt package) | Great Expectations tests in dbt | GE power without Python infra |
| Lightdash + dbt tests | Free (self-hosted) | BI with dbt test visibility | Surfacing test results in dashboards |
| Custom SQL checks | Free | Scheduled queries + alerts | Small teams, specific checks |
Where data quality fits in the pipeline
Data quality isn't a layer you add at the end. It runs at multiple points -- after ingestion, after transformation, and before anything reaches a dashboard.
Sources --> Ingestion --> Warehouse --> Transform --> BI / Analysis
| | |
[Soda] | [dbt tests] | [Lightdash] |
[Custom SQL] | [Elementary] | |
| [GE] | |
| [Datafold] | |
\ /
[Monte Carlo]
(monitors everything)The tools at the warehouse level check raw data after ingestion. The ones in the transform column run as part of your dbt pipeline. Monte Carlo sits across all of it.
Fastero
Connect your database. Ask questions. Get dashboards.
Postgres, BigQuery, Snowflake, and 10+ sources — live-connected, AI-powered, no dashboard builder learning curve.
Try free →dbt tests
If you run dbt, you already have a data quality framework. Four built-in tests ship with every dbt project:
models:
- name: orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['pending', 'shipped', 'delivered', 'cancelled']
- name: customer_id
tests:
- relationships:
to: ref('customers')
field: customer_idThese run with dbt test after every dbt run. They catch nulls in required fields, duplicate keys, broken foreign key relationships, and unexpected categorical values. That covers 60-70% of real data quality incidents I've seen in production.
The limitation: dbt tests run when dbt runs. They don't monitor raw source tables on a schedule, they don't do anomaly detection, and they won't tell you when something looks statistically wrong but passes a hard rule.
If you're still weighing dbt Core against Cloud, our dbt Core vs dbt Cloud comparison covers the testing and CI differences in detail.
Great Expectations
Great Expectations is the most flexible data validation library available. It's a Python framework where you define "expectations" -- assertions about what your data should look like -- and run them against batches of data.
validator.expect_column_values_to_not_be_null("email")
validator.expect_column_values_to_be_between("age", min_value=0, max_value=120)
validator.expect_column_distinct_count_to_be_between("country_code", min_value=1, max_value=250)
validator.expect_column_mean_to_be_between("order_total", min_value=10, max_value=500)You can write expectations that no YAML config language can express -- statistical distribution checks, cross-column consistency rules, time-series pattern validation. GE also generates data documentation ("Data Docs") automatically.
The tradeoff is the learning curve. GE has its own concepts -- data contexts, expectation suites, checkpoints, batch requests -- and wiring them together takes real setup time. I've seen teams spend a week getting their first checkpoint running. Once it's running, it's excellent.
Use it when: you need validation logic too complex for YAML-based tools, or you want programmatic control over every rule.
Soda
Soda is the answer to "I want Great Expectations but without the setup overhead." You write checks in SodaCL, a YAML-based language designed specifically for data quality:
checks for orders:
- row_count > 0
- missing_count(customer_id) = 0
- invalid_percent(email) < 5%:
valid format: email
- avg(order_total) between 20 and 200
- schema:
fail:
when column type changes:
- order_id
- customer_idThe syntax is readable, the learning curve is shallow, and soda scan runs against any SQL database. Soda Cloud adds a monitoring dashboard, alerting, and incident history. Soda sits between dbt tests and Great Expectations in complexity -- more expressive than dbt's built-in tests, simpler than Python expectation suites. For teams that want checks non-engineers can read and modify, it's a strong pick.
Elementary
Elementary builds data observability directly into dbt. Install it as a dbt package, and it extends your existing tests with anomaly detection, schema change monitoring, and a self-hosted observability dashboard.
models:
- name: orders
columns:
- name: order_total
tests:
- elementary.column_anomalies:
where: "created_at > current_date - interval '7 days'"Instead of you setting a threshold, Elementary learns the normal pattern from historical data and flags deviations. It's not ML in the Monte Carlo sense -- statistical baselines computed in SQL inside your warehouse -- but it catches the distribution drift and volume anomalies that static dbt tests miss.
The free version generates a static HTML report. Elementary Cloud adds Slack alerts, a live dashboard, and incident management. Everything runs as dbt models and tests -- no separate infrastructure.
Use it when: you want anomaly detection but aren't ready for a $100K platform, and you're already invested in dbt.
Monte Carlo
Monte Carlo is the enterprise data observability platform. Connect it to your warehouse, and it monitors every table automatically -- schema changes, freshness, volume anomalies, distribution drift -- using ML models trained on your data's actual patterns.
At 500+ tables across 20+ data engineers, writing individual checks stops being feasible. Monte Carlo does it automatically, with lineage that traces a broken source through every downstream model and dashboard, root cause analysis that identifies which upstream change caused the incident, and incident management with ownership and resolution tracking.
The price reflects it: $100K+/year, sometimes significantly more depending on table count and warehouse. The right tool for large data platforms where the cost of bad data reaching exec dashboards exceeds the platform cost. The wrong tool for a five-person team with 30 tables.
Datafold
Datafold solves a problem the other tools don't touch: data regression testing. When you change a dbt model, how do you know the output is still correct? Datafold diffs the data -- comparing your changed model's output against production, row by row, column by column, showing added rows, removed rows, value differences, and statistical shifts. It integrates with dbt CI, so every pull request gets a data diff automatically.
Use it when: you ship dbt model changes frequently and have been burned by a "looks fine" merge that silently shifted downstream numbers.
dbt-expectations
dbt-expectations ports a subset of Great Expectations tests into dbt's native testing framework. GE-style assertions, directly in your dbt YAML:
models:
- name: orders
columns:
- name: order_total
tests:
- dbt_expectations.expect_column_values_to_be_between:
min_value: 0
max_value: 10000
- dbt_expectations.expect_column_mean_to_be_between:
min_value: 20
max_value: 300
- name: email
tests:
- dbt_expectations.expect_column_values_to_match_regex:
regex: "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"Distribution checks, regex matching, statistical assertions -- without the separate Python infrastructure or checkpoint configuration. Everything runs inside dbt test and fails your CI pipeline if a check breaks. The tradeoff: GE has hundreds of expectations; dbt-expectations ports the most-used ones. For most teams, the ported set covers everything they'd actually write.
Lightdash + dbt tests
Lightdash is an open-source BI tool built specifically for dbt. The data quality angle: it surfaces dbt test results alongside your dashboards, so the person looking at a revenue chart can see whether the underlying model's tests are passing.
This solves a real problem. In most setups, dbt tests fail silently in a CI log nobody outside the data team reads. Lightdash puts that information where the data consumer actually looks -- next to the data itself. Self-hosted is free. Cloud adds user management and scheduled deliveries. If your team is dbt-native, the test visibility is a genuinely useful differentiator over Metabase or Superset.
Custom SQL checks
Don't skip this one. A scheduled SQL query that posts to Slack when something's wrong is often the right answer for small teams.
-- Alert if no orders in the last 2 hours (freshness)
SELECT COUNT(*) AS recent_orders
FROM orders
WHERE created_at > NOW() - INTERVAL '2 hours';
-- Alert if null rate on email spikes (quality)
SELECT
COUNT(*) FILTER (WHERE email IS NULL) * 100.0 / COUNT(*) AS null_pct
FROM users
WHERE created_at > NOW() - INTERVAL '1 day';Run these on a cron schedule, pipe failures to a Slack webhook, and you've got monitoring. Not scalable past 15-20 checks, no anomaly detection, and thresholds are whatever you set -- but it works, it's free, and you can have it running in an hour. For scheduling, you can use cron, your orchestrator, or a tool like Fastero that runs queries on a schedule and routes alerts automatically. Our guide to building a free analytics stack covers the scheduling options.
How to decide: a starting framework
The choice depends on three things: what's already in your stack, how many tables you care about, and your budget.
Already running dbt? Start with dbt's built-in tests. Add dbt-expectations for richer assertions. Add Elementary if you want anomaly detection without leaving the dbt ecosystem.
Not running dbt? Soda or custom SQL checks. Soda if you want a structured framework with a monitoring dashboard. Custom SQL if you have fewer than 15 checks and want zero dependencies.
Need programmatic control? Great Expectations. It's more work to set up, but nothing else gives you the same flexibility for complex validation logic.
50+ tables, 10+ person team? Evaluate Monte Carlo. The manual approach doesn't scale linearly, and at this size the cost of a missed data incident likely exceeds the platform cost.
Shipping dbt models frequently? Add Datafold to your CI pipeline for data regression testing.
Whichever tool you pick, start with checks for incidents you've actually had. Full-coverage monitoring comes later.
If you're building out the rest of your data stack, our breakdown of the best tools for data engineering teams covers every layer from ingestion to visualization, and the open-source ETL tool comparison narrows down the ingestion decision.
Frequently asked questions
Do I need a dedicated data quality tool, or are dbt tests enough?
For most teams under 10 people with fewer than 50 models, dbt tests cover the majority of real incidents. Add a dedicated tool when you need anomaly detection, monitoring of raw source tables outside dbt, or an operational layer with alerting and incident history. The built-in tests are a floor, not a ceiling -- but it's a high floor.
How is data quality different from data observability?
Data quality tools test assertions you define ("this column is never null"). Data observability tools monitor everything automatically and flag anomalies you didn't anticipate. In practice the line is blurry -- Elementary and Monte Carlo both do both -- but it matters when deciding between writing checks yourself and paying for a platform that generates them.
Can I use multiple tools together?
Yes, and most mature teams do. A common stack: dbt tests for basic assertions, Elementary for anomaly detection, Datafold for CI regression testing, Soda or custom SQL for source-table monitoring outside dbt.
What data quality checks should I write first?
Freshness checks, null checks on required fields, and row count floors on critical tables. These three categories catch the vast majority of production data incidents. Start with the checks that would have caught your last three data incidents.
How does Fastero handle data quality?
When you connect a data source to Fastero, it validates the schema and column types automatically -- detecting type mismatches, unexpected nulls, and structural changes before you start analyzing. Combined with scheduled queries that alert on anomalies, it covers the custom SQL check approach without the cron job maintenance.
Try Fastero free — connect your database, Fastero validates schemas and types automatically. AI-powered analytics with built-in data awareness. No credit card required.

