Learning technical SEO, layer by layer
Technical SEO has four layers that sit on top of one another: being crawled, being rendered, being indexed, and being delivered fast. You learn them from the bottom, because a broken lower layer makes work on everything above it pointless.
- Lesson 7 of 15
- Intermediate
- Free, no signup
The four layers of technical SEO, from foundation to surface
The crawl, render and index order comes from Google's own diagram in its JavaScript documentation. You learn from the bottom and you notice from the top.
- Delivery speedThe only layer a client can see, and the last one you should get to visible
- IndexingA unique address, the canonical tag, and a page with something to say Google decides
- RenderingText that only JavaScript builds waits in a second queue own queue
- CrawlingFound through a link, allowed in robots.txt, and answered correctly by the server foundation
These four layers are a teaching model, not an official Google taxonomy. Their use is telling you which problem to solve first.
Last checked: Facts and tool names in this lesson are re-checked against their sources on this date.
What layers is technical SEO made of?
Four layers, and each is a condition for the next. A page has to be reachable to be crawled, crawled to be rendered, rendered for its text to be indexed, and indexed before the question of speed means anything at all.
Here is a point that most checklists get backwards. Google's own order, according to the diagram in its own JavaScript documentation, is crawling, then rendering, then indexing. Rendering sits between the two, not after indexing. For a page whose text is built by JavaScript, that single swap decides whether the text enters the index at all.
The order you learn in, though, is not the machine's order, and it does not need to be. You learn from the bottom, because each layer is the condition for the one above it; but you notice problems from the top, because speed is the only layer you and your client can see. Someone who confuses those two spends six months on speed while the page was never indexed.
And one boundary that saves a lot of time: which of these layers moves rankings most is a different argument, and we wrote it separately. What technical SEO is and which part of it actually matters pulls that prioritisation out of real projects. This lesson does not prioritise; it gives a learning path and, at each layer, the check you run.
The crawl layer: how do I know Google reaches the page?
Crawling means Google's crawler finds the address, is allowed to fetch it, and gets an answer from the server. Three separate conditions, and each one breaks on its own.
Finding comes from links. A page with no internal link pointing at it, present only in the sitemap, is a marginal page as far as Google is concerned. The first check is always this: starting from the home page, how many clicks does it take to reach it?
Permission comes from robots.txt, and here is a rule almost nobody writes down. Google says only one group is valid for a particular crawler: the crawler picks the group whose user agent matches it most specifically, and ignores the other groups. The next sentence in the documentation is even blunter: specific groups and the global group are not combined.
Which means that if you wrote a separate group for one named bot, that bot sees none of the rules in the asterisk group. Read your own robots.txt once with that in mind; there is a fair chance that some rules you thought applied everywhere are written for only part of your crawlers.
Do not drop the second half of the same rule either, because you need it the moment you read a real file: several groups all written for one crawler are merged together. So in a file that declares the asterisk group three times, a crawler with no specific group of its own gets the rules of all three at once. The first half of the rule tells you which group to ignore, the second tells you which groups to read together, and someone who knows only the first half misreads a real file.
The third condition, the server's answer, is the simplest and eats the most time: a 200 for a page that should stay, a 301 for one that moved, and a 404 for one that genuinely is not there. A page whose content is gone but which still returns 200 is what gets called a soft error, and it is worse than either of the other two.
Why blocking in robots.txt is not the same as noindex
If only one thing from this lesson survives, let it be this section.
robots.txt says do not read. The noindex rule says you read it, now do not show it in results. The first is a crawl-layer control and the second is an index-layer control, and if you put both on one page, the second is never read.
Google states this with total clarity: for the noindex rule to be effective, the page must not be blocked by a robots.txt file and has to be otherwise accessible to the crawler; if it is blocked, the crawler will never see the rule and the page can still appear in results, for example when other pages link to it.
So a page you want out of the results has to stay open, so the crawler can come in and see the tag. That is precisely the opposite of what intuition says, which is why somebody makes this exact mistake every month.
In a different document, the one about duplicate URLs, Google comes back to the same thing and writes: do not use robots.txt for canonicalisation, because Google may still index URLs disallowed in robots.txt without their content. Two independent pages, one message: blocking is not removing.
The page is not in the results. Which control did you touch?
Two controls with similar names sitting on different layers. Using both together disables the second one.
Is the page blocked in robots.txt?
The noindex tag is never read
- The crawler does not enter the page, so it never sees the tag inside it
- If other pages link to it, it can still appear in the results
- The fix: remove the block first, then put the tag in
Now go to the index layer
- The page's robots tag: is noindex there or not
- Which address the canonical tag points at
- And then Search Console, the only place that states the real index status
Neither of these is instant. Until Google comes back to the page, the old result stays where it was.
The render layer: does Google see what you see?
Your browser runs the JavaScript and the page completes. Google runs it too, just not at the same moment.
Google's own documentation says the crawler queues pages both for crawling and for rendering, and adds that it is not obvious from outside whether a page is waiting for crawling or waiting for rendering. So between the moment Google takes your page's code and the moment it sees the text your script built, there is a gap whose length you do not set.
The check for this layer is the simplest of all and needs no tool. Take the raw code of the page, not what you see in your browser's developer tools, and search inside it for one sentence from the main body. If the sentence is there, the render layer is not your problem. If it is not, your text exists only for a browser.
Most tutorials lose the difference between those two: the code you see in the Elements tab of developer tools is the rendered code and it is always full. The thing that matters is the answer the server sent with no script running at all.
And if the sentence is missing, the answer is not always rewriting the whole site. For most content sites it is enough that the main text arrives in that first server response, while the rest of the page, the comments and the recommendations, gets built by script afterwards.
The index layer: the page exists, the result does not
Being indexed is not a right, it is Google's choice. A page that was crawled and rendered may still not enter the index, and the most common reason is not technical at all: the page holds nothing that is not already in the results.
The commonest technical reason, though, is a duplicate address. A product reachable through three category paths has three addresses; the www and non-www versions, the trailing-slash and no-slash versions, and every address built by a filter parameter add to the pile. Google picks one of them and sets the rest aside, and its pick is not necessarily yours.
Google lists the ways of stating your pick in order of strength: a redirect is a strong signal, a canonical link annotation is a strong signal, and inclusion in a sitemap is a weak signal. There are three more that never work and get tried anyway: robots.txt, the URL removal tool, and hope.
The word repeated in that list is signal, not instruction. A canonical tag does not force Google, which is exactly what makes people angry about it. If two addresses genuinely hold different content, putting a canonical on one of them does not make the problem go away.
And one practical warning that comes down to telling two problems apart: a duplicate address is one thing, and two separate articles competing for one phrase is another. For the second, a canonical is not the answer. If you are not sure which one you have, start with submitting a site to Google and the indexing problem, which opens that diagnosis from the ground up.
The speed layer is deliberately short here
Speed is the fourth layer and it gets two paragraphs here, no more. The reason is that site speed is a whole path of its own, and the right place to talk about it is the site speed path, not one section of a technical SEO lesson.
What you need from this lesson is one sentence: speed is the layer that starts to matter once the three below it are healthy, and not before. A page that is not indexed gets zero visits with a score of one hundred. The reverse holds too; a page whose first three layers are fine and which loads slowly has a problem its reader feels before Google does.
A multilingual site adds one more layer
If your site is monolingual, skip this section. If it is not, this is where most projects lose time.
When the same page exists at four addresses, all four have to be declared to each other, and each one has to list itself among the declarations as well. If the English version does not name itself in its own list, that relationship is incomplete. This is one of those things you check with one look at the page code and that almost nobody checks.
The second point, written down even less often, goes back to robots.txt. Path matching in that file is literal, which means writing one rule for a path does not cover the same path with a language prefix. A site whose languages are separated by an address prefix has to write every rule once per language, otherwise the language versions of that path are left with no rule at all.
And one thing that catches people out: the sitemap needs the same relationship. If your SEO plugin puts only the primary language's addresses in the sitemap, the other languages are found through internal links alone, and they become exactly the marginal pages described in the crawl layer.
Where do I start, and how do I check each layer?
The order below is the one that gets run on a project, and it is the same one to learn in. Each stage has a check that either answers or does not; if it does not, the next stage is meaningless.
First, the link path: how many clicks from the home page reach the page. Second, permission: it is not blocked in robots.txt, and the group that actually applies to it is the group you thought applied. Third, the server's answer: the status code is the one it should be. Fourth, rendering: one sentence from the body is findable in the raw page code. Fifth, indexing: the page is in the index, and this is the one thing only Search Console can answer, not another tool and not a language model. Sixth, speed.
One warning about the checking itself, which comes from doing it and is in no tutorial: when you search the page code for the robots tag, watch the quote style. WordPress and SEO plugins print that attribute sometimes with single quotes and sometimes with double, and a search that knows only one form will happily report that the tag does not exist. You can see this on this very site.
And if you would rather not do this yourself, this same order is where we start in SEO work; not because it is elegant, but because working on the wrong layer is the most expensive mistake in this field.
Six checks, in the order they get run
Each step either answers or does not. If it does not, do not climb to the next one; that is where your problem is.
-
1
The link path
How many clicks from the home page reach this page?
-
2
Permission
Not blocked in robots.txt, and the group that applies is the one you thought
-
3
The server answer
The status code is what it should be, and an empty page does not return 200
-
4
Rendering
One sentence from the body is findable in the raw page code
-
5
Indexing
The page is in the index. Only Search Console has that answer.
-
6
Speed
Now, and only now, go to speed
No external tool and no language model answers the fifth step. Index status comes from Search Console alone.
The fast path, with AI
Technical SEO is the one part of SEO where a language model genuinely works well, and the reason is simple: its inputs are text and its questions have right answers. The response headers, the head tags and the robots.txt file are three short pieces of text, and a model can find the contradiction between them in seconds, which a person does more slowly by eye. A cheap fast model of the Flash class is enough here, since this is extraction and matching rather than judgement; our current pick is in the <a class="text-link" href="/en/ai/">AI section</a>.
- Produce the three inputs with the commands at the top of the recipe: the response headers, the head tags, and the robots.txt file.
- The third command matters and usually gets skipped: pull the tags out on their own. The full code of a page is hundreds of kilobytes, and on a site that inlines its CSS even the head section is too big for a model.
- Run the recipe. The output is one verdict per layer, each carrying the exact input line that produced it.
- Fix the lowest layer with a negative verdict first, then take the same three inputs again. Do not touch the layers above it before that.
Copy-ready recipe
U="https://example.com/page/"
curl -s -I -A "Mozilla/5.0" "$U"
curl -s -A "Mozilla/5.0" "$U" > page.html
tr -d '\n' < page.html | grep -oiE '<(title[^>]*>[^<]*</title|link[^>]*|meta[^>]*)>'
curl -s "https://example.com/robots.txt"
grep -c "one sentence from the page body" page.html
---- the prompt, once you have the output of the four commands above ----
Role: technical reviewer. Rule only from the input and guess nothing.
Page address: {address}
Response headers:
{output of the first command}
Head tags:
{output of the third command}
The robots.txt file:
{output of the fourth command}
How many times the body sentence was found in the raw code: {number}
Write one row per layer, with three columns: the layer, the verdict, the input line that produced the verdict.
The layers and their questions:
1. Crawling: is this page's path blocked in robots.txt? First find the group that is valid for Google's crawler. Apply both halves of the rule: a specific group is not combined with the asterisk group, but several groups all written for one crawler are merged together. So if the file declares the asterisk group more than once and has no specific group for Google's crawler, read the rules of every asterisk group together.
2. The server answer: what is the status code, and is there a redirect in the path.
3. Rendering: is the count number zero or not.
4. Indexing: what the head robots tag says, what an x-robots-tag response header says, and whether the canonical tag points at this same address or a different one.
Rules:
- If there is no robots tag and no x-robots-tag header in the input, the verdict is "not present", not "there is a problem". Their absence means the default state.
- Head tags may be written with single or double quotes. Treat both as the same.
- If something is not determinable from the input, write "not determinable from this input" and stop there.
- Give no verdict on whether the page is indexed. That does not come from this input.
- Finish with a single sentence: which is the lowest layer with a negative verdict.
Before you trust the output: Three things do not come out of this recipe and you have to know them yourself. First, the third input is the raw code, so anything JavaScript adds to the head is not in it; if a script sets your canonical tag, the model does not see it and is right to say it is absent. Second, the real index status is in none of these four inputs and no model can state it; that answer comes only from that site's Search Console. And third, more important than either: the output of this recipe is a diagnosis, not an instruction to execute. robots.txt and the canonical tag are exactly the two places where one wrong value, applied across a whole site, can push the site out of the results. Change them one at a time and look after each change.
AI in this kind of work
The position of this lesson: on the crawl, render and index layers a language model is a good assistant, and on the decision layer it is not. The difference shows up where the question moves from "what does this tag say" to "should I change this tag". The first has an answer in the text. The second needs something the model does not have: what this page currently ranks for and what is lost if you break it.
Tools that actually help
- Google Search Console The only place that states a page's real index status. No external tool and no model knows it, because that data lives only at Google.
- Claude For running the recipe above and for reading a long robots.txt, because it takes constraints and says which line it drew its verdict from. Iran is not on Anthropic's supported-countries list and there is no official payment route from Iran.
- Gemini For the same job when the input is long. Google's own page says the Gemini web app runs in over 230 countries and territories, and Iran is not on that list.
- RGB The access and payment layer for Iran, kept separate from the tools themselves.
Where it backfires
The risk here differs from the content risk and is more dangerous. In content, a bad sentence can be changed tomorrow; in technical SEO, one wrong value applied across a whole site can push it out of the results and take weeks to come back. Three files have that property: robots.txt, the canonical tag and the robots tag. Those same three are where a model makes the most mistakes, because their rules are full of near-identical cases. The group rule is the example: a model that does not know a named group never inherits the asterisk group will tell you with complete confidence that your rule applies to every crawler. The defence is simple and is built into the recipe above: make the model put the input line next to every verdict. A verdict that cannot show its line has not been checked.
Sources: Google Search Central: introduction to robots.txt Google Search Central: block search indexing with noindex Google Search Central: understand the JavaScript SEO basics
Where this advice stops
Technical SEO removes a ceiling and puts nothing underneath it. A page whose four layers are all healthy but which answers nobody's question ranks for no technical setting. And the four-layer model is itself a teaching simplification, not an official Google taxonomy; Google counts three phases in its JavaScript documentation and explains speed elsewhere. Where this lesson and Google's documentation disagree, the documentation is right.
From our own work
You can count the group rule on this very site. Open our robots.txt: the Disallow line for the login path is written four times in the asterisk group, and then those same four lines are repeated verbatim in the AI crawler group, eight lines in total for one path. That repetition is not redundancy; it is the consequence of the rule described in the crawl section. As long as that group held only an Allow line, the bots named in it carried none of the restrictions from the asterisk group. And writing each path four times has its own reason: matching in that file is literal, and the language versions of the same path are separate addresses. Why those two paths were blocked at all is written in the comment above that code: the login and register pages take a parameter that encodes the current address inside itself, so every link generated a fresh address and built an infinite tree a crawler never finishes. On that day, 8 August 2026, it produced ten gigabytes of logs and filled the disk.
Real follow-up questions
What is the difference between crawling and indexing?
Crawling means Google read the page. Indexing means that, having read it, Google decided to keep it in its own list. A page can be crawled and not indexed, and that state is the most common surprise people find in Search Console.
Can robots.txt remove a page from the results?
No. Google itself says a page blocked in robots.txt can still appear in the results, for example when something else links to it. To take a page out of the results, the page has to stay open so the crawler can see the noindex rule.
Do I need to know how to code for technical SEO?
For diagnosis, no. All six checks in this lesson happen without a line of code and most of them are just looking at a text file. For fixing some of the problems, yes, especially on the render layer where you go into the theme and the site code; but a correct diagnosis is what tells you whether anyone needs to touch the code at all.