<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shiva Roy</title>
    <description>The latest articles on DEV Community by Shiva Roy (@shiva_roy_261633d4dc5a8fa).</description>
    <link>https://dev.to/shiva_roy_261633d4dc5a8fa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949395%2F5602638d-3f37-43df-b4ae-a04717b267a3.jpg</url>
      <title>DEV Community: Shiva Roy</title>
      <link>https://dev.to/shiva_roy_261633d4dc5a8fa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shiva_roy_261633d4dc5a8fa"/>
    <language>en</language>
    <item>
      <title>How to Win at Technical SEO — A Developer's No-BS Playbook for 2026</title>
      <dc:creator>Shiva Roy</dc:creator>
      <pubDate>Mon, 25 May 2026 11:30:57 +0000</pubDate>
      <link>https://dev.to/shiva_roy_261633d4dc5a8fa/how-to-win-at-technical-seo-a-developers-no-bs-playbook-for-2026-1mcg</link>
      <guid>https://dev.to/shiva_roy_261633d4dc5a8fa/how-to-win-at-technical-seo-a-developers-no-bs-playbook-for-2026-1mcg</guid>
      <description>&lt;p&gt;You shipped the feature. The code is clean. The deployment went smooth. Your pull request got three approvals and zero comments. Life is good.&lt;/p&gt;

&lt;p&gt;Then someone from marketing sends you a Slack message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey, our organic traffic dropped 30% last month. Can you look into it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And suddenly you're staring at Google Search Console like it's written in a language you almost-but-not-quite understand, wondering how a website you built &lt;em&gt;correctly&lt;/em&gt; can be performing &lt;em&gt;badly&lt;/em&gt; in search.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth most developers don't hear until it's too late:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google doesn't care how clean your code is. It cares whether it can crawl it, render it, understand it, and serve it fast.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technical SEO isn't some dark art practiced by marketers with too many browser tabs open. It's infrastructure. It's architecture. It's the stuff that lives between your &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tags, your server response times, your rendering strategy, and your JavaScript bundle size. And in 2026, if you're building for the web and you're not thinking about this stuff, you're building half a product.&lt;/p&gt;

&lt;p&gt;This post is the guide I wish someone had handed me three years ago. No fluff. No "10 tips" listicle energy. Just the actual technical work that makes websites rank, broken down the way a developer thinks about it.&lt;/p&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Crawlability — If Google Can't Find It, It Doesn't Exist
&lt;/h2&gt;

&lt;p&gt;Before Google can rank your page, it needs to find it. Before it can find it, Googlebot needs to crawl it. And before it can crawl it, your server needs to actually serve it something useful.&lt;/p&gt;

&lt;p&gt;This sounds obvious. It isn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  The robots.txt Trap
&lt;/h3&gt;

&lt;p&gt;I've seen production sites with &lt;code&gt;Disallow: /&lt;/code&gt; in their &lt;code&gt;robots.txt&lt;/code&gt; because someone copied a staging config to production and nobody checked. I've seen sites blocking their CSS and JS directories, which means Googlebot can crawl the HTML but can't render the page — so it has no idea what the page actually looks like.&lt;/p&gt;

&lt;p&gt;Here's a sane &lt;code&gt;robots.txt&lt;/code&gt; for most sites:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Allow&lt;/span&gt;: /
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;api&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;internal&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;staging&lt;/span&gt;/

&lt;span class="n"&gt;Sitemap&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things to note:&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;/api/&lt;/code&gt; routes don't need to be indexed. Your admin panel doesn't need to be indexed. Your internal tools don't need to be indexed. Everything else should be crawlable unless you have a specific reason to block it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 2026 addition:&lt;/strong&gt; Google now has the &lt;code&gt;Google-Extended&lt;/code&gt; user agent token. This controls whether your content trains Google's AI models (Gemini). This is separate from crawling and indexing — blocking &lt;code&gt;Google-Extended&lt;/code&gt; doesn't affect your search rankings, it only affects AI training data. Decide your stance on that and configure accordingly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Google&lt;/span&gt;-&lt;span class="n"&gt;Extended&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  XML Sitemaps That Actually Help
&lt;/h3&gt;

&lt;p&gt;Your sitemap is a roadmap for crawlers. Most developers either auto-generate one and forget about it, or don't have one at all.&lt;/p&gt;

&lt;p&gt;A good sitemap in 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/services/web-development&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2026-05-10&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;changefreq&amp;gt;&lt;/span&gt;monthly&lt;span class="nt"&gt;&amp;lt;/changefreq&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;0.8&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules that matter:&lt;/p&gt;

&lt;p&gt;Only include URLs that return a &lt;code&gt;200&lt;/code&gt; status code. Don't include pages you've &lt;code&gt;noindex&lt;/code&gt;'d — that's contradictory and confuses crawlers. Keep it under 50,000 URLs per sitemap file (use sitemap index files if you're bigger). And actually update the &lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt; when you update the page — don't hardcode a date from 2023.&lt;/p&gt;

&lt;p&gt;If you're on Next.js, generate your sitemap dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/sitemap.js (Next.js App Router)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPublishedPages&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// your CMS or DB call&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;changeFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;monthly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isCorePage&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crawl Budget — Yes, It Matters
&lt;/h3&gt;

&lt;p&gt;If your site has more than a few thousand pages, crawl budget becomes real. Google allocates a limited number of crawls per visit. If you're wasting that budget on paginated archives, URL parameters, session IDs, or infinite scroll endpoints, your actual important pages might not get crawled frequently enough.&lt;/p&gt;

&lt;p&gt;Things that burn crawl budget:&lt;/p&gt;

&lt;p&gt;Faceted navigation generating thousands of parameter combinations (&lt;code&gt;/products?color=red&amp;amp;size=xl&amp;amp;sort=price&lt;/code&gt;). Infinite scroll without canonical static URLs. Duplicate content across HTTP/HTTPS or www/non-www versions. Calendar pages generating URLs for every day of every month going back to 2015.&lt;/p&gt;

&lt;p&gt;Fix it with canonical tags, &lt;code&gt;robots.txt&lt;/code&gt; rules for parameter-heavy paths, and by consolidating your URL structure. In 2026, managing your "index budget" — the ratio of quality pages to total indexed pages — is just as important as managing crawl budget.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Rendering — The JavaScript Problem Nobody Wants to Talk About
&lt;/h2&gt;

&lt;p&gt;Here's where developers get punished for doing things "the modern way."&lt;/p&gt;

&lt;p&gt;Client-side rendered SPAs are still an uphill battle for SEO. Yes, Googlebot uses a headless Chromium-based renderer. Yes, it can execute JavaScript. But there's a catch — it doesn't render pages instantly. There's a queue. Your page gets crawled, then it goes into a rendering queue, and &lt;em&gt;eventually&lt;/em&gt; Googlebot comes back to render the JavaScript and see the actual content.&lt;/p&gt;

&lt;p&gt;That delay can be hours. Sometimes days. For a new page that needs to rank quickly, that's a problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rendering Decision Tree
&lt;/h3&gt;

&lt;p&gt;Here's how to think about it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static pages (marketing, blog, docs, landing pages):&lt;/strong&gt; Use Static Site Generation (SSG) or Incremental Static Regeneration (ISR). Pre-render the HTML at build time. Googlebot gets fully rendered content instantly. Zero rendering delay. This is the ideal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Next.js ISR example&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateStaticParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getAllPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// regenerate every hour&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dynamic pages (dashboards, user-specific content, search results):&lt;/strong&gt; Use Server-Side Rendering (SSR). The server renders the HTML on each request, so Googlebot gets a complete page without needing to execute client-side JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App-like interfaces (admin panels, internal tools):&lt;/strong&gt; Client-side rendering is fine here. These pages don't need to be indexed.&lt;/p&gt;

&lt;p&gt;The rule is simple: &lt;strong&gt;if a page needs to rank, it needs to be server-rendered or statically generated.&lt;/strong&gt; Full stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hydration Tax
&lt;/h3&gt;

&lt;p&gt;Even with SSR, you're not off the hook. Hydration — the process where React (or Vue, or Svelte) attaches event listeners and makes the server-rendered HTML interactive — costs JavaScript execution time. On a page with heavy component trees, hydration can block the main thread for hundreds of milliseconds.&lt;/p&gt;

&lt;p&gt;This directly hurts your INP score (more on that below).&lt;/p&gt;

&lt;p&gt;The 2026 fix: React Server Components. They render on the server, never ship JavaScript to the client, and reduce your hydration payload significantly. If you're still using &lt;code&gt;getServerSideProps&lt;/code&gt; and full client-side React trees in 2026, you're carrying unnecessary weight.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Server Component — zero client-side JS&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ServiceList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only add &lt;code&gt;'use client'&lt;/code&gt; to components that genuinely need interactivity — forms, modals, dropdowns. Everything else should stay on the server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: Core Web Vitals — The Performance Metrics That Actually Affect Rankings
&lt;/h2&gt;

&lt;p&gt;In 2026, three metrics determine your page experience score:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LCP (Largest Contentful Paint):&lt;/strong&gt; How fast the biggest visible element loads. Target: under 2.5 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INP (Interaction to Next Paint):&lt;/strong&gt; How fast the page responds to user interactions — clicks, taps, keystrokes. Target: under 200 milliseconds. This replaced FID in March 2024 and it's significantly stricter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLS (Cumulative Layout Shift):&lt;/strong&gt; How much the page layout jumps around while loading. Target: under 0.1.&lt;/p&gt;

&lt;p&gt;Google evaluates these at the 75th percentile using real user data from Chrome (CrUX). That means your score reflects the experience of your slower visitors, not your median user. And it evaluates at the URL group level — poor performance on high-traffic pages can drag down your entire domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing LCP
&lt;/h3&gt;

&lt;p&gt;LCP is usually about your hero image or heading text rendering too slowly. The fixes are straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preload your LCP image:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/hero.webp"&lt;/span&gt; &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use modern formats.&lt;/strong&gt; Serve WebP or AVIF instead of PNG/JPEG. Next.js &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; handles this automatically. If you're not on Next, use &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; with fallbacks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/hero.avif"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/hero.webp"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/hero.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Description"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1200"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"600"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inline critical CSS.&lt;/strong&gt; If your CSS is render-blocking (it probably is), extract the critical-path CSS and inline it in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Defer the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cut server response time.&lt;/strong&gt; TTFB over 600ms kills LCP before your frontend even gets a chance. Use a CDN. Cache aggressively. If you're on a shared hosting plan, that's your bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing INP (The Metric Most Sites Fail)
&lt;/h3&gt;

&lt;p&gt;INP is where things get interesting — and where most developers have work to do.&lt;/p&gt;

&lt;p&gt;INP measures the responsiveness of &lt;em&gt;every&lt;/em&gt; interaction on the page, not just the first one. If a user clicks your "Book Appointment" button and the main thread is blocked by a JavaScript bundle doing something unnecessary, that delay counts.&lt;/p&gt;

&lt;p&gt;The biggest INP killers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long tasks on the main thread.&lt;/strong&gt; Any JavaScript task longer than 50ms blocks the browser from responding to user input. The fix is to break up long tasks using &lt;code&gt;requestIdleCallback&lt;/code&gt; or &lt;code&gt;scheduler.yield()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad — one giant blocking function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processAllItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;heavyComputation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Better — yield control back to the browser&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processAllItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;heavyComputation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scheduler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// lets the browser handle pending interactions&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Too many third-party scripts.&lt;/strong&gt; This is the silent killer. Google Tag Manager with 20+ tags. Chat widgets. Analytics. Heatmaps. Ad pixels. Each one adds JavaScript that runs on user interactions. Audit every script. Ask: does this directly contribute to revenue or user experience? If not, defer it or remove it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Defer non-critical scripts --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://analytics.example.com/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Or better — load on user interaction --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://chat-widget.example.com/loader.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;once&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Heavy hydration.&lt;/strong&gt; Already covered this above. Use Server Components. Code-split aggressively. Lazy-load anything below the fold.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing CLS
&lt;/h3&gt;

&lt;p&gt;CLS is the easiest to fix and the most annoying to ignore. Layout shifts happen when elements load without pre-defined dimensions.&lt;/p&gt;

&lt;p&gt;The checklist:&lt;/p&gt;

&lt;p&gt;Always set &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; on images and videos. Use &lt;code&gt;aspect-ratio&lt;/code&gt; in CSS as a fallback. Load web fonts with &lt;code&gt;font-display: swap&lt;/code&gt; and use &lt;code&gt;size-adjust&lt;/code&gt; to match fallback font metrics. Don't inject content above the fold dynamically (banners, cookie consent bars, promotional headers) without reserving space.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Prevent CLS from font loading */&lt;/span&gt;
&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'YourFont'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url('/fonts/yourfont.woff2')&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;'woff2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;font-display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;size-adjust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;105%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 4: URL Architecture — Clean URLs Are a Ranking Signal
&lt;/h2&gt;

&lt;p&gt;Your URL structure isn't just cosmetic. It communicates hierarchy, relevance, and topic relationships to search engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good URLs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services/web-development
/blog/technical-seo-guide-for-developers
/case-studies/ecommerce-redesign-2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bad URLs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/page?id=4837&amp;amp;ref=sidebar
/blog/2026/05/25/this-is-my-really-long-blog-post-title-that-goes-on-forever
/services/service-detail.php?service_id=12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules:&lt;/p&gt;

&lt;p&gt;Use hyphens, not underscores. Keep URLs short and descriptive. Avoid unnecessary date strings in blog URLs (they date your content and provide no SEO value). Use a flat-ish hierarchy — every important page should be reachable within 3 clicks from the homepage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonical Tags
&lt;/h3&gt;

&lt;p&gt;If the same content is accessible at multiple URLs (www vs non-www, HTTP vs HTTPS, trailing slash vs no trailing slash, parameter variations), you need canonical tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://yourdomain.com/services/seo"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Google: "This is the real URL. Index this one. Ignore the duplicates."&lt;/p&gt;

&lt;p&gt;If you're on Next.js App Router:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/services/seo/page.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yourdomain.com/services/seo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 5: Structured Data — Speaking Google's Language
&lt;/h2&gt;

&lt;p&gt;Schema markup is how you give Google explicit, machine-readable information about your content. It's the difference between Google guessing what your page is about and Google &lt;em&gt;knowing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In 2026, structured data is also how AI Overviews, Perplexity, and ChatGPT's browsing tools pull information from your site. If your content is schema-enriched, it's more likely to appear in AI-generated answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Essentials
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Organization schema&lt;/strong&gt; (put this on your homepage):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourdomain.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourdomain.com/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sameAs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://linkedin.com/company/yourcompany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://twitter.com/yourcompany"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Article schema&lt;/strong&gt; (for blog posts):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How to Win at Technical SEO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Person"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Author Name"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"datePublished"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dateModified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-25"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;FAQ schema&lt;/strong&gt; (for pages with Q&amp;amp;A sections):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FAQPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Question"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is technical SEO?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Technical SEO is the process of optimizing your website's infrastructure so search engines can crawl, render, and index it effectively."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;LocalBusiness schema&lt;/strong&gt; (if you have a physical location):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LocalBusiness"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Business"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PostalAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streetAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123 Main St"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressLocality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressRegion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your State"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telephone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+91-XXXXXXXXXX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openingHours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mo-Sa 09:00-18:00"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always validate your schema with Google's &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Rich Results Test&lt;/a&gt;. Deploy broken schema and you get nothing — no rich results, no enhanced visibility. Worse, you might confuse Google about what your page actually is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: Internal Linking — The Most Underrated Ranking Lever
&lt;/h2&gt;

&lt;p&gt;Developers think about routing. SEOs think about internal linking. They're talking about the same thing from different angles.&lt;/p&gt;

&lt;p&gt;Internal links do two things for search engines: they help Googlebot discover pages (crawlability) and they distribute authority (PageRank) across your site. A page with zero internal links pointing to it is an orphan page — Google probably won't find it, and if it does, it won't consider it important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 3-click rule:&lt;/strong&gt; Every important page should be reachable from the homepage in 3 clicks or fewer. If your best service page requires Home → Services → Category → Subcategory → Actual Page, it's buried too deep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use descriptive anchor text.&lt;/strong&gt; "Click here" tells Google nothing. "Our technical SEO audit process" tells Google exactly what the linked page is about.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Bad --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/services/seo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click here&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; to learn more.

&lt;span class="c"&gt;&amp;lt;!-- Good --&amp;gt;&lt;/span&gt;
Learn more about our &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/services/seo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;technical SEO audit process&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Contextual links within content beat navigation links.&lt;/strong&gt; A link from within a relevant blog post carries more topical signal than a link buried in a footer menu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 7: HTTPS, Security Headers, and the Stuff You Forget
&lt;/h2&gt;

&lt;p&gt;HTTPS has been a ranking signal since 2014. In 2026, there's no excuse for running HTTP. Period.&lt;/p&gt;

&lt;p&gt;But beyond the SSL certificate, your security headers also affect how browsers and crawlers interact with your site.&lt;/p&gt;

&lt;p&gt;A solid set of headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com
Permissions-Policy: camera=(), microphone=(), geolocation=()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These don't directly boost rankings, but they prevent security issues that can tank your site (malware injections, clickjacking, mixed content warnings) — all of which cause Google to flag your site as unsafe, which absolutely kills your rankings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 8: The Monitoring Stack
&lt;/h2&gt;

&lt;p&gt;Technical SEO isn't a one-time fix. It's ongoing. Things break. Deployments introduce regressions. A new developer adds a &lt;code&gt;noindex&lt;/code&gt; tag to the wrong template. A CDN config change adds 500ms to your TTFB.&lt;/p&gt;

&lt;p&gt;You need monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The minimum viable stack:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Search Console — your primary data source. Check coverage reports, Core Web Vitals, and crawl stats weekly.&lt;/p&gt;

&lt;p&gt;PageSpeed Insights — run it against your top 10 pages. If any metric is red, fix it before worrying about content.&lt;/p&gt;

&lt;p&gt;Lighthouse CI — integrate it into your CI/CD pipeline. Set performance budgets and fail the build if they're breached:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lighthouserc.yml&lt;/span&gt;
&lt;span class="na"&gt;ci&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;assert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;assertions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;categories:performance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;error&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;minScore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;
      &lt;span class="na"&gt;interactive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;error&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;maxNumericValue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screaming Frog or Sitebulb — run a full crawl monthly. Catch broken links, missing meta tags, orphan pages, redirect chains, and duplicate content before Google does.&lt;/p&gt;

&lt;p&gt;Set performance budgets in your build process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JS Bundle: &amp;lt; 150KB gzipped
CSS: &amp;lt; 50KB gzipped  
TTFB: &amp;lt; 600ms
LCP: &amp;lt; 2.5s
INP: &amp;lt; 200ms
CLS: &amp;lt; 0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a deploy violates these, it shouldn't ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 9: The AI Search Layer — The New Frontier
&lt;/h2&gt;

&lt;p&gt;This is the 2026 addition that most guides skip.&lt;/p&gt;

&lt;p&gt;Google AI Overviews, ChatGPT browsing, Perplexity, and other AI search tools are now crawling websites and pulling information to generate answers. This means your content isn't just competing for traditional blue links — it's competing to be &lt;em&gt;cited&lt;/em&gt; by AI.&lt;/p&gt;

&lt;p&gt;What helps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clear, well-structured content with explicit answers.&lt;/strong&gt; AI systems pull from content that directly answers questions. If your page says "What is technical SEO?" followed by a clear, concise definition, it's more likely to be cited than a page that meanders into it after three paragraphs of preamble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema markup.&lt;/strong&gt; Structured data gives AI crawlers machine-readable context about your content. FAQPage, HowTo, and Article schemas are particularly valuable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E-E-A-T signals.&lt;/strong&gt; Author bios with credentials. Publish dates. Editorial standards. AI systems (and Google's quality raters) look for signals that your content was created by someone who knows what they're talking about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;robots.txt&lt;/code&gt; considerations.&lt;/strong&gt; Different AI crawlers use different user agents. If you want your content to appear in AI answers but don't want it used for training data, you need to configure your &lt;code&gt;robots.txt&lt;/code&gt; accordingly. Research the user agents for each AI crawler you care about — they change frequently.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part Where I Tell You About Help
&lt;/h2&gt;

&lt;p&gt;I work in the technical SEO and web development space, and I've seen this pattern hundreds of times: a team of talented developers builds something technically impressive that performs terribly in search because nobody thought about crawlability, rendering strategy, or structured data during the build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://graventonsolutions.com" rel="noopener noreferrer"&gt;Graventon Solutions&lt;/a&gt;&lt;/strong&gt; is a &lt;a href="https://graventonsolutions.com/" rel="noopener noreferrer"&gt;digital marketing and web development agency&lt;/a&gt; that works with development teams and businesses to bridge that gap. We handle the full technical SEO stack — crawl audits, Core Web Vitals optimization, schema implementation, site architecture planning, and ongoing monitoring — so developers can focus on building features while knowing the search infrastructure is solid.&lt;/p&gt;

&lt;p&gt;We're based in India (Bilaspur and Raipur, Chhattisgarh) and work with teams remotely. If your site has technical SEO issues you haven't gotten around to fixing, or if you're building something new and want the search foundation laid correctly from day one, we can help.&lt;/p&gt;

&lt;p&gt;Reach out at &lt;strong&gt;&lt;a href="https://graventonsolutions.com" rel="noopener noreferrer"&gt;graventonsolutions.com&lt;/a&gt;&lt;/strong&gt; or find us on LinkedIn.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR Checklist
&lt;/h2&gt;

&lt;p&gt;For the skimmers (I respect you), here's the condensed version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CRAWLABILITY
├── robots.txt doesn't block important content
├── XML sitemap exists, is accurate, auto-updates
├── No orphan pages
├── Crawl budget not wasted on junk URLs
└── Google-Extended configured per your AI policy

RENDERING
├── Public pages use SSG or SSR (not client-only)
├── React Server Components for non-interactive UI
├── Code splitting and lazy loading below the fold
└── Hydration payload minimized

CORE WEB VITALS
├── LCP &amp;lt; 2.5s (preload hero, modern formats, CDN)
├── INP &amp;lt; 200ms (break long tasks, audit third-party JS)
├── CLS &amp;lt; 0.1 (dimensions on images, font-display: swap)
└── Performance budgets in CI/CD

URLS &amp;amp; STRUCTURE
├── Clean, descriptive, hyphenated URLs
├── Canonical tags on all pages
├── Every key page within 3 clicks of homepage
└── Descriptive anchor text on internal links

STRUCTURED DATA
├── Organization schema on homepage
├── Article/BlogPosting on content pages
├── FAQ schema where applicable
├── LocalBusiness if physical location
└── Validated with Rich Results Test

SECURITY
├── HTTPS everywhere
├── HSTS, X-Frame-Options, CSP headers
└── No mixed content warnings

MONITORING
├── Google Search Console (weekly)
├── PageSpeed Insights (top 10 pages)
├── Lighthouse CI in pipeline
└── Monthly full-site crawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go fix your &lt;code&gt;robots.txt&lt;/code&gt;. You know it needs it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the Graventon Solutions team. We build websites that rank and fix ones that don't. &lt;a href="https://graventonsolutions.com" rel="noopener noreferrer"&gt;graventonsolutions.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>performance</category>
      <category>marketing</category>
    </item>
  </channel>
</rss>
