Technical SEO audit
Example Mechanical
A fictional commercial HVAC contractor serving one metro area, at example.com.
Summary
Example Mechanical's commercial service pages should be bringing in its most valuable work, and four of the six can't appear in Google at all. Fixing that, tracking quote requests properly and repairing links lost in the last redesign come first: small changes with the largest effect.
Ten findings follow, ranked by expected impact on qualified inquiries and by the effort to fix them. Each one has an owner and a definition of done, so it can go straight into your team's backlog.
What we'd fix first
How findings are ranked
- High
- Stops important pages ranking or hides what SEO produces. Fix first.
- Medium
- Holds pages back or wastes visitors. Fix once the high items are live.
- Low
- Worth doing; little effect on its own.
Effort is our estimate of the work involved: small is a template or settings change, medium touches several pages or templates, large means new content.
Findings
| # | Finding | Area | Priority | Effort | Owner |
|---|---|---|---|---|---|
| 1 | Four of six service pages tell Google not to index them | Indexing | High | Small | Developer |
| 2 | Quote requests aren't recorded as conversions | Measurement | High | Small | Aivium Digital |
| 3 | Old URLs from the last redesign return “not found” | Redirects | High | Small | Developer |
| 4 | Two pages compete for “commercial hvac maintenance” | Site architecture | High | Medium | Aivium Digital and marketing |
| 5 | Service pages sit four clicks from the homepage | Site architecture | Medium | Small | Developer |
| 6 | A background video delays the main content on phones | Performance | Medium | Small | Developer |
| 7 | The service area list appears only after JavaScript runs | Rendering | Medium | Medium | Developer |
| 8 | No page answers “repair or replace” searches | Search intent | Medium | Large | Aivium Digital and your technicians |
| 9 | Filtered blog archives create hundreds of duplicate URLs | Crawl efficiency | Low | Small | Developer |
| 10 | Business markup lists an old phone number | Structured data | Low | Small | Developer |
Four of six service pages tell Google not to index them
- What we found
- The commercial service pages share a template that still carries a noindex tag from the staging site. Search Console lists all four as “Excluded by noindex tag”. Only the homepage and two residential pages can appear in results.
- Why it matters
- These are the pages that should win searches like “commercial hvac contractor”. While they're excluded, no amount of content or links will make them rank.
- What to do
- Remove the noindex tag from the service template, confirm the pages return 200 and are in the XML sitemap, then request indexing in Search Console.
- Done when
- No service page returns a noindex directive in HTML or headers
- All six service URLs appear in the sitemap
- Search Console shows them as indexed within the following crawl cycle
Quote requests aren't recorded as conversions
- What we found
- The quote form redirects to a thank-you page that GA4 doesn't treat as a key event, and phone taps aren't tracked at all. Organic traffic is visible; the inquiries it produces aren't.
- Why it matters
- Without conversions there's no way to tell which pages bring in work, or to report what SEO contributes beyond rankings.
- What to do
- Mark form submissions and phone taps as GA4 key events, keep the source with each inquiry when it reaches the CRM, and record a starting measurement before other changes go live.
- Done when
- Test submissions appear as key events with source and landing page
- Phone taps are recorded on every page
- A starting measurement is saved and dated
Old URLs from the last redesign return “not found”
- What we found
- 38 URLs from the previous site return a 404 page. Six of them still have links from other websites, including a trade association's member directory.
- Why it matters
- Links from other sites are part of what makes a site credible to search engines. Links that point at missing pages pass on nothing, and visitors who follow them leave.
- What to do
- Redirect each old URL to its closest current page with a single 301, prioritizing the six with external links. Don't send them all to the homepage.
- Done when
- Each of the 38 URLs resolves in one 301 hop to a relevant page
- No redirect chains or loops
- The six linked URLs are checked by hand
Two pages compete for “commercial hvac maintenance”
- What we found
- A service page and a 2022 blog post both target maintenance contracts. Search Console shows Google alternating between them for the same searches, and neither holds a steady position.
- Why it matters
- When two pages split the signals, both rank lower than one clear page would, and the blog post can't take a quote request.
- What to do
- Make the service page the one page for maintenance contracts: merge the post's useful content into it, redirect the post, and point internal links at the service page.
- Done when
- One URL targets maintenance contract searches
- The old post redirects to it
- Internal links use descriptive anchor text and point at the service page
Service pages sit four clicks from the homepage
- What we found
- The main navigation links to blog categories, not services. The service pages are reachable only through an “Our work” page and a dropdown, while every blog post is one click from the homepage.
- Why it matters
- Pages that are hard to reach get crawled less and are treated as less important. Visitors have the same problem.
- What to do
- Add the six service pages to the main navigation and link to them from the homepage and from related blog posts.
- Done when
- Every service page is reachable within two clicks of the homepage
- Each service page has at least three relevant internal links
A background video delays the main content on phones
- What we found
- The homepage loads a 9 MB autoplay video before its headline. In a mobile lab test the largest visible element took 4.8 seconds to appear, outside Google's “good” range for Largest Contentful Paint.
- Why it matters
- Slow pages lose visitors before they read anything, and Core Web Vitals are part of how Google assesses page experience.
- What to do
- Replace the video with a compressed poster image on phones, load the video only on larger screens and after the page is interactive.
- Done when
- Mobile Largest Contentful Paint under 2.5 seconds in the lab
- No layout shift when the media loads
The service area list appears only after JavaScript runs
- What we found
- Each location page loads its list of towns from a script. The HTML the server sends contains an empty container, so crawlers that don't run the script see pages that look nearly identical.
- Why it matters
- Search engines can render JavaScript, but later and less reliably. Many AI crawlers don't render it at all.
- What to do
- Render the list of towns in the server HTML and keep the script only for the interactive map.
- Done when
- The towns appear in the page source with JavaScript disabled
- Location pages pass a rendered-versus-source comparison
No page answers “repair or replace” searches
- What we found
- Buyers weighing a rooftop unit replacement search questions such as “repair or replace rooftop unit”. The site has no page for that decision; the replacement page opens with a quote form and no explanation.
- Why it matters
- Buyers at this stage are close to spending money. The business that explains the decision clearly is the one they call.
- What to do
- Publish a cost and comparison guide written with your technicians, then link it to the replacement service page.
- Done when
- A brief is agreed with your team
- The guide is published, reviewed by a technician and linked from the service page
Filtered blog archives create hundreds of duplicate URLs
- What we found
- Tag and date filters combine into about 1,400 crawlable archive URLs with near-identical content. They make up most of what a full crawl finds.
- Why it matters
- On a site this size the crawl cost is modest, but the duplicates dilute internal links and clutter reporting.
- What to do
- Noindex filtered archive pages, remove links to filter combinations, and keep only main categories in the sitemap.
- Done when
- Filtered archives return noindex
- A re-crawl finds under 300 URLs
Business markup lists an old phone number
- What we found
- The LocalBusiness structured data still carries the previous phone number and no service area, so it disagrees with the website and the Google Business Profile.
- Why it matters
- Consistent business details help search engines and AI assistants trust which number, address and service area are correct.
- What to do
- Update the markup to match the site and profile, add the service area, and validate it.
- Done when
- Markup validates with no errors
- Phone and service area match the website and Google Business Profile
Recommended order of work
First
Indexing, conversion tracking and the 38 broken redirects (findings 1 to 3). Small changes, the largest effect, and the measurement every later report depends on.
Next
One page for maintenance contracts, service pages in the navigation, and the homepage video (findings 4 to 6).
Then
Server-rendered location pages, the repair-or-replace guide, archive cleanup and structured data (findings 7 to 10).
Timing is agreed with your team once the scope is confirmed. Fixes are checked on a staging site where one exists, then again after they go live.
What this audit didn't cover
- Server logs. None were available, so crawl behavior was judged from the crawl and Search Console's crawl stats. On larger sites, log analysis shows exactly what search engines request.
- Authority and links from other sites. Reviewed only where they touched technical issues, such as the six broken linked URLs.
- Writing new content. The audit recommends pages and briefs; producing them is separate work.