Favicon not showing in google search: 27 homepages, 7 files that break a written rule
A favicon not showing in google search is usually a file problem, not a tag problem. Of 27 homepages we could read, all declare an icon and every declaration resolves, but 5 point at a format Google's documentation does not list and 2 more are not square.
FIELD TEST · 2026-09-14 · 30 homepages · 27 icons downloaded and decoded · one pass
Sample and method: the 30-domain panel this series has used since 2026-08-15, one request per homepage on 2026-09-14 with a desktop Chrome user agent and no JavaScript. For each homepage we then requested the icon file it points at and decoded that file, so every size below is the real pixel size rather than the sizes attribute the page declares.
A favicon not showing in google search is usually a file problem, not a tag problem. On the 27 homepages we could read, all 27 declare an icon and every declaration returns 200 — but 5 point at a file in a format Google's documentation does not list, and 2 more are not square. That is 7 files failing a requirement Google publishes in writing, on sites with full-time platform teams.
How we measured
One homepage request per domain, then one request for the icon file. We parsed every <link> whose rel value names an icon, picked the first one Google's documentation lists as a favicon source, and downloaded it. Dimensions come from decoding those bytes, which is the step the earlier survey of this panel deliberately skipped.
curl -s -o home.html -w "%{http_code}\n" \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/126.0 Safari/537.36" \
https://example.com/
python3 -c "
from html.parser import HTMLParser
from urllib.parse import urljoin
from PIL import Image
import io, urllib.request
class Icons(HTMLParser):
def __init__(self): super().__init__(); self.hrefs = []
def handle_starttag(self, tag, attrs):
a = dict(attrs)
rel = (a.get('rel') or '').lower().split()
if tag == 'link' and 'icon' in rel:
self.hrefs.append(a.get('href', ''))
p = Icons(); p.feed(open('home.html').read())
url = urljoin('https://example.com/', p.hrefs[0])
raw = urllib.request.urlopen(url).read()
im = Image.open(io.BytesIO(raw))
print(url, im.format, im.size)
"
| Check | Source of the rule | Result |
|---|---|---|
| Homepage returns 200 | — | 27 of 30 |
| Declares at least one icon | Google favicon doc | 27 of 27 |
| First icon returns 200 | Google favicon doc | 27 of 27 |
| File format is listed | BMP, GIF, ICO, PNG, JPEG, PPM, TIFF | 22 of 27 |
| File is square | 1:1 aspect ratio | 22 of 24 decoded |
What Google's favicon documentation actually requires
Google's favicon guidelines are short and specific, which is what makes them useful as a checklist. The favicon documentation was last updated 2026-08-28 UTC when we fetched it on 2026-09-14, and it states the file requirements in one paragraph.
"Your favicon must be a square (1:1 aspect ratio) that's at least 8x8px. While the minimum size requirement is 8x8px, we recommend using a favicon that's larger than 48x48px so that it looks good on various surfaces. Google Search supports the following favicon file formats: BMP, GIF, ICO, PNG, JPEG, PPM, and TIFF." — Google Search Central, favicon documentation, retrieved 2026-09-14
Three other lines on the same page matter for this measurement. The favicon URL "must be stable". Googlebot-Image "must be able to crawl the favicon file" and Googlebot must be able to crawl the home page. And the page is explicit that none of this is a ranking factor and no outcome is promised: a favicon "isn't guaranteed to appear in Google Search results, even if all guidelines are met".
The 27 icons, decoded
Every readable homepage declares an icon, so the interesting number is what the file turns out to be. The table is sorted by domain; — means the file is a vector image our decoder cannot measure in pixels.
| Site | Format | Pixels | Square |
|---|---|---|---|
| about.gitlab.com | ico | 48x48 | yes |
| arstechnica.com | png | 60x60 | yes |
| github.com | svg | — | — |
| news.ycombinator.com | svg | — | — |
| nextjs.org | ico | 48x48 | yes |
| railway.com | ico | 48x48 | yes |
| react.dev | png | 32x32 | yes |
| slack.com | png | 35x34 | no |
| stripe.com | svg | — | — |
| substack.com | ico | 32x32 | yes |
| supabase.com | ico | 16x16 | yes |
| techcrunch.com | webp | 32x32 | yes |
| vercel.com | ico | 48x48 | yes |
| webflow.com | png | 32x32 | yes |
| www.bbc.com | png | 32x32 | yes |
| www.cloudflare.com | png | 99x96 | no |
| www.figma.com | png | 128x128 | yes |
| www.framer.com | png | 64x64 | yes |
| www.mozilla.org | png | 196x196 | yes |
| www.netlify.com | ico | 48x48 | yes |
| www.notion.com | ico | 64x64 | yes |
| www.nytimes.com | png | 48x48 | yes |
| www.reddit.com | png | 64x64 | yes |
| www.shopify.com | webp | 32x32 | yes |
| www.theverge.com | ico | 48x48 | yes |
| www.wikipedia.org | ico | 48x48 | yes |
| www.wired.com | ico | 16x16 | yes |
Two columns are worth reading against the declared markup rather than the file. Sixteen of the 27 icons live on a different hostname from the homepage — a CDN, in every case — and 16 of the 27 pages declare no sizes attribute at all. Neither is a problem by itself, because Google reads the file, not the attribute. It just means the markup tells you less than it appears to.
Why a favicon not showing in google search is usually about the file
Google's supported-format list has seven entries and SVG is not one of them, nor is WebP. Five of the 27 homepages point their primary icon at a file in one of those two formats, and in two of the five the declared type disagrees with what the server actually sent.
| Site | Declared type | File served |
|---|---|---|
| github.com | image/svg+xml | svg |
| stripe.com | image/svg+xml | svg |
| news.ycombinator.com | (none) | svg |
| www.shopify.com | image/png | webp |
| techcrunch.com | (none) | webp |
GitHub is the clearest case, and it is a good illustration of why the declaration alone is not enough. Its rel="icon" is an SVG, which is the rel value Google documents; its PNG is declared as alternate icon, which is not a rel value on Google's list. So the supported rel points at an unsupported format and the supported format sits under an unlisted rel.
The two WebP files are the opposite failure. Shopify declares type="image/png" and TechCrunch declares nothing, and both servers return image/webp at a URL ending in .png. The markup looks compliant and the bytes are not.
Two icons are not square
The square rule is written as a must, and two large sites break it. Cloudflare's /favicon.ico is a 99x96 PNG, and Slack's favicon-32.png is 35x34 despite a declared sizes of "16x16 32x32 48x48". Both files decode cleanly; neither is square.
We cannot tell from the outside what Google does with them. Both sites have shipped those files for years and both are large enough that someone would have noticed a blank icon, so the likely explanation is that Google pads or scales a near-square image rather than dropping it. That is a guess, and it is the one place where this measurement stops.
The size recommendation is the softer rule, and it is the one most sites miss. Ten of the 24 decodable icons are smaller than the recommended 48x48 — eight are exactly 48, and seven are larger. Every one of them still clears the hard 8x8 minimum, so none of this is a failure; it is just a file that will look worse on the surfaces that draw it large.
The icon that looked blocked and was not
Google requires Googlebot-Image to be able to crawl the icon, so we checked every icon path against the robots.txt of the host that actually serves it. Not one of the 27 is blocked — and the site that looked blocked is the instructive one.
Reddit's icon is a 64x64 PNG on www.redditstatic.com, and that host's robots.txt opens with User-agent: * and Disallow: /, with a short list of allowed paths that does not include the icon. Read that far and the icon is blocked. But the same file has a later group that names Googlebot-Image with an empty Disallow, and a specific group overrides the wildcard one. For Googlebot-Image the file is open. The trap is checking the homepage's robots.txt instead of the icon host's; the two are different files, and 16 of these 27 icons are cross-host.
What this means for your own favicon
Run these checks against your own icon and read the file, not the markup. The order matters, because the first two decide whether the last three are even reachable.
- Fetch the icon URL your page declares and confirm it returns 200. A 404 on a declaration that looks fine is the single most common cause.
- Decode the bytes and print the format and the pixel size. Do not trust the file extension: an
.icocan hold a PNG, and a.pngURL can serve WebP. - Check that the format is one of the seven Google lists, and that width equals height.
- If the file is smaller than 48x48, re-export it at 128x128 or larger and keep the same URL, since the URL is required to be stable.
- Confirm
Googlebot-Imagecan fetch the path on the icon's own host, then request indexing of the home page from the URL Inspection tool, because the favicon is re-read with the home page.
- Check the file, because the declaration can be perfect while the bytes are SVG, WebP, or 99x96.
- Do not add a second
rel="icon"pointing at a different size and assume Google will pick the better one; the documentation says one favicon per hostname and does not promise which link wins.
A crawler accessibility check answers the neighbouring question — what an AI crawler actually receives from your page — and the same habit applies: measure the response, not the markup. The declaration-side numbers for this panel are in favicon seo across 27 homepages, and the icon tags a site needs for install prompts are in the web app manifest survey.
Common questions
How did you measure this?
One request per homepage on 2026-09-14 with a desktop Chrome user agent and no JavaScript, then one request for the first icon the page declares under a rel value Google lists. We saved the icon bytes and decoded them with an image library, so the sizes are the files' own dimensions. The panel is the same 30 domains this series uses; 3 returned 403 to our client and are excluded, which leaves 27.
Does a wrong favicon hurt rankings?
No. Google files favicons under search appearance, not ranking, and says a favicon "isn't guaranteed to appear in Google Search results, even if all guidelines are met". A missing icon costs you a visual cue, not a position.
My favicon is SVG. Should I replace it?
Add a raster one. SVG is not in Google's supported-format list, and every site in this panel that ships SVG also ships a raster fallback somewhere. The safe setup is a square PNG of 128x128 or larger declared with rel="icon", and the SVG kept as an additional link if you want it for browsers.
How long before a new favicon shows up?
Google re-reads the favicon when it recrawls the home page, so the timing is your home page's crawl timing rather than a favicon-specific process. The page advises requesting indexing of the home page through the URL Inspection tool, which is the same tool you would use to check the page is crawlable at all.
Why did the earlier survey not decode the files?
Because it was measuring declarations, and the two questions are separate. That survey found all 27 homepages declare an icon and five lack a root /favicon.ico. This one starts where that stopped, at the bytes behind the declaration — and it is why two of the files here are non-square even though every declaration in the panel resolved.


