Skip to content

Search Console

With Search Console enabled you get:

  • A Search queries dashboard in the Analytics section: clicks, impressions, average CTR and average position for the selected range (compared with the previous period), a daily chart, and the top queries, pages, countries and devices.
  • The Google Search sub-tab on every document’s Analytics tab: Google’s index status for the page (verdict, coverage, last crawl, canonical, fetch and robots.txt state, a link to the URL Inspection tool) and the page’s own queries, countries and devices. PageSpeed Insights fills the rest of that sub-tab when it is enabled too — both are Google’s verdict on the same page.

Everything is read from the Search Console API with a service account. No Google SDK is bundled: the package signs a short-lived JWT with the account’s key and exchanges it for an access token.

  1. Create a service account in Google Cloud Console: IAM & Admin → Service accounts → Create. No roles are needed. Under Keys, add a JSON key and download it.

  2. Enable the API for the project: APIs & Services → Library → Google Search Console API.

  3. Add the account to the property in Search Console: Settings → Users and permissions → Add user, paste the service account’s e-mail (…@…iam.gserviceaccount.com), permission Full or Restricted (both can read).

  4. Configure Umbraco:

    {
    "Flowcourier": {
    "Analytics": {
    "SearchConsole": {
    "Enabled": true,
    "Property": "sc-domain:example.com"
    },
    "Google": {
    "ServiceAccountJson": "{ \"type\": \"service_account\", ... }"
    }
    }
    }
    }

    The key JSON is long: an environment variable (Flowcourier__Analytics__Google__ServiceAccountJson) or a secret store is the natural home. Alternatively point Google:ServiceAccountJsonPath at the file on the server.

Setting Default Description
SearchConsole:Enabled false Shows the dashboard and the Search Console half of the document’s Google Search sub-tab.
SearchConsole:Property SiteUrl + / The property exactly as Search Console lists it: a URL-prefix property (https://www.example.com/) or a domain property (sc-domain:example.com).
SearchConsole:CacheSeconds 900 Server-side cache for search analytics.
SearchConsole:InspectionCacheMinutes 60 Cache for URL inspection results (the inspection API allows about 2 000 calls per day per property).
SearchConsole:RowLimit 100 Queries / pages fetched per report.
Google:ServiceAccountJson — The service account’s key JSON, inline.
Google:ServiceAccountJsonPath — …or a path to the key file.

Settings → Flowcourier → Analytics shows the service account’s e-mail (never the key) so you can check which account needs access.

  • Search Console finalises data with a delay of about two days; the newest days can still change. The dashboard states the latest day that has data.
  • Position is the average ranking — lower is better, and the change arrow is coloured accordingly.
  • Index status is what Google reported when the page was last inspected. The view caches it for an hour; Re-check asks Google again.
  • The per-page figures filter search analytics to the page’s exact public URL (SiteUrl + route). If Search Console knows the page under a different URL (a redirect, a trailing-slash difference), set SiteUrl to match.
Message Meaning
Google rejected the service account The key JSON is invalid or the account was deleted.
The service account has no access to the Search Console property Step 3 above is missing, or Property doesn’t match the property the account was added to.
Search Console does not know the property Property is not spelled exactly as in Search Console (URL-prefix properties need the trailing slash; domain properties need sc-domain:).

Index status: checked on demand, with advice

Section titled “Index status: checked on demand, with advice”

The document’s Google Search sub-tab shows Google’s index status for the page — verdict, coverage state, last crawl, canonical, robots and fetch state — together with what to do about it. The state is translated into one line of advice with a severity:

Google says Advice
Indexed Nothing to do (a note if the page is not in the sitemap).
Excluded by noindex Check the hide-from-search / noindex setting on the page.
Google chose a different canonical Both URLs are shown; usually duplicate content or a language variant pointing at the wrong URL.
Crawled, currently not indexed Content quality or thinness: give the page a clear answer, more substance and links from related pages.
Discovered, currently not indexed Weak internal linking or missing from the sitemap.
Blocked by robots.txt, fetch failed A developer problem; content changes will not help.

A page created less than SearchConsole:PendingDays ago (default 14) that Google has not indexed yet is shown as pending instead of a warning — Google routinely takes days.

The view never asks Google just because it was opened: the URL Inspection API allows 2,000 calls a day per property and each takes seconds. It shows the last known status with the time it was checked, and Check with Google / Re-check asks for a fresh one. The service account needs owner or full permission on the property for inspections; restricted users get a permission error.

Leaving every page’s status to whoever opens the tab means most pages never get checked. With index tracking on (the default once Search Console is enabled), a background job keeps the status fresh for the whole site, so the tab and the “not indexed” finding answer instantly and never call Google on an editor’s request.

The job ticks once an hour. That is what makes the common question — I published this page, has Google got it? — answerable within the hour rather than some time the next day. Each tick:

  1. Once a day, it asks Search Console which pages drew impressions in the last 28 days. A page that appears in search results is indexed by definition, so those pages are marked without spending an inspection. (Only once a day: Search Console’s data is daily-granular and lags a day or two, so asking hourly would return the same rows.)
  2. Everything else — newest pages first — is inspected one URL at a time, up to what is left of the day’s budget.
Setting Default What it does
SearchConsole:IndexTracking:Enabled true Turn off to keep index status on-demand only — and to keep the package free of database tables.
SearchConsole:IndexTracking:DailyInspectionBudget 200 URL Inspection calls the job and manual re-checks share per UTC day. Google’s own ceiling is 2,000 a day per property, so the default leaves room for inspecting by hand in Search Console itself.
SearchConsole:IndexTracking:RecheckDays 7 How long a stored status is trusted before the page is inspected again.

The tick and the re-check interval are different things. The job runs hourly; any one page is re-inspected at most every RecheckDays, because index verdicts move on Google’s crawl schedule — days to weeks, not hours.

The shared budget. Manual re-checks spend from the same daily pot as the job, and the panel shows what is left (“183 of 200 checks left today”). Once it is gone the re-check button is disabled until midnight UTC. If Google itself returns a quota error the job stops for that tick and picks up where it left off on the next one.

Permissions. Inspection needs the service account to be an owner or full user of the property. If it is not, the job records the refusal on the page it was checking, pauses for a day rather than failing on every URL, and the settings page shows the reason.

The table. This is the only feature in the Analytics package that stores anything: FcAnalyticsIndexStatus, one row per document and culture, holding the last known verdict, coverage and crawl date. It is created by a migration on the first start after you enable Search Console with index tracking on — a site that leaves either off never gets the table.