A Table Is Not a Data Product: Ownership, SLIs, and the Consumer Contract
Note
CONSUMER CONTRACT LOADED: Dataset has a purpose, owner, freshness target, quality evidence, and recovery route. Table publication is now an accountable service.
A table becomes a data product when someone can depend on it deliberately.
The distinction is not marketing. A table is a storage object. A data product is an interface with a purpose, an owner, a contract, measurable service levels, and a way to respond when reality deviates from the promise.
Over the last several weeks we have looked at the components:
- Contracts preserve meaning
- Idempotency makes reruns safe
- Observability detects bad data
- Schema evolution protects consumers
- Backfills preserve a recovery path
- Lineage, CDC, table formats, metadata, and cost controls make the state explainable and operable
Now we assemble those properties into a service that a consumer can use with confidence.
Start With the Consumer Decision
“Orders table” is not a purpose. A useful product definition names the decision it supports:
Finance uses
daily_revenueto close the ledger by 11:00 UTC each business day. It contains captured payments, grouped by business date and ISO currency. It is not a real-time balance.
That sentence establishes grain, inclusion rules, timing, and a boundary. Without it, two teams can query the same table and reach different conclusions while both believe they are correct.
The Product Card
Keep the public contract compact and executable.
|
|
The exact fields will differ by organisation. The important part is that the values are decisions someone is willing to defend.
SLIs Turn Promises Into Measurements
An SLI is an observed indicator. An SLO is the target for that indicator.
Freshness
|
|
Measure both source freshness and publication freshness. A successful job that loaded stale input should not receive full credit.
Completeness
|
|
The denominator must be defined. A row count by itself cannot distinguish a quiet business day from a missing partition.
Correctness
Correctness should use domain invariants and reconciliation:
|
|
For finance, compare against a ledger. For logistics, compare shipment state transitions. For a feature table, compare distributions and key coverage. A generic “tests passed” percentage is not a substitute for the consumer’s real risk.
Availability
|
|
Define what counts as a successful publication. A job that writes a staging table but never updates the consumer-facing view should not count as available.
Error Budgets Create a Decision Rule
If an SLO is 99.5% for 200 scheduled publications in a month, the error budget is one failed publication. The number is not a punishment. It tells the team when to spend time on reliability rather than adding another feature.
|
|
Use the budget to guide behaviour:
- Healthy budget: ship planned changes, improve the product, or retire unused checks.
- Budget nearly exhausted: prioritise root-cause work and reduce risky releases.
- Budget exceeded: pause non-essential changes until the service is stable.
Do not hide incidents by changing the denominator after the fact. If the schedule changes, version the SLO and explain the change.
Publication Is a Protocol
A data product should move through a visible release sequence:
|
|
Each boundary needs a failure policy. If reconciliation fails, do we block publication, publish with a warning, or route the output to a quarantine table? The correct answer depends on the product’s risk, but silence is never a policy.
The Consumer Contract Includes Change
Availability today does not protect a consumer from tomorrow’s breaking change.
Every product should state:
- Which fields are stable and which are experimental
- What a null means
- What timezone and units apply
- How historical rows are corrected
- How long old fields remain available
- Where consumers can see usage and migration status
- Who approves a breaking change
An additive column may be safe for many consumers. A semantic change from gross to net revenue is not. Schema evolution is part of service management, not a cleanup task after deployment.
The Operator’s Readiness Check
Before calling a dataset production-ready, ask:
| Question | Evidence |
|---|---|
| Is the purpose unambiguous? | Product card and grain |
| Is there one accountable owner? | Team and escalation route |
| Can freshness be measured? | Source and publication timestamps |
| Can bad data be detected? | Domain checks and reconciliation |
| Can the output be replayed? | Raw retention and idempotent runbook |
| Can consumers be found? | Lineage and usage metadata |
| Can a breaking change be rolled back? | Version policy and retained state |
| Can spend be bounded? | Query budget and workload owner |
If the answer is “we would need to ask someone,” the service is not yet ready for an important decision.
The Data Product Rule
A data product is a promise with evidence.
Give it a purpose, an owner, a contract, measurable service levels, and a recovery path. Then let pipeline runs, quality checks, lineage events, and usage history update the evidence automatically.
The mature platform is not the one with the most tables. It is the one where consumers know which tables to trust, operators know what to do when trust is lost, and both groups can see the same state.
References: OpenLineage overview for run and dataset metadata, BigQuery INFORMATION_SCHEMA.JOBS for operational evidence, and the data observability vital signs already in this archive.
This closes the current weekly run. The next useful question is not which tool to add, but which promise the system still cannot prove.