Find out the day your SEO broke, not the month after
A staging noindex that shipped. A Disallow: / somebody pasted. A sitemap that quietly started 404ing. Nothing on your site reports any of it. SEOtto checks, keeps every version, and tells you the day it changes.
Check one page right now — no account:
Monitoring a whole site is free for one site. Start free
Read every crawl
HTTP/1.1 200 OK
Traffic does not fall off a cliff. Something moves, and nothing tells you.
Every one of these is a normal Tuesday deploy. All of them answer 200 — the page still renders, the CMS still says published, and analytics only shows the shape of it three weeks later.
Tuesday's deploy
SEOtto alerts that hour
Analytics shows it, three weeks later
X-Robots-Tag
The environment flag reaches the template
Staging sets noindex. A build promotes the wrong config. Forty pages leave the index over the following week, and view-source on production looks fine because the directive arrived in a response header.
- Meta robots and the response header, read together
- Critical the moment a page stops being indexable
GET /collections/outerwear
robots.txt
Somebody edits robots.txt
In WordPress it is a checkbox labelled “Discourage search engines”. It writes Disallow: / and closes the whole site. The page still loads for you, because you are not a crawler.
- Every version kept, diffed line by line
- Read as Googlebot reads it, longest match first
robots.txt
sitemap.xml
The sitemap generator times out
It answers 200 with nothing in it, or 404s entirely. New pages stop being discovered. There is no error anywhere, because from the server's point of view nothing failed.
- URL count compared with the last crawl
- Indexes and gzipped sitemaps followed
sitemap.xml
No URLs in the sitemap — it listed 415 yesterday, and still answers 200.
<head>
A redesign rewrites the head
Titles get shorter, H1s become styled divs, canonicals all point at the home page. Each change is defensible on its own; together they are a rankings drop that takes a month to show up.
- Title, description, H1 and canonical on every page
- One alert per crawl, however many pages moved
first crawl after the redesign
- <title>rewritten38 pages
- <h1>missing12 pages
- rel="canonical"points at /27 pages
GET /api/v1/changes
A change is a fact. Whether it was a mistake is a separate question.
Which is why a diff here is not coloured red and green. Red would deliver a verdict before anything had decided one.
- Every version of every tracked signal, kept for the life of the site
- Purple, struck through is what it was; blue is what it is
- Red and amber mean severity, and nothing else
/pricing
Before
Pricing — plans from $19 | Harbor Retail
Now
Pricing | Harbor Retail
A change and nothing else. The new title is fine, so no issue opened and nobody was paged — but it is on the record for the day somebody asks.
POST /api/v1/sites/{site}/crawl
Three things happen, on a schedule
There is no plugin, no script tag and no analytics account to connect. Everything SEOtto reads is what any visitor can read.
01fetch
It reads the site the way a crawler does
robots.txt first, then the sitemap — following a sitemap index and un-gzipping where needed — and falling back to a walk of internal links when there is no usable sitemap. That fallback is reported, not hidden.
02record
It records the state of every page
Status, redirect chain, indexability from both the markup and the headers, title, description, H1s, canonical, Open Graph, structured data, word count and link counts. The first crawl is the baseline, and is silent.
03compare
It compares, judges, and only then tells you
Differences become changes — facts, kept forever. Rules turn the current state into issues, which open and close. A message goes out on the edge, never on the twentieth crawl that found the same thing.
GET /api/v1/overview
Fifty client sites, one screen, worst first
The overview sorts by health and never by name. An agency opens it once a morning, and the answer has to be in the first row rather than behind a filter.
- A separate alert channel per client, each with its own severity floor
- A light, print-clean report per site, because it is going into a client deck
- No per-seat pricing — the number that scales is sites
Overview
Verity Legal
verity-legal.example
3 pages set to noindex
52
Ridgeline SaaS
ridgeline.example
robots.txt blocks the entire site
59
Pellet & Fern
pelletandfern.example
Sitemap could not be fetched
59
Harbor Retail
harbor-retail.example
Nothing blocking, 3 notes
97
/#pricing
One site free, for good
Because a monitor you have to pay for before you trust it is a monitor nobody trusts. Paid plans buy frequency, pages and history; every plan runs every check.
Free
One site, checked every day.
$0forever
- 1 site, 25 pages
- Daily crawl
- Email alerts
- 14 days of page snapshots
- Every check in the catalog
Pro
For one site you cannot afford to lose.
$19per month
- 10 sites, 500 pages each
- Hourly crawl
- Email, Slack and webhook alerts
- 180 days of page snapshots
- Per-site alert routing
Agency
For a roster you answer for.
$79per month
- 100 sites, 2,000 pages each
- Hourly crawl
- A separate alert channel per client
- 2 years of page snapshots