Images not indexed by Google: why your pictures are missing from image search
An image appears in Google Images only when Google can find it as an <img> element in a page's HTML, Googlebot is allowed to fetch the file, and the page it sits on is indexed. Most missing images fail one of those through a CSS background, a lazy-load script, a robots.txt rule or hotlink protection.
There is no "image indexing" report in Search Console, so diagnosis is a matter of checking each condition in turn.
Establish what is and is not indexed
- In Google Images, search
site:example.com. This shows a sample of indexed images from your site. Add a word from a specific image's alt text or filename to look for it. - In Search Console's Performance report, change Search type to Image. Impressions here mean some images are indexed and being shown; a flat zero on a site with many images suggests a site-wide block.
Pick two or three images that should be indexed and are not, and run the checks below on those.
Check 1: is the image in an img element with a real src?
curl -s https://example.com/blue-mug/ | grep -io '<img[^>]*>' | head
Google's image documentation is explicit that it finds images in the src attribute of <img> elements, including those inside <picture>, and does not index CSS background images.
Fails you may see:
- The image is not in the output at all. It is a
background-imagein CSS, or inserted by JavaScript after load. Decorative backgrounds do not need indexing. A product or article image does: put it in an<img>element. srcis a placeholder.src="data:image/gif;base64,…"or a tiny blank file, with the real URL indata-srcordata-lazy. Script-based lazy loaders do this. Google may not run the swap. Prefer native lazy loading,loading="lazy"with the realsrc, which WordPress applies by default. If you keep a lazy-load plugin, enable its<noscript>fallback and exclude key images.- The image is in an iframe or a third-party widget. It belongs to that source, not your page.
Check 2: can Googlebot fetch the file?
Take the image URL from the src and test it:
curl -sI -A "Googlebot-Image/1.0" "https://example.com/wp-content/uploads/2026/03/blue-mug.jpg" | head -n 5
You want 200 and an image content type.
- robots.txt. A rule such as
Disallow: /wp-content/orDisallow: /wp-content/uploads/blocks every upload. If images are served from a CDN hostname, that host's robots.txt applies. Paste the file and the image URL into our robots.txt tester, choosing Googlebot-Image; Google's image crawler follows rules for its own name, thenGooglebot, then*. - Hotlink protection. Rules that allow image requests only when the referrer is your own site. Googlebot sends none. Allow empty referrers.
- Firewall or CDN bot rules returning 403 for image requests from crawlers; see blocked due to access forbidden (403).
- Signed or expiring URLs. Image addresses with tokens that change on every page load give Google a different URL each time, and the old ones stop working. Use stable URLs.
Check 3: is indexing allowed?
On the page that hosts the image:
curl -s https://example.com/blue-mug/ | grep -io '<meta[^>]*name=.robots.[^>]*>'
curl -sI "https://example.com/wp-content/uploads/2026/03/blue-mug.jpg" | grep -i x-robots-tag
noimageindexin the page's robots tag asks search engines not to index the images on that page. In Hydrogen SEO this directive is among the snippet and preview settings on the Robots screen and per post; check it has not been switched on. See snippet and preview controls.noindexon the page. Images are indexed in association with a landing page. If the page is excluded, its images generally are too.X-Robots-Tag: noindexon the image file itself, from a server rule covering image extensions or the uploads directory.
Check 4: is the format and context usable?
Google lists the formats it indexes: BMP, GIF, JPEG, PNG, WebP, SVG and AVIF. Beyond format, images are more likely to be indexed and shown when Google understands them:
- A descriptive
altattribute. Our image alt text checker lists every image in a page's HTML with its alt state. Hydrogen SEO can fill missing alt attributes from a template at render time; see image SEO attributes. - A meaningful filename,
blue-stoneware-mug.jpgoverIMG_4821.jpg. - Relevant text near the image, and a page title that relates to it.
- A reasonably large, sharp file. Thumbnails and icons are seldom shown.
Help discovery with an image sitemap
Listing images in your XML sitemap tells Google about files it might not find quickly, including those loaded late on the page. Hydrogen SEO adds image entries to each URL in its sitemap when Include Images in Sitemap is on, which is set on Hydrogen SEO → Sitemap; see XML sitemaps. A sitemap entry does not override a robots.txt block or a noimageindex; it only aids discovery.
Confirm and wait
After fixing a block, repeat the curl checks: the <img> has a real src, the file returns 200 to an image crawler user agent, and no directive forbids indexing. Run a live test in URL Inspection on the hosting page and look at the screenshot and page resources to confirm the image loaded. Then request indexing for that page. Image indexing generally lags behind page indexing, so check the image search results and the Image search type in the Performance report again after a few weeks, not days.
Common questions
Does Google index CSS background images?
No. Google's documentation says it does not index images referenced only in CSS. Use an img element for images you want found.
Do I need alt text for an image to be indexed?
It is not strictly required, but alt text is one of the main signals Google uses to understand an image, and it is needed for accessibility.
My images are on a CDN subdomain. Is that a problem?
No, provided that hostname allows crawling in its own robots.txt and returns the files to crawlers. Keep image URLs stable.
Does lazy loading stop images being indexed?
Native lazy loading with a real src attribute does not. Script-based lazy loading that hides the URL in a data attribute can.