Twitter/X Card Not Working
You post a link on Twitter/X and there's no card — just a plain URL. Or the card shows but with the wrong image, a missing description, or an unexpected layout. Twitter/X has its own meta tag system (twitter:* tags) with specific syntax requirements that trip up even experienced developers.
Common Causes
1. <a href="https://previewog.com/twitter-card-types/">twitter:card</a> tag is missing — This is the one tag Twitter/X does not fall back to OG for. Without twitter:card, there is no card. Period.
2. Wrong attribute: property instead of name — Twitter/X meta tags use name, not property. Writing <meta property="twitter:card"> instead of <meta name="twitter:card"> means Twitter/X won't read it.
3. robots.txt blocking Twitterbot — Twitter's crawler (Twitterbot/1.0) respects robots.txt on both the page domain and the image CDN domain. Block either one and the card fails.
4. Image served over HTTP — Twitter/X requires HTTPS for card images.
5. Image too large or too small — summary cards need at least 144x144px. summary_large_image needs at least 300x157px. Maximum file size is 5MB.
6. Cached old data — Twitter/X caches card data for approximately 7 days.
7. JavaScript-rendered meta tags — Twitterbot/1.0 does not execute JavaScript.
8. GIF image — Twitter/X only uses the first frame of an animated GIF for card images. If the first frame is blank or irrelevant, the card looks broken.
Step 1: Add the Required twitter:card Tag
This is the most common issue. The twitter:card meta tag is required and has no OG fallback. Without it, Twitter/X ignores all other twitter tags and OG tags for card rendering.
<meta name="twitter:card" content="summary_large_image" />Valid values:
summary — small square thumbnail with title and description
summary_large_image — large landscape image above title and description
player — embedded video or audio player (requires approval)
app — app install card (requires approval)
For most websites, use summary_large_image.
Step 2: Verify Attribute Syntax
Twitter/X meta tags use the name attribute, not property:
<!-- CORRECT -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Your Title" />
<meta name="twitter:description" content="Your description." />
<meta name="twitter:image" content="https://example.com/preview.jpg" />
<!-- WRONG — Twitter/X won't read these -->
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Your Title" />This is the opposite of OG tags, which use property. Having both sets with correct attributes is valid and recommended:
<!-- OG tags (property attribute) -->
<meta property="og:title" content="Your Title" />
<meta property="og:image" content="https://example.com/preview.jpg" />
<!-- Twitter tags (name attribute) -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Your Title" />
<meta name="twitter:image" content="https://example.com/preview.jpg" />Step 3: Check the Fallback Chain
Twitter/X checks for its own tags first, then falls back to OG tags for most properties:
Card type: Primary tag twitter:card — no fallback (required).
Title: Primary tag twitter:title, falls back to og:title.
Description: Primary tag twitter:description, falls back to og:description.
Image: Primary tag twitter:image, falls back to <a href="https://previewog.com/og-image-guide/">og:image</a>.
If you set og:image but not twitter:image, Twitter/X will use the OG image. But if you don't set twitter:card, nothing else matters — there will be no card.
Step 4: Check robots.txt on BOTH Domains
Twitterbot/1.0 checks robots.txt on the page domain and on the image domain (if different). This catches people off guard when their image is hosted on a CDN:
# Your site: example.com/robots.txt
User-agent: Twitterbot
Allow: /
# Your CDN: cdn.example.com/robots.txt — Check this too!
User-agent: Twitterbot
Allow: /If your CDN's robots.txt blocks Twitterbot, the card will render with no image even though the page is accessible.
Step 5: Force a Re-Crawl
Twitter/X deprecated its Card Validator tool, but there are still ways to force a re-crawl:
1. Post the URL in a tweet draft. Create a new tweet, paste the URL, and wait for the card preview to load. Don't publish — the act of loading the preview triggers a crawl. Discard the draft afterward.
2. Append a cache-busting parameter. Add ?v=2 to your URL when sharing to bypass the cache entirely: https://example.com/page/?v=2
3. Wait 7 days. Twitter/X's cache expires naturally after approximately 7 days.
Step 6: Verify Image Requirements
Image requirements by card type:
summary: Minimum 144x144px, max 5MB, 1:1 aspect ratio.
summary_large_image: Minimum 300x157px, max 5MB, 2:1 aspect ratio. Recommended size is 1200x628px. Twitter/X crops to a 2:1 ratio, so a 1200x630 OG image will have 2px trimmed — negligible but technically there.
Images must be: HTTPS, JPEG, PNG, or WebP, under 5MB, not animated GIF (first frame only is used), and directly accessible (no redirects, no authentication).
Platform-Specific Notes
No approval needed for basic cards: Since 2018, summary and summary_large_image cards work automatically. You do not need to register your domain or apply for approval. This is a persistent myth from the old Card Validator era.
Player cards still need approval: If you want to embed video or audio players using twitter:card type player, you must apply for approval through the Twitter/X developer portal. This is the only card type that still requires it.
Card Validator status: The Card Validator at cards-dev.twitter.com/validator was deprecated. It may intermittently work, but it's no longer officially supported. The tweet draft method is the current recommended way to trigger a re-crawl.
GIF behavior: Twitter/X extracts the first frame of an animated GIF and uses it as a static image for the card preview. If the first frame is blank, loading, or a solid color, the card will look broken. Use a static JPEG or PNG for the OG image instead.
twitter:site and twitter:creator: These optional tags associate the card with Twitter/X accounts. They don't affect whether the card renders. They add attribution in some card layouts. Both are optional:
<meta name="twitter:site" content="@yourbrand" />
<meta name="twitter:creator" content="@authorname" />Cache is per-URL: Twitter/X caches each URL independently. The canonical URL and any URL with query parameters are cached separately. This is why the ?v=2 cache-busting trick works.
Prevention Checklist
Use this checklist before sharing any link on Twitter/X:
twitter:card meta tag is present (no OG fallback for this tag). All twitter:* tags use name attribute, not property. Image is HTTPS, no redirects, under 5MB. Image meets minimum dimensions (144x144 for summary, 300x157 for large). robots.txt allows Twitterbot on page domain AND image CDN domain. OG tags are in static HTML (not JavaScript-rendered). No animated GIF used as card image (use static JPEG/PNG). After changes, trigger re-crawl via tweet draft or cache-busting parameter.
FAQ
You're almost certainly missing the twitter:card meta tag. This is the one tag that has no OG fallback. Even if og:title, og:description, and og:image are all perfect, Twitter/X won't render a card without <meta name="twitter:card" content="summary_large_image" />.
Yes, it matters. Twitter/X reads name attributes for its own tags, not property. <meta property="twitter:card" ...> is invisible to Twitter/X. Change it to <meta name="twitter:card" ...>. This is a common mistake because OG tags use property, and developers assume all social meta tags work the same way.
No. Domain validation (whitelisting) was required before 2018 for summary and summary_large_image cards. It's no longer needed. These card types work automatically on any domain. Only player and app cards still require approval.