Social images: size, safe area and the crop you did not plan for
The tag is one line and the failures are all in the file it points at. A path that resolves in your browser and nowhere else, a picture too small to render, and text sitting in the third of the frame that some surface is about to cut off.
The short answer
og:image must be an absolute URL, because a relative path is not resolvable by a scraper fetching your page from elsewhere. Target 1200 by 630 pixels, stay under about 5MB, and keep anything that matters away from the edges: every surface crops a different rectangle out of the file you provide.
A relative path here is not a URL at all
og:image requires an absolute URL, with the scheme and the host. This is the single most common way the tag fails, and it fails in the least helpful way possible: the value is present, the syntax is valid, nothing reports an error, and no image appears.
The reason it catches people is that a relative path works everywhere else on the page. An <img src="/img/hero.jpg"> resolves against the document URL because the browser knows what document it is in. A scraper reading a value out of a meta tag is not resolving anything: it takes the string and requests it. Some readers do resolve it and the tolerant ones have taught a lot of teams that a relative value is fine. It is not, and the surfaces that drop it do not tell you.
wrong right
--------------------------------- -----------------------------------------
/img/hero.jpg https://example.com/img/hero.jpg
img/hero.jpg https://example.com/img/hero.jpg
//example.com/img/hero.jpg https://example.com/img/hero.jpg
http://example.com/img/hero.jpg https://example.com/img/hero.jpg
https://localhost:3000/hero.jpg the production host, not the build host
https://cdn.example.com/h.jpg?v=2 fine, as long as it returns 200 to a botThe protocol-relative form on the third row is the subtle one. It is legal in HTML, it works in a browser, and as a bare string handed to an HTTP client it has no scheme, so it is not a fetchable address. The fifth row is what happens when the value is built from an environment variable that was right in development.
Two related properties are worth setting while you are in the file. og:image:alt describes the picture for anyone who cannot see it, which is the same obligation as alt text everywhere else on the page. And og:image:width with og:image:height lets a surface reserve the right space before the file has downloaded, which is the difference between a card that appears and a card that appears, jumps, and reflows.
Dimensions, weight, and the files that get quietly dropped
Once the URL resolves, the file itself has to clear a set of thresholds that are mostly undocumented and broadly consistent. The numbers below are the ones worth building to rather than a specification any single platform publishes.
- 1200 by 630 is the shape to author. That is 1.91:1, the ratio the large-format card is built around, and it is what the protocol examples use. Author once at that size and every surface has something usable to work from.
- Below roughly 200 pixels on a side, some surfaces stop rendering an image at all. A 96 pixel logo is a common accidental value, and it does not produce a small card, it produces a text-only one.
- File size has a ceiling. A few megabytes is enough to be refused by some readers and to time out with others. An 8MB PNG export of a screenshot is a real and frequent cause of an empty preview.
- Format support is narrower than on your page. JPEG and PNG are safe. SVG is not: several surfaces will not render it, and some refuse it on principle because it can contain script. WebP and AVIF are accepted in more places than they were and are still the reason a card is blank on one client and fine on another. Serve modern formats to browsers and keep a JPEG for the scraper.
- The URL has to be reachable by a bot. An image behind a signed URL, a hotlink rule, a Referer check or a CDN policy that challenges unknown user agents is an image no scraper can fetch.
Animation is worth one sentence: an animated GIF is served as its first frame in most previews, so if the meaning is in the motion, there is no meaning in the card.
Every surface cuts a different rectangle out of it
You supply one image. Different surfaces show it at different aspect ratios, and none of them ask permission. A wide card keeps most of the frame, a compact card takes a centre square, and a thumbnail in a chat client can take less than that. All of them crop from the middle outward, which means the middle is the only part you control.
Two rules follow from the shape and they are the whole of the practical advice. Keep text well inside the centre, and never let a word run to an edge. Then check the square crop rather than the wide one, because if the image survives being squared it survives everything.
The corollary is about templated images. Generating a share image per page from the page title is a good technique and it is where edge-crowding gets baked in at scale: the template is designed against the widest ratio, the longest title wraps to three lines, and the third line sits in the cropped band on every page with a long title. Test the template with your longest title, not a representative one.
Check one page for a usable image URL
This reports two things about the URL you enter: whether an og:image is declared at all, and whether the value is absolute. Those are the two failures a single fetch can prove. Everything else on this page, the dimensions, the weight, the crop, is a property of the file rather than of the tag, and reading the tag cannot tell you about it.
No signup required. Each free search audits one page, paste any URL to see it in action.
Does this affect AI search?
Not for retrieval, and the reason is worth stating plainly: a share image is not part of your content. Nothing in it is indexed as an answer, and a model reading your page to resolve a question has no use for a 1200 by 630 JPEG containing your headline in a typeface.
There is one narrow exception, and it is an accessibility artefact rather than an image one. og:image:alt is text, so it is readable, and on a page whose subject is thin it is one more sentence describing what the thing is. That is a marginal effect and not a reason to do any of this.
The real connection runs the other way. Assistants that cite sources render those citations as cards, and a card with no image is a smaller, quieter, less clickable object in a list of results that mostly have one. So the image does not help a model choose you. It helps a person act on a model having chosen you, which is the only step in that funnel where a picture has ever mattered.
Why the picture is rated above the words beside it
Within this group of checks the image is rated Important and the share copy is a Refinement, which looks like the wrong way round until you consider what each one costs when it is absent. A missing description shortens a card. A missing or unfetchable image removes it, and a link with no image occupies a fraction of the space in a feed and reads as an afterthought next to every neighbour that has one.
It stays below Critical for the same reason as everything else in the social group: no crawler, index or ranking system consumes this. A site with no share images competes on search exactly as well as one with them.
What earns the rating is the failure mode rather than the feature. Most findings in an audit are a thing done imperfectly. This one is usually a thing done and then silently undone, by a relative path, an oversized export or a CDN rule, on a page where the team believes the work shipped. The gap between believing you have a share image and having one is what makes this worth checking rather than assuming.
Testing the file, not the tag
Every real failure here is downstream of the declaration, so the check has to follow the URL and look at what comes back.
URL=https://example.com/guides/sharpening
IMG=$(curl -s "$URL" \
| grep -o 'property="og:image" content="[^"]*"' \
| sed 's/.*content="//;s/"$//')
echo "declared: $IMG"
# absolute? a relative value is the failure that reports no error
case "$IMG" in
https://*) ;;
*) echo "NOT ABSOLUTE, most scrapers will drop this" ;;
esac
# status, type and size, as a scraper would get them
curl -sI "$IMG" | grep -i '^HTTP/\|^content-type:\|^content-length:'A content-length in the millions and a content-type of image/svg+xml are both silent failures on some surfaces. A 403 means your CDN is refusing the request that builds every preview of your site.
Then look at it as a square, before anyone else does.
Open the image and crop it to a centre square. If the headline is cut, the logo is halved or the subject has left the frame, that is what a large share of your audience receives, and no debugger will report it as a problem because nothing is technically wrong. This is the one step in this guide that cannot be automated and the one that changes the most.
Questions this check raises
- Does og:image have to be an absolute URL?
- Yes. A relative path such as /og.png is not a URL a scraper can resolve, and most platforms discard it rather than guessing at a base. This is the single most common reason a share preview appears with no image on a site that clearly has one.
- What size should a social share image be?
- 1200 by 630 pixels covers every major surface at a 1.91:1 ratio. What matters more than the exact size is the safe area: different platforms crop to square, to 2:1 and to 1.91:1, so text or a logo near an edge will be cut on at least one of them.
- Why is my share image not updating?
- Platforms cache aggressively, often for days, and they cache by URL. Changing the file at the same address usually does nothing. Publish the new image at a new URL, or use the platform debugger to force a refetch, which is what those tools exist for.