Image Sitemap Generator for Google Image Search

Product photos, blog illustrations, and gallery shots rarely get found through links alone, and a crawler that never sees a picture cannot put that picture in front of anyone searching Google Images. This page turns pairs of page and image URLs into the image sitemap format Google reads: one url entry per page, with an image:image block for every picture that page carries. Rows with captions and titles give the crawler text to match against each file.

Everything runs in this tab. The rows you paste are checked locally, the XML is assembled in memory, and the download hands back a file that never touched a server. Leave the sample rows in place to see the shape of the output, or clear the box and paste your own list with the header line first.

Build an Image Sitemap From Page and Image Rows

Rows and URL tags The rows stay in this tab.

One row per line, header first. Quote a caption that contains a comma.

Download XML

    How It Works

    The build runs in two passes. First every line in the box is checked on its own: the header is skipped, blank lines are ignored, and a row that fails a URL check is reported by its row number while the remaining rows move ahead. Then the surviving rows are grouped by page URL and written out as XML in the order the pages first appeared.

    1. Paste one row per line. Start with the header line page,image,caption,title, then add a page URL and an image URL on every line after it. A caption containing a comma stays in one column when the whole value is quoted.
    2. Fill the optional columns where you have them. Caption and title are passed into the image:caption and image:title tags, and a blank value is skipped rather than written as an empty tag.
    3. Pick the URL tags, then press Build image sitemap. Last modified, changefreq, and priority apply to every page entry in the file, and all three can stay empty; the priority box starts at 0.8.
    4. Read the notes, then copy or download. Rows that failed a check appear under the box with their row number, warnings carry a Note: prefix, and the summary line counts image entries against the page URLs they sit under.

    Before and After

    Before (rows as pasted)
    page,image,caption,title
    https://example.com/products/red-sneakers/,https://cdn.example.com/red-sneakers.jpg,"Lightweight red sneakers, side view",Red Sneakers Product Photo
    https://example.com/products/red-sneakers/,https://cdn.example.com/red-sneakers-top.jpg,Top-down view of the pair,Red Sneakers Top View
    https://example.com/blog/running-guide/,https://cdn.example.com/running-guide-cover.jpg,Cover photo for the running guide,Running Guide Cover Image
    After (built with priority 0.8)
    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
      <url>
        <loc>https://example.com/products/red-sneakers/</loc>
        <priority>0.8</priority>
        <image:image>
          <image:loc>https://cdn.example.com/red-sneakers.jpg</image:loc>
          <image:title>Red Sneakers Product Photo</image:title>
          <image:caption>Lightweight red sneakers, side view</image:caption>
        </image:image>
        <image:image>
          <image:loc>https://cdn.example.com/red-sneakers-top.jpg</image:loc>
          <image:title>Red Sneakers Top View</image:title>
          <image:caption>Top-down view of the pair</image:caption>
        </image:image>
      </url>
      <url>
        <loc>https://example.com/blog/running-guide/</loc>
        <priority>0.8</priority>
        <image:image>
          <image:loc>https://cdn.example.com/running-guide-cover.jpg</image:loc>
          <image:title>Running Guide Cover Image</image:title>
          <image:caption>Cover photo for the running guide</image:caption>
        </image:image>
      </url>
    </urlset>

    Use Cases

    Developer Production Workflow
    Catalog pages with several product photos each A launch page carrying new screenshots Client galleries filed as one sitemap
    Shared page URL merges two image rows Last modified set to the launch date Captions pulled from the shot list
    Titles kept short, captions carry detail Row numbers read before the next build File downloaded as image-sitemap.xml
    Bad URL rows listed without stopping the build Warnings counted under the output box XML stays on the machine the whole time

    Common Mistakes

    • Deleting the header line. The first line in the box is always skipped, so removing it promotes your first real row to header status and drops it from the build without an error.
    • Typing bare hostnames in the URL columns. A value such as example.com fails the http check, and the row is listed by number instead of being guessed at.
    • Leaving every caption and title blank. The file still builds, but a Note: warning counts the entries with no metadata, and those pictures carry no text for image search to match.
    • Expecting one picture listed under two spellings of a page URL to merge. Grouping matches the page URL exactly, so a missing trailing slash or an http versus https difference splits the rows into two page entries.

    Best Practices

    • Write the title as the subject of the picture and the caption as the surrounding detail, since both strings end up as context Google reads next to the image URL.
    • Keep one spelling of each page URL down the column. Grouping is a plain text match, so a missing trailing slash quietly creates a second page entry for the same page.
    • Set last modified only to a date you can back up. Google reads that tag and skips the other two URL tags, so a date that drifts from real edits loses its value.
    • Split the rows before a build passes 1,000 page URLs, or run a splitter over the finished file, so the submitted sitemap stays inside the caps.

    Frequently Asked Questions

    What is an image sitemap for?

    An image sitemap lists the pictures that live on your pages so Google can find them during a crawl. It matters most when images sit behind scripts or far from the home page, since a crawler that reaches the text may still miss the files. Each entry pairs one page URL with one or more image URLs, and Google can then consider those pictures for Google Images results.

    Which columns are required and which are optional?

    Page and image are the only required columns, and both have to be full URLs starting with http:// or https://. Caption and title are optional; rows that leave them blank still build, and the tool only warns when an entry carries neither. The first line in the box is always treated as a header and skipped.

    How are several images on one page grouped?

    Rows that carry the same page URL are merged into a single url entry, with each row becoming its own image:image block underneath. The page URL is written once no matter how many rows share it, and the pictures keep the order they had in your list. There is no need to sort the rows before building.

    What do the caption and title tags do?

    Both are optional text fields that give Google context about the picture beyond its file name. image:title holds the name of the image and image:caption holds a short description, and a caption with commas inside stays in one column when it is quoted. An entry with neither still appears in the file, just with less text to match against.

    What do lastmod, changefreq, and priority mean?

    Last modified adds a date to every page entry, and changefreq and priority add the matching sitemap tags. Worth knowing before you fill them in: Google ignores both changefreq and priority when it picks what to crawl, so those tags are for protocol compatibility rather than influence. An accurate lastmod is the one of the three that Google reads.

    How big can an image sitemap get?

    One sitemap file is capped at 50,000 URLs and 50 megabytes uncompressed, and Google reads at most 1,000 URLs and 50,000 images in a single image sitemap. This tool lists a warning under the output whenever a build passes either cap, so the file can be split before it is submitted. Rows past the caps belong in a second file rather than in one oversized one.

    Do my rows leave the browser?

    No. The rows are parsed, checked, and assembled into XML inside this tab, and the download comes from a local blob URL. Nothing is sent to a server, and reloading the page clears the box along with everything built from it.