Page MenuHomePhabricator

Reviewed new articles not indexed on Google
Open, Needs TriagePublic

Description

Impact

New articles on English Wikipedia often take weeks or months to surface in Google Search. DuckDuckGo and other search engines seem unaffected. Most (all?) other Wikipedias and non-Wikipedias also seem unaffected.

These new articles can be relevant to breaking news, and present an important opportunity to share knowledge and draw a reader to Wikipedia. New articles should be indexed and surfaced by Google Search as quickly as possible.

Google often does index new articles within minutes of their creation. Likewise, edits to existing articles often reflect in excerpts on their SERP within minutes. However, some articles consistently remain unindexed for many months which is an unacceptably long period of time.

Problem

On 10 Feb 2026, it was reported in WP:VPT that an article created in July 2025 was still not returned in Google search results more than six months later, yet is indexed just fine in DuckDuckGo. The article in question is Nova Scotia Guard, created 1 July 2025 and patrolled 6 September 2025 (log).

On 25 Feb, @tstarling confirmed that the patrol action updates page_touched, which updates the last-modified tag in the sitemap, signalling that the page is ready to be recrawled and indexed.

My current theory is is that it is caused by a combination of these factors:

  • The page is created by a user who is not autopatrolled.
  • Google first crawls the page creation within pages of its creation (i.e. via RCFeed), which is generally a good thing. It sees the page in the noindex and honours that, which is good per the spam issue described below.
  • Google retains this information and thus ignores future edit events from RCFeed, and approximately never recrawls it passively to see if the page contents (or robots tag) changed.
  • Google does not currently use a sitemap for en.wikipedia.org.

Background: How stuff works

New articles sometimes require review from a patroller before they are indexable by search engines. This works via Extension:PageTriage ($wgPageTriageNoIndexUnreviewedNewArticles = true; $wgPageTriageMaxAge = 90;) and is enabled on English Wikipedia. The extension adds a "noindex" meta tag to the HTML head when we render web pages for articles that are unreviewed and less than 90 days old. Articles created by autpatrolled are considered reviewed from the get to.

This means articles not created by "autopatrolled" editors are initially kept outside external search engines, until they are reviewed or survive 90 days without deletion. This is a good thing as it protects our domain reputation from spam and vandalism in the most valuable SEO position: the page title; and discourages such actions at scale in the first place.

The sitemaps we have are dynamically served on-demand and include all indexable pages with their URL and last-modified timestamp. Sitemaps are cached for upto one hour. When a page is edited or patrolled, this sets the page's last-modified timestamp (aka page_touched).

For example:

  • 31 March 2026 00:23: A new user creates Sports Riot (Newspaper).
  • 31 March 2026 01:30: One hour later, it has not yet been patrolled. And indeed, when we view the page and check the source of the HTML web page, there is a "noindex" meta tag. It is also omitted from the relevant sitemap chunk.

Another example:

Note that just because an inexperienced editor initially created a page, says nothing about its current content or reliability. Within a few minutes or hours, experienced editors tend to write, fix, extend the content as they see fit.

We know that Google subscribes to our RCFeed and may decide (based on heuristics and priorities) for a subset to crawl a page within a minutes of a page being created or edited. We also know that Google crawls the sitemap once a day to discover new or changed pages as a reliable fallback for stuff not otherwise prioritized. The feeds, pipelines, caching, crawling is all there. This usually works correcty and efficiently.

Screenshot 2026-04-13.png (850×563 px, 63 KB)

There are 14 million pages on en.wikipedia.org currently indexed by Google according to its Search Console. It has also found over 80 million links that it decided not to index, such as:

  • Random gargage pointing to a 404 Not Found, e.g. /w/does_not_exist.html
  • non-canonical URL, e.g. /wiki/Foo?something=bogus123
  • <meta> robots "noindex", including:
    • old revisions, /w/index.php?oldid=123
    • non-view action, /w/index.php?title=Einstein&action=history, /w/index.php?title=Einstein&action=edit
    • local search, /w/index.php?title=Special:Search&s=foo+123
    • new unpatrolled article, /wiki/Something_New

While Google does re-crawl a small trickle of these (perhaps based on inbound links or sitemaps?), generally speaking a search engine does not (and should not) proritize re-crawl the infinitely many URLs it has ever found in the wild. Doing so would take away crawl quota it could spend on more relevant and higher value pages instead. For most of the web, this rarely changes, and it is even less likely for it to be relevant/urgent.

However, there are cases outside Wikipedia as well. For example, I can see a company website creating new product pages, blog posts, or press releases as noindex while the page is being drafted or publicly tested before wider announcement. Given that most websites don't have an equivalent to RCFeed, these pages are not likely to be linked or discovered from anywhere until after the "noindex" tag is removed. But, it's still possible that such page may be leaked on Reddit, social media, where Google stumbles upon it. It would be annoying if such page then remains un-indexed for weeks or months despite high relevance to current events.

Expectation

We hope the signals should suffice to prioritize re-crawling in search engines:

  • Included in the sitemap. This strongly implies it can be indexed, because sites generally do not include noindexed pages in an indexing sitemap.
  • Not previously seen in the sitemap. This rules out strange cases of a site listing a noindexed page in their sitemap for a no reason (MediaWIki doesn't do this, but I'm sure search engines encounter bad sitemaps).
  • The sitemap entry has a last-mod timestamp after the last crawl attempt.

Beyond that:

  • The last crawl included a <link rel=canonical> pointing to self, reflecting it isn't wild bogus.
  • First-party inbound links, reflecting it isn't wild bogus.
  • A past crawl was initiated by RCFeed, reflecting it wasn't wild bogus.

In terms of RCFeed, it seems fair to ignore a page there once seen as noindex until something else flips it. There are many namespaces and page patterns that are essentially permanely no-indexed and so would be wasteful (e.g. user pages, talk pages, project pages, various meta discussions and archives etc).

See also

Event Timeline

26 Feb 2026 Update

Last year we submitted sitemaps in Google Search Console for these domains. This was for unrelated investigations/experiments (e.g. T400022, T380573).

  • commons.wikimedia.org
  • uk.wikipedia.org
  • nl.wikipedia.org
  • en.wiktionary.org
  • en.wikibooks.org

Sitemaps have been available on all 1000+ WMF wikis since July 2025, and advertised in robots.txt.

I noticed in our logs that Googlebot does not fetch sitemaps for enwiki, and indeed basically for no wikis other than those we manually submitted in Google Search Console last year.

--- spark-sql (default)>
SELECT uri_host, COUNT(*) _reqs
FROM wmf.webrequest
WHERE year=2026 AND month=2 AND day IN (20,21,22,23,24,25)
AND webrequest_source='text' AND uri_path LIKE '/w/rest.php/site/v1/sitemap/0%'
AND isp_data["isp"]='Googlebot' AND http_status=200
GROUP BY uri_host ORDER BY _reqs DESC;
uri_host                 _reqs   _chunks _days  _per_day
commons.wikimedia.org   109910 / 18508 / 5    = 1.2
en.wiktionary.org       4919   / 1151  / 5    = 0.9
uk.wikipedia.org        3511   / 592   / 5    = 1.1
nl.wikipedia.org        3287   / 602   / 5    = 1.1
en.wikibooks.org        269    / 48    / 5    = 1.1
myv.wikipedia.org       23
et.wikiquote.org        3
Fetched 7 row(s)

myvwiki and etwiki are an outlier where it seems to have picked up a sitemap we didn't submit. I don't know why just those two, but it didn't for the other ~1000 wikis.

30 Mar 2026 Update

SELECT uri_host, COUNT(*) _reqs FROM wmf.webrequest WHERE year=2026 AND month=3 AND day IN (24,25,26,27,28,29) AND webrequest_source='text' AND uri_path LIKE '/w/rest.php/site/v1/sitemap/0%' AND isp_data["isp"]='Googlebot' AND http_status=200 GROUP BY uri_host ORDER BY _reqs DESC;
uri_host                _reqs    _sitemap_chunks  _days   _per_day
commons.wikimedia.org   111641 / 18756          / 5     = 1.2
en.wiktionary.org       5047   / 1157           / 5     = 0.9
en.wikibooks.org        268    / 48             / 5     = 1.1
uk.wikipedia.org        26     / 594            / 5     = 0.0
nl.wikipedia.org        18     / 603            / 5     = 0.0
pl.wikiquote.org        3       …
Fetched 6 row(s)

In GCS under nl.wikipedia.org > Sitemaps, only 3 of the 604 chunks appear to be fetched from the sitemap:

  • /w/rest.php/site/v1/sitemap/0/page/0 (Success; last read: Mar 31, 2026)
  • /w/rest.php/site/v1/sitemap/0/page/1 (Success; last read: Mar 31, 2026)
  • /w/rest.php/site/v1/sitemap/0/page/10 (Success; last read: Mar 31, 2026)

None of the other 600 chunks are listed in GCS, which might explain why it has so few requests. But, this narrow appearance in GCS was the case last month as well, and last month nl.wikipedia.org did have all its sitemap chunks fetched by Googlebot.

In any event, en.wikipedia.org remains absent.

On 31 Mar 2026, I manually submitted the sitemap for en.wikipedia.org in GCS. This is now fetched daily and working as expected.

Googlebot is still broken in its fetching from nlwiki and ukwiki for unknown reasons.

Googlebot still has not discovered the sitemaps of all other wikis, despite advertising in robots.txt. Bing did discover this correctly and automatically for all wikis, starting last year shortly after we deployed it in June 2025.

spark-sql (default)> SELECT uri_host, COUNT(*) _reqs FROM wmf.webrequest WHERE year=2026 AND month=4 AND day IN (8,9,10,11,12) AND webrequest_source='text' AND uri_path LIKE '/w/rest.php/site/v1/sitemap/0%' AND isp_data["isp"]='Googlebot' AND http_status=200 GROUP BY uri_host ORDER BY _reqs DESC;
uri_host                _reqs   _sitemap_chunks  _days  _per_day
commons.wikimedia.org   94291 / 18906          / 5    = 0.99
en.wikipedia.org        49522 /  8294          / 5    = 1.19
en.wiktionary.org       4252  /  1160          / 5    = 0.73
en.wikibooks.org        222   /    49          / 5    = 0.91
nl.wikipedia.org        25    /   604          / 5    = 0.00
uk.wikipedia.org        23    /   596          / 5    = 0.00
Time taken: 575.494 seconds, Fetched 6 row(s)

Bing Webmaster Tools shows 350 sitemaps discovered in 2025 and regularly crawled. Technically we have 365 Wikipedia sites, so a dozen are missing from Bing. From a few random ones I checked I noticed that aa.wikipedia, ak.wikipedia, and ten.wikipedia were missing (these are closed/inactive).

Screenshot 2026-04-13 at 09.08.34.png (2,208×1,628 px, 342 KB)

@Krinkle: I've been watching the page indexing stats in GSC to track # of indexed and non-indexed pages per day on enwiki after you submitted the sitemap. Looks like about 300K pages went from non-indexed to indexed from April 3-6, but after that there's been no subsequent change (though data is only being reported up to April 9, so maybe we'll see another jump later this week).

Adding here the sketch of the follow-up script we were discussing making, to evaluate the impact of sitemap submission:

All newly created articles not created by autopatrolled users (from our data) OR less than 90 days old (= labeled indexable in our db)
Patrolled status (from our data)
Daily pageview count (from our data)
Indexed status (from regular call to Google API)

Upon further reflection, I think what we need is more like:

A daily updating table of:

  1. All enwiki articles <= 90 days old as of March 31 (we want to focus just on articles we expect the sitemap submission to have indexed, and to capture both manually and autoreviewed articles)
  2. Creator has autoreview status (capturing whether we expect this article to be manually reviewed or not – if true, then we expect this page to be indexable without a marked-as-reviewed-date on date of page creation; I think the applicable user-rights to look for are "confirmed" and "admin"; bots can also have autoreview status but bots shouldn't be creating ns0 pages on enwiki https://en.wikipedia.org/wiki/Wikipedia:User_groups#Table) )
  3. Page creation date (to know when a page made by a creator w/autoreview rights should have been made indexable)
  4. Marked as reviewed date (capturing date of manual review action if applicable, to know when a manually-reviewed page should have been made indexable)
  5. Indexed date (from a check of the Google API; blank if not yet indexed)

If we have this data in a daily-updated table, I believe we should be able to answer the following questions:

  • Pre sitemap submission, how many articles were eligible to be indexed, and how many of these have been indexed over time?
  • What is the average lag-time in indexing, and how is that changing over time?
  • Are there differences in autoreviewed vs. manually-reviewed indexing lag?
  • What is the pageview impact of a page going from "available to be indexed but not indexed" to "indexed"? (I believe we could get this from a separate query of daily pageviews data, calculating the total PVs week before/after "Indexed date" and comparing to an equally-sized subset of the pages not yet indexed)

Does this sound more sensible to you? Does the data structure match the suggested research questions here? Plz let me know if there's anything wonky in my thinking or if there's an opportunity to simplify.

Also, do you have access to the BigQuery data? If the full list of "discovered, not yet indexed" pages from the enwiki sitemap has been imported there, I think that would be a much easier/more direct way to get the above insights, so worth checking this first!

[…]

All newly created articles not created by autopatrolled users (from our data) OR less than 90 days old (= labeled indexable in our db)

This doesn't seem right. I believe you want one of these:

  • Articles by autopatrolled users OR more than 90 days old (=indexable)
  • Articled not by autopatolled users AND less than 90 days old (=not indexable)

A daily updating table of:

  1. All enwiki articles <= 90 days old as of March 31 (we want to focus just on articles we expect the sitemap submission to have indexed, and to capture both manually and autoreviewed articles)
  2. Creator has autoreview status (capturing whether we expect this article to be manually reviewed or not – if true, then we expect this page to be indexable without a marked-as-reviewed-date on date of page creation; I think the applicable user-rights to look for are "confirmed" and "admin"; bots can also have autoreview status but bots shouldn't be creating ns0 pages on enwiki https://en.wikipedia.org/wiki/Wikipedia:User_groups#Table) )
  3. Page creation date (to know when a page made by a creator w/autoreview rights should have been made indexable)
  4. Marked as reviewed date (capturing date of manual review action if applicable, to know when a manually-reviewed page should have been made indexable)
  5. Indexed date (from a check of the Google API; blank if not yet indexed)

[…]

I would suggest excluding redirects from the dataset. These are probably less of a concern for us I think, and could make data noisy due to being treated differently (they tend to serve as aliases for the destination page, I don't know if Google does or even should care much about their individual indexing status, and afaik GCS Inspect returns data for the destination which can be confusing.)

For the creator and review date, it might be more reliable (and simpler) to directly check the wiki page for its current "robots" status, rather than to try guess or re-construct it. So instead of looking at age, creator, and their autopatrol status (which is hard because users can get that right various different local groups as well as global groups; and sometimes these are granted temporarily in a way you might not see after the fact), we can check it like so:

Indexable
https://en.wikipedia.org/wiki/Banana

<meta name="robots" content="max-image-preview:standard">
Not indexable
https://en.wikipedia.org/wiki/The_Note_Processor_(software)

<meta name="robots" content="noindex,nofollow,max-image-preview:standard">

I'd perhaps go about it like this: For enwiki NS=0 non-redirect articles created after March 31, track:

  • URL
  • MW Page creation timestamp
  • MW Indexable timestamp (first time you saw indexable, null until then, keep unchanged after that)
  • GCS First crawl date
  • GCS First crawl status (indexed or noindexed, keep unchanged)
  • GCS Indexable date (null until indexed, keep unchanged after that)

Then when you refresh the data:

  • Skip, if already known to be GCS indexed.
  • Add new row if needed, get page creation timestamp, and set it.
  • If no MW indexable date, check article HTML, and set todays date if now indexable. I like the idea of getting the "Mark as patrol" date from the patrol log, as that lets you backdate things more accurately regardless of when you run the daily script. Though you'll only find that if it was created by non-autopatrolled, and if it became indexable due to a patrol action (rather than by age). I'd say, when you find it is indexable, then iff you find a patrol acton, use that timestamp, otherwise default to todays date (i.e. autopatrolled, or old enough).
  • If no GCS first crawl, check, and set if so. If indexable, set indexable date to GCS's crawl date.
  • If no GCS indexed date, check, and set indexable date to GCS's crawl date.

It then breaks down into a funnel like this:

  • All NS0 non-redirect articles
    • Articles that need/needed patrolling: Rows with a gap between "Page creation" and "MW indexable" tell us that the article was initially created with "noindex" state.
      • Articles that may suffer from the Google bug: Rows with a "GCS first crawl status = noindex". Google crawled the unpatrolled article soon enough after creation that it knows about the noindex status. It is then a question as to whether the sitemap and other signals will overcome that status for it to recrawl and index it later.
        • Articles currently affected: Rows with a MW indexable date but not yet GCS indexed.

Assuming daily sitemap ingestion by Google, and not considering any other signals and limitations, then I'd expect articles that had a GCS first crawl with "noindex", get a GCS indexed date around 24 hours after the MW Indexed date.

Correction: New pages that are temporarily marked "noindex" by the PageTriage extension are included in the sitemap. I mistakenly wrote above that only indexable pages are included in the sitemap. While this is mostly true, it misses a notable exception specific to en.wikipedia.org. I don't think we'll change this (reasons below) and the overall expectation/hope from Google stays the same: When a page is included in the sitemap the <lastmod> field should be followed as usual. We don't put anything in our sitemap that is indefinitely not indexable. On en.wikipedia.org specifically (due to the PageTriage extension) some entries may be temporarily tagged "noindex". Whenever the page is edited, including when it is patrolled/becomes indexable, <lastmod> is increased.

From the task description:

[…]
On 25 Feb, Tim Starling confirmed that the patrol action updates page_touched, which updates the last-modified tag in the sitemap, signalling that the page is ready to be recrawled and indexed.

This is correct, and this correctly implies that the page was already in the sitemap. And indeed, generally, it is. I shouldn't have contradicted this.

From the task description:

[…]
The sitemaps we have are dynamically served on-demand and include all indexable pages with their URL and last-modified timestamp. Sitemaps are cached for upto one hour. […]

For example: […] One hour later, it has not yet been patrolled. And indeed, when we view the page and check the source of the HTML web page, there is a "noindex" meta tag. It is also omitted from the relevant sitemap chunk.

Another example: […] One hour later, when we view the page, there is not a "noindex" instruction in the page's HTML source. And unlike the other page, it is included and discoverable in that same sitemap chunk.

My emperical test above must have been a false negative. I made sure to pick one from at least an hour ago, but whether through timezone confusion or two-layered caching, I must have been looking at stale cache predating the page's creation.

What we know:

  • In MediaWiki core, the way to mark a page as not indexable is through the __NOINDEX__ magic word in the wikitext content. This is stored in the database, it lasts indefinitely (untli someone edits the page to remove that mark), and is commonly used to opt-out of search engines on one's user page, or on discussion archives, etc.
  • The MediaWiki PageTriage extension is configured on en.wikipedia.org specifically, to use a runtime hook at the time of serving a pageview on articles created by a typical user (i.e. not an experienced user with the autopatrol right), and the article is less than 90 days old, and it was not yet patrolled by someone; then this hook adds the meta robots=noindex tag to the HTML head. This tag is not stored in the database. It is a temporary override determined when viewing the page.
  • In MediaWiki core, when generating sitemaps on the fly, we exclude pages marked in the database as having __NOINDEX__ in the wikitext content.

So what's true is that pages explicitly marked as not-indexable through wikitext, are excluded in mediawiki/SitemapGenerator.php (because it is cheap and easy to do so, and would because it would be undesirable to expose these more than needed). However, the enwiki-specific logic of automatically setting "noindex" on articles not yet patrolled and <90 days, happens dynamically at runtime during the pageview generation. It is not in the database and thus not excluded from the sitemap. Doing so with a naive hook in the PageTriage extension would be to slow to repeat 10,000 times, but something tailor fit might work.

I'm not sure this actually matters, though, because the index issue with enwiki new pages predates our sitemap submission to Google for enwiki. We also know from our request logs that Google didn't fetch our sitemaps prior to that. It only fetches sitemaps on wikis where we manually submitted one. The too-early-discovery issue thus must originate elsewhere (e.g. RCFeed or organic links from another web pag). Having said that, it is possible that sitemaps might make it worse.

Example: https://en.wikipedia.org/w/index.php?title=Special:NewPages&hideredirs=1&hidepatrolled=1 (pick one 2+ hours old)