How a scan works
How Loomaly finds pages, checks them, judges content, measures speed and scores the site.
A scan of your whole site runs when you add_site, when you ask your assistant to check with target: site, and on its own through the weekly re-scan, a sitemap change or your deploy webhook. It goes through these stages:
- Discovery finds your pages from your sitemap and a crawl.
- Templates groups pages that share a URL pattern and picks representatives.
- Rule checks and AI judgment run on every page.
- Representative pages are loaded again in a real browser and their speed is measured.
- Page judgments compare pages across the whole site.
- Internal link suggestions look for links worth adding between your pages.
- The health score and the fix-first ranking update as results come in.
You can also scan a single page with check (pass the URL or finding). That runs steps 3 and 4 for that one page.
Discovery
Loomaly starts with what your site says about itself, then crawls for anything it missed.
- robots.txt and sitemaps. It reads
/robots.txt, then/sitemap.xml,/sitemap_index.xml,/sitemap-index.xmland any sitemap your robots.txt lists, following sitemap index files down to nested sitemaps. It keeps up to 10,000 URLs, along with each page'slastmoddate. Your homepage is always included. A site with at least 10 discovered pages and no sitemap is no sitemap. When a sitemap exists, indexable pages the crawl found that are missing from it (after ignoring a trailing slash,wwwand query strings) are sitemap leaves pages out. Those two do not fire together. Sign-in and app pages that answer 200 without noindex are sign-in or app page can be indexed. A robots.txt that is only comments is a notice that the host manages the file. - Crawl. Next it follows links from your homepage, up to three clicks deep, to find pages the sitemap doesn't list. The crawl visits up to 200 pages on the Free plan and up to 1,000 on paid plans.
- Sites built with JavaScript. If the sitemap and crawl together find fewer than 20 pages, the site probably builds its links in the browser, so Loomaly crawls a second time in a real browser that runs your JavaScript.
- What's left out. Only pages on your domain count (
wwwand non-wwware treated as the same site). Files that aren't web pages, such as images, PDFs, feeds, and.txt,.xmlor.jsonfiles, are skipped. If you set a path scope such as/gb, only pages under that path are kept.
Pages your robots.txt disallows (for all crawlers or for LoomalyBot) are marked robots blocked and aren't fetched at all: no rule checks, no AI judgment, no performance test, no page judgments. The site asked crawlers to stay out.
If your robots.txt blocks our crawler
If robots.txt blocks the crawler Loomaly uses to discover pages, or opts out of search crawling with a Content-Signal directive, the scan stops and status / say report The site owner has opted out of SEO crawling. To allow it, add these lines to robots.txt and ask your assistant to scan again:
User-agent: CloudflareBrowserRenderingCrawler
Allow: /If discovery finds nothing at all (a blocked sitemap, or a site that redirects visitors from our region elsewhere), fix the sitemap or unblock the crawler, then ask your assistant to check with target: site again.
Page templates and representatives
Most sites are built from a handful of templates: every product page, every blog post and every category page shares one layout. Loomaly groups your pages by URL pattern, so /products/blue-mug and /products/red-teapot both belong to the template /products/*. A page whose path is unique, like /about, is a template of its own.
From each template Loomaly picks representative pages, spread evenly across the template rather than bunched at the start of the list:
| Pages in the template | Representatives |
|---|---|
| 1–3 | all of them |
| 4–100 | 3 |
| 101–1,000 | 5 |
| more than 1,000 | 8 |
Representatives are where Loomaly loads pages in a real browser and measures speed (see below). Every page, representative or not, gets the same rule checks and AI judgment.
Every page: rule checks and AI judgment
Every page Loomaly found (up to 1,500 per scan), except those robots.txt disallows, goes through the same two steps. The page is read as the server sends it, without running JavaScript.
Rule checks
Code settles everything that can be decided from the page's HTML, the same way every time:
- the title and meta description (missing, too short, too long)
- the canonical link (missing, or pointing at another URL), the viewport tag,
noindexandnofollow, and thelangattribute on<html> - headings: a missing H1, more than one H1, skipped levels
- images: missing or empty alt text, and pages with four or more images where none is lazy-loaded
- links: no internal links, fewer than three, or more than 100 external links
- structured data: no JSON-LD, JSON-LD with errors, no Organization schema on the home page, no breadcrumb schema on deeper pages
- Open Graph tags and
og:image, and a favicon - hreflang: a missing self-reference or
x-defaultwhen the page declares hreflang - HTTP errors, pages served over
http://, pages that are an empty app shell without JavaScript, and pages under 300 words (Chinese, Japanese and Korean text is counted by character)
The Rules reference marks each of these rules Rule check.
AI judgment
Some things can only be judged by reading the page. For each page, Loomaly puts the page's path, title, headings, a short opening excerpt, a description of its length and the buttons and call-to-action links it found in front of an AI model and asks one set of questions at once:
| Question | Can raise | Asked on |
|---|---|---|
| What kind of page is this (article, product, category, landing, docs, home, utility, other)? | decides which answers below apply | every page |
| Does it give enough substance for what it's for? | Thin content | pages with text |
| Does it read like a person wrote it, with search terms at a normal rate? | Possible keyword stuffing | pages with 150 words or more |
| Does each section open with its answer, so it makes sense on its own? | Page not optimized for AI citation | articles, docs and landing pages with at least two H2s |
| Does it have questions with answers? | Missing FAQ schema | when the page has no FAQPage markup |
| Does it give the visitor one clear next step? | No clear next step for the visitor | home, landing and product pages whose buttons were recorded |
| Does the title describe what the page delivers? | Title does not match the page | pages with a title and text |
| Does it name who wrote it, and show when? | Missing author byline, Missing publication date | articles whose structured data doesn't already say so |
Code decides which answers apply to which kind of page, so a product page is never flagged for having no author. Only confident answers become issues: the model has to be about 90% sure the answer is "no" (or, for the FAQ question, "yes"). Anything less certain is dropped: it isn't shown and doesn't affect the score. The page's text is only ever given to the model as data to judge, never as instructions.
Sign-in, cart, checkout, search, legal and contact pages, noindex pages, pages that redirect and pages that return an error aren't judged. Neither are pages with under 150 characters of text in the served HTML: there's nothing to read. When such a page is a sizeable document (20 KB of HTML or more), the rule check reports it as Page renders only client-side instead, because that near-empty page is what crawlers that don't run JavaScript see, including most AI crawlers.
Every explanation and fix prompt comes from Loomaly's own templates, so the same problem is described the same way on every scan. Your assistant gets those prompts on the top todo item (fixPrompt) and via problem when you need more detail; it only invents extra wording when you ask it to draft a change.
Rule checks don't count against your pages on any plan. AI judgment doesn't either: on Free it runs on the top 20 pages of each scan, and on a paid plan it runs on every page. If AI judgment couldn't run for a page, that page's earlier AI-judgment issues stay open rather than being treated as fixed, until a later scan judges it again.
todo and problem show each problem once, with the page templates it appears on, so a problem on 1,000 product pages shows up as one thing to fix in the template. A page that redirects to another website isn't treated as one of your pages: it's dropped from the list and its issues are ignored automatically.
Representative pages and performance
Representative pages are scanned on their own rather than in the site-wide pass. For each one, Loomaly:
- Loads the page in a real browser, so content your JavaScript renders is included, as Google sees it.
- Runs the same rule checks and AI judgment on the rendered page.
- Measures performance with PageSpeed Insights and real-visitor data (see below).
A single page you scan yourself with check goes through the same three steps.
How many pages are tested
Each representative page takes one of your plan's monthly pages. A scan tests as many representatives as your plan has pages left this month, up to 150 per scan, and never more than the site has. When no pages are left, the scan still runs the rule checks and AI judgment on every page; it just tests no pages in depth until your pages reset or you upgrade. See Plans & pages.
To spread that budget well:
- Breadth first. Every template gets its first representative tested before any template gets a second.
- Oldest first. Representatives that were scanned longest ago go first. On a site with more templates than one scan's budget, repeated scans work through the rest instead of testing the same pages every time.
- In waves. Tests start 40 per minute rather than all at once. A scan of 150 pages starts its last wave about three minutes in.
Why only representatives
Loading a page in a real browser and running PageSpeed Insights on it takes time and costs money for every page, and pages built from the same template almost always perform alike: they load the same scripts, styles and layout. So speed is measured on a few pages per template, while the checks that really differ from page to page (rule checks, AI judgment and page judgments) run across the whole site.
Performance and Core Web Vitals
When a representative page is scanned, Loomaly runs Google PageSpeed Insights on it (mobile) and looks up Chrome UX Report data (real visitors on phones). Wherever real-visitor data exists it's used first, because that's what Google ranks on; otherwise lab measurements are used. A page is flagged when:
| Measure | Flagged at |
|---|---|
| Largest Contentful Paint (LCP) | over 2.5 s |
| Interaction to Next Paint (INP, real-visitor data only) | over 200 ms |
| Cumulative Layout Shift (CLS) | over 0.1 |
| Time to First Byte (TTFB) | over 800 ms |
| Lighthouse Performance score | under 50 |
| LCP image without a priority hint | when PageSpeed Insights reports it |
LCP, INP, CLS and TTFB are warnings in Google's "needs improvement" band and errors only when real-visitor data is in its "poor" band; lab-only results stay warnings. Each issue says whether its numbers are the page's own, the whole site's (Google's fallback when a page has too few visits) or from the lab. A measurement older than 45 days stops counting and its issue moves to Needs re-measuring. These appear in todo like any other issue. If PageSpeed Insights can't measure a page, the scan reports nothing for it, and it won't mark earlier performance issues on that page as fixed.
Page judgments
Some problems only show when you compare pages with each other or look for pages that have quietly broken: is this page competing with that one? Is this product gone? Code picks the likely candidates first and AI judges only those.
After the site-wide pass finishes, a background pass looks at up to 1,500 pages:
- Competing pages. Loomaly compares each page's title, heading and opening text with its closest matches on your site. Pairs that are nearly identical go to AI, which decides whether they are duplicates, variants of one item (another size, colour or language), overlapping, or distinct. Only duplicates and overlapping pairs become an issue, Competes with another page for the same search, and the issue names the other page. Pages that already point at each other through a canonical or hreflang link, or that redirect, are skipped.
- Empty or gone pages. Pages with very little text (under 80 words), or whose title, heading or opening text says something like "sold out" or "not found", go to AI, which decides what the page really is. The answer can become Error page served as a normal page, Unavailable item still indexable or Placeholder page with no real content. Sign-in, cart, legal and
noindexpages are skipped, since they are meant to be short or out of search.
Each pass judges at most 150 pairs and 100 suspect pages, most similar and most clearly broken first. Answers below 0.60 confidence are dropped. Answers from 0.60 up to 0.85 are stored and left off todo and the weekly report until you turn on lower-confidence AI judgments under /account; 0.85 and above are shown. They still count toward the health score. Results usually show up in todo a few minutes after the rest of the scan. A page-judgment issue closes only when a later pass judges the page again and no longer finds the problem.
Internal link suggestions
When the page judgments of a site scan are done, Loomaly looks for internal links worth adding. Nothing to click: it runs after every full scan, and takes a few minutes on a large site. The pass:
- Takes up to 500 of your most recently scanned pages that have text on them.
- For each page, finds the pages on your site whose content is closest to it: the likeliest places for a link to it.
- Looks for an existing sentence on those pages that mentions the topic, and the words in it that would make a natural anchor. Links that already exist are never proposed again.
- Asks AI whether an editor would actually add that link.
The results are available from todo with view: links. The yes/no judgment treats 0.90 and above as ready to apply. In calibration that bar was never reached — every chosen suggestion sat between 0.50 and 0.90 — so the list shows that whole set instead of an empty one. todo can ask for routing: "act" when you want only the stricter set. Each suggestion shows the page it goes on, the page it points to, and the sentence with the words to turn into a link. After you add a link (or decide not to), triage with decide_link marks it accepted or dismissed. Below the suggestions are the pages on your site that no other page links to. Loomaly never edits your site: accepting a suggestion only marks it done for your team.
The health score
The health score is built from five dimensions (indexability, page basics, content and AI readability, structured data, performance). On each page an error fails its dimension, a warning costs 25 points and a notice 5, at most 10 from notices. Each dimension is averaged over the pages checked for it, and the score is their weighted average. How the health score works has the weights, the performance rules and a worked example.
Open issues from every source count, and so do issues marked fixed until a re-check confirms them. Ignored and fixed issues don't. status and report show each dimension's score and what fixing each top problem would add. The score updates as each page finishes, so it moves during a scan, and again when page judgments arrive.
| Score | Status |
|---|---|
| 80–100 | Healthy |
| 50–79 | Needs work |
| 0–49 | At risk |
Limits at a glance
| Stage | Limit |
|---|---|
| Sitemap | up to 10,000 URLs |
| Crawl | 3 links deep; 200 pages (Free), 1,000 pages (paid plans) |
| JavaScript crawl | only when sitemap and crawl find fewer than 20 pages |
| Rule checks and AI judgment | every page, up to 1,500 per scan; unlimited, never counts against your pages |
| Representative pages (browser + performance) | up to 150 per scan, limited by your plan's pages left this month |
| Page judgments | up to 1,500 pages, 150 pairs and 100 suspect pages per pass |
| Link suggestions | up to 500 pages per pass, after every full scan |
Connect your AI assistant (MCP)
Connect Claude, Claude Code, Cursor, Codex or ChatGPT to Loomaly. Twelve intent tools cover rankings, AI search, fixes and reports — all through chat.
Issues
How Loomaly lists problems through todo and problem, what to fix first, what each severity and state means, and how check confirms a fix on the live page.