Blog
Data drift explained: causes, detection & fixes
The pipeline ran clean. No errors, no alerts. The data was just quietly wrong.

Most data incidents don't start with an error message. A Salesforce admin renames a field on Tuesday. Your extract, transform, load (ETL) job runs fine on Wednesday, with no errors and no alerts. By Thursday, your marketing attribution dashboard shows zero leads from paid channels. The pipeline didn't break. The schema technically held together. But the values flowing through it shifted, and nobody noticed until a VP asked why paid acquisition looked like it fell off a cliff.
That's data drift in action. It usually starts as a quiet change in the data your systems depend on, then compounds until someone downstream spots something wrong.
What is data drift?
Data drift is a change in the statistical properties of the data your systems receive in production, relative to the data they were originally built on.
That definition comes from the ML world, but drift reaches far beyond model performance. It affects analytics pipelines, business intelligence (BI) dashboards, and AI workflows that query your warehouse. The system keeps running while the answers get less reliable.
The terminology also varies across the industry. Several kinds of drift can happen at the same time, and practitioners often use terms interchangeably. What matters most is understanding the different ways your data can shift underneath your systems.
The types that matter in practice
In practice, drift usually shows up in a few familiar ways.
Sometimes the makeup of incoming data changes while downstream logic still assumes the old pattern. In ML, this often gets labeled covariate shift. Maybe your customer mix shifts toward a new demographic, or a sensor starts reading slightly differently.
Sometimes the values still look familiar, but what they imply has changed. In ML, that's commonly called concept drift. Credit scoring models are a standard example: the applicant profiles can look familiar even as the macro environment shifts the actual risk of default.
Schema drift is structural. Columns get added, removed, renamed, or their types change. This is different from statistical drift.
You can also monitor shifts in the outputs your systems produce. In ML, that often appears as prediction drift: a change in the distribution of model outputs. It can serve as an early warning signal because you don't need ground truth labels to detect it.
Schema validation catches structural changes that statistical tests miss, and statistical tests catch distributional shifts that schema validation will never flag. You need both.
The causes you'll actually encounter
Data drift in production usually means something upstream changed.
Silent schema changes from engineering teams
Backend teams rename columns, change data types, and drop tables without knowing your pipeline exists.
And this is accelerating. AI-assisted software development is speeding up code delivery, which increases pressure on downstream data systems that weren't designed to absorb that pace of change.
SaaS platform changes with no downstream visibility
Salesforce admins delete or migrate columns without knowing those fields feed downstream dashboards. Soda at Make documented this pattern, where source system owners had no visibility into downstream dependencies. By the time the impact was visible, it was already in a KPI report. And when something broke, the first two hours went not to fixing code but to finding out who currently owned the data.
Third-party format changes nobody anticipated
A financial services firm's warehouse began calculating incorrect portfolio values after a market data provider changed its file format without notice. The team had tested for missing data and calculation errors, but not for a decimal separator change. The error went undetected for two weeks, affecting thousands of client reports.
Upstream pipeline rewrites that change feature meaning
Great Expectations and Avanade documented a case where a top feature feeding into an ML model had gone to zero due to an issue deep in the data warehouse. The team caught it through their data quality processes. Without that detection, the model would have silently degraded.
Semantic drift through transformation layers
A field's meaning can diverge from its original source across multiple transformation steps without anyone realizing. A table can be technically well-optimized yet semantically wrong if its definition drifts from the source over multiple transformations and no pipeline is monitoring for that change.
Individual analysts may notice something is off, but as Locally Optimistic points out, "people are often doing data quality monitoring during their individual workflows, but those checks never get surfaced outside of that individual's workflow." The observation stays local. The drift persists globally.
How drift corrupts AI answers before anyone notices
Data drift is especially dangerous in AI analytics because the confidence signal stays intact even when the governed context underneath it has gone stale. The AI keeps producing outputs that look reasonable, but it can be confidently wrong, grounded in definitions and distributions that no longer reflect reality.
Evidently AI explains why standard data quality tooling misses this: "data quality issues refer to corrupted and incomplete data... whereas data drift refers to changes in distributions in otherwise correct and valid data." The data is valid. The distribution has changed. Quality checks pass anyway.
This gets riskier when AI systems strictly query governed context layers. If underlying tables get restructured, business definitions change, or column semantics shift, a large language model (LLM) can continue to generate syntactically correct queries against semantically wrong definitions. The queries execute without error. The results look grounded. The failure exists entirely upstream. Technical users still get the best results by reading the generated SQL before they trust the answer.
Standard retrieval-augmented generation (RAG) evaluation metrics such as faithfulness, groundedness, and answer relevance may miss this kind of upstream context problem. Every metric that measures the relationship between the answer and the context can still pass.
And in workflows where AI chains multiple reasoning steps together (whether that's a business user asking follow-up questions in Threads or a technical user digging deeper in Notebook Agent), each step treats the previous step's output as established fact. One wrong premise at the start cascades through the entire chain.
According to Hex's State of Data Teams 2026 report, 31% of data leaders cite trust as their top concern with adopting AI on their data, nearly twice any other concern cited. The worry isn't theoretical. Teams know their data layer isn't ready for the certainty AI projects onto it.
Detection at the data-team level
You can catch drift with checks that fit directly into workflows you're already running.
Statistical tests for distribution monitoring
If you want to monitor distribution changes, start with methods that are practical for the size and shape of your data. In most teams, that means comparing current data against a baseline and alerting when the difference crosses a threshold.
For small datasets, one common approach is the Kolmogorov-Smirnov (KS) test. It measures the maximum difference between two distributions and is the default in tools like Evidently AI. But it over-alerts on large datasets because statistical power scales with sample size.
For larger datasets, Wasserstein distance can be a more stable choice for monitoring distribution shifts. For very large datasets, the KS test can become overly sensitive to small differences that don't matter operationally.
If your team works primarily in SQL, Population Stability Index (PSI) is worth knowing. It's widely used in financial services, can be computed in pure SQL without Python, and teams typically use PSI ranges to distinguish shifts worth watching from shifts worth acting on.
For categorical features, the chi-squared test is a standard default.
Schema change detection
Compare current schemas against baselines and alert on changes. Snapshot information_schema.columns as a reference and compare on each run, with strict alerts for critical columns and soft warnings for optional ones.
Integration with dbt, Airflow, and Dagster
A dbt singular test can flag mean drift with nothing more than SQL:
-- tests/assert_feature_mean_stable.sqlWITH current_stats AS (SELECT AVG(feature_value) AS current_meanFROM {{ ref('my_model') }}),reference_stats AS (SELECT ref_meanFROM {{ ref('feature_reference_stats') }}WHERE feature_name = 'feature_value')SELECT *FROM current_statsCROSS JOIN reference_statsWHERE ABS(current_mean - ref_mean) / ref_mean > 0.15It runs inside your existing dbt test suite and returns rows on failure, making drift alerting a first-class part of your pipeline.
For teams using Airflow or Dagster, distribution checks can run as pipeline steps. Evidently AI's test suites are designed for pipeline orchestration contexts and generate pass/fail results.
The catch with any test-based approach: tests only catch failures developers anticipated. Nobody writes a test for a decimal separator changing from periods to commas. Pipelines can still succeed while producing corrupted output, so teams mistake the absence of a failure for correctness. Data quality monitoring closes part of this gap, but it doesn't give you cross-system visibility into why an upstream owner made a change, or where the blast radius extends. That needs a feedback loop, not just alerting.
What a governed response looks like
When you detect drift, the response touches every downstream consumer.
Flag affected tables immediately
The fastest way to prevent bad downstream decisions is to suspend trust signals on affected sources. If you're using endorsed or certified table statuses (whether in dbt, a data catalog, or your analytics platform), remove that status the moment drift is confirmed. That makes it clear to downstream users that the affected table should no longer be treated as trusted context until remediation is complete.
Trace the blast radius with lineage
Before fixing anything, enumerate what's affected. Which dashboards, models, and downstream tables depend on the drifted source? Lineage tracking, whether through dbt, your catalog, or your analytics platform, lets you answer this in minutes instead of hours. As Datafold notes, lineage helps teams understand where data originated, how it was transformed, and where it flows across the organization.
Lock access during remediation
Tighten workspace rules and access controls on affected tables so downstream consumers don't read from a known-bad source. The goal is to prevent decisions based on data you know is unreliable.
Close the feedback loop
After remediation, don't just re-certify the table and move on. Adjust your detection thresholds. The drift event is evidence that previous thresholds were too permissive. Soda at 2K Games documented a case where an internally built anomaly detection tool generated so many false positives that teams stopped trusting alerts entirely, and marketing teams ended up being the first to discover data issues.
Calendly's Go-to-Market analytics team addressed this proactively by building a Standardized Metric Library in Hex as company-wide KPI documentation, specifically to "tie-break conflicting reports" and give everyone a governed source of truth. When definitions drift, there's a single place to reconcile them rather than chasing inconsistencies across scattered dashboards.
Communicate before someone asks
Downstream analysts need to know which tables are affected and when the fix lands. Business stakeholders need impact in plain language, not pipeline logs. And if you have models that retrain automatically, confirm the upstream drift is remediated before any retrain triggers. Otherwise, your automated pipeline encodes the corrupted distribution as ground truth.
Context Studio provides visibility into where governance gaps are creating confusion before they produce wrong answers: which questions come up most often, where context is breaking down, and where answers fall short.
Data trustworthiness is a practice, not a destination
Data drift isn't a one-time problem you solve and move on from. It's a persistent condition of working with production data. Schemas evolve, business definitions shift, and upstream systems change without notice. The teams that handle it well aren't the ones with the fanciest monitoring stack. They're the ones who treat governance best practices as ongoing work: endorsed tables that signal trust, detection checks inside existing pipelines, and observability that closes the loop before a wrong answer reaches a stakeholder.
Frequently Asked Questions
How is data drift different from a data quality bug?
Data quality bugs involve corrupted or incomplete data, such as a null injection, a failed pipeline, or a malformed record. Data drift involves changes in distributions within otherwise valid data. The distinction matters because quality checks will catch a broken pipeline but will pass cleanly when the data is technically correct and the distribution has shifted. Both can degrade your analytics outputs, but they need different detection approaches: quality checks for structural integrity and statistical monitoring for distributional shifts.
Do I need a dedicated ML monitoring platform to detect drift?
Not necessarily. If you're running dbt, Airflow, or Dagster, you can add distribution checks directly into your existing pipeline as singular tests, asset checks, or Python operators. Tools like scipy give you KS tests and Wasserstein distance with a few lines of code. Dedicated ML monitoring platforms like Evidently AI or NannyML add convenience: prebuilt dashboards, interactive visualizations, and in NannyML's case multivariate detection. But the core statistical methods work fine as pipeline steps.
How do governed metric definitions help prevent drift from affecting AI-generated answers?
When metrics are defined once in a governed layer (whether authored directly in Hex or synced from dbt, Cube, or Snowflake), both business users in Threads and technical users working in notebooks query those definitions instead of recalculating from raw tables. This reduces a common form of semantic drift, where the same metric gets calculated differently across teams and tools. Governed definitions don't prevent the underlying data from drifting, but they ensure that when drift does occur, there's a single definition to update rather than dozens of scattered queries to hunt down. The key is pairing governed metric definitions with observability that surfaces when those definitions no longer reflect reality. Otherwise you're just standardizing on stale context.