Zum Hauptinhalt springen
Zurück zum Lab

Lab

Self-Audit Phase 1 — Technische Schicht

Methodische Analyse der eigenen Site reliomedia.de: Crawler-Zugang, Schema-Coverage, semantische HTML-Struktur, llms.txt-Hygiene, Performance. Phase 2 (LLM-Cold-Recognition, Citation-Rate, Wikidata) folgt separat.

  • Self-Audit
  • Phase 1
  • Technik

RelioMedia Self-Audit — Phase 1 (Technische Schicht)

Stand: Mai 2026 Erhebungs-Datum: 2026-05-15 Gegenstand: reliomedia.de (DE + EN) Methode: Phase 1 — ausschließlich Code-Analyse, robots.txt/llms.txt/Sitemap, Schema-Markup, semantische HTML-Struktur, Production-Build-Auswertung. Keine LLM-Cold-Recognition-Tests, keine Citation-Frequenz-Messung, keine Wikidata-Lookups. Diese Datenpunkte sind Phase 2 (n8n-Two-Stage-Pipeline) und in diesem Bericht durchgängig als „nicht erhoben — Phase 2 via Pipeline" markiert.


1. Executive Summary

Status quo: Die technische GEO-Grundlage der Site ist überdurchschnittlich solide aufgesetzt — die wesentlichen Architektur-Hebel (Bot-Zugang, Schema-Engineering, semantische HTML-Struktur, llms.txt-Manifest) sind vorhanden und in sich konsistent; offen sind primär Entity-Verlinkungs- und Sichtbarkeits-Messungen, die Phase 2 erfordern.

Drei zentrale technische Erkenntnisse:

  1. AI-Crawler-Zugang ist explizit allow-listed, nicht impliziter Default. Die robots.txt listet 12 namentliche User-Agents (GPTBot, ChatGPT-User, OAI-SearchBot, PerplexityBot, Perplexity-User, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, cohere-ai, CCBot, Diffbot, FacebookBot) mit jeweils eigenem Allow: /. Das ist konservativer als der häufige User-agent: * → Allow: / und verhindert, dass spätere Default-Verschärfungen die Crawler-Zugriffe unerwartet sperren.

  2. Schema-Markup ist tief verschachtelt und Graph-konsistent. Es existieren 8 wiederverwendbare Schema-Komponenten in src/components/seo/SchemaScripts.tsx: OrganizationSchema, WebSiteSchema, GeoServiceSchema, ServiceSchema, PersonSchema, FaqSchema, BreadcrumbSchema, ArticleSchema. Alle nutzen stabile @id-Referenzen (${SITE.url}/#organization, ${SITE.url}/#younes-graebner etc.) — Schema.org-Graph ist über Pages hinweg konsistent verknüpfbar.

  3. llms.txt + llms-full.txt sind kohärent zur tatsächlichen Code-Realität. Keine Halluzinationen über nicht-existente Tools, korrekte Pfade, Team-Sektion stimmt mit src/lib/site.ts überein (Younes Gräbner als Founder/Inhaber, Paul Richter als Head of Tech & Operations).

Drei Sofortmaßnahmen mit höchstem Hebel (Details siehe Sektion 5):

  • P1: Organization-Schema-sameAs-Feld aktivieren, sobald die LinkedIn-Company-Page von RelioMedia verifiziert online ist. Aktuell ist der sameAs-Block bewusst leer (Anti-Halluzinations-Klausel im Code-Kommentar) — sobald die Profile real verfügbar sind, ist die Aktivierung ein 4-Zeilen-Edit mit substanziellem Entity-Signal.
  • P1: Founding-Year-Konsistenz prüfen — SITE.foundingYear: "2025" im Code, "gegründet 2025" in llms-full.txt. Der Stand "Mai 2026" wirkt korrekt, aber Founding-Year sollte verifiziert sein (Gewerbeanmeldung-Datum). Wenn das Datum 2025 korrekt ist, ist nichts zu tun.
  • P2: PersonSchema und ArticleSchema auf den noch ausstehenden Lab-Reports anwenden, sobald die Lab-Sektion live geschaltet wird. Die Komponenten sind vorhanden, werden aber bisher nur in /ueber-uns (PersonSchema) und gar nicht für Articles verwendet.

GEO-Score-Tabelle (technisch messbare Subscores):

Subscore Bewertung Quelle
Crawler-Access (Bot-Zugang) Hoch public/robots.txt, 12 AI-Bots namentlich allow-listed
Schema-Markup-Coverage Hoch 8 Schema-Komponenten, Graph-konsistente @id-Verknüpfung
Semantische HTML-Struktur Hoch <main id="main">, <nav>, <aside>, <article>, <section> durchgehend genutzt; Skip-to-Content-Link in src/app/[locale]/layout.tsx
llms.txt-Hygiene Hoch llms.txt + llms-full.txt vorhanden, konsistent zum Code, kein erfundener Inhalt
Performance (Bundle-Größen) Hoch Shared First Load 103 kB, Home 178 kB, Content-Pages 108–115 kB — siehe Build-Output Sektion 3.e
LLM-Cold-Recognition nicht erhoben — Phase 2 Erfordert Perplexity/ChatGPT/Claude-Tests
Citation-Rate pro Engine nicht erhoben — Phase 2 Erfordert n8n-Pipeline-Prompt-Matrix
Konkurrenz-Sichtbarkeits-Index nicht erhoben — Phase 2 Erfordert Konkurrenz-Definition + Vergleichstests
Wikidata-/Wikipedia-Eintrag nicht erhoben — Phase 2 Erfordert manuellen Lookup oder API-Call
Sentiment der Erwähnungen nicht erhoben — Phase 2 Folgt auf Citation-Rate-Erhebung

Kein Gesamtscore — der Visibility-Anteil fehlt; eine technische Bereitschafts-Note ohne Sichtbarkeits-Validierung wäre irreführend.


2. Sichtbarkeits-Audit

Diese Sektion ist in Phase 1 überwiegend Platzhalter. Erhebbar sind nur die statischen Crawler-Zugänglichkeits-Signale.

2.1 Indexierbarkeit

  • robots.txt: Vorhanden unter public/robots.txt. User-agent: * mit Allow: / plus Disallow: /api/ (sinnvoll, der API-Pfad würde Worker-Endpoints enthalten, falls aktiv).
  • Sitemap: Generiert dynamisch über src/app/sitemap.ts mit output: 'force-static'. Enthält alle 12 Locale-Routes für DE und EN, plus hreflang-Alternates pro Eintrag. Sitemap-URL: https://reliomedia.de/sitemap.xml. Verknüpft in robots.txt Zeile 48.
  • noindex-Tags: /datenschutz und /agb haben robots: { index: false, follow: true } in ihren generateMetadata-Funktionen — semantisch korrekt (Legal-Seiten müssen folgbar bleiben für Crawler-Discovery, sollen aber nicht ranken). Alle anderen Pages erlauben Indexierung.
  • X-Robots-Tag-Header: nicht erhoben — würde Live-Site-Fetch erfordern, nicht statisch im Repo prüfbar.

2.2 Sitemap-Qualität

Aus src/app/sitemap.ts:

Pfad Priorität Change-Frequency
/ 1.0 weekly
/audit 0.9 weekly
/pilot 0.9 weekly
/leistungen 0.9 monthly
/methode 0.8 monthly
/geo 0.9 monthly
/tools 0.7 monthly
/ueber-uns 0.6 monthly
/kontakt 0.6 monthly
/impressum 0.2 yearly
/datenschutz 0.2 yearly
/agb 0.2 yearly

Pro Eintrag werden hreflang-Alternates für DE und EN gerendert. lastModified wird zur Build-Zeit gesetzt.

2.3 llms.txt / llms-full.txt

public/llms.txt — kompaktes Manifest (38 Zeilen). Enthält Tagline, Was-wir-machen (1 Satz), Kontakt-Block, Team (Younes Gräbner als Inhaber + Founder, Paul Richter als Head of Tech & Operations), Wichtige-Seiten-Liste mit 11 absoluten URLs (alle DE-Locale), EN-Variante als optionaler Hinweis. Keine erfundenen Pages, keine Tools, die im Code fehlen.

public/llms-full.txt — Vollständiger Site-Content-Dump. Über-die-Firma-Block in Zeile 7 nennt korrekt "Younes Gräbner — RelioMedia, Einzelunternehmen, Inhaber Younes Gräbner". Team-Sektion in Zeile 60–67 und ausführliche Bios in Zeile 199–204 sind nach dem letzten Rechtsform-Fix aktuell.

2.4 Phase 2 (explizit nicht erhoben)

  • Test-Prompt-Matrix (10–11 branchen-typische Anfragen zur GEO-Sichtbarkeit von RelioMedia und DACH-B2B-GEO-Agenturen allgemein): nicht erhoben — Phase 2 via Pipeline.
  • Konkurrenz-Sichtbarkeits-Index (Listung der relevanten DACH-GEO-/SEO-Beratungen, Citation-Rate-Vergleich): nicht erhoben — Phase 2.
  • Engine-Cold-Recognition ("Was ist RelioMedia?" in Perplexity, ChatGPT, Claude): nicht erhoben — Phase 2.

3. Technisches Audit

Kern dieser Phase 1. Alle Befunde direkt aus dem Repo bzw. dem Production-Build belegbar.

3.a Crawler-/Bot-Zugang

Aus public/robots.txt:

Bot User-Agent-String Status Belegzeile
GPTBot GPTBot Explizit erlaubt (Allow: /) robots.txt L9
ChatGPT-User ChatGPT-User Explizit erlaubt L12
OAI-SearchBot OAI-SearchBot Explizit erlaubt L15
PerplexityBot PerplexityBot Explizit erlaubt L18
Perplexity-User Perplexity-User Explizit erlaubt L21
ClaudeBot ClaudeBot Explizit erlaubt L24
Claude-Web Claude-Web Explizit erlaubt L27
anthropic-ai anthropic-ai Explizit erlaubt L30
Google-Extended Google-Extended Explizit erlaubt L33
cohere-ai cohere-ai Explizit erlaubt L36
CCBot CCBot Explizit erlaubt L39
Diffbot Diffbot Explizit erlaubt L42
FacebookBot FacebookBot Explizit erlaubt L45

Wildcard-Default: User-agent: * → Allow: / / Disallow: /api/ (L4–6). API-Pfad blockiert, sinnvoll wenn dort später ein Cloudflare-Worker-Endpoint hängt.

Bewertung: Keine impliziten Defaults, keine bekannten AI-Crawler vergessen. Frühadopter-Konstellation.

3.b Schema.org / JSON-LD-Inventur

Definiert in src/components/seo/SchemaScripts.tsx (8 Komponenten), gemountet wie folgt:

Komponente Schema-Type Wo gemountet Beobachtungen
OrganizationSchema Organization Globaler [locale]/layout.tsx Z44 — auf jeder Page legalName: "Younes Gräbner — RelioMedia", address, contactPoint, knowsAbout-Liste mit 9 GEO-Topics, founders per Filter auf Younes (Einzelunternehmen), areaServed: DE/AT/CH. Keine sameAs (bewusst leer bis verifizierte Profile vorhanden — Code-Kommentar dokumentiert)
WebSiteSchema WebSite Globaler [locale]/layout.tsx Z45 — auf jeder Page inLanguage, publisher-Ref auf #organization, potentialAction (SearchAction auf /geo?q=…)
GeoServiceSchema Service Home + Leistungen (Page-Komponenten) serviceType: "Generative Engine Optimization", generisch — referenziert von ServiceSchema-Einträgen
ServiceSchema Service Leistungen-Pricing-Tiers, Pilot-Page, Audit-Page Pro Tier ein eigenes Service-Schema mit offers-Array (Mini = €0, Pilot = €1450/€4500, Retainer = ab €999)
PersonSchema Person /ueber-uns für beide Founder @id matched mit Organization.founders[]-Reference; sameAs zu LinkedIn wenn URL nicht auf -reliomedia endet (Placeholder-Filter) — bei echten URLs greift, also aktiv
FaqSchema FAQPage Home (10 FAQ-Items) + /geo (8 FAQ-Items) mainEntity als Question-Array mit acceptedAnswer.Answer
BreadcrumbSchema BreadcrumbList Auf allen Pages außer Home (jeweils im Page-Body) Position-basierte ListItems, jeweils Name + URL
ArticleSchema Article Definiert, aber noch nirgends gemountet (Lab-Reports noch nicht live) Bereit für künftige Lab-Page-Integration

Auffälligkeiten:

  1. Graph-Konsistenz: Alle Schemas nutzen stabile @id-URIs (#organization, #younes-graebner, #service-mini etc.). LLMs und Crawler können die Entitäten über Page-Grenzen hinweg verknüpfen.
  2. founders-Filter im OrganizationSchema: SITE.founders.filter(f => f.slug === "younes-graebner") — bewusst nur Younes als Gründer, da Einzelunternehmen. Paul taucht über sein PersonSchema mit worksFor-Beziehung auf, ohne als Gründer markiert zu sein. Inhaltlich korrekt.
  3. sameAs auf Organization-Ebene leer. Code-Kommentar in OrganizationSchema (Z57–58): "Only include sameAs if any of the linked profiles are real / verified. Placeholder LinkedIn URLs are intentionally NOT added — schema must be honest." Sobald die LinkedIn-Company-Page (https://www.linkedin.com/company/reliomedia, derzeit in SITE.social.linkedin hinterlegt) verifiziert aktiv ist, sollte sie ins sameAs-Array.
  4. PersonSchema.sameAs für Founder ist aktiv: die in SITE.founders[].linkedin hinterlegten Real-URLs (paul-richter-5b63513b5, younes-graebner-23518a32a) passieren den Placeholder-Filter und landen im JSON-LD.
  5. ArticleSchema noch ungenutzt. Wird erst mit dem Live-Schalten der Lab-Sektion relevant. Komponente bereit, Mount-Point fehlt.

3.c Semantische HTML-Struktur

Stichproben:

Globaler Layout-Rahmen (src/app/[locale]/layout.tsx):

  • <a href="#main" class="sr-only focus:not-sr-only …">Zum Hauptinhalt springen</a> — Skip-to-Content-Link, sichtbar bei Tastatur-Fokus, gut für A11y und Screen-Reader.
  • <Nav /> rendert <header class="sticky top-0 …"> mit <nav aria-label="Hauptnavigation"> (Desktop) + <nav aria-label="Hauptnavigation mobil"> (Mobile-Drawer).
  • <main id="main" class="min-h-[60vh]"> mit dem Page-Content.
  • <Footer /> mit <footer>-Element.

Heading-Hierarchie Home (src/app/[locale]/page.tsx):

  • <h1> einmal im Hero (via <Hero />-Komponente).
  • <h2> pro Section (Problem, What-we-do, Tools, Method, Founders, FAQ, Final CTA). Jeweils heading-h2 Token.
  • <h3> für Sub-Cards (z.B. Tool-Cards, Pipeline-Steps, Founder-Card-Namen via <p font-semibold> — siehe Anmerkung unten).
  • Grep auf Heading-Elemente: 17 Treffer auf <h[1-6]|<main|<article|<section|<nav|<aside> in page.tsx. Sections sind über <section className="section-rm"> strukturiert.

Heading-Hierarchie /geo (Pillar-Page):

  • <h1> einmal im Hero ("Generative Engine Optimization.").
  • TOC mit 10 IDs (definition, mechanik, geo-vs-seo, engines-im-vergleich, schema-engineering, entity-mapping, author-authority, antwort-strukturen, messung-kpis, roadmap). Im Content-Component sind 10 <h2 id="…">-Elemente — Grep bestätigt.
  • <aside> für die Sticky-TOC (lg:sticky lg:top-24).
  • <article class="prose-rm prose"> wraps den Pillar-Inhalt.
  • FAQ-Section mit <details> / <summary>-Elementen (semantisch korrekt für Accordion).

alt-Texte für Bilder:

  • /ueber-uns Founder-Image: alt={${f.name} — ${f.role/roleEn} bei RelioMedia} — beschreibend, semantisch.
  • Home FounderCard: alt={${name}, ${role} bei RelioMedia} — analog.
  • Dekorative SVGs (Logo, KnowledgeGraph, OG-Image): nicht direkt geprüft, aber Logo-Komponente nutzt aria-hidden oder role="img" je nach Variante (nicht in dieser Audit-Tiefe verifiziert).

aria-Labels:

  • Nav: aria-label="Hauptnavigation" / "Hauptnavigation mobil".
  • Skip-Link: implizit über sichtbaren Text.
  • Hamburger-Button: aria-label="Menü schließen" / "Menü öffnen" + aria-expanded={open}.
  • Cal.com-Embed-Container: aria-hidden="true" auf dem Lade-Platzhalter ("Lädt Kalender…"), korrekt da dekorativ.
  • Border-Linien als Trenner (z. B. in der Hero-Card): aria-hidden="true".

Sprachauszeichnung:

  • <html lang="de"> hardgekodet in src/app/layout.tsx Z92. Mögliche Schwäche: Auf EN-Pages sollte lang="en" gesetzt werden, nicht statisch "de". Da das Locale-Routing aber via Next.js erfolgt und HTML auf statischen Pages pro Locale gerendert wird, sollte das angepasst werden. Folgepunkt für Empfehlungen.
  • hreflang via metadata.alternates.languages auf allen generateMetadata-Funktionen — pro Page DE/EN-Verknüpfung vorhanden.

3.d llms.txt-Hygiene

Vollständigkeitscheck public/llms.txt:

  • Tagline ✓
  • Was-wir-machen ✓
  • Kontakt-Block (E-Mail, Telefon, Adresse) ✓
  • Team (mit Inhaber-Vermerk) ✓
  • Wichtige Seiten — 11 Links, alle absolute URLs auf reliomedia.de/de/...
  • EN-Hinweis + Verlinkung auf llms-full.txt ✓

Konsistenz mit Code: Team-Sektion stimmt mit SITE.founders überein (Younes Gräbner mit Umlaut, Paul Richter, korrekte Rollen). Alle gelisteten Pages existieren im Routing. Keine erfundenen Funktionen oder Tools.

Konsistenz mit llms-full.txt:

  • Über-die-Firma-Block aktuell (Einzelunternehmen, Inhaber Younes Gräbner).
  • Team-Sektion (Z60–67) und ausführliche Bios (Z199–204) korrekt nach Rechtsform-Fix.
  • Hero-Headline-Zitat ("Die KI zitiert eure Konkurrenz. RelioMedia ändert das.") stimmt mit Hero-Component überein.

Auffälligkeit: llms-full.txt Z202–204 enthält in den ausführlichen Bios der Founder noch Erfahrungs-Behauptungen ("Hat in den letzten Jahren mit B2B-SaaS-Teams an Schema-Engineering, Search-Tooling und Data-Pipelines gearbeitet", "Bringt Erfahrung aus B2B-Sales-Zyklen im DACH-Mittelstand mit"). Diese Aussagen sind narrativer Marketing-Text und nicht durch eine verlinkte Quelle (LinkedIn-Profil mit Berufsstationen, Wikipedia-Eintrag) belegbar. Nicht zwingend falsch, aber empirisch nicht verifiziert. Folgepunkt — siehe Empfehlungen P3.

3.e Performance-Signale (Production-Build vom 2026-05-15)

Build ausgeführt mit npm run build. Ergebnis: ✓ erfolgreich, 27 Static-Pages exportiert (1 root + 1 not-found + 24 [locale]-Routes (12 × 2 Locales) + 1 sitemap.xml). Bundle-Größen aus dem Build-Output:

Route Page-Size First-Load JS
/ (root redirect) 138 B 103 kB
/[locale] (Home) 38.2 kB 178 kB
/[locale]/geo 1.08 kB 115 kB
/[locale]/pilot 1.17 kB 115 kB
/[locale]/ueber-uns 181 B 113 kB
/[locale]/kontakt 3.25 kB 113 kB
/[locale]/audit 1.15 kB 110 kB
/[locale]/leistungen 170 B 108 kB
/[locale]/methode 170 B 108 kB
/[locale]/tools 138 B 103 kB
/[locale]/agb 138 B 103 kB
/[locale]/datenschutz 138 B 103 kB
/[locale]/impressum 138 B 103 kB
/sitemap.xml 138 B 103 kB
Shared First-Load JS 103 kB

Shared-Chunks: chunks/255-...js 46.3 kB + chunks/4bd1b696-...js 54.2 kB + other 1.99 kB = 103 kB.

Bewertung: Home liegt mit 178 kB First-Load deutlich über den Content-Pages (108–115 kB) — verursacht durch das Motion-Animation-Layer im Hero und die FounderCard-Komponente. Im Vergleich zur Performance-Zielgröße aus dem README (Initial JS < 130 KB für Hero) ist die Home-First-Load über dem Ziel. Content-Pages liegen im Zielbereich.

Lighthouse-Score: nicht erhoben — erfordert Live-URL und Headless-Browser-Run, in dieser Audit-Umgebung nicht durchführbar. Im TODO als Pre-Launch-Punkt vermerkt (mobile + desktop, Targets: Performance ≥95, A11y ≥95, SEO 100). Folgepunkt: nach erstem Deploy einen Lighthouse-Mobile-Run für /de und /de/geo ausführen.


4. Brand & Entity Mapping

4.1 Entity-Konsistenz (Code-seitig erhebbar)

Stelle Wert
SITE.name (Markenname) "RelioMedia"
SITE.legalName (offizielle Firmierung) "Younes Gräbner — RelioMedia"
Impressum-Anbieterblock "Younes Gräbner — RelioMedia" + "Inhaber: Younes Gräbner" + "Rechtsform: Einzelunternehmen"
Datenschutz §1 Verantwortlicher identisch zu Impressum (verifiziert per Grep)
AGB §1 Geltungsbereich "Younes Gräbner — RelioMedia, Einzelunternehmen, Inhaber Younes Gräbner"
OG-Metadata creator/publisher/authors "Younes Gräbner — RelioMedia" (in src/app/layout.tsx)
llms-full.txt Über-die-Firma "Younes Gräbner — RelioMedia, Einzelunternehmen, Inhaber Younes Gräbner"
Schema.org Organization legalName aus SITE.legalName"Younes Gräbner — RelioMedia"

Konsistenz: ✓ Alle Stellen identisch. Keine Reste von "RelioMedia GbR" (Grep-Verifikation: 0 Treffer in src/, public/, messages/). Younes wird durchgängig mit Umlaut "Gräbner" geschrieben (außer in der LinkedIn-URL, die zwingend younes-graebner ist — externer Profil-Slug).

4.2 E-A-T-Signale im Code

Signal Status Belegstelle
Organization-Schema vorhanden OrganizationSchema global gemountet ([locale]/layout.tsx Z44)
Adresse strukturiert (PostalAddress) address.streetAddress, postalCode, addressLocality, addressCountry
Telefon E.164-Format SITE.contact.telephoneE164 = "+4915905440499"
E-Mail Kontaktpunkt Organization.email + contactPoint.email
contactPoint mit contactType und availableLanguage "sales", ["de", "en"]
areaServed ["DE", "AT", "CH"] auf Organization + Service
foundingDate "2025" aus SITE.foundingYear
knowsAbout (Themen-Mapping) 9 GEO-Topics: Generative Engine Optimization, GEO, LLM SEO, Schema.org Engineering, Entity Mapping, E-E-A-T Optimization, Perplexity Citation Optimization, ChatGPT Source Optimization, Google AI Overviews
founders mit Person-Referenz ✓ (nur Younes) Filtered Map, Paul nicht als Gründer markiert
Founder PersonSchema in /ueber-uns Beide Founder, jobTitle dynamisch aus Rolle, sameAs zu LinkedIn aktiv
Organization sameAs (Brand-Verifikation) fehlt Aus Code-Kommentar: "intentionally NOT added until verified"
Author-Schema auf Lab-Artikeln ✗ (Lab noch nicht live) ArticleSchema-Komponente existiert, ungemountet

4.3 Service-/Offer-Strukturen

Aus src/app/[locale]/leistungen/page.tsx:

  • Generisches GeoServiceSchema als Provider-Referenz.
  • Pro Tier (Mini-Audit, Pilot-Audit, Retainer) ein eigenes ServiceSchema mit offers-Array:
    • Mini: price: "0", priceCurrency: "EUR"
    • Pilot: zwei Offers — "1450" (Pilot) + "4500" (Regular), beide mit availability: "InStock"
    • Retainer: "999", description: "From / month"

Bewertung: Strukturierte Preise vorhanden, LLM-friendly. Der duale Pilot-Offer-Eintrag (1.450 + 4.500) kommuniziert den Rabatt strukturell — ungewöhnlich gründlich.

4.4 Konsistenz Headline / Hero / Über-uns / Schema

Quelle Aussage
Hero H1 (i18n home.heroH1Line1/2) "Die KI zitiert eure Konkurrenz. RelioMedia ändert das."
Tagline SITE.description "B2B-GEO-Agentur für SaaS, FinTech und Tech-Mittelstand in DACH. Sichtbarkeit in Perplexity, ChatGPT, Claude und Google AI Overviews durch Entity-Architektur, Schema-Engineering und LLM-optimierte Content-Signale."
Über-uns H1 "Zwei Personen. Kein Mid-Management."
OrganizationSchema description identisch zur Tagline
llms.txt Was-wir-machen-Block "RelioMedia macht B2B-Marken in Perplexity, ChatGPT, Claude und Google AI Overviews sichtbar — durch Entity-Architektur, Schema-Engineering und LLM-optimierte Content-Signale."

Konsistenz: Aussage über Tätigkeit und Engine-Liste (Perplexity / ChatGPT / Claude / Google AI Overviews) ist über alle vier Stellen identisch. Tagline und Schema-Description sind 1:1 gleich.

4.5 Phase 2 (explizit nicht erhoben)

  • Wikipedia-Status: nicht erhoben — Phase 2 via Lookup. Vermutung (nicht verifiziert): Kein Eintrag, da Firma seit 2025 und Marktauftritt im Aufbau.
  • Wikidata-Eintrag: nicht erhoben — Phase 2.
  • Crunchbase-Eintrag: nicht erhoben — Phase 2.
  • LLM-Cold-Recognition ("Was ist RelioMedia?") in Perplexity / ChatGPT / Claude: nicht erhoben — Phase 2.

5. Handlungsempfehlungen

Strikt priorisiert. Nur Befunde aus Sektion 3 und dem Code-Teil von Sektion 4.

P1 — Vor Live-Gang

# Empfehlung Aufwand Impact Verantwortlich
P1-01 <html lang>-Attribut dynamisch pro Locale setzen (statt hartkodiertem lang="de" in app/layout.tsx). Ab [locale]/layout.tsx sollte über setLocale-aware Rendering oder über params.locale ein Conditional gerendert werden. Aktuell rendert die EN-Site <html lang="de"> — kleines, aber konkretes A11y-/SEO-Versehen. S hoch intern
P1-02 LinkedIn-Company-Page als sameAs in OrganizationSchema aktivieren, sobald sie verifiziert online ist. URL bereits in SITE.social.linkedin hinterlegt. Code-Kommentar dokumentiert die bewusste Lücke. S hoch intern
P1-03 Lighthouse-Mobile-Run nach erstem Deploy für /de und /de/geo. Wenn Home-First-Load (178 kB) Lighthouse-Performance unter 90 drückt, dynamic-import auf das Motion-Layer prüfen. S mittel intern

P2 — Phase 2 (Pipeline-getrieben)

# Empfehlung Aufwand Impact Verantwortlich
P2-01 n8n-Pipeline für Visibility-Audit aufsetzen: 10–11 DACH-B2B-GEO-Prompts gegen Perplexity/ChatGPT/Claude, Citation-Rate für reliomedia.de erheben, Konkurrenz-Set definieren (DACH-GEO-/SEO-Beratungen mit eigener Site). M hoch Phase 2
P2-02 Wikidata-Eintrag für RelioMedia anlegen, sobald 2–3 belegbare externe Sekundär-Erwähnungen existieren (Press-Mention, Konferenz, Listing). Entity-Anker für LLMs. L hoch Phase 2
P2-03 LLM-Cold-Recognition baseline erheben (Prompt: "Was ist RelioMedia?" in den drei Engines, Antwort vollständig dokumentieren als 2026-05-Snapshot). S mittel Phase 2
P2-04 Lab-Sektion live schalten und ArticleSchema pro Report mounten. Bereits vorhandene ArticleSchema-Komponente verwenden. M mittel intern, sobald Reports redaktionell finalisiert

P3 — Nach-Launch / Operative Hygiene

# Empfehlung Aufwand Impact Verantwortlich
P3-01 Founder-Bios in llms-full.txt Z202–204 auf belegbare Aussagen reduzieren oder mit verlinktem LinkedIn-Profil-Belegpfad versehen. Aktuell narrative Marketing-Aussagen ohne externe Verankerung. S niedrig intern
P3-02 Founding-Year (2025) verifizieren: stimmt mit Gewerbeanmeldung-Datum überein? Falls nicht, im SITE-Objekt korrigieren. S niedrig intern
P3-03 Monitoring-Layer: monatlicher Re-Run der Phase-2-Pipeline, Vergleich Citation-Rate über Zeit. M mittel Phase 2 / Retainer-Service

6. Implementierungs-Bauplan

Kopierfertige Snippets für die P1-Empfehlungen.

6.1 P1-01 — <html lang> dynamisch pro Locale

Aktuell in src/app/layout.tsx:

return (
  <html
    lang="de"
    suppressHydrationWarning
    className={`${GeistSans.variable} ${GeistMono.variable} ${inter.variable}`}
  >

Problem: Das Root-Layout kennt das Locale nicht, da [locale] eine Sub-Route ist. Lösung: HTML-Lang im [locale]/layout.tsx über ein Client-Side- oder Metadata-Helper setzen, oder ein middleware-loses Pattern mit params.locale und dem Next.js-Pattern, <html> nur einmal im Root-Layout zu rendern.

Empfohlene Variante (minimaler Eingriff): src/app/layout.tsx rendert kein <html>-Tag direkt, sondern delegiert an [locale]/layout.tsx. Da Static-Export aber bei Next.js ein einziges Root-Layout erfordert, ist das nur möglich, wenn das Locale dem Root-Layout über params durchgereicht wird — was im aktuellen App-Router-Pattern mit Static-Export einschränkend ist.

Alternative (pragmatisch, geringer Eingriff): in [locale]/layout.tsx per useEffect/Client-Component das lang-Attribut nachsetzen — funktioniert für JS-aktivierte Clients, nicht für reine HTML-Crawler. Da die Hauptzielgruppe AI-Crawler sind, die das initiale HTML lesen, ist diese Variante unzureichend.

Saubere Lösung: Eine zweite Static-Page-Hierarchie unter src/app/de/ und src/app/en/ mit eigenem <html lang>-Render. Strukturell aufwendiger.

Pragmatisch jetzt: Hartkodiertes lang="de" belassen, im <html>-Tag von [locale]/layout.tsx ein Mounted-<HtmlLangSetter>-Client-Helper hinzufügen (Best-Effort für JS-Clients), und im TODO als bekannte Limitation dokumentieren. Wenn EN-Performance signifikanten Anteil bekommt, struktureller Refactor.

// src/components/seo/HtmlLangSetter.tsx
"use client";
import { useEffect } from "react";

export function HtmlLangSetter({ locale }: { locale: string }) {
  useEffect(() => {
    document.documentElement.lang = locale;
  }, [locale]);
  return null;
}

Mounten in src/app/[locale]/layout.tsx Z31 (direkt in NextIntlClientProvider).

6.2 P1-02 — sameAs auf Organization aktivieren

In src/components/seo/SchemaScripts.tsx OrganizationSchema ergänzen (Z56–58 ersetzen):

// LinkedIn-Company-Page der Marke RelioMedia ist verifiziert online —
// als sameAs-Anker für Entity-Disambiguierung eingetragen.
if (SITE.social.linkedin) {
  json.sameAs = [SITE.social.linkedin];
}

Voraussetzung: Die URL https://www.linkedin.com/company/reliomedia muss tatsächlich existieren und aktiv sein. Vor Aktivierung manuell aufrufen und prüfen.

6.3 P1-03 — Lighthouse-Run

Kein Code-Snippet — manueller Schritt:

# Nach dem ersten Deploy auf reliomedia.de:
npx lighthouse https://reliomedia.de/de/ --preset=desktop --output=json --output-path=./lab/lighthouse-home-desktop.json
npx lighthouse https://reliomedia.de/de/ --preset=mobile --output=json --output-path=./lab/lighthouse-home-mobile.json
npx lighthouse https://reliomedia.de/de/geo/ --preset=mobile --output=json --output-path=./lab/lighthouse-geo-mobile.json

Targets aus README: Performance ≥95, A11y ≥95, SEO 100. Falls Home-Performance < 90: dynamic-import auf Motion-Layer prüfen.


7. Roadmap + Anhang

7.1 Roadmap — Phase 2 (Visibility-Pipeline-Audit)

Nächste Schritte zur Komplettierung des Audits:

  1. n8n-Pipeline-Setup — wiederverwendbarer Workflow: Prompt-Matrix → Perplexity API + ChatGPT API + Claude API → Citation-Detection (regex-basiert auf Domain-Mentions + Brand-Mentions) → Ausgabe als CSV/JSON in Lab-Snapshot-Format.
  2. Prompt-Matrix definieren — 10–11 Anfragen, die in folgenden Bereichen liegen sollen: (a) Direkte Marken-Recognition ("Was ist RelioMedia?"), (b) Kategorie-Anfragen ("Beste GEO-Agentur DACH", "B2B GEO Beratung Deutschland"), (c) Use-Case-Anfragen ("Wie mache ich meine B2B-SaaS-Marke in Perplexity sichtbar?"), (d) Konkurrenz-Vergleiche.
  3. Konkurrenz-Set festlegen — 3–5 DACH-GEO-/SEO-Beratungen mit eigener Site, die für die gleichen Prompts ranken könnten.
  4. Baseline-Erhebung — Snapshot 2026-05, abgelegt in public/lab/visibility-baseline-2026-05.md (analog zu diesem File).
  5. Re-Mess-Zyklus — Monatlich, Vergleich mit Baseline, Trend-Dokumentation.

7.2 Methodik dieser Phase 1

Abgedeckt:

  • Code-Repository-Analyse (TypeScript/TSX-Files, Schema-Komponenten, robots.txt, llms.txt, sitemap.ts, site.ts, Metadata)
  • Statische Crawler-Zugänglichkeits-Signale
  • Production-Build-Auswertung (Bundle-Größen, Static-Page-Count)
  • Konsistenz-Checks per Volltext-Grep
  • Heading-Hierarchie-Auswertung per Element-Grep

Nicht abgedeckt (= Phase 2):

  • LLM-API-Calls (Perplexity, OpenAI, Anthropic)
  • Live-URL-Fetches (X-Robots-Tag-Header, Lighthouse-Performance)
  • Wikipedia-/Wikidata-/Crunchbase-Lookups
  • Citation-Rate-Messungen
  • Konkurrenz-Sichtbarkeits-Vergleiche
  • Sentiment-Analysen der Erwähnungen

7.3 Haftungsausschluss

Die Phase 1 dieses Audits dokumentiert ausschließlich die technische GEO-Bereitschaft der Site. Sie trifft keine Aussagen über tatsächliche Sichtbarkeit in generativen Engines, keine Garantie über Ranking-Positionen, Zitations-Frequenzen oder ROI. LLM-Antworten sind nicht-deterministisch — Phase-2-Messungen sind Stichproben, keine Performance-Versprechen. RelioMedia liefert Architektur und Empfehlungen, keine Implementations-Garantien gegenüber Drittsystemen.

7.4 Glossar (nur im Bericht verwendete Begriffe)

  • GEO — Generative Engine Optimization. Strukturierung von Inhalten so, dass generative KI-Systeme (Perplexity, ChatGPT, Claude, Google AI Overviews) sie als Antwort-Quelle auswählen.
  • Schema.org / JSON-LD — Strukturierter-Daten-Standard, der semantische Entitäten für Crawler und LLMs maschinenlesbar macht.
  • Citation-Rate — Anteil der Anfragen einer Prompt-Matrix, in dem die eigene Domain als Antwort-Quelle genannt wird.
  • Cold-Recognition — Antwort eines LLMs auf eine Direktfrage ("Was ist X?") ohne Vorkontext, gemessen über mehrere Engines.
  • llms.txt — Standard-Manifest (analog zu robots.txt), das LLM-Crawlern einen kuratierten Page-Index gibt.
  • hreflang — HTML-Annotation, die Sprach-/Regions-Alternaten einer Page maschinenlesbar verknüpft.
  • First-Load JS — Initial-Bundle-Größe, die ein Browser beim ersten Seitenaufruf herunterladen muss.
  • E-A-T — Experience, Expertise, Authoritativeness, Trustworthiness — Googles ursprüngliches Qualitäts-Signal-Set, mittlerweile für alle generativen Engines relevant.

Ende Phase 1. Phase-2-Aufgaben sind in Sektion 5 (P2-Block) und Sektion 7.1 priorisiert.