Which data quality checks should a small data team set up first?

Set up table checks first: freshness, volume, and schema on every critical table. Then add column checks on keys and important fields: not null, unique, valid values, sane ranges and dates. Finish with one business rule per key metric. Mark only key, freshness, and negative-money failures as hard fails, and give every check a named owner.

Key points

  • DataKitchen's coverage standard is two to three tests per table (freshness, volume, schema), at least two tests per column, and one custom test per significant business metric.
  • General checks such as freshness, row counts, nulls, duplicates, and accepted values need no business knowledge, and most can be generated from a data profile; business rules can't, and need someone who knows what the data means.
  • Severity needs three tiers: a hard fail stops the load and wakes somebody, a soft fail warns the rule's owner, and an informational check records a number silently. Keep hard fails few.
  • Generated range checks learn the data in front of them: in DataKitchen's August 2026 NYC taxi test, the generated minimum-fare check set its floor at negative $367 and passed on a 300,000-row sample, so a business rule that fares are never negative was still needed.
  • Every check needs one owner, and a rule that fires every night should be demoted, not muted.

The hard part is the first check, not the hundredth. When we read 849 comments on why data engineers don’t test, one commenter, kenfar, gave the order we’d give: “I’d start with very obvious and simple items: checks for uniqueness, foreign keys, nulls, appropriate dates. Once that’s in place I’d add reconciliation and anomaly detection checks.”

Here’s that order made concrete for a small team.

Twenty starter checks

Apply these to the handful of tables that matter most. The names in the second column are the DataOps TestGen test types that do each job; any tool with the same checks works. Severity follows the three tiers in Your Best Data Quality Rules Live in Someone Else’s Head: hard fail, soft fail, informational.

#CheckTestGen test typeScopeKindSeverityOwner
1Table updated on scheduleTable Freshness, or the freshness monitorTableGeneralHardPipeline engineer
2Row count in its normal rangeVolume monitor or Row RangeTableGeneralSoftPipeline engineer
3Columns added, dropped, or retypedSchema monitorTableGeneralSoftPipeline engineer
4Row count never shrinks (append-only tables)Row CountTableGeneralSoftPipeline engineer
5No duplicate rowsDuplicate RowsTableGeneralHardPipeline engineer
6Primary key is never nullRequired EntryColumnGeneralHardPipeline engineer
7Primary key is never repeatedUnique ValuesColumnGeneralHardPipeline engineer
8Foreign keys exist in the dimensionReference MatchColumnGeneralSoftPipeline engineer
9Required fields have no placeholders like “N/A”Required, No PlaceholderColumnGeneralSoftData steward
10Share of missing values hasn’t jumpedPercent MissingColumnGeneralSoftData steward
11Status and category codes are on the listValue MatchColumnGeneralSoftData steward
12Event dates aren’t in the futurePast DatesColumnGeneralSoftPipeline engineer
13Newest record is recentRecencyColumnGeneralSoftPipeline engineer
14Amounts stay inside their observed rangeMinimum Value, Maximum ValueColumnGeneralSoftAnalyst
15Identifiers keep their formatPattern MatchColumnGeneralInformationalData steward
16Email and ZIP fields are validEmail Format, Valid US ZipColumnGeneralInformationalData steward
17Amounts are never negativeCustom ConditionColumnBusinessHardAnalyst
18One rule per key metric, such as shipped ≤ orderedCustom Condition or Custom TestTableBusinessSoftAnalyst
19Totals by group match the source or last deliveryAggregate BalanceTableBusinessSoftAnalyst
20The headline KPI hasn’t moved more than history allowsMetric TrendTableBusinessSoftMetric owner

Rows 1 through 16 need no business knowledge, and most of them come out of a data profile without anyone typing them. That’s deliberate. The Guide to DataOps Tests puts the standard at two to three tests per table, at least two per column, and one custom test per significant business metric. Rows 17 through 20 are the part a profiler can’t do.

Why row 17 exists when row 14 already checks amounts

Generated range checks learn the data they’re shown. In DataKitchen’s NYC taxi exercise, the generated minimum-value check on fare_amount set its floor at negative $367, because that was the lowest fare in the 300,000-row sample. On the sample it passed, and the business rule “fares are never negative” failed. Against the full month of 2,964,624 rows the generated check failed too, on 22 fares below the floor, because new data didn’t look like old data. Row 14 tells you something changed. Row 17 tells you something is wrong.

Keep the hard fails rare

A hard fail stops the load and pages somebody, so reserve it for failures that would publish something wrong: no load, null keys, duplicate keys, negative money. Make the rest soft or informational. When a check fires every night and nobody acts, demote it rather than muting it. A muted check still looks like coverage.

One owner per check

The owner is whoever can act on a failure. That is usually not the person who wrote the test. Pipeline checks go to whoever is on call. Source-data checks go to whoever can persuade the source owner to fix it. Business rules go to the analyst or steward who knows what “correct” means, and the fastest way to get those rules is to show that person a draft and let them correct it.

Twenty checks on your critical tables won’t make you covered. They will make your next incident the first one you hear about from a test instead of from a VP.

Frequently asked questions

Short answers to the follow-up questions people ask next.

What is the first data quality check I should add?

Freshness on every table people report from. It asks whether the table updated when it should have, and it needs no business knowledge and no threshold you have to invent, because a monitor learns the table's normal update pattern from history. A stale table produces correct-looking numbers that are a day old, and nobody notices until a meeting.

How many data quality tests does a table need?

DataKitchen's standard is two to three tests per table covering freshness, volume, and schema, at least two tests per column, and one custom test for each significant business metric. Add an error check for every tool and a status and timing check for every job. For a Medallion architecture with about 200 tables and three tools, that comes to roughly 5,000 tests, which is why generating them matters.

What's the difference between a general check and a business rule?

A general check works on any table without knowing what the data means: not null, unique, row count, accepted values, date ranges. A business rule encodes what you know about the business, such as quantity shipped never exceeding quantity ordered. General checks can be generated from a profile. Business rules come from the people who read the reports.

Which data quality failures should stop the pipeline?

Very few. Make a check a hard fail only when continuing would publish something wrong to customers, such as a null or duplicate primary key, a negative amount of money, or a table that didn't load. Everything else is a soft fail that warns the owner or an informational check that records the number. Too many hard fails and your team starts overriding them.

Who should own a data quality check?

One named person per check, usually whoever can act on a failure. Source checks belong with the person who can push the source owner to fix it. Pipeline checks belong with the engineer on call. Business rules belong with the analyst or steward who knows what correct means. Seven roles touch rules, and none holds the whole picture.

Try it on your own data

DataOps TestGen is free and open source. Profile a table and generate its tests this afternoon.