Launch offerExploreTry on
Pricing
Launch offerOfferSign inStart
Launch offer · until Sun, Oct 25Until Sun, Oct 252 Marks and a year of Pro for $99See the launch offer and new MarksSee the offer
Field GuideCSS and web
CSS and web

OG image not showing? A checklist to fix your link preview

Your page looks right, the tag is there, and the preview is still blank or stuck on an old picture. Here is the order to check things in, and how to clear each platform's cache.

GradientlyVerified Gradiently account·October 19, 2026·7 min read
Cover: Modal Meridian · GR·FP1Q·5P

The short version

  • An OG image not showing is almost always one of five causes: a relative URL, a tag added by JavaScript, an image the crawler cannot fetch, a file that is too large, or a cached old preview.
  • The og:image value must be a full https URL that appears in the HTML the server sends, because most link crawlers do not run JavaScript.
  • The image itself must return a 200 status with an image content type, without a login, a redirect loop or a robots.txt rule blocking the crawler.
  • Facebook allows OG images up to 8 MB and LinkedIn up to 5 MB, but a designed 1200×630 PNG should weigh far less, which also helps apps like WhatsApp that publish no limit.
  • Platforms cache images by URL, so after changing an OG image give it a new filename, then refresh the preview in Facebook's Sharing Debugger or LinkedIn's Post Inspector.
On this page
Step 1: use an absolute https URLStep 2: make sure og:image is in the server HTMLStep 3: check the image is reachable by crawlersStep 4: stay inside size and file weight limitsStep 5: clear each platform's cacheA preview worth fixing

OG image not showing on a shared link? The cause is nearly always one of five things: the og:image address is relative, the tag is added by JavaScript after the page loads, the crawler cannot fetch the image, the file breaks a platform's limits, or the platform is still showing a cached preview. Check them in that order. Each step below takes a minute and rules one cause out for good.

No image anywhere

Likely cause

Relative URL or tag missing from server HTML

Fix

Full https:// URL, rendered on the server
Image on some apps, not others

Likely cause

Crawler blocked, file too heavy, or wrong format

Fix

Allow the bots, compress, use PNG or JPEG
Small square thumbnail instead of a large card

Likely cause

Image too narrow, or no twitter:card

Fix

1200×630 image and summary_large_image
Old image keeps appearing

Likely cause

Platform cache

Fix

New filename, then re-scrape in the inspector
Works locally, not in production

Likely cause

Base URL points at localhost or a preview domain

Fix

Set the production domain as the base URL
SymptomLikely causeFix
No image anywhereRelative URL or tag missing from server HTMLFull https:// URL, rendered on the server
Image on some apps, not othersCrawler blocked, file too heavy, or wrong formatAllow the bots, compress, use PNG or JPEG
Small square thumbnail instead of a large cardImage too narrow, or no twitter:card1200×630 image and summary_large_image
Old image keeps appearingPlatform cacheNew filename, then re-scrape in the inspector
Works locally, not in productionBase URL points at localhost or a preview domainSet the production domain as the base URL
Match what you see to the row, then jump to that step.

Step 1: use an absolute https URL

A crawler reading your page has no idea where /og.png lives. It needs the whole address, protocol and domain included. Relative paths, protocol-relative paths (//example.com/og.png) and plain http:// addresses are the most common reason a preview comes up blank.

html
<!-- Broken: the crawler cannot resolve these -->
<meta property="og:image" content="/og/launch.png" />
<meta property="og:image" content="//example.com/og/launch.png" />

<!-- Working: full https URL, size and alt declared -->
<meta property="og:image" content="https://example.com/og/launch-v2.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Launch week, on a deep violet background" />
<meta name="twitter:card" content="summary_large_image" />
The tags that fix most blank previews. twitter:card uses name, the Open Graph tags use property.

Declaring the width and height matters on the first share: Facebook says that without them, a page may appear without its image until the crawler has fetched it once. Open Graph tags covers the rest of the set.

Step 2: make sure og:image is in the server HTML

Your browser's inspector shows the page after JavaScript has run, so a tag can look perfect there and still be invisible to crawlers. Single page apps that set meta tags in the browser (with a client-side head manager, for example) are the classic case. Check what a crawler actually receives:

bash
# The HTML a crawler receives: is og:image in it?
curl -s -A "facebookexternalhit/1.1" https://example.com/launch | grep -i 'og:image'

# The image itself: expect HTTP 200 and an image content type
curl -sI https://example.com/og/launch-v2.png | grep -iE '^HTTP|content-type|content-length'
Two checks from a terminal. If the first prints nothing, the tag is added in the browser and crawlers never see it.

In Next.js with the App Router, set the tags in metadata so they are rendered on the server. Put metadataBase in the root layout so relative image paths become full URLs, and point it at your production domain, not localhost or a preview deployment.

ts
// app/layout.tsx
import type { Metadata } from 'next'

export const metadata: Metadata = {
  metadataBase: new URL('https://example.com'),
  openGraph: {
    images: [{ url: '/og/launch-v2.png', width: 1200, height: 630, alt: 'Launch week' }],
  },
  twitter: {
    card: 'summary_large_image',
  },
}
/og/launch-v2.png resolves to https://example.com/og/launch-v2.png in the rendered head. Next.js also reads an opengraph-image.png file placed in a route folder.

Step 3: check the image is reachable by crawlers

The page loading is not enough: the crawler then makes a second request for the image, and that request can fail on its own. Open the image URL in a private window, then work through this list.

  1. 1

    No login, no cookie wall

    The image must load for a stranger. Images behind auth, a staging password or a consent screen come back as an HTML page, not a picture.

  2. 2

    Status 200, no redirect chains

    A 404, a 403 from a firewall or bot protection, or a redirect to a login page all end in a blank preview. One clean redirect is usually fine; several are not.

  3. 3

    robots.txt allows the bots

    X's crawler identifies as Twitterbot and follows robots.txt, and LinkedIn names a blocked crawler as a common cause. A blanket Disallow on /images/ or /_next/ can block the preview.

  4. 4

    A real image content type

    The server should send Content-Type: image/png or image/jpeg. A file served as text/html or application/octet-stream is often ignored. See Content-Type on MDN.

  5. 5

    PNG or JPEG, not SVG

    Crawlers broadly do not render SVG previews. Use PNG for designed cards and JPEG for photos; PNG vs JPEG explains the trade.

Step 4: stay inside size and file weight limits

An image that is too small gets demoted to a thumbnail, and one that is too heavy may not be fetched at all. These are the limits the platforms publish themselves. Where a platform publishes no number, keep the file light and test.

Facebook

Published guidance

At least 200×200, 1200×630 recommended, at most 8 MB
LinkedIn

Published guidance

At least 1200×627, 1.91:1, at most 5 MB; under 401 px wide shows as a thumbnail
X

Published guidance

The crawler typically downloads images up to 5 MB; use summary_large_image for the large card
WhatsApp, Slack, Discord, iMessage

Published guidance

No published limits: a lean PNG or JPEG is the safe choice
PlatformPublished guidance
FacebookAt least 200×200, 1200×630 recommended, at most 8 MB
LinkedInAt least 1200×627, 1.91:1, at most 5 MB; under 401 px wide shows as a thumbnail
XThe crawler typically downloads images up to 5 MB; use summary_large_image for the large card
WhatsApp, Slack, Discord, iMessageNo published limits: a lean PNG or JPEG is the safe choice
Taken from each platform's own documentation. Numbers change, so treat them as ceilings, not targets.

A designed 1200×630 card with flat colour and type rarely needs to be large. Compressing it helps the apps without published limits, where heavy images are a common reason a preview quietly fails. Image compression shows how to cut weight without banding.

Link preview 1200×630

1200 × 630

LinkedIn link image 1200×627

1200 × 627

Too narrow: 400×210

400 × 210

The standard preview, LinkedIn's near-identical size, and an image narrow enough to be shown as a small thumbnail.

Step 5: clear each platform's cache

If the old picture keeps showing, the platform cached it. Facebook says it caches images by URL, so the same address will keep serving the old image even after you replace the file. The reliable fix everywhere is a new filename for the new image, then a refresh where the platform offers one.

Facebook, Messenger

How to refresh

Sharing Debugger, then Scrape Again
LinkedIn

How to refresh

Post Inspector: inspect the URL to fetch it fresh
X

How to refresh

No preview tool: change the image URL and draft a new post to check
WhatsApp

How to refresh

No tool: change the image URL, then send the link in a new chat
Slack, Discord

How to refresh

No tool: a new image URL, or a query string on the page link, triggers a fresh fetch
iMessage

How to refresh

Previews are built on the sender's device: send the link again after the image URL changes
PlatformHow to refresh
Facebook, MessengerSharing Debugger, then Scrape Again
LinkedInPost Inspector: inspect the URL to fetch it fresh
XNo preview tool: change the image URL and draft a new post to check
WhatsAppNo tool: change the image URL, then send the link in a new chat
Slack, DiscordNo tool: a new image URL, or a query string on the page link, triggers a fresh fetch
iMessagePreviews are built on the sender's device: send the link again after the image URL changes
Refreshing only affects new shares. Posts already published keep the preview they were made with.

Avoid

  • Overwriting og.png with a new design
  • Waiting for caches to expire
  • Deleting the old image straight away

Do

  • Uploading og-v2.png or a hashed filename
  • Re-scraping in the Sharing Debugger and Post Inspector
  • Keeping the old file live for posts that still point to it

Hashed filenames from your build tool or a version suffix (launch-v2.png) do this automatically. A query string such as ?v=2 on the image URL also works for most crawlers, but a new path is the safer bet.

A preview worth fixing

Once the plumbing works, the image still has to earn the click at thumbnail size: a short line, large type and the key words in the centre, where square crops keep them. OG image size covers the layout, and link preview image the design side. If you make a fresh image per post, dynamic OG images generates them from the title.

example.com
Launch week
Gradiently · @gradiently

A 1200×630 preview that survives every crop: one short line in the centre and a small site name above it.

In Gradiently, Link preview (Open Graph) 1200×630 is a built-in size and exports as PNG, so the file arrives at the right dimensions. Export each new version under a new filename and the cache problem never starts. The same steps apply to a repository card; see GitHub social preview.

Design with a living gradient

Posts, stories, slides and banners in every size, with text that always reads.

Start designing, free

Questions people ask

Why is my OG image not showing on LinkedIn?

Most often the image is under 1200×627, over 5 MB, behind a login, or blocked from LinkedIn's crawler. Fix the file, then inspect the URL in LinkedIn Post Inspector to fetch it again.

Why does Facebook show my old OG image?

Facebook caches images by URL. Upload the new image under a new filename, update og:image, then click Scrape Again in the Sharing Debugger.

Why is my Twitter card image not showing on X?

Check that og:image or twitter:image is a full https URL in the server HTML, that robots.txt does not block Twitterbot, and that twitter:card is set to summary_large_image for the large card.

Does og:image work if it is added with JavaScript?

Usually not. Most link crawlers read the HTML the server sends and do not run scripts, so set the tags on the server.

What format should an OG image be?

PNG for designed cards with type and flat colour, JPEG for photos, at 1200×630. Avoid SVG, which crawlers broadly do not render as a preview.

Share this guide

Written by GradientlyVerified Gradiently account

The team behind Gradiently, a design tool built around Marks: living gradients that make everything you design look like yours.

See our profile

On this page

Step 1: use an absolute https URLStep 2: make sure og:image is in the server HTMLStep 3: check the image is reachable by crawlersStep 4: stay inside size and file weight limitsStep 5: clear each platform's cacheA preview worth fixing

Share this guide

Next in CSS and web

CSS linear gradient: the complete guide to linear-gradient()

Keep reading

All CSS and web guides
CSS and web

Open Graph tags: the complete guide for share previews

5 min read

Every shared link becomes a little poster for your page, built from a few meta tags. Get them right and the preview looks designed; miss one and platforms guess. Here is the complete set, with markup to copy.

Social media

Link previews: why your shared links look broken, and the fix

6 min read

You paste your link into a chat and get a grey box, the wrong picture or a logo cropped in half. Almost every broken preview comes down to one of eight causes, and all of them are fixable in minutes.

Social media

OG image size: 1200×630 link previews that work everywhere

6 min read

Every time someone pastes your link, a small picture decides whether anyone clicks it. Here is the size, the tags and the layout that make that picture work.

Find the look that’s only yours.

Every Mark is a living background with one owner. Try an unclaimed Mark, and claim yours when it feels right.

Start designingSee the launch offer

Marks left to claim

50of 1,000

950 claimed so farFind yours

Check a certificate

Type a certificate number or a Mark’s code to see who owns it.

Works with ChatGPT and Claude

Ask your AI for a design. It makes it in your Mark, ready to edit.

ChatGPTClaude
How to connect

Product

  • Launch packs
  • Explore
  • Pricing
  • Certificates

Learn

  • Field Guide
  • Help centre
  • What’s new

Developers

  • Overview
  • ChatGPT and Claude
  • API reference
  • API keys

Company

  • About
  • Contact us
  • Sign in

Legal

  • Terms
  • Privacy
  • Refunds
  • Mark protection
  • Cookies
  • All policies
Move through the letters. Each one wears a real Mark.Touch a letter to see its Mark.One name. Ten Marks inside it.
© 2026 Gradiently