Check in bulk which of your pages Google has actually indexed
Paste a batch of URLs or pull them from your sitemaps, then see coverage, canonicals and crawl dates for every page in one sortable table.
Build me an indexing triage console for Google Search Console. Search Console only lets me inspect one URL at a time, so I want a screen where I can throw a whole batch of URLs at it and see, in one table, which pages Google has actually indexed and which it has quietly skipped.
At the top of every view there is a property picker. A handler calls Google Search Console List Sites to populate it, and the selected siteUrl is passed verbatim to every other handler, because an inexact property string silently returns empty data instead of erroring. Remember the last selected property per viewer so the app opens where they left off.
The main surface is the batch inspection view. It has two ways to load URLs: paste them into a textarea (one per line, deduplicated and trimmed), or load them from the property's submitted sitemaps. Once a batch is staged, show the count, an estimate of how long the run will take, and a Run inspection button. The run itself loops Google Search Console Inspect URL across the batch in a handler, writing each result into app storage as it lands, and the UI shows a live progress bar with the number completed, the number remaining and the current URL.
Throttling matters here. Google caps URL inspection at 2,000 checks per day and 600 per minute per property, so the run must pace itself under both limits, track how much of the daily allowance this property has already consumed, and display that remaining budget before the user commits to a batch. If a batch is larger than the remaining daily allowance, warn before starting and offer to inspect as many as will fit. Treat a 429 response as quota exhaustion: stop the run cleanly, keep every result already collected, and show a plain message saying the daily quota is used up and the rest of the batch can resume tomorrow, with a Resume button that picks up exactly where it stopped.
Results land in a sortable, filterable table with one row per URL. Columns: the URL, coverage state, indexing verdict, Google-selected canonical, my declared canonical, last crawl date, mobile usability status and rich results status. Every column sorts, and there is a free-text filter on the URL. Above the table put one-click filter chips for the three views I care about most: not indexed, crawled but not indexed, and canonical mismatch (Google-selected canonical differs from the declared one). Each chip shows its own count. Colour-code the verdict column so a bad row is obvious at a glance, and let me select rows with checkboxes.
A second panel lists the property's sitemaps. Populate it with Google Search Console List Sitemaps, then Get Sitemap for per-sitemap detail, showing for each one: the sitemap path, its type, last submitted and last downloaded dates, submitted versus indexed page counts, and its error and warning totals. Flag any sitemap with errors, and any where indexed is far below submitted. Note that the errors, warnings, contents.submitted and contents.indexed fields sometimes come back as strings, so cast them to numbers before comparing or summing, and sitemap feedpath values must be URL-encoded when used in a request path.
Each sitemap row gets a Resubmit sitemap button backed by Google Search Console Submit Sitemap. That call returns an empty body on success, so treat the HTTP status as the signal, then show a confirmation toast and refresh the row. Because Google's sitemap counts, especially the indexed count, can lag the live state by several days, every number in this panel and every inspection result in the table must be date-stamped with when it was fetched, and the panel should carry a short line explaining that these counts are Google's last known figures rather than a live reading.
Every table row gets a File fix ticket button that creates a Linear issue through Create Issue, prefilled with the URL in the title and a description carrying the coverage state, indexing verdict, Google-selected canonical, declared canonical, last crawl date and the date the inspection was run. Let me pick the Linear team once in settings and reuse it. Once a ticket exists for a row, show its identifier inline and link out to it instead of offering to create a duplicate.
The app also has a Diagnose these URLs button that kicks off a background agent over the currently flagged or selected rows. The agent reads the inspection results, groups the URLs by likely root cause (canonical conflicts, soft-404 patterns, orphan pages that appear in no submitted sitemap, thin or duplicate clusters), and can call Google Search Console Inspect URL again on a few representative URLs and List Sitemaps to confirm whether a page is actually orphaned. It then writes a prioritized remediation plan back into the app, one section per root cause, ordered by how many URLs each cause explains, with the concrete fix and the affected URLs listed under it. Finally it files one Linear issue per root cause using Create Issue, with the grouped URL list and the recommended fix in the description, and adds a comment through Add Comment to Issue linking back to the plan in the app. One grouped issue per cause, never one issue per URL.
The agent's output lands in a Diagnosis panel inside the app, showing the run status while it works and then the plan itself, with each root cause section linking to the Linear issue it filed and to the matching filtered view of the table. Keep past diagnosis runs so I can compare this week against last week.
Persist inspection results per property so the table survives a reload and I can see how a URL's verdict has changed since the previous run, highlighting rows whose verdict moved since last time. Handle the obvious failure modes plainly: no verified properties on the account, a property the account cannot access, an empty sitemap list, and a run interrupted partway through.
What does this prompt do?
- Checks hundreds of your pages against Google in a single run instead of pasting them into Search Console one URL at a time, with a live progress bar while it works.
- Lands every result in a sortable, filterable table: is the page indexed, which version Google picked as the canonical, when it was last crawled, and how it scored on mobile usability and rich results. One-click filters pull up not indexed, crawled but not indexed, and canonical mismatch.
- Shows a sitemap panel with submitted versus indexed counts for each sitemap plus its error and warning totals, and a button to resubmit any sitemap that has gone stale.
- Includes a Diagnose button that hands the problem rows to a background agent, which groups them by likely root cause, writes a prioritized fix plan back into the app, and files one grouped ticket per cause in Linear instead of one ticket per URL.
What do I need to use this?
- A Google account with owner or full access to the site you want to check in Search Console
- At least one sitemap submitted in Search Console, or your own list of URLs to paste in
- A Linear workspace if you want to file fix tickets, plus the team those tickets should land on
How can I customize it?
- Set the batch size and pacing so a large site gets worked through over several days within your daily checking allowance
- Change which columns the table shows and which quick filters sit above it, for example adding a mobile-only or rich-results-only view
- Point the ticket button at Jira or Asana instead of Linear, and preset the team, project or label every ticket should land on
FAQs
Why can't I just do this in Search Console?
How many URLs can I check per day?
Why don't the sitemap indexed counts match what I see elsewhere?
Does this ask Google to index my pages?
What does the Diagnose button actually do?
Do I need to be a developer to use this?
Related templates
Every weekday we compare your staging and production feature settings and flag only the differences that could be hurting customers.
Rank every incident.io alert route by how much noise it makes, see which alerts never became real incidents, and tune the worst offenders every week.
See every overnight browser run that failed, watch the replay, and let an agent tell you whether the site changed or your own script broke.
Open one board each morning to see every flag stuck partway through a rollout, how long it has sat there, and ramp or roll back with one click.
A board that ranks the people who opened three or more separate support conversations this month, reads their threads, and files the real fix.
A board your product marketer opens on every ship day to turn finished engineering tickets into announcements customers actually read in your Messenger.
Stop inspecting URLs one at a time.
Check your whole site's indexing status in one pass, see exactly which pages Google skipped and why, and send the real problems straight to your team.