Der Lovable-SEO-Realitätscheck: Was ich beim Bauen von dot2.solutions gelernt habe

Ein Bericht aus erster Hand, in dem ich gegen jede SEO-Wand laufe, die eine Lovable-App treffen kann — und was sie wirklich behebt. Von doppelten Canonicals bis zu kaputten OG-Bildern: das ehrliche Audit.

Chris

Chris

March 15, 2026 · 14 min read

Der Lovable-SEO-Realitätscheck: Was ich beim Bauen von dot2.solutions gelernt habe
Was Besucher sehen vs. was Googlebot zuerst sieht

Ein Bericht aus erster Hand, in dem ich gegen jede SEO-Wand laufe, die eine Lovable-App treffen kann — und was sie wirklich behebt.

Ich bin Top-1-%-Lovable-Entwickler. Ich habe über 1,1 Millionen Zeilen Code auf der Plattform ausgeliefert. Ich liebe es ehrlich, damit zu bauen.

Und meine eigene Website hatte monatelang 5 Seiten in der Google Search Console mit „Duplikat ohne vom Nutzer gewähltes Canonical“ markiert.

Dieser Artikel ist alles, was ich beim Beheben gelernt habe — und das ehrliche Eingeständnis, was ich nicht beheben konnte.

Zuerst: Was Lovable tatsächlich baut

Lovable generiert React-+-Vite-Anwendungen. Das heisst, jede produzierte Site ist eine Client-Side-Rendered (CSR) Single-Page-App (SPA).

Praktisch heisst das: Wenn ein Crawler — Google, LinkedIn, ChatGPT, Perplexity — eine URL deiner Site abruft, liefert jede Seite Folgendes:

<!DOCTYPE html>
<html>
  <head>
    <title>Titel deiner Seite</title>
    <!-- dieselben Meta-Tags für jede Route -->
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

Der eigentliche Seiteninhalt — Überschriften, Texte, Canonical-Tags — existiert erst, nachdem React gebootet hat und JavaScript im Browser läuft. Für menschliche Besucher ist das nahtlos. Für Crawler entstehen echte Probleme.

Das ist keine Kritik an Lovable. Das ist die Architektur. Sie zu verstehen ist Voraussetzung für alles Weitere in diesem Artikel.

Die drei Crawler-Probleme, die das erzeugt

1. Googles zweistufiger Crawl führt zu Indexierungsverzögerungen

Google verarbeitet CSR-Sites in zwei Schritten:

  • Stufe 1: initiales HTML crawlen (sieht die leere Shell)
  • Stufe 2: später zurückkommen, JavaScript rendern und den echten Inhalt erfassen

Stufe 2 ist verzögert, depriorisiert und nicht garantiert schnell. Für eine neue Seite können das Tage oder Wochen bis zur sauberen Indexierung sein.

2. Social-Plattformen und KI-Crawler sehen nichts

LinkedIn, Twitter/X, Facebook, ChatGPT, Perplexity — keiner führt JavaScript aus. Wenn jemand auf LinkedIn einen Link zu deinem Blogpost teilt, holt die Plattform die URL für die Vorschau, bekommt deine leere Shell und zeigt entweder generische Infos oder nichts.

Das zählt mehr, als die meisten Lovable-Builder denken. Deine Open-Graph-Tags, sauber via react-helmet-async gesetzt, sind für Social-Crawler komplett unsichtbar.

3. react-helmet-async-Canonicals kommen zu spät

Mein SEO-Setup sah korrekt aus. Ich hatte SEOHead-Komponenten auf jeder Seite, die per react-helmet-async eindeutige Title, Beschreibungen und Canonicals injizierten. Google Search Console markierte trotzdem 5 Seiten als „Duplikat ohne vom Nutzer gewähltes Canonical“.

Warum? Weil diese Canonicals von JavaScript injiziert werden — Googles erster Crawl jeder Seite sieht dieselbe HTML-Shell mit dem Basistitel aus index.html und keinem seitenspezifischen Canonical. Google sieht 10 Seiten, die alle gleich aussehen, und markiert sie als Duplikate.

Was ich auf meiner eigenen Seite kaputt vorgefunden habe

Hier das Audit von dot2.solutions — ehrlich und ungefiltert:

❌ Relative Pfade bei OG-Bildern in der index.html

<!-- Was ich hatte — für Social-Crawler kaputt -->
<meta property="og:image" content="/lovable-uploads/image.png" />

<!-- Was es sein sollte -->
<meta property="og:image" content="https://dot2.solutions/lovable-uploads/image.png" />

Social-Crawler lösen keine relativen Pfade auf. Jeder Share meiner Homepage erzeugte eine kaputte Vorschau. Einzeiler-Fix, grosser Effekt.

❌ Falsches Default-ogImage in der SEOHead-Komponente

Meine SEOHead-Komponente hatte als Default:

ogImage = '/lovable-uploads/meet-fin3.webp'

Das ist ein Blogpost-Bild — ein Foto zu Fin — das als Social-Preview für jede Seite verwendet wurde, die kein eigenes Bild gesetzt hat. Meine Pricing-Seite, Lokalisierungs-Seite und Kontaktseite teilten alle ein Fin-Artikelbild auf LinkedIn.

❌ Schema-Duplikate

Ich hatte umfassendes JSON-LD-Schema in der index.html — Organization, LocalBusiness, Service. Ich hatte zusätzlich eine StructuredData-Komponente, die auf verschiedenen Seiten verwendet wurde. Auf jeder Seite mit gleichen Schema-Typen sah Googlebot Duplikat-Schemata.

Der Fix: Organization und LocalBusiness in die statische index.html (sitewide Identitäts-Signale, die jeder Crawler sehen muss). Die Komponente nur für seiten-spezifische Schemata — Article bei Blogposts, Service auf Servicepages, FAQPage, wo passend.

❌ Kein statisches Canonical in der index.html

Meine index.html hatte einen Kommentar, dass Canonicals „pro Seite von der SEOHead-Komponente überschrieben werden“ — aber keinen statischen Fallback. Für die Homepage und für alle Crawler ohne JS gab es im statischen HTML gar kein Canonical.

<link rel="canonical" href="https://dot2.solutions/" /> direkt in die index.html zu ergänzen, ist eine einfache Mitigation.

❌ Fehlende KI-Bot-Direktiven in der robots.txt

Meine robots.txt hat Googlebot und Bingbot abgedeckt, aber nichts für KI-Crawler. Da GEO (Generative Engine Optimization) immer relevanter wird, war das ein Versäumnis. Ergänze explizite Einträge:

User-agent: GPTBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Claude-Web
Allow: /

Die Fixes, die wirklich in Lovable funktionieren

Alle umsetzbar, ohne die Plattform zu verlassen. Schritt-für-Schritt-Anleitungen und einsatzfertige Prompts in meinem SEO-Setup-Guide für Lovable-Apps im Help Center.

  1. Absolute URLs für alle OG-Bilder — sowohl in der index.html als auch als Default-Fallback in deiner SEOHead-Komponente.
  2. Ein gebrandetes Default-ogImage — nutze deine echte Social-Card als Fallback, kein zufälliges Blogpost-Bild.
  3. og:site_name und og:locale — in SEOHead ergänzen:
    <meta property="og:site_name" content="Name deiner Seite" />
    <meta property="og:locale" content="de_CH" />
  4. Statisches Canonical in der index.html — mindestens für die Homepage.
  5. KI-Crawler-Direktiven in der robots.txt — explizites Allow für GPTBot, PerplexityBot, Claude-Web.
  6. Trennung der Schema-Scopes — sitewide Schemas statisch in der index.html, seiten-spezifische Schemas nur via Komponente.
  7. Build-Time Meta-Tag-Injection — die, die ich tatsächlich ausgeliefert habe. Drei Dateien machen es aus:
    • scripts/prerender-meta.ts — ein eigenes Vite-Plugin, das beim Build läuft, dist/index.html in routen-spezifische Verzeichnisse kopiert und korrekte <title>, <meta name="description">, <link rel="canonical"> und OG/Twitter-Tags pro Route injiziert
    • scripts/prerender-routes.ts — Route-Metadaten-Config, auto-generiert (siehe unten)
    • vite.config.ts — angepasst, um das Plugin einzubinden

Beim Build erzeugen Lovables Server Dateien wie dist/intercom-expert/index.html und dist/blog/ai-agents/index.html — jeweils mit eindeutigen Meta-Tags, fest ins statische HTML gebrannt. Googlebot sieht die Canonical-Tags sofort, ohne JavaScript.

Der Punkt, der es wartbar macht: ein Skript scripts/generate-prerender-routes.ts liest alle Blogpost-Datendateien, extrahiert id, title und excerpt und regeneriert prerender-routes.ts automatisch. Es läuft als prebuild-npm-Skript — neue Blogposts werden ohne manuelle Config in den Routen synchron gehalten.

Den leeren <div id="root">-Body fixt es nicht — den übernimmt React weiterhin client-seitig. Aber es zielt direkt auf das „Duplikat ohne vom Nutzer gewähltes Canonical“-Problem aus der Search Console.

Die Fixes, die das Verlassen von Lovable verlangen

Sei ehrlich zur Decke.

Was Build-Time Meta Injection NICHT fixt: Dein Seiten-Body bleibt im statischen HTML ein leerer <div id="root">. Google muss weiter JavaScript ausführen, um echten Content zu sehen. Die zweistufige Crawl-Verzögerung bleibt. Für eine inhaltsstarke Seite, deren Hauptkanal organische Suche ist, ist das eine reale Grenze.

Was es fixt: das „Duplikat ohne Canonical“-Problem in Search Console — genau, weil dieser Fehler darum geht, dass Google im statischen HTML vor dem JS-Lauf keine Canonicals sieht. Mit dem Plugin bekommt jede Key-Route ihr eigenes HTML-File mit dem richtigen Canonical eingebrannt. Ich beobachte das in Search Console über die nächsten 4–6 Wochen, um zu bestätigen, dass die markierten Seiten in „indexiert“ wechseln.

Der Cloudflare-Worker-+-Prerender.io-Ansatz: Ich habe es geprüft. Berichte aus der Praxis zeigen DNS-Instabilität nach wenigen Stunden — man landet wieder bei A-Records und umgeht das ganze Setup. Für eine produktive Consultancy-Seite sind sporadische Downtimes ein grösseres Problem als langsame Indexierung.

Die Framer-Migrationsroute: Framer löst das SSR-Problem elegant für reine Marketing-Seiten. Aber wenn deine Lovable-App Supabase-Backend, Auth-Flows, Kundenportale oder andere Dynamik hat — Framer kann das nicht. Du hättest zwei Codebases zu pflegen.

💡 Die ehrliche Empfehlung

Für die meisten Lovable-Builder ist der richtige Move:

  1. Alle Fixes oben in Lovable umsetzen
  2. Deinen Blog auf Ghost verschieben, wenn Content-SEO fürs Geschäft zählt

Ghost handhabt SSR nativ, ist für Content gebaut, und der Blog ist genau dort, wo Googles Crawl-Verzögerung am stärksten wehtut. Deine App bleibt in Lovable, wo sie hingehört.

Was Lovable beim SEO gut macht

Ich möchte das nicht rein kritisch lesen lassen — vieles macht Lovable richtig:

  • llms.txt-Support — ich habe llms.txt und llms-full.txt auf dot2.solutions umgesetzt. Das ist für GEO und KI-Crawler-Sichtbarkeit ehrlich vorne.
  • Sauberes URL-Routing — React Router erzeugt automatisch saubere, sprechende URLs.
  • Semantisches HTML — Lovable generiert konsistent saubere <main>-, <nav>-, <section>-Strukturen.
  • Performance — Vite-Builds sind schnell. Core Web Vitals tendieren gut.
  • Flexibilität — SEOHead-Pattern, StructuredData-Komponente und robots.txt-Konfig geben dir echten Hebel innerhalb der CSR-Grenzen.

Für eine Consultancy wie meine, deren Akquise primär über LinkedIn, die Intercom-Community und Empfehlungen läuft — nicht über organische Suche — sind die CSR-Limits handhabbar. Für ein content-first Business, in dem SEO der Hauptkanal ist, sind sie deutlicher.

Die Checkliste

Bevor du eine Lovable-Site shippst, prüfe jedes davon (oder nutze den vollständigen SEO-Setup-Guide für Implementierungsdetails):

Die breitere Lektion

In Lovable zu bauen ist schnell. Diese Geschwindigkeit hat einen Trade-off — du shippst standardmässig CSR, und CSR hat bekannte SEO-Grenzen, die keine react-helmet-async-Konfiguration vollständig löst.

Das ist kein Grund, Lovable zu meiden. Es ist ein Grund, mit realistischen Erwartungen reinzugehen, jede verfügbare Mitigation umzusetzen und bewusste Entscheidungen zu treffen, wo dein Content tatsächlich liegt.

Meine Seite rankt weiterhin. Meine Blogposts werden indexiert. Die Search-Console-Warnungen werden besser. Ich tue aber auch nicht so, als wäre die Architektur unsichtbar.

Bau schnell. Shippe oft. Aber wisse, worauf du baust.

Baust du mit Lovable und brauchst Experten-Begleitung?

Als Top-1-%-Lovable-Entwickler mit 1,1M+ ausgelieferten Zeilen helfe ich Teams zu produktionsreifen Ergebnissen — von SEO-Architektur bis zu komplexen Integrationen. Ob ganzer Build oder Code-Review: lass uns sprechen.

Unsere Lovable-Expert-Services ansehen →

Christopher Boerger ist Gründer von dot2.solutions, einer Schweizer Beratung für KI-Support-Automation mit Schwerpunkt Intercom-Fin-AI-Deployment und Wissensbasis-Architektur. Top-1-%-Lovable-Entwickler.

SEOLovableReactViteGoogle Search ConsoleOpen GraphTechnical SEO

Häufig gestellte Fragen

Lovable baut React + Vite Single-Page-Apps, in denen alle Routen dieselbe index.html-Shell ausliefern. Canonical-Tags, die von react-helmet-async injiziert werden, erscheinen erst nach der JavaScript-Ausführung — Googles erster Crawl sieht für jede Seite identisches statisches HTML und meldet sie als Duplikate. Der Fix: ein statisches Canonical in der index.html ergänzen und ein Build-Time-Meta-Injection-Plugin nutzen, das pro Route ein HTML-File mit eigenem Canonical erzeugt.

Nein. LinkedIn, Twitter/X, Facebook und KI-Crawler wie ChatGPT und Perplexity führen kein JavaScript aus. Sie sehen nur die statische HTML-Shell — OG-Tags via react-helmet-async sind für sie unsichtbar. Du brauchst absolute URLs für OG-Bilder in der index.html und idealerweise ein Build-Time-Meta-Setup, um korrekte OG-Tags pro Route auszuliefern.

Build-Time Meta Injection ist ein eigenes Vite-Plugin (prerender-meta.ts), das beim Build läuft. Es kopiert dist/index.html in routen-spezifische Verzeichnisse und injiziert die korrekten Title, Meta-Description, Canonical-URL und OG/Twitter-Tags pro Route. Crawler sehen so eindeutige, korrekte Meta-Tags in statischem HTML — ohne JavaScript ausführen zu müssen.

Wenn Content-SEO ein primärer Wachstumskanal ist, hoste deinen Blog auf einer Plattform mit nativem Server-Side Rendering wie Ghost. Deine App kann in Lovable bleiben, wo sie exzelliert. Wenn deine Akquise über andere Kanäle läuft (LinkedIn, Empfehlungen, Community), sind die CSR-Limits mit den richtigen Mitigationen handhabbar.

Lovable erzeugt sauberes URL-Routing über React Router, semantisches HTML mit korrekter main/nav/section-Struktur, schnelle Vite-Builds mit guten Core Web Vitals und gibt dir die Flexibilität, SEOHead-Komponenten, StructuredData-Komponenten, robots.txt-Konfiguration und eine llms.txt für KI-Crawler-Sichtbarkeit zu implementieren.

Noch Fragen?

Kontakt aufnehmen

Share this article

Building on Lovable? Let's Talk.

As a top-ranked Lovable expert, we help teams ship production-grade web apps — SEO, GEO, and SSR done right from day one.

No commitment required • Free 30-minute consultation • Expert guidance