Kinetic Gain · Data Governance
Pillar guide

Data lineage: trace every field from source to report

By Kinetic Gain, Data Governance Last updated

Data lineage is the map of how each field moves from where it was captured, through every transformation, to the dashboards, models, and exports that consume it. This page goes deep on lineage as its own discipline. The data governance pillar only summarizes it in a section. The short version: table-level lineage tells you which tables connect, column-level lineage tells you what actually breaks when you change something and where a person's data ended up.

Data lineage is a directed graph: a source column flows through a transformation into a downstream column, which lineage can trace forward for impact analysis and backward to prove where a value came from. Source column Transform Report column Impact + privacy trace both ways
Lineage is a directed graph of columns and transformations. Read it downstream for impact analysis, upstream to prove where a number came from.

What data lineage actually is

Lineage is a directed graph. The nodes are your data objects, tables, views, columns, dashboards, model features, exported files. The edges are the transformations that carry data from one to the next: a join, a dbt model, an ETL step, a CASE expression, a BI calculated field. Follow the edges downstream and you see everywhere a value travels. Follow them upstream and you see where a number came from.

That map is the difference between changing a pipeline with confidence and changing it by prayer. Without lineage, every schema change and every audit request turns into archaeology: opening query after query to reconstruct a path that the system already knows but never wrote down. Lineage writes it down, and keeps it honest, by reading the code that moves your data rather than a diagram someone drew once.

Table-level vs column-level lineage, and why column-level wins

An exact blast radius, not a whole-table alarm

Table-level lineage tells you orders feeds daily_revenue feeds the Finance dashboard. That is useful for a first orientation and almost useless for a real decision, because a table has dozens of columns and a change to one of them should not implicate all of them.

Column-level lineage tells you that orders.amount_cents, divided by 100 in a specific model, becomes daily_revenue.revenue_usd, which feeds the Net Revenue tile. Now the blast radius is exact. When you touch one column you see the handful of downstream fields that depend on it, not the whole table it happens to live in. This precision is the entire reason lineage earns its keep. It is what makes impact analysis trustworthy and what makes a privacy answer defensible instead of approximate.

Impact analysis: if I change this, what breaks

Read the graph before the change ships, not after the dashboard goes blank

Impact analysis is lineage read in the downstream direction. Before you rename a column, change a type, drop a field, or quietly change a definition from gross to net, you ask the graph: what depends on this. The answer is the list of models, dashboards, and exports that will move or break. Read the graph upstream instead and you answer the other half of the question, where did this number come from, which is what you need when a figure looks wrong and you have to trace it back to source.

The leverage is running impact analysis on the pull request, while the change is still cheap to adjust, so the owners of the fields at risk are looped in before anything breaks.

Lineage for privacy and audit

Turn "we deleted them everywhere" from a hope into an evidenced statement

When a person exercises a right over their data, you have to know every place that data went, not just where it was first stored. Under GDPR Article 15 (right of access) you must be able to say what you hold and where. Under Article 17 (right to erasure) you have to delete it everywhere it propagated, including derived tables, aggregates, and exports that copied it downstream. Article 30 (records of processing activities) expects a truthful account of your data flows, and lineage is direct evidence for that account. CCPA access and deletion rights create the same practical need for US-facing data.

Column-level lineage is what turns a complete deletion into a provable one. If an email address was copied from a signup table into a marketing export and a model feature, lineage shows all three, so the deletion is complete and you can produce the map that proves it. This is a readiness and evidence posture, not a certification. Lineage gives you the artifact a reviewer or a regulator can actually inspect.

Redact PII across the fields lineage traces

How lineage is captured: parsed, not drawn

Hand-drawn lineage diagrams rot the moment a query changes, because nothing keeps the picture tied to the code. Real lineage is parsed from the artifacts that already move your data: SQL query logs, dbt manifests, orchestration and ETL definitions, and BI tool metadata. You parse the SQL into its syntax tree, resolve each column reference through joins, CTEs, and subqueries back to its sources, and assemble the graph automatically.

Because it is generated from the real code, it stays current when you regenerate it on every deploy or rebuild it from recent query history. The hard parts are worth naming honestly: SELECT * hides which columns actually flow, dynamic SQL and stored procedures resist static parsing, and cross-system hops (warehouse to reverse-ETL to a SaaS tool) break the chain unless each hop is captured. A capture approach that ignores these silently reports less blast radius than really exists, which is worse than reporting none.

What to measure

Lineage coverage

Share of columns and tables with captured lineage, not just the flagship models.

Target: rising toward full coverage

Freshness

How current the graph is against the latest deploy. Stale lineage is confidently wrong lineage.

Target: regenerated every deploy

Time to impact analysis

How fast you can answer "what breaks" for a proposed change.

Target: minutes, not a half-day of tracing

Privacy answerability

Share of access and deletion requests you can resolve from lineage instead of manual hunting. Also watch orphaned and unresolved columns.

Target: resolved from the graph, evidenced
DimensionTable-level lineageColumn-level lineage
GranularityWhich tables feed which tables and reportsWhich specific column feeds which downstream column, through which expression
Answers "what breaks"Roughly. Flags the whole table as affected, including columns that are notPrecisely. Names the exact downstream fields that depend on the one you are changing
Privacy request usePoints to tables that might hold a person's data. Still needs manual confirmation per fieldTraces a specific field to every downstream copy, so access and deletion can be proven
Effort to maintainLower. Fewer edges to parse and keep currentHigher to build, but automated by parsing SQL rather than drawn by hand
Failure modeOver-broad blast radius. Teams learn to ignore it because it cries wolfUnder-reported flow if SELECT *, dynamic SQL, or cross-system hops are not captured
Illustrative scenarioA team changes a revenue column from gross to net inside one warehouse model. Table-level lineage says the finance table is involved and stops there. Column-level lineage shows that this exact column feeds a board-level "Net Revenue" tile and two forecasting features, so the change is reviewed with those owners before it ships instead of surfacing as a number that silently shifted.
Illustrative scenarioA person asks to be deleted. Their email was captured in a signup table, then copied into a marketing export and into a model feature. Without column-level lineage, the deletion covers the signup table and misses the two downstream copies. With it, all three are traced and cleared, and the traced map becomes the evidence that the request was fully handled.

FAQ

What is data lineage?
Data lineage is the map of how each field flows from its source, through every transformation, to the dashboards, models, and exports that use it. It is a directed graph where nodes are data objects and edges are the transformations that move data between them, so you can trace any value forward to where it goes or backward to where it came from.
What is the difference between table-level and column-level lineage?
Table-level lineage shows which tables feed which tables and reports. Column-level lineage shows which specific column feeds which downstream column and through what expression. Column-level is the one that matters, because it gives an exact blast radius for a change and lets you trace a single person's field to every downstream copy, rather than flagging a whole table as affected.
How does data lineage help with impact analysis?
Impact analysis reads lineage in the downstream direction to answer if I change this, what breaks. Before you rename a column, change a type, or change a definition, the graph lists the models, dashboards, and exports that depend on it. Run it on a pull request and you catch downstream breakage while the change is still cheap to fix.
How does lineage support GDPR and CCPA requests?
A request under GDPR Article 15 (right of access) or Article 17 (right to erasure), and the equivalent CCPA access and deletion rights, requires knowing every place a person's data went, not just where it was first stored. Column-level lineage traces a field to all of its downstream copies, so access and deletion are complete and you can produce the map as evidence. This is a readiness and evidence posture, not a certification.