Working hours Mon–Fri: 10:00 – 18:00

Sample SEO Audit Report — Real Findings From Our Own Site

This is a real audit, not a template. Every number below comes from Google Search Console, URL Inspection or our own crawler — and the site under audit is our own.

Site: development-web.com · Audit date: August 2026 · Scope: full site, 276 pages

Summary

The site was growing in impressions but almost never in clicks: 11,824 impressions over 28 days against 14 clicks, average position 35.2. The audit set out to find why. Three of the findings below had been quietly costing traffic for months.

Quick wins — fix these first

Critical

1. Every English page told Google it was Russian

What we found. Nine English pages — the homepage, service landings, the blog — served <html lang="ru-RU">, while og:locale declared en_US and hreflang declared en. Three language signals, contradicting each other, on pages targeting the US and UK.

Why it matters. The site’s own analytics showed 23% of impressions coming from Russia — a market this business does not serve. Contradictory language signals do not help a search engine send the page to the right country.

Fix. Derive the lang attribute from the same field hreflang already uses, so all three signals agree. Verified afterwards: 0 mismatches across 12 sampled pages.

Critical

2. The homepage H1 had been wrong for four months

What we found. The H1 read «Website development» while the business sells SEO and automation. A fix had been deployed in April and reported as applied — the database field was filled in, yet the live page never changed.

Root cause. The template reads that heading through Carbon Fields, which stores values under an underscore-prefixed key (_h_s2_title). The deployment wrote to the un-prefixed key, so the template found nothing and fell back to a hardcoded default. A one-character mismatch, invisible in any interface.

Fix. Read the heading from post meta directly, keeping Carbon as a fallback. The homepage now states what the company actually sells. It had been collecting 58 impressions and zero clicks on «web development» queries at positions 32-99.

High

3. One article, two URLs, 1,142 impressions split

What we found. The same article was reachable at /blog/how-to-tell-if-seo-is-working/ (1,078 impressions) and /blog/seo/how-to-tell-if-seo-is-working/ (64). Neither version ranked — average positions 65 and 48.

Fix. A 301 redirect to a single canonical URL so the signals stop being divided between two addresses.

High

4. Section headings were not headings

What we found. On every landing page the section titles — «SEO company in Europe: countries we cover» and similar keyword-bearing lines — were rendered as <div class="section-title"> instead of <h2>. A search engine saw no headings at all below the H1.

Fix. Change the element in the template; the CSS was class-based, so nothing moved visually. The main money page went from 6 headings to 13, another landing from 1 to 8.

High

5. Every blog article was published with an empty author

What we found. The Article schema on all 37 posts carried "author": {"name": "", "@id": ""}. Structurally present, factually empty — the site was publishing anonymous expertise.

Fix. A real author entity with verifiable profile links, referenced from every article.

Content and relevance

Measured

6. Text relevance of the main commercial page

We compared the page against the pages currently ranking for its main keyword. Breadth of the term cloud came out at 75.0 against a target of 75 — already sufficient. Depth scored 76.9, giving an over-optimisation ratio of 102.5: depth running ahead of breadth.

What this means in practice. The automated recommendation was to add the target phrase another 50 times. We rejected it. The top of that SERP contains aggregators and listicles with artificially inflated keyword density; copying them would push a service page into over-optimisation.

What we recommended instead. Add the vocabulary the page genuinely lacks — rank, strategies, optimisation, visibility — each used naturally, and close the specific gaps: the words «company» and «European SEO» were missing from both the title and the H1 while carrying 357 impressions between them.

Measured

7. Near-duplicate pages

A TF-IDF comparison across all 276 pages, with the shared template excluded, found the site broadly healthy: 1.4% of pages in duplicate territory, which is background noise. Two specific pairs needed attention.

/seo-germany/ and /seo-berlin/ scored 0.71 similarity. /administration/ and /maintenance/ scored 0.92 — both with zero impressions, so we merged them with a 301 toward the page whose topic has roughly three times the search demand.

What we did not recommend

An audit is also about what to leave alone. Three examples from this one:

  • The technical crawler reported a TTFB of 2,597 ms. Three consecutive measurements returned 0.42 s — the first reading had hit a cold cache. No action needed.
  • A 720-per-month keyword with «low competition» in Google Ads looked like an opportunity. The SERP for it is held by WallStreetPrep, Zendesk, Paddle and NetSuite. «Low competition» in Ads refers to advertising, not to ranking difficulty. We advised against spending a month there.
  • A query set showing 1,000+ impressions turned out to be someone else’s quoted search strings, not real demand. Optimising for them would have produced nothing.

How the numbers were produced

Search Console API for impressions, positions and query-to-page mapping; URL Inspection for crawl and index status; our own crawler for the technical checks; SERP parsing plus TF-IDF and BM25 scoring for relevance and duplicate detection. Every figure in this report can be reproduced from your own Search Console within a few minutes.

Want this for your own pages?

Send your URL and main keyword to info@development-web.com — scope and a delivery slot within 24 hours.

See pricing