No Duplicate Caption and Summary

No Comments
No duplicate caption and summary

Element Code: AC-044

TL;DR: When a table carries both a <caption> element and a summary attribute holding the same text, screen readers announce the table's name twice. The summary attribute is obsolete in HTML5 anyway, so the fix is nearly always the same: keep the caption, delete the summary.
Check
AC-044, Accessibility
Affects
HTML data tables
Severity
Low, quick win
Fix effort
Minutes per template
Best tool
axe DevTools

What this check actually flags

HTML 4 gave data tables two naming mechanisms. The <caption> element renders a visible title as part of the table, and the summary attribute held an invisible description that only assistive technology would surface. Somewhere along the way, accessibility checklists started telling people that every table needed both, and developers, plus roughly every CMS table plugin of that era, filled both with the same sentence.

The result through a screen reader is clumsy. NVDA or JAWS reaches the table and reads something like "Quarterly revenue by region, table, Quarterly revenue by region, six columns, twelve rows." The listener hears the identical label twice before a single data cell arrives. Axe ships this exact test as its table-duplicate-name rule, and this check flags the same condition: caption text and summary text that match.

There is a second layer. HTML5 made the summary attribute obsolete outright. The W3C Nu HTML Checker throws an error on it whether or not it duplicates the caption, so even a unique, well written summary is markup with an expiration date that already passed.

Why it matters

Straight talk on severity first: this is a hygiene check, not a rankings emergency. It still earns its place, for three reasons.

Screen reader experience. Redundant announcements are the audio version of a stutter. One duplicated table name costs a couple of seconds; a report page with fifteen tables costs half a minute of pure noise. Screen reader users move through tables constantly, and duplicate names also pollute the element list dialogs those tools generate, so every table shows up sounding half broken and harder to scan.

Validation and template age. An obsolete attribute is a fingerprint of an old template. In audits, wherever I find summary attributes I reliably find their friends nearby: align attributes, layout tables, the occasional font tag. Clearing this check is often the first pull on a thread that leads to a broader template cleanup, and that cleanup is what actually moves accessibility scores.

The SEO angle, honestly stated. Google does not rank you higher for deleting a summary attribute. What clean table semantics buy you is extraction confidence: a table with exactly one clear accessible name is easier for parsers to label correctly when tables get pulled into featured snippets and AI answers. I treat table markup quality as a snippet eligibility play, not a ranking play, and that framing has held up well.

Before: duplicate names <table summary="Revenue by region"> <caption>Revenue by region</caption> ... Screen reader says: "Revenue by region, table, Revenue by region, 6 columns, 12 rows" Same name, twice. After: one clean name <table> <caption>Revenue by region</caption> ... Screen reader says: "Revenue by region, table, 6 columns, 12 rows" Announced once. Done.

Caption, summary, and the modern options

Here is the reference grid I use when deciding where a table's name and description should live.

MechanismStatus in HTML5Who gets itUse it when
<caption>Valid, recommendedEveryone, visiblyEvery data table, as its one name
summary attributeObsolete, fails validationSome screen readers, inconsistentlyNever. Migrate it out
aria-describedbyValidAssistive technologyLong structural notes for complex tables
aria-labelledbyValidAssistive technologyA visible heading already names the table
role="presentation"ValidTells AT to skip table semanticsLeftover layout tables, no name at all

How to detect it

  • axe DevTools: run the free browser extension on any page with tables. The rule fires as table-duplicate-name. Fastest single page confirmation you will get.
  • Nu HTML Checker: validator.w3.org/nu flags every summary attribute as an error, duplicate or not, which makes it the definitive per page sweep.
  • Screaming Frog: for a whole site, set a Custom Search for summary=" and crawl. Export the matches, then compare each against its caption in the page source. Ten minutes and you have a complete inventory.
  • Codebase grep: if you control the templates, grep -rn 'summary="' templates/ finds the source in seconds and beats patching rendered pages one at a time.
  • WAVE: the WebAIM extension surfaces table naming and structure in its details panel, handy when you also suspect missing header cells.

How to fix it, step by step

  1. Inventory every table carrying a summary attribute using one of the detection routes above.
  2. Compare each summary against its caption. Identical or near identical text: delete the summary. Done. This is the entire fix in the large majority of cases I see.
  3. If the summary contains genuinely useful structural guidance the caption lacks, something like "rows grouped by department, totals in the final row", move that guidance somewhere valid: fold it into the caption, or place it in a visually hidden paragraph and point aria-describedby on the table at it.
  4. If a table has a summary but no caption at all, promote the summary text into a new <caption>. Visible naming beats invisible naming, and captions help sighted users with cognitive disabilities too.
  5. If the table is a layout table, and yes, those still exist in email derived templates, it should carry neither caption nor summary, plus role="presentation" so assistive technology skips its table semantics entirely.
  6. Re-run axe and the Nu validator to confirm zero summary attributes remain and every data table announces one clean name.

What good looks like: every data table on the site has exactly one accessible name, it comes from a <caption>, the caption is short and specific, and longer structural notes live in an aria-describedby target when they are needed at all.

DO

  • Give every data table a short, specific <caption>
  • Delete summary attributes that repeat the caption
  • Move genuinely useful summary text into the caption or an aria-describedby target
  • Mark leftover layout tables with role="presentation"
  • Re-validate with axe and the Nu checker after template edits

DON'T

  • Ship both a caption and a summary with matching text
  • Keep summary attributes because they "do no harm": they fail validation and some screen readers still read them
  • Stuff captions with keyword text aimed at rankings
  • Reach for aria-label on tables when a visible caption would serve everyone
  • Patch rendered pages by hand when the duplication comes from one shared template

FAQ

Do screen readers still read the summary attribute?
Some do, depending on version and verbosity settings, which is exactly the problem: you cannot predict whether users will hear it once, twice, or not at all. Content you cannot deliver predictably does not belong in your markup. Put the name in the caption, where behavior is consistent.
Is this a Google ranking factor?
No. Google has never listed table summary hygiene as a ranking signal, and nobody serious claims otherwise. The payoff is indirect: valid, clearly named tables are easier to extract for featured snippets and AI answers, and the fix usually rides along with a template cleanup that improves the page in ways that do matter.
My CMS adds the summary attribute automatically. Now what?
Fix it at the source, not in the output. Older WordPress table plugins and WYSIWYG editors added summary by default. Check the plugin settings for a toggle, update the plugin, or filter the generated markup in your theme. Hand editing hundreds of rendered posts while the generator keeps producing new ones is wasted effort.
Should the caption repeat the heading directly above the table?
No, that just recreates the duplicate announcement problem one level up. If a visible heading already names the table, either make the caption more specific than the heading, or drop the caption and point aria-labelledby at the heading's id. One name per table, from one source.

Duplicate table names are rarely the only legacy markup on a site

If one check like AC-044 is firing, an old template is usually leaking a dozen other issues into your pages. An Advanced SEO Audit maps all of it: accessibility, crawlability, indexation, and the fixes in priority order.

Book an Advanced SEO Audit

Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.

About SEO ProCheck

Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.

Work With Me

Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.

Subscribe to our newsletter!

More from our blog