SEO Monitoring Dashboard

· 3 min read

A private dashboard that watches backlinks, Google positions, index status and Core Web Vitals across my own sites — built entirely on free Google APIs, with alerts when something moves.

A private dashboard that watches backlinks, Google positions, index status and Core Web Vitals across my own sites — built entirely on free Google APIs, with alerts when something moves.

At a glance

Problem
Backlinks disappear, positions slide and pages fall out of the index quietly. You find out weeks later, and the tools that would have told you sooner bill by the month.
What was built
A dashboard that watches backlinks, Search Console performance, keyword positions, index status and Core Web Vitals across several sites, and raises an alert when one of them moves the wrong way.
My role
All of it — the data model, the Google API integrations, the scheduler and queue work, the Filament panel and the alerting.
What makes it interesting
Almost everything a paid rank tracker sells is available free from Google’s own APIs. The product is the plumbing: scheduling, storing history and noticing change.
Result
A private tool I and a few people close to me run our own sites on, inside free API quotas, with the history kept so a drop can be dated.

This one is not a client project and not a product you can sign up for. It runs for my own sites and a handful of people close to me, and it exists because the alternative was paying a monthly subscription for numbers Google already gives away.

The problem

Search visibility fails slowly and quietly. A backlink you paid for or earned goes dead when someone redesigns their site. A page drops out of the index after a template change. Your average position slides two places a week for a month, which is nothing on any given day and a lot by the end. Core Web Vitals degrade because a plugin update shipped a heavier script.

None of that announces itself. You notice when traffic is already down and then spend an afternoon working out when it started — and usually you cannot, because nobody was writing the numbers down.

Commercial tools solve this and charge per month per project for it. That is fair for an agency running fifty clients. It is a poor deal when you want to watch a handful of your own sites and the underlying data is free.

What it watches

In one dashboard
  • Backlinks, and whether they are still alive Each link is re-crawled on its own schedule: HTTP status, anchor text, rel attribute, and whether the linking page is still indexed. A 0–100 quality score folds those signals into one number.
  • Search Console performance Clicks, impressions, CTR and average position pulled daily and stored as history — by page, query, device and country, so a drop can be dated rather than guessed at.
  • Keyword positions Tracked keywords get a daily position from Search Console rather than a scraper, with a 30-day trend and the clicks and impressions behind each one.
  • Core Web Vitals, twice over PageSpeed Insights for lab data and the Chrome UX Report for what real visitors actually experienced — mobile and desktop, tracked over time instead of checked once.
  • Index status and sitemaps URL Inspection says whether Google has the page. The sitemap monitor parses robots.txt and sitemap.xml, follows sitemap indexes, and flags pages that are indexed but missing from the sitemap.
  • Alerts, not dashboards to remember to open A lost backlink, an average position down more than three places week over week, a page that stops passing inspection, Core Web Vitals crossing into poor — each raises an alert with a severity.
Projects list — three sites side by side with total links, how many were found on the last crawl, how many were lost, the check interval and when each was last checked

The interesting part: it all runs on free quotas

The reason a tool like this can exist without a subscription is that Google publishes the data through its own APIs, at no cost, to anyone willing to build the plumbing.

API What it gives, and what it costs
Search Console — Search Analytics
Clicks, impressions, CTR, position, broken down by page, query, device and country. 25 000 calls a day, per project; a sync spends five to fifteen.
Search Console — URL Inspection
Whether a specific URL is indexed and why. 2 000 a day per property; the scheduler spends fifty per run on the top pages.
PageSpeed Insights
Lab Core Web Vitals plus performance, accessibility, SEO and best-practice scores. 25 000 a day; two calls per site, mobile and desktop.
Chrome UX Report
Field data — what Chrome users actually experienced, per origin and per URL. 150 a minute, no daily cap.

Those numbers are the whole design constraint. They are generous enough that the system would carry roughly 1 500 projects before Search Console became the limit — which is far more than it will ever need, and the reason nothing here is rationed or paywalled internally.

What you do not get for free is the part that makes it useful: something that calls those APIs on a schedule, keeps the answers, compares today against last week, and tells you when the comparison is bad. That is the product.

Backlinks table for one site — each row the linking page and its domain, the anchor text, whether the link is still Found, Not Found or Blocked, its rel attribute, the HTTP code the last crawl got back, whether the linking page is indexed, and a 0–100 quality score, with actions to add a link, bulk import or re-check them all

How it stays current

The schedule
  1. Job 1

    Backlinks — every minute

    Not every link every minute: the runner picks up whichever links are due for a re-check, so crawling spreads out instead of arriving as one daily spike.

  2. Job 2

    Search Console — daily, 05:00

    Yesterday’s performance and the tracked keywords, written into history tables the charts read from.

  3. Job 3

    Index status — daily, 06:00

    URL Inspection across the top pages, capped per run so the daily quota is never the thing that breaks.

  4. Job 4

    Core Web Vitals — Mondays

    PageSpeed Insights, then the Chrome UX Report half an hour later. Weekly, because field data moves on a 28-day window and daily polling would tell you nothing new.

  5. Job 5

    Sitemaps — Mondays, 08:00

    Re-parse, re-compare against what is indexed, and surface the difference.

Everything heavier than a single HTTP call goes through a queue rather than the scheduler itself, so a slow crawl or a rate-limited API never holds up the rest of the run.

Core Web Vitals for one site — a performance score trend for mobile and desktop over five months, then lab figures from PageSpeed Insights (mobile 87, desktop 70, SEO 92, accessibility 100, best practices 100, LCP 3.6s, CLS 0.008) and field figures from the Chrome UX Report (LCP 1.9s good for 86.4% of visits, INP 154ms, CLS 0.070)

My role

All of it. The project is mine end to end: the data model — twenty-five tables, most of them history rather than current state — the OAuth flow against Search Console, the three Google API clients, the scheduler and queue workers, the Filament panel, the charts and the alerting rules. Ninety-eight commits over about three and a half weeks in April 2026.

Result

  • Drops can be dated Because the numbers are written down daily, "when did this start" has an answer instead of a guess.
  • No subscription The data was always free; what was missing was something to collect it. Running cost is a small server and nothing else.
  • Alerts that fire — and need tuning Lost links and slipping positions raise alerts rather than waiting to be noticed. Four thousand of them are currently unread, which is its own lesson: an alert nobody can act on is noise, and the thresholds are the unfinished part.
Alerts list — 4 090 of them, each a lost backlink with the linking domain and the HTTP code that killed it, tagged by project and type, with read state and how long ago it fired

Technologies

Laravel

The application, the scheduler and the queue workers that do every piece of work heavier than one HTTP call.

Filament

The admin layer: tables, filters, charts and the alert views, so the interface followed the data model instead of being built twice.

MySQL

Twenty-five tables, most of them daily history — the part that turns a live reading into a trend.

Google Search Console API

OAuth per user, Search Analytics for performance and positions, URL Inspection for index status.

PageSpeed Insights & CrUX

Lab and field Core Web Vitals, mobile and desktop, kept over time rather than sampled once.

Back to portfolio

Related posts

Read more