Resource, template
Data quality checklist
Most bad data arrives through a job that ran perfectly.
- Before
- Before you publish anything built from this data.
- Fill it in
- Ten minutes, run against the actual rows, not from memory.
- After
- Signed off and filed with the report, so anyone can see what was checked.
Filled example, matched against Spot the Dirty Data's own planted faults.
All 12 checks reviewed · 7 failed
| Check | How to test it | Result | |
|---|---|---|---|
| Completeness | |||
| ✓ | Row count matches what the source says it sent | Compare the loaded row count against the source system's own count or file manifest. | N/A |
| ✓ | Required fields have no blanks | Run a COUNT WHERE column IS NULL on every required column. | Fail (order 1010 has a blank quantity with a value present) |
| Uniqueness | |||
| ✓ | The key column has no duplicates | GROUP BY the key column and check every count is 1. | Fail (order 1002 appears twice, identical) |
| ✓ | No row appears twice after joins | Compare row counts before and after each join. | N/A |
| Validity | |||
| ✓ | Values sit in their allowed range (no negative quantities) | Check MIN() on quantity and value columns is not below the allowed floor. | Fail (order 1006 has a negative quantity) |
| ✓ | Dates are real dates and none are in the future | Parse every date value and check it against today's date and the calendar. | Fail (order 1014 is dated 30 February, which does not exist) |
| Consistency | |||
| ✓ | Categories are spelled one way only | List DISTINCT values in each category column and read them. | Fail (region appears as North, NORTH, N. and north; product as “Widget B” and “widget b”) |
| ✓ | The total matches the source system | Reconcile the aggregate total against the source system's own total for the same period. | N/A |
| Timeliness | |||
| ✓ | The data is as recent as the report claims | Compare the data's last-refreshed timestamp against the freshness the report states. | N/A |
| Accuracy | |||
| ✓ | One row traced end to end against the original | Pick one row, recompute it by hand from the source, and compare. | Fail (order 1018: eight units at €120 each is €960, the row shows €860) |
| ✓ | The largest and smallest values look sensible | Sort by value and eyeball the top and bottom five rows. | Fail (order 1017 is €45,000 for three units, against roughly €150 a unit everywhere else) |
| Definition | |||
| ✓ | The measure matches its written definition | Re-read the metric's written definition and check the query matches it field for field. | N/A |
- Checked by
- Data Platform team (illustrative)
- Date
- 21 March 2026 (illustrative)
Blank template — copy or fill in
Complete this here or copy it into your own document. Edits are not saved when you leave the page.
