We respect your privacy.

We use strictly necessary cookies to keep you signed in and to protect against CSRF. With your permission we also use a small amount of first-party analytics to improve the product. We do not sell your data and we do not use third-party advertising trackers. See our cookie policy and privacy policy .

← All learn topics

Rule page.table.missing-headers

Give data tables real <th> header cells

page.table.missing-headers is a check in Crawlmind's site audit that grades low-impact issues of this kind. This page explains why the rule matters and the exact fix.

Impact: lowEffort: low

Why it matters

A `<table>` with data rows but no `<th>` is just a visual grid — screen readers announce a wall of cells with no context, and AI engines can't map a value to the column/row it belongs to. Comparison and spec tables are exactly the content that gets pulled into answers, so header-less tables quietly lose you citations and fail accessibility checks.

The fix

Mark the header row (and first column, for matrices) with `<th>` + `scope`:

```html
<table>
  <thead>
    <tr>
      <th scope="col">Plan</th>
      <th scope="col">Price</th>
      <th scope="col">Crawls / mo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Pro</th>
      <td>$29</td>
      <td>50</td>
    </tr>
  </tbody>
</table>
```

Use `<th scope="col">` for column headers and `<th scope="row">` for the label cell of each row. Don't fake headers with bold `<td>` — the `<th>` element is what carries the semantics.

References