What Technical SEO Is (and What It Isn't)
Technical SEO is the set of optimizations that help search engine crawlers find, understand, and index your pages effectively. It's distinct from on-page SEO (content quality) and off-page SEO (backlinks).
For bootstrapped founders, technical SEO is often over-complicated. You'll read guides recommending complex canonical tag strategies, hreflang configuration, and crawl budget optimization. For a site with under 1,000 pages, 95% of this is unnecessary.
This checklist covers the 25 technical SEO issues that actually matter for growing sites — in priority order.
Priority 1: Issues That Block Indexing
These must be fixed before anything else. A page that isn't indexed doesn't exist in Google.
1. Check that your robots.txt isn't blocking important pages
Your robots.txt file tells Google which pages not to crawl. A misconfigured robots.txt is one of the most common causes of "why isn't Google finding my pages?"
Check: Visit yourdomain.com/robots.txt. Verify that:
- Your main pages (blog, VS pages, guides) are not disallowed
- The sitemap URL is listed:
Sitemap: https://yourdomain.com/sitemap.xml - No
Disallow: /rule (which blocks everything)
2. Verify your sitemap exists and is valid
Your XML sitemap lists every page Google should index. For Next.js, this is auto-generated from app/sitemap.ts. For WordPress, your SEO plugin generates it.
Check: Visit yourdomain.com/sitemap.xml. Verify it loads and lists your important pages. Submit the sitemap URL in Google Search Console → Sitemaps.
3. Check for accidental noindex tags
<meta name="robots" content="noindex"> tells Google not to index a page. This is correct for pages like login, admin, and search results — but catastrophic if accidentally added to your blog or landing pages.
Check: In Google Search Console → Coverage → Excluded, look for pages listed under "Excluded by 'noindex' tag." If any of your important pages appear there, investigate immediately.
4. Verify all important pages are getting crawled
Google Search Console → URL Inspection. Enter your most important URLs and verify they show "URL is on Google." If they say "URL is not on Google," click "Request Indexing."
Priority 2: Core Web Vitals
Google uses Core Web Vitals as a ranking factor. Check and optimize these:
5. Largest Contentful Paint (LCP) — target < 2.5s
LCP measures how quickly the main content of your page loads. The most common causes of poor LCP:
- Unoptimized hero images (use
next/imagewith properpriorityattribute) - Render-blocking CSS or JavaScript
- Slow server response time
Check: Google PageSpeed Insights → enter your URL → check LCP on mobile.
Fix in Next.js: Add priority to your above-the-fold images: <Image src="..." priority />
6. Cumulative Layout Shift (CLS) — target < 0.1
CLS measures how much your page visually shifts while loading. Causes:
- Images without explicit
widthandheightdimensions - Dynamically inserted banners or ads above existing content
- Web fonts causing text to reflow
Fix: Always specify width and height on images. Use font-display: swap for web fonts.
7. Interaction to Next Paint (INP) — target < 200ms
INP measures responsiveness to user interactions. Common issues:
- Excessive JavaScript executing during user interactions
- Large event handlers
- Heavy third-party scripts
Check: PageSpeed Insights → look for INP score. CrUX data (field data) is more reliable than lab data.
Priority 3: Crawling and Structure
8. All important pages are accessible from internal links
Google discovers pages by following links. An "orphan page" (no internal links pointing to it) is hard for Google to find and value. After every new page you publish, update 2–3 existing pages to link to it.
Check: Screaming Frog (free up to 500 URLs) or ahrefs Site Audit → look for orphan pages.
9. No redirect chains
A redirect chain is: page A → page B → page C. Each redirect adds latency and dilutes link equity. Maximum 1 redirect per URL.
Check: In Google Search Console → Coverage, look for "Page with redirect" warnings.
10. No broken internal links (404s)
A broken internal link sends users and crawlers to a dead end. Beyond UX issues, 404s waste crawl budget.
Check: Google Search Console → Coverage → "Not found (404)". Fix by updating the links that point to 404 pages.
11. HTTPS on all pages (no mixed content)
All pages should load over HTTPS. "Mixed content" (HTTPS page loading HTTP resources) causes browser warnings and ranking issues.
Check: Open your pages in Chrome and check the address bar for security warnings. Use PageSpeed Insights — it flags mixed content issues.
12. Canonical tags on all pages
Every page should have a canonical URL pointing to itself. This prevents duplicate content issues when pages are accessible via multiple URLs (with query parameters, trailing slashes, etc.).
In Next.js: Add to metadata:
alternates: { canonical: 'https://yourdomain.com/page-url' }
In WordPress: Yoast and Rank Math handle this automatically.
Priority 4: Structured Data
Schema markup doesn't directly affect rankings but improves click-through rate by enabling rich results.
13. BlogPosting schema on all blog articles
Implement this on every blog article. It enables Google to display publishing dates and author information in search results.
14. FAQPage schema on FAQ sections
If your page has a FAQ section (and it should — per our SEO content checklist), add FAQPage schema. This enables "People Also Ask" rich results that expand your search result size.
15. Organization schema on your homepage
Basic organization data: company name, URL, logo. This helps Google understand your entity and can improve knowledge panel accuracy.
16. BreadcrumbList schema on deep pages
Add breadcrumb schema to blog posts, guide pages, and VS pages. This displays the navigation path in search results and improves click-through rate.
In Next.js: Inject via <script type="application/ld+json"> in the <head>. The content should be a JSON-LD object.
Priority 5: Page Speed and Performance
17. Optimize images (WebP format, proper sizing)
Images are typically the largest contributors to page weight. Serve images in WebP format (30–50% smaller than JPEG/PNG) and size them appropriately for their display dimensions.
In Next.js: next/image handles WebP conversion and sizing automatically.
In WordPress: Install Imagify or ShortPixel — they convert and compress on upload.
18. Enable caching headers
Static assets (CSS, JavaScript, images) should be cached by the browser. Without caching, users re-download all assets on every visit.
In Next.js + Vercel: Vercel automatically sets optimal cache headers. In WordPress: WP Rocket or W3 Total Cache configure caching.
19. Use a CDN for global performance
A Content Delivery Network serves your assets from servers close to your visitors. Cloudflare (free) dramatically improves load times for international visitors and provides DDoS protection.
20. Eliminate render-blocking resources
JavaScript and CSS that load in the <head> block page rendering. Move non-critical scripts to load after the page, or use defer and async attributes.
Priority 6: On-Page Technical Basics
21. One H1 per page
Every page should have exactly one H1 tag. The H1 is your main headline and should contain the target keyword.
Check: View source on each important page and search for <h1> — count occurrences.
22. Meta title under 60 characters
Google truncates titles at approximately 60 characters. Longer titles get cut, which reduces CTR and can confuse the relevance signal.
23. Unique meta titles and descriptions
Every page should have unique meta title and description. Duplicate meta titles are a common technical issue that confuses Google about which page should rank for which keyword.
Check: Google Search Console → Enhancements → HTML improvements.
24. Language attribute set on HTML element
Your HTML tag should declare the language: <html lang="en">. This helps Google serve your content to the right audience.
In Next.js: Set in app/layout.tsx: <html lang="en">
25. Mobile-friendly pages
Google uses mobile-first indexing — it evaluates your mobile version for rankings. All pages should be fully functional on mobile with legible text and no horizontal scroll.
Check: Google PageSpeed Insights → Mobile tab. Google's mobile usability test in Search Console.
The Technical SEO Audit Process
For a new site or quarterly audit:
Step 1: Search Console audit (free)
- Check Coverage report → fix any critical errors (noindex, 404, redirect issues)
- Check Core Web Vitals report → identify URLs with poor scores
- Check Sitemaps → verify your sitemap is submitted and indexed
Step 2: PageSpeed Insights (free)
Run your homepage, a sample blog post, and a VS page. Fix any issues affecting LCP or CLS.
Step 3: Manual checks
- Visit robots.txt
- Visit sitemap.xml
- View source on key pages to verify canonical, H1, and schema markup
Step 4: Monthly monitoring
Set a calendar reminder to check Search Console for new errors monthly. Technical SEO issues often appear silently — a deployment that accidentally adds a noindex tag goes unnoticed without monitoring.
What Technical SEO Won't Fix
Technical SEO is necessary but not sufficient. No amount of schema markup or page speed optimization will rank a page that:
- Targets keywords that are too competitive for your domain
- Has thin content that doesn't satisfy search intent
- Has no internal links pointing to it
- Is on a domain with zero topical authority
Technical SEO is the foundation. Content quality and topical authority are the structure built on top of it. Fix technical issues, then invest the majority of your time in content and keyword strategy.
Related: SEO content checklist 2026, How to rank without backlinks, WordPress AI publishing workflow
Ready to put this into practice?
Clustea does the keyword gap analysis, content clusters, and SEO article writing automatically. 3 free articles, no credit card.
Ahmed Salhi
Founder, Clustea · built this after spending $600/mo on 4 separate SEO tools
I built Clustea to replace the fragmented stack of Ahrefs + Surfer + Jasper + Frase I was using as a solo founder. All the content on this blog comes from real experience building organic traffic. LinkedIn →