Pingu
Computer MySQL PostgreSQL Books Publications
Spielereien Kanu Geopolitik Business TopoDB POI Klettersteigen History TransPool Thermal Baden Brokenstuben Goldwaschen
Blog Contact
Shinguz
Google
/ch/open

SEO / GEO

/ home / computer / .

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:

1. KI-Optimierung (Generative Engine Optimization - GEO)

KI-Suchmaschinen hassen vage Formulierungen. Sie lieben strukturierte, unmissverständliche Daten.

  • Strukturierte Daten (Schema.org) integrieren: Das ist der wichtigste Schritt. Implementiere LocalBusiness-, Organization- und ItemTier-Schemas im HTML-Code. Wenn eine KI deine Seite scannt, muss sie blind erkennen: „Metro Supermarket GmbH“ ist ein Lebensmittelgeschäft in Uster mit den Öffnungszeiten X und der Telefonnummer Y.
  • Faktenbasierte & direkte Sprache: KI-Modelle fassen Texte zusammen. Schreibe kurze, präzise Sätze ohne Marketing-Floskeln. Statt „Wir sind Ihr toller Partner für den Garten“ nutze: „Gartenbau Züger bietet Gartenpflege und Gartenbau in Uster an.“
  • Zitate und Urheberrechte klären: KI-Modelle neigen dazu, Quellen zu nennen, wenn sie Daten als vertrauenswürdig einstufen. Ein klares Impressum und transparente Autoren- oder Betreiberdaten (z. B. im Footer) erhöhen das Vertrauen (E-E-A-T).

2. Klassische On-Page- & Inhalts-SEO

Da deine Seite als regionales Branchenverzeichnis fungiert, musst du die lokale Relevanz drastisch stärken.

  • Eigene Unterseiten für Firmen und Regionen: Aktuell listen sich alle Firmen untereinander auf der Startseite. Das verwässert die Keywords. Jede Firma (z. B. Gartenbau Züger) und jede Region (z. B. Uster) benötigt eine eigene, suchmaschinenoptimierte Unterseite (URL-Struktur: /firmen/gartenbau-zueger oder /regionen/uster).
  • Spezifische Title Tags & Meta Descriptions: Jede Unterseite braucht massgeschneiderte Metadaten.
  • Schlecht: MySite — Meine kleine Website
    • Besser für die Firma: Gartenbau Züger in Uster | Gartenpflege & Gartenbau | MySite
  • Semantische HTML-Struktur (H-Readings): Die aktuelle Struktur nutzt direkt ### für Firmennamen. Verwende auf den neuen Firmen-Unterseiten <h1> für den Firmennamen und <h2> für Bereiche wie „Öffnungszeiten“ oder „Kontakt“.

3. Technische SEO-Optimierungen

  • Ladezeit (PageSpeed) & Mobile First: Ein Verzeichnis wird oft von unterwegs auf dem Smartphone aufgerufen. Die Seite muss extrem schnell laden. Minimiere CSS/JS und nutze moderne Bildformate (WebP).
  • Interne Verlinkung: Verlinke aus dem Text heraus. Wenn bei der Metro Supermarket GmbH das Keyword „Uster“ steht, sollte dieses auf die Regionsseite /regionen/uster verlinken. Das stärkt das interne Linknetzwerk, dem auch KI-Crawler folgen.
  • Sitemap & Robots.txt: Stelle sicher, dass eine dynamische sitemap.xml existiert, die alle neuen Firmen-Unterseiten automatisch listet, und reiche diese in der Google Search Console ein.

Direkt-Vergleich: Klassische SEO vs. KI-Optimierung

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:

  • Welches Content-Management-System (CMS) oder Framework nutzt du für die Website?
  • Hast du die Möglichkeit, Datenbanken anzubinden, um dynamische Unterseiten für die Firmen zu erstellen?
  • Gibt es bereits eine Google Search Console Verknüpfung für die Domain?

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:

1. Dynamische Unterseiten mit Hugo “Data Templates” erstellen

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

2. Das perfekte Hugo-Template für SEO & KI (single.html)

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 }}

3. Google Search Console (GSC) einrichten

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.

  1. Gehe auf die Google Search Console.
  2. Füge deine Domain mysite.shinguz.ch als Domain-Property hinzu.
  3. Bestätigung via DNS: Da es eine Subdomain ist, musst du idealerweise beim DNS-Anbieter deiner Hauptdomain (shinguz.ch) einen TXT-Eintrag hinterlegen. Alternativ kannst du die GSC als URL-Präfix-Property anlegen und eine von Google bereitgestellte HTML-Datei in deinen static/ Ordner von Hugo legen.
  4. Sitemap einreichen: Hugo generiert standardmässig unter public/sitemap.xml eine Sitemap. Trage diese nach der Bestätigung in der GSC ein (https://shinguz.ch).

4. KI-Crawlern den Zugriff erlauben (Robots.txt)

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.


1. Die Datenquelle vorbereiten

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": []
  }
]

2. Automatische Firmen-Unterseiten (Content Adapter)

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 }}
  • Effekt: Hugo generiert nun vollautomatisch URLs wie /firmen/metro-supermarket/ und nutzt dafür das layouts/firmen/single.html-Template, das wir vorhin erstellt haben.

3. Automatische Regions-Sammelseiten (z.B. /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 }}

4. Letzter SEO-Schritt: Die Startseite säubern

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>

Der Effekt für SEO & KI:

  1. Google sieht eine saubere Hierarchie: Startseite → Region (z.B. Uster) → Firma (z.B. Gartenbau Züger). Jede Seite rankt für ein spezifisches Keyword.
  2. KI-Crawler lesen die JSON-LD-Struktur auf den Firmen-Einzelseiten ein und können bei Prompts wie “Nenne mir einen Gärtner in Uster” deine Seite fehlerfrei als Quelle ausgeben und direkt dorthin verlinken.

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?