Back to News & Insights
SEO October 14, 2026 · 6 min read

12 SEO Mistakes Developers Ship to Production (and How to Catch Them)

The site looks perfect in the browser, but Google sees something else. Here are the technical SEO bugs I find most often in audits, with quick checks you can run yourself.

12 SEO Mistakes Developers Ship to Production (and How to Catch Them)

Most SEO problems I find in audits aren't content or keyword problems. They're bugs. The site looks perfect in the browser, Lighthouse is green, the client is happy, and Google quietly refuses to index half of it.

The tricky part is that these bugs don't throw errors. Nothing breaks for the user. So here are the 12 I see most often, with a quick way to catch each one. Shipping the staging noindex to production

The classic. Staging was set to "discourage search engines", the site went live, and nobody unchecked it.

For any stack, check both the HTML and the response headers, since X-Robots-Tag is easy to forget in a server config:

Add this to your launch checklist. Better yet, make it a deploy check. robots.txt blocking what Google needs to render the page

Blocking /wp-content/ or /assets/ "for security" means Googlebot can't load your CSS and JS, so it can't render the page the way users see it.

The reverse is just as common: low-value URLs (internal search, filter combinations, admin-ish paths) left fully crawlable. robots.txt controls crawling, not indexing, so for pages that must stay out of the index, use noindex and let Google crawl them. Content that only exists after JavaScript runs

With client-side rendering, the initial HTML can be an empty shell. Google does render JavaScript, but it's slower, less reliable, and any error means content (or links) simply don't exist for Googlebot.

Then check the rendered HTML in Search Console's URL Inspection tool. If your main content, menu, or product links only appear after hydration, consider SSR or static generation for those routes. Infinite scroll and "load more" without real URLs

Googlebot doesn't scroll or click buttons like a user. Content loaded on scroll events or behind a "Load more" button may never be seen.

Each page of results should have its own URL that works without JavaScript. Canonical and noindex misconfigurations

A few variations I keep finding: Every page canonicalized to the homepage (a template bug) Canonical pointing to a URL that redirects or returns 404 noindex and canonical to another URL on the same page (conflicting signals) Canonical tags added only by JavaScript

Then crawl the site (Screaming Frog or similar) and filter for canonicals that don't point to themselves. Every non-self canonical should be intentional. The CMS generating thousands of empty pages

In a recent audit, a local contractor's site had about 2,600 URLs. Only 58 were service pages. Around 1,650 were image attachment pages and about 700 were tag archives, most with a single post.

WordPress creates an attachment page for every upload. Since WordPress 6.4, new installs have them disabled, but older sites keep them on:

For tag archives, if your SEO plugin doesn't handle it, the core wprobots filter does:

Also check your sitemap index. If you see attachment-sitemap.xml or a huge posttag-sitemap.xml, you have this problem. Building URLs with string concatenation

The missing slash came from an old search-replace (https://old-domain/ → https://example.com). Users never noticed, because the Elementor lightbox opened the image from a separate, correctly generated URL. Crawlers, on the other hand, saw a broken link on every affected page.

Want to discuss this further?

Book a free strategy call with our team to see how these insights apply to your specific business goals.

Book a consultation