Siehe auch: Website improvement
Um deine Website mysite.shinguz.ch sowohl für Suchmaschinen (SEO) als auch für KI-Suchmaschinen (GEO / AIEO) wie ChatGPT, Perplexity und Google Gemini zu optimieren, solltest du an zwei Hebeln ansetzen: technische Struktur und strukturierte Inhalte. KI-Modelle konsumieren Daten anders als klassische Suchmaschinen – sie suchen nach klaren Fakten, logischen Verknüpfungen und direkt verwertbaren Antworten.
Hier sind die wichtigsten Massnahmen, aufgeteilt in logische Schritte:
KI-Suchmaschinen hassen vage Formulierungen. Sie lieben strukturierte, unmissverständliche Daten.
Da deine Seite als regionales Branchenverzeichnis fungiert, musst du die lokale Relevanz drastisch stärken.
/firmen/gartenbau-zueger oder /regionen/uster).MySite — Meine kleine Website
Gartenbau Züger in Uster | Gartenpflege & Gartenbau | MySite### für Firmennamen. Verwende auf den neuen Firmen-Unterseiten <h1> für den Firmennamen und <h2> für Bereiche wie „Öffnungszeiten“ oder „Kontakt“./regionen/uster verlinken. Das stärkt das interne Linknetzwerk, dem auch KI-Crawler folgen.sitemap.xml existiert, die alle neuen Firmen-Unterseiten automatisch listet, und reiche diese in der Google Search Console ein.| Optimierungs-Fokus | Klassisches SEO (Google) | KI-Optimierung (LLMs / GEO) |
|---|---|---|
| Ziel | Ranking auf Platz 1-3 für Keywords wie „Firmenverzeichnis Uster“. | Erwähnung in der generierten Antwort („Welche Gärtner gibt es in Uster?“). |
| Wichtigster Faktor | Backlinks, Klickrate (CTR), Keyword-Dichte. | Schema.org-Daten, unmissverständliche Fakten, Zitationswürdigkeit. |
| Textstil | SEO-optimierter Content, der Suchintentionen abdeckt. | Extrem präzise, kurze Abschnitte, kein Content-Spam. |
Um dir konkretere Tipps zu geben, lass mich wissen:
Da du Hugo als statischen Website-Generator (SSG) nutzt, hast du die perfekte Grundlage für eine extrem schnelle, SEO- und KI-freundliche Website. Da Hugo standardmässig statische Seiten generiert, musst du für die Firmenunterseiten nicht zwingend eine Live-Datenbank zur Laufzeit anbinden. Stattdessen kannst du die Daten aus einer Datenbank (oder aus JSON-/YAML-Dateien) abrufen, um während des Build-Prozesses statische Unterseiten zu generieren. Das sorgt für unschlagbare Ladezeiten (PageSpeed), was Google und KI-Crawler gleichermaßen lieben.
Hier ist dein konkreter Fahrplan, um das Verzeichnis mit Hugo aufzubauen:
Anstatt zur Laufzeit eine SQL-Datenbank abzufragen, exportierst du deine Firmendaten am besten in eine JSON- oder YAML-Datei (z. B. data/firmen.json). Hugo kann daraus über sogenannte Custom Outputs oder Content Adapters (seit Hugo v0.126.0) automatisch für jede Firma eine eigene Unterseite generieren.
Deine Ordnerstruktur sollte am Ende so aussehen:
├── content/
│ ├── firmen/ <- Hier entstehen die Firmenunterseiten
│ └── regionen/ <- Hier entstehen die Regionsseiten
├── data/
│ └── firmen.json <- Hier liegen alle Firmendaten strukturiert
└── layouts/
└── firmen/
└── single.html <- Das SEO- & KI-optimierte Template für die Einzelfirma
Bediene im Layout für die Firmen-Einzelansicht sowohl Google als auch KI-Bots, indem du strukturierten Text mit Schema.org im JSON-LD-Format kombinierst.
Erstelle ein Template unter layouts/firmen/single.html:
{{ define "main" }}
<article itemscope itemtype="https://schema.org">
<!-- KI- & Suchmaschinen-relevanter Titel -->
<h1 itemprop="name">{{ .Params.firma_name }} in {{ .Params.ort }}</h1>
<p class="kategorie">Kategorie: <span itemprop="category">{{ .Params.kategorie }}</span></p>
<div class="beschreibung" itemprop="description">
<p>{{ .Params.beschreibung }}</p>
</div>
<!-- Kontaktdaten sauber strukturiert -->
<section class="kontakt">
<h2>Kontakt</h2>
<p>Adresse:
<span itemprop="address" itemscope itemtype="https://schema.org">
<span itemprop="streetAddress">{{ .Params.strasse }}</span>,
<span itemprop="postalCode">{{ .Params.plz }}</span>
<span itemprop="addressLocality">{{ .Params.ort }}</span>
</span>
</p>
{{ if .Params.telefon }}
<p>Telefon: <span itemprop="telephone">{{ .Params.telefon }}</span></p>
{{ end }}
</section>
<!-- Öffnungszeiten für Google & KI-Direktantworten -->
<section class="oeffnungszeiten">
<h2>Öffnungszeiten</h2>
<ul>
{{ range .Params.oeffnungszeiten }}
<meta itemprop="openingHours" content="{{ . }}">
<li>{{ . }}</li>
{{ end }}
</ul>
</section>
</article>
<!-- JSON-LD für LLMs (ChatGPT, Gemini) und Google explicit einbinden -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "{{ .Params.firma_name }}",
"description": "{{ .Params.beschreibung }}",
"category": "{{ .Params.kategorie }}",
"address": {
"@type": "PostalAddress",
"streetAddress": "{{ .Params.strasse }}",
"addressLocality": "{{ .Params.ort }}",
"postalCode": "{{ .Params.plz }}",
"addressCountry": "CH"
},
"telephone": "{{ .Params.telefon }}"
}
</script>
{{ end }}
Da du noch keine Verknüpfung hast, ist dies deine höchste Priorität für klassisches SEO. Ohne GSC weiss Google nicht zuverlässig, wann du neue Seiten veröffentlichst.
Einige Webmaster sperren KI-Bots aus Angst vor Scrapping. Da du aber möchtest, dass ChatGPT und Co. deine Firmenverzeichnis-Daten finden und in Suchresultaten zitieren, stelle sicher, dass deine static/robots.txt die wichtigen Bots erlaubt.
Stelle sicher, dass diese Zeilen nicht auf Disallow stehen, beziehungsweise explizit freigegeben sind:
User-agent: *
Allow: /
# Explizit für KI-Suchmaschinen-Crawler
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
Möchtest du Unterstützung beim Einrichten des Hugo Content Adapters, um die Unterseiten vollautomatisch aus deiner JSON-/Datenbank-Datei zu generieren, oder soll ich dir zeigen, wie du die internen Regionsseiten (z. B. alle Firmen aus Uster gruppiert) in Hugo aufbaust?
Hier erfährst du, wie du das mit Hugo Content Adapters (verfügbar seit Hugo v0.126.0) elegant löst. Der grosse Vorteil: Du musst keine hunderten Markdown-Dateien manuell erstellen. Du pflegst einfach deine Zentral-Datenbank (oder eine JSON-Datei), und Hugo baut beim Generieren der Website automatisch alle Firmen-Unterseiten und Regions-Sammelseiten.
Erstelle eine JSON-Datei unter data/firmen.json. Wenn du eine SQL- oder NoSQL-Datenbank nutzt, lässt du diese einfach bei jedem Deployment einen Export in dieses Format in deinen Hugo-Ordner werfen:
[
{
"id": "metro-supermarket",
"firma_name": "Metro Supermarket GmbH",
"kategorie": "Lebensmittel",
"ort": "Uster",
"plz": "8610",
"strasse": "Freiestrasse 8",
"beschreibung": "Handel mit Lebensmitteln und Getränken.",
"telefon": "044 941 08 41",
"oeffnungszeiten": ["Mo-Fr: 08:00 - 18:30", "Sa: 08:00 - 17:30"]
},
{
"id": "gartenbau-zueger",
"firma_name": "Gartenbau Züger",
"kategorie": "Dienstleistungen",
"ort": "Uster",
"plz": "8610",
"strasse": "Schlossweg 6",
"beschreibung": "Professioneller Gartenbau und Gartenpflege in der Region.",
"telefon": "044 940 43 34",
"oeffnungszeiten": []
}
]
Damit Hugo weiss, dass es aus dieser JSON-Datei echte Seiten generieren soll, nutzen wir eine _content.gotmpl-Datei. Das ist der moderne Hugo-Weg für dynamische Inhalte.
Erstelle die Datei content/firmen/_content.gotmpl:
{{/* Daten laden */}}
{{ $data := site.Data.firmen }}
{{/* Für jeden Eintrag in der JSON-Datei eine Seite generieren */}}
{{ range $data }}
{{ $page := dict
"title" (printf "%s in %s" .firma_name .ort)
"path" .id
"kind" "page"
"params" (dict
"firma_name" .firma_name
"kategorie" .kategorie
"ort" .ort
"plz" .plz
"strasse" .strasse
"beschreibung" .beschreibung
"telefon" .telefon
"oeffnungszeiten" .oeffnungszeiten
)
}}
{{ $.AddPage $page }}
{{ end }}
/firmen/metro-supermarket/ und nutzt dafür das layouts/firmen/single.html-Template, das wir vorhin erstellt haben./regionen/uster)Für Suchmaschinen (und KI-Modelle, die lokale Listen aggregieren) sind Regionsseiten extrem mächtig. Wir möchten, dass unter /regionen/uster/ automatisch alle Firmen aufgelistet werden, die das Attribut "ort": "Uster" haben.
Erstelle die Datei content/regionen/_content.gotmpl:
{{ $data := site.Data.firmen }}
{{/* Einzigartige Orte aus der JSON extrahieren (z.B. "Uster", "München") */}}
{{ $orte := slice }}
{{ range $data }}
{{ $orte = $orte | append .ort }}
{{ end }}
{{ $einzigartigeOrte := $orte | uniq }}
{{/* Für jeden Ort eine Übersichtsseite generieren */}}
{{ range $einzigartigeOrte }}
{{ $slug := . | urlize }}
{{ $page := dict
"title" (printf "Firmen und Dienstleistungen in %s" .)
"path" $slug
"kind" "page"
"params" (dict "ort" .)
}}
{{ $.AddPage $page }}
{{ end }}
Jetzt fehlt nur noch das passende Layout, das die Firmen auf der Regionsseite filtert und anzeigt. Erstelle die Datei layouts/regionen/single.html:
{{ define "main" }}
<h1>Lokale Firmen in {{ .Params.ort }}</h1>
<p>Hier finden Sie alle unabhängigen Unternehmen, Handwerker und Geschäfte aus der Region {{ .Params.ort }}:</p>
<ul class="firmen-liste">
{{ $aktuellerOrt := .Params.ort }}
{{/* Wir holen uns alle Seiten aus dem Bereich "firmen" */}}
{{ range (where .Site.RegularPages "Section" "firmen") }}
{{ if eq .Params.ort $aktuellerOrt }}
<li>
<strong><a href="{{ .Permalink }}">{{ .Params.firma_name }}</a></strong>
— {{ .Params.kategorie }} ({{ .Params.strasse }})
<p>{{ .Params.beschreibung }}</p>
</li>
{{ end }}
{{ end }}
</ul>
{{ end }}
Da du die Firmen jetzt auf eigenen Unterseiten und Regionsseiten hast, solltest du deine Startseite (layouts/index.html) so umbauen, dass sie für Suchmaschinen als “Inhalts-Hub” dient.
Anstatt alle Firmendetails direkt auf der Startseite zu laden, verlinkst du dort nur noch die Regionen und die neuesten Einträge:
<h2>Suchen Sie nach Region</h2>
<ul>
{{ range (where .Site.RegularPages "Section" "regionen") }}
<li><a href="{{ .Permalink }}">Firmen in {{ .Params.ort }}</a></li>
{{ end }}
</ul>
<h2>Zuletzt eingetragene Firmen</h2>
<ul>
{{ range first 5 (where .Site.RegularPages "Section" "firmen") }}
<li><a href="{{ .Permalink }}">{{ .Params.firma_name }}</a> ({{ .Params.ort }})</li>
{{ end }}
</ul>
Möchtest du als Nächstes sehen, wie wir eine Suchfunktion (z. B. mit Pagefind oder FlexSearch) direkt in Hugo einbauen, die komplett ohne Server-Datenbank auskommt und perfekt zu deinem statischen Verzeichnis passt?