TL;DR
Wenn jemand eine URL in Telegram, WhatsApp, Facebook, LinkedIn oder X einfügt, baut die App eine Karte aus Open Graph (og:*) und, für X, Twitter Cards. Ohne korrekte Meta-Tags: zufälliges Favicon, abgeschnittener Titel oder kein Bild. Kartenstandard: 1200×630 (~1.91:1), absolute HTTPS-URL, og:title, og:description, og:image, og:url, og:type. In Next.js App Router setzen Sie das in generateMetadata / metadata. Deploy auf DevStudioIT Cloud; dynamische OG für Cases über Branchly. Unten: Tag-Checkliste, Next.js-Code, Crawler-Cache-Fallen und Tests.
Für wen das ist
- Firmen, die Blog und Landings in Social / Chat teilen
- Next.js-App-Router-Entwickler ohne WordPress-SEO-Plugins
- Marketer mit „hässlicher Vorschau“ trotz schöner Site
- Mehrsprachige Teams (pl/en/de) mit Title/Description pro Locale
Keywords (SEO)
open graph nextjs, twitter cards link vorschau, og:image 1200x630, facebook whatsapp telegram meta tags, social share card 2026, generateMetadata open graph
Was der Crawler liest (und was nicht)
Messenger führen Ihren Client-JS nicht im Nutzerbrowser aus, sie machen HTTP GET und parsen HTML (oft frühe Bytes / SSR). Deshalb:
- Meta müssen im ersten HTML stehen (Server Components / SSG), nicht nur per
useEffect - Bild öffentlich erreichbar (nicht hinter Auth, nicht
localhost) - Große JS-only-SPAs ohne SSR = leere oder falsche Previews
| Plattform | Primäre Tags | Hinweise |
|---|---|---|
| Facebook / Messenger | og:* |
Debugger erzwingt Rescrape |
og:title, og:description, og:image |
aggressiver Cache | |
| Telegram | og:* |
manchmal auch twitter:* |
og:* |
Post Inspector | |
| X (Twitter) | twitter:card, twitter:image… |
summary_large_image |
Minimales Tag-Set
<meta property="og:type" content="website" />
<meta property="og:site_name" content="DevStudio.it" />
<meta property="og:locale" content="de_DE" />
<meta property="og:url" content="https://devstudioit.com/de/blog/slug" />
<meta property="og:title" content="Kartentitel, max ~60–70 Zeichen" />
<meta property="og:description" content="1–2 Sätze, ~110–160 Zeichen" />
<meta property="og:image" content="https://devstudioit.com/og-share.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Bildbeschreibung" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Kartentitel" />
<meta name="twitter:description" content="Beschreibung" />
<meta name="twitter:image" content="https://devstudioit.com/og-share.jpg" />Für Blogposts: og:type = article plus optional article:published_time, article:author.
Bildspezifikation 1200×630
| Parameter | Empfehlung |
|---|---|
| Größe | 1200×630 px (sicherer Standard) |
| Ratio | ~1.91:1 |
| Format | JPG oder PNG; WebP scheitert bei manchen Crawlern |
| Gewicht | meist < 1 MB (besser < 300 KB) |
| Safe Zone | Text/Logo in mittleren ~80%, Ränder können croppen |
| URL | absolut https://... |
Projekt-Fallback: /og-share.jpg. Pro Post override via Frontmatter ogImage.
Kein 4K-Vollseiten-Screenshot, Crawler skalieren sowieso; Sie verlangsamen nur den Scrape.
Next.js App Router, generateMetadata
import type { Metadata } from 'next';
const BASE = 'https://devstudioit.com';
export async function generateMetadata({
params,
}: {
params: Promise<{ locale: string; slug: string }>;
}): Promise<Metadata> {
const { locale, slug } = await params;
const post = await getPost(locale, slug); // Markdown oder Branchly
const image = post.ogImage?.startsWith('http')
? post.ogImage
: `${BASE}${post.ogImage ?? '/og-share.jpg'}`;
const url = `${BASE}/${locale}/blog/${slug}`;
return {
title: post.title,
description: post.description,
alternates: { canonical: url },
openGraph: {
type: 'article',
locale: locale === 'pl' ? 'pl_PL' : locale === 'de' ? 'de_DE' : 'en_US',
url,
siteName: 'DevStudio.it',
title: post.title,
description: post.description,
images: [{ url: image, width: 1200, height: 630, alt: post.title }],
},
twitter: {
card: 'summary_large_image',
title: post.title,
description: post.description,
images: [image],
},
};
}Root-Layout setzt Defaults; Seiten überschreiben. Keine zwei widersprüchlichen og:image im <head>.
Crawler-Cache, Bug-Report Nr. 1
Bild geändert, WhatsApp zeigt noch das alte? Das ist Plattform-Cache, nicht Ihr CDN.
| Plattform | Tool / Trick |
|---|---|
| Sharing Debugger → Scrape Again | |
| Post Inspector → inspect | |
| X | Card Validator |
oft: ?v=2 anhängen zum Testen; warten oder anderes Gerät |
|
| Telegram | @webpagebot oder später erneut einfügen |
Auf DevStudioIT Cloud langes Cache-Control für OG-Bilder erst wenn final, während Iteration Dateinamen versionieren (og-share-2026-07.jpg).
Dynamische Karten (optional)
Für Cases aus CMS/DB (Branchly):
ogImageUrlam Datensatz speichern- Oder PNG via
ImageResponsemit Titel auf Brand-Hintergrund erzeugen
Generierte Karten wirken einheitlich, brauchen aber Plattform-Tests, manche Crawler haben Scrape-Timeouts.
Checkliste vor Publish
- Absolutes
og:imageHTTPS, 200 OK - Dimensionen stimmen (width/height Meta = echte Pixel)
- Title ≤ ~70 Zeichen, Description nicht mitten im Wort abgeschnitten
-
og:url= Locale-Canonical - Getrennte Title/Description pl/en/de
-
twitter:card=summary_large_imagefür großes Bild - FB Debugger + Einfügen in Telegram/WhatsApp auf öffentlicher Staging-URL
Typografie und Branding auf der 1200×630-Karte
Eine Social Card ist ein Mini-Billboard: in 0,5 s müssen Marke und Thema sitzen. Praxis:
- Hintergrund, Brandfarbe oder Foto mit starkem Overlay (Text mobil lesbar)
- Logo, klein in der Safe Zone; nicht 40% der Fläche
- Titel auf der Grafik, kürzer als HTML-
og:title(~6–8 Wörter) - Kein Mini-UI, kein voller Dashboard-Screenshot; ein Motiv wählen
- Locale, eigene PL/EN/DE-Grafik, wenn der Titel in die Bitmap gebrannt ist
Für den DevStudio-Blog reicht oft ein Template: Gradient + Titelzeile + Marke. Fallback /og-share.jpg ist besser als fehlendes og:image.
FAQ
Reicht eine siteweite og-share.jpg?
Als Fallback, ja. Für Blog und wichtige Landings oft eigenes Bild (Titel + Branding) für besseren Feed-CTR.
Darf og:image relativ /og-share.jpg sein?
Next.js Metadata API absolutisiert oft, Crawler sind wählerisch. Besser volle https://...-URL.
Open Graph vs. JSON-LD, dasselbe?
Nein. OG = Social Preview. JSON-LD = Google-Verständnis (Organization, BlogPosting). Sie brauchen beides.
Warum zeigt LinkedIn einen anderen Titel als og:title?
Oft eigener Cache oder <title>. Rescrape im Inspector erzwingen; SSR muss aktuelles HTML liefern.
Wollen Sie korrekte Social Cards auf Ihrer Site?
- Kontaktieren Sie uns, Metadata, OG 1200×630 und Preview-Tests in Next.js
- Next.js SEO Metadata App Router, Title, Description, hreflang
- JSON-LD Schema.org, Structured Data neben OG
Über den Autor
Wir bauen schnelle Websites, Web/Mobile-Apps, KI-Chatbots und Hosting — mit Fokus auf SEO und Conversion.
Empfohlene Links
Von Theorie zu Produktion — Branchly, Hosting-Stack und Referenzen.
