Course EducationalCourse Schema Markup vertieft – CourseInstance und Zertifikate für Google
Schema Markup

Course Schema Markup vertieft: EducationalCourse, CourseInstance und Zertifikate für Google

Shift07 Team
3. Mai 2026
14 Min. Lesezeit
Schema Markup

Du hast bereits die Grundlagen des Course Schema Markups implementiert — doch Google bietet weit mehr Möglichkeiten, Bildungsangebote als Rich Snippets darzustellen. Der entscheidende Unterschied liegt im Zusammenspiel von EducationalCourse, CourseInstance und speziellen Properties wie hasCourseInstance, educationalCredentialAwarded und competencyRequired. Wer diese fortgeschrittenen Eigenschaften beherrscht, kann seine Kursseiten erheblich informativer und klickstärker in den Suchergebnissen präsentieren.

Dieser Artikel geht deutlich tiefer als die Grundlagen: Du lernst, wie du Kursinstanzen mit Terminen und Preisen strukturierst, Zertifikate korrekt einbindest, mehrere Kursdurchläufe abbildest und typische Fehler vermeidest, die dazu führen, dass Google dein Markup ignoriert.

Course vs. EducationalCourse: Was ist der Unterschied?

In Schema.org gibt es eine wichtige Hierarchie: EducationalCourse ist ein direkter Untertyp von Course. Course beschreibt ein allgemeines Bildungsangebot — eine Folge von Bildungsveranstaltungen, die auf ein bestimmtes Lernziel ausgerichtet sind. EducationalCourse erweitert diese Definition um spezifische Bildungsaspekte.

In der Praxis verwendet Google für Kurskarussells (Course Carousels) primär EducationalCourse. Wenn du möchtest, dass dein Kurs in den spezifischen Rich Results für Kurse erscheint, solltest du deshalb EducationalCourse dem allgemeineren Course vorziehen.

  • Course: Basistyp, geeignet für jede Art von Lehrveranstaltung
  • EducationalCourse: Untertyp, bevorzugt von Google für dedizierte Kurs-Rich-Results
  • LearningResource: Übergeordneter Typ für alle Lernmaterialien (Videos, Dokumente, Kurse)

Google empfiehlt explizit EducationalCourse für Angebote, die in Kurskarussells erscheinen sollen. Die Properties überschneiden sich weitgehend — der entscheidende Unterschied liegt im Typ-Wert selbst.

Die wichtigsten Properties im Überblick

Bevor wir in komplexe Beispiele eintauchen, hier die Properties, die Google für EducationalCourse auswertet:

Pflicht-Properties (Required)

  • name: Titel des Kurses (String)
  • description: Kurze Kursbeschreibung (String)
  • provider: Die Organisation, die den Kurs anbietet (Organization)

Empfohlene Properties (Recommended)

  • url: Kanonische URL der Kursseite
  • image: Kursbild für Rich Results
  • hasCourseInstance: Verweis auf eine oder mehrere CourseInstance-Objekte
  • educationalCredentialAwarded: Zertifikat oder Abschluss nach Kursende
  • teaches: Was der Kurs vermittelt (Freitext)
  • coursePrerequisites: Voraussetzungen für den Kurs
  • competencyRequired: Erforderliche Vorkenntnisse
  • occupationalCategory: Berufliche Kategorie (z. B. nach SOC-Code)
  • numberOfCredits: Kreditpunkte (ECTS o. ä.)
  • financialAidEligible: Förderfähigkeit (Boolean/String)

CourseInstance: Das Herzstück für Kurskalendar und Preise

Eine der mächtigsten Erweiterungen des Course-Schemas ist CourseInstance. Während EducationalCourse den Kurs als abstraktes Konzept beschreibt (Titel, Lernziele, Zertifikat), repräsentiert CourseInstance einen konkreten Kursdurchlauf mit spezifischem Termin, Preis und Anmeldelink.

Diese Trennung ist konzeptuell wichtig: Ein Kurs "Python für Anfänger" kann mehrmals im Jahr stattfinden — jeder Durchlauf ist eine eigene CourseInstance mit eigenem Start- und Enddatum. Für Google bedeutet das: Aktuelle, zeitlich relevante Informationen erscheinen direkt in den Suchergebnissen.

Properties von CourseInstance

  • courseMode: Kursformat — "online", "onsite" oder "blended"
  • startDate: Startdatum (ISO 8601, z. B. "2026-06-15")
  • endDate: Enddatum
  • location: Veranstaltungsort bei Präsenzkursen (Place-Objekt)
  • instructor: Kursleiter (Person-Objekt)
  • offers: Preisinformationen (Offer-Objekt)
  • inLanguage: Kurssprache (z. B. "de")
  • courseWorkload: Zeitaufwand (ISO 8601 Dauer, z. B. "PT20H" für 20 Stunden)

Vollständiges JSON-LD-Beispiel: EducationalCourse mit CourseInstance

Das folgende Beispiel zeigt einen Online-Kurs mit zwei geplanten Durchläufen, Zertifikat und vollständigen Preisinformationen:

{
  "@context": "https://schema.org",
  "@type": "EducationalCourse",
  "name": "Python für Einsteiger: Programmieren lernen von Grund auf",
  "description": "In diesem Kurs lernst du Python von Null. Nach 20 Unterrichtsstunden kannst du eigene Skripte schreiben, Daten verarbeiten und einfache Webanwendungen erstellen.",
  "url": "https://example.de/kurse/python-einstieg",
  "image": "https://example.de/images/python-kurs.jpg",
  "provider": {
    "@type": "Organization",
    "name": "TechAkademie Berlin",
    "url": "https://example.de",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Unter den Linden 42",
      "addressLocality": "Berlin",
      "postalCode": "10117",
      "addressCountry": "DE"
    }
  },
  "teaches": "Python-Syntax, Datenstrukturen, Funktionen, objektorientierte Programmierung, Dateioperationen",
  "coursePrerequisites": "Grundlegende Computer-Kenntnisse; keine Programmiererfahrung erforderlich",
  "competencyRequired": "Umgang mit dem Computer, Englischkenntnisse für Bibliotheksdokumentation hilfreich",
  "educationalCredentialAwarded": "Teilnahmezertifikat Python für Einsteiger",
  "occupationalCategory": "15-1256.00",
  "numberOfCredits": "2",
  "inLanguage": "de",
  "hasCourseInstance": [
    {
      "@type": "CourseInstance",
      "name": "Python Einstieg – Juni 2026",
      "courseMode": "online",
      "startDate": "2026-06-15",
      "endDate": "2026-06-26",
      "courseWorkload": "PT20H",
      "inLanguage": "de",
      "instructor": {
        "@type": "Person",
        "name": "Dr. Anna Müller",
        "url": "https://example.de/trainers/anna-mueller"
      },
      "offers": {
        "@type": "Offer",
        "price": "299",
        "priceCurrency": "EUR",
        "availability": "https://schema.org/InStock",
        "validFrom": "2026-04-01",
        "url": "https://example.de/kurse/python-einstieg/anmeldung?termin=juni-2026"
      }
    },
    {
      "@type": "CourseInstance",
      "name": "Python Einstieg – September 2026",
      "courseMode": "onsite",
      "startDate": "2026-09-07",
      "endDate": "2026-09-18",
      "courseWorkload": "PT20H",
      "inLanguage": "de",
      "location": {
        "@type": "Place",
        "name": "TechAkademie Berlin – Hauptgebäude",
        "address": {
          "@type": "PostalAddress",
          "streetAddress": "Unter den Linden 42",
          "addressLocality": "Berlin",
          "postalCode": "10117",
          "addressCountry": "DE"
        }
      },
      "instructor": {
        "@type": "Person",
        "name": "Dr. Anna Müller"
      },
      "offers": {
        "@type": "Offer",
        "price": "399",
        "priceCurrency": "EUR",
        "availability": "https://schema.org/InStock",
        "validFrom": "2026-05-01",
        "url": "https://example.de/kurse/python-einstieg/anmeldung?termin=september-2026"
      }
    }
  ]
}

Zertifikate richtig einbinden: educationalCredentialAwarded

Die Property educationalCredentialAwarded teilt Google mit, welche Qualifikation Teilnehmer nach erfolgreichem Kursabschluss erhalten. Du kannst einen einfachen String angeben oder ein vollständiges EducationalOccupationalCredential-Objekt nutzen:

"educationalCredentialAwarded": {
  "@type": "EducationalOccupationalCredential",
  "name": "Zertifikat Python-Entwickler Grundstufe",
  "description": "Offizielles Teilnahmezertifikat der TechAkademie Berlin",
  "url": "https://example.de/zertifikate/python-grundstufe",
  "credentialCategory": "certificate",
  "recognizedBy": {
    "@type": "Organization",
    "name": "Bundesverband IT-Bildung e.V."
  },
  "validFor": "P3Y"
}

Die Property credentialCategory kann folgende Werte annehmen:

  • "degree": Akademischer Abschluss
  • "diploma": Diplom
  • "certificate": Zertifikat
  • "badge": Digitales Abzeichen
  • "license": Berufserlaubnis/Lizenz

Die Property validFor gibt die Gültigkeitsdauer im ISO-8601-Format an — "P3Y" bedeutet drei Jahre. Das ist besonders für IHK-Zertifikate oder branchenspezifische Qualifikationen relevant.

courseMode: Online, Präsenz oder Hybrid?

Google unterscheidet bei CourseInstance drei Kursmodi, die direkt in den Rich Results angezeigt werden können:

  • "online": Vollständig digital, kein Präsenztermin
  • "onsite": Präsenzkurs an einem physischen Ort
  • "blended": Kombination aus Online- und Präsenzanteil

Du kannst auch die Langform nach Schema.org-Empfehlung verwenden, also https://schema.org/OnlineEventAttendanceMode. In der Praxis akzeptiert Google beide Schreibweisen — kurz und lang.

Wichtig: Bei Online-Kursen ohne physischen Ort solltest du auf ein location-Objekt verzichten oder stattdessen VirtualLocation verwenden. Ein leer gelassenes location-Objekt erzeugt einen Validierungsfehler.

courseWorkload: Zeitaufwand korrekt angeben

Die Property courseWorkload erwartet einen ISO-8601-Dauerwert. Dieser Wert beschreibt den gesamten Zeitaufwand für den Kurs — also Unterrichtszeit plus Selbststudium. Die gängigsten Werte:

  • "PT2H": 2 Stunden (kurzes Webinar)
  • "PT20H": 20 Stunden (intensiver Crash-Kurs)
  • "P2D": 2 Tage
  • "P3W": 3 Wochen
  • "P6M": 6 Monate (Ausbildungsprogramm)

Du kannst die Werte auch kombinieren: "P2DT4H" bedeutet 2 Tage und 4 Stunden. Falls du kein ISO-Tool zur Hand hast, gibt es auf Shift07 einen ISO 8601 Dauer-Konverter, der dir diesen Wert automatisch berechnet.

Instructor-Details: Person-Schema korrekt einbinden

Die Qualität des Kursleiters ist ein wichtiger Vertrauensfaktor für potenzielle Teilnehmer. Google empfiehlt, das instructor-Objekt so vollständig wie möglich auszufüllen:

"instructor": {
  "@type": "Person",
  "name": "Prof. Dr. Klaus Weber",
  "url": "https://example.de/trainer/weber",
  "image": "https://example.de/images/trainer-weber.jpg",
  "description": "15 Jahre Erfahrung in Python-Entwicklung und Data Science",
  "sameAs": [
    "https://www.linkedin.com/in/klausweber",
    "https://github.com/klausweber"
  ],
  "jobTitle": "Senior Data Engineer",
  "worksFor": {
    "@type": "Organization",
    "name": "TechAkademie Berlin"
  }
}

Mit vollständigen Trainer-Profilen stärkst du gleichzeitig dein E-E-A-T-Signal (Experience, Expertise, Authoritativeness, Trustworthiness). Das ist besonders für medizinische, rechtliche oder finanzielle Weiterbildungsangebote wichtig — Google bewertet hier die Qualifikation des Lehrpersonals besonders kritisch.

Preisinformationen: Offer-Objekt richtig strukturieren

Das Offer-Objekt innerhalb von CourseInstance ermöglicht es, Kurspreise direkt in den Suchergebnissen anzuzeigen. Wichtig: Google zeigt Preise nur dann an, wenn das Offer-Objekt vollständig und korrekt ist.

"offers": {
  "@type": "Offer",
  "price": "199.00",
  "priceCurrency": "EUR",
  "availability": "https://schema.org/InStock",
  "validFrom": "2026-05-01",
  "validThrough": "2026-06-10",
  "url": "https://example.de/kurse/python-einstieg/buchen",
  "priceValidUntil": "2026-06-10"
}

Für kostenlose Kurse verwendest du:

"offers": {
  "@type": "Offer",
  "price": "0",
  "priceCurrency": "EUR",
  "availability": "https://schema.org/InStock",
  "url": "https://example.de/kurse/python-einstieg/kostenlos-anmelden"
}

Beachte: Der Wert von price muss immer ein String oder eine Zahl sein, nie ein Ausdruck wie "ab 99 EUR" oder "auf Anfrage". Solche Werte werden von Google als invalid markiert und können dazu führen, dass das gesamte Rich Result nicht erscheint.

Mehrere Kursinstanzen: Wann ist das sinnvoll?

Du solltest hasCourseInstance als Array nutzen, wenn:

  • Der gleiche Kurs mehrfach im Jahr stattfindet (Januar, April, September)
  • Du Online- und Präsenzversion des gleichen Kurses anbietest
  • Verschiedene Städte denselben Kurs beherbergen
  • Du Early-Bird- und Normalpreis abbilden möchtest (zwei Instanzen mit unterschiedlichen validFrom/validThrough)

Wichtig: Begrenze die Anzahl der Instanzen auf maximal 3-5 pro Seite. Zu viele Instanzen erhöhen die Ladezeit der Seite und machen den JSON-LD-Block unübersichtlich. Für umfangreiche Kurskalender empfiehlt sich eine separate Kalenderseite mit eigenem Schema.

Typische Fehler bei Course Schema Markup

Bei der Auswertung hunderter strukturierter Daten aus deutschen Bildungsseiten fallen folgende Fehler regelmäßig auf:

Fehler 1: provider fehlt oder ist leer

Google fordert provider als Pflichtfeld. Viele Implementierungen lassen dieses Feld leer oder geben nur einen String statt eines Organization-Objekts an. Korrekt ist immer das vollständige Objekt mit @type, name und url.

Fehler 2: startDate ohne vollständige ISO-8601-Syntax

Falsch: "2026-06-15T00:00:00" ohne Zeitzone. Richtig: "2026-06-15T09:00:00+02:00" (mit Zeitzone) oder kurz "2026-06-15" (reines Datum). Fehlerhafte Datumsangaben führen zu Warnings im Rich Results Test.

Fehler 3: courseMode fehlt bei CourseInstance

courseMode ist für Google ein wichtiges Unterscheidungsmerkmal. Online-Kurse ohne courseMode: "online" werden möglicherweise nicht korrekt in den gefilterten Kurssuchen (z. B. "Online-Kurse Python") angezeigt.

Fehler 4: Preis als nicht-numerischer String

Wie oben erwähnt: "ab 99 EUR" oder "kostenlos" sind ungültige Preiswerte. Nutze immer "0" für kostenlose Kurse und numerische Strings oder Zahlen für bezahlte Angebote.

Fehler 5: Kursseite ohne eigene URL

Jeder Kurs sollte eine eigene, kanonische URL haben. Implementierst du Course Schema auf einer Seite, die mehrere Kurse mit JavaScript lädt (z. B. aus einer API), sieht Google möglicherweise nur einen leeren Kurscontainer, bis das JavaScript ausgeführt wird. Überprüfe das mit dem JavaScript SEO Checker.

Google Rich Results: Was wird tatsächlich angezeigt?

Google zeigt Course Rich Results in zwei Hauptformaten:

1. Kurskarussell (Course Carousel)

Erscheint bei generischen Suchanfragen wie "Python lernen" oder "Excel Kurs". Google wählt mehrere Kurse verschiedener Anbieter und stellt sie in einem horizontalen Karussell dar. Voraussetzungen: Mindestens drei Kurse, vollständige provider-Angabe, gültige url.

2. Einzelner Kurs mit Instanzen

Bei spezifischen Suchanfragen kann Google einzelne Kursseiten mit kommenden Terminen, Preisen und Kursleiter direkt im SERP-Snippet hervorheben. Das ist besonders relevant für standortbezogene Suchen wie "Python Kurs Berlin 2026".

Integration mit EducationalOrganization Schema

Wenn du eine EducationalOrganization betreibst, verknüpfe dein Course-Schema über provider direkt mit dem Organization-Markup auf deiner Startseite. Das stärkt das Signal, dass deine Kurse von einer anerkannten Bildungseinrichtung stammen — ein wesentlicher E-E-A-T-Faktor.

"provider": {
  "@type": ["Organization", "EducationalOrganization"],
  "@id": "https://example.de/#organization",
  "name": "TechAkademie Berlin GmbH",
  "url": "https://example.de",
  "logo": {
    "@type": "ImageObject",
    "url": "https://example.de/logo.png"
  },
  "accreditation": {
    "@type": "EducationalOccupationalCredential",
    "name": "Staatlich anerkannte Weiterbildungseinrichtung Berlin"
  }
}

Die Verwendung von @id mit dem Seitenlink deiner Organisation ist Best Practice: Wenn Google mehrere Seiten deiner Domain crawlt, erkennt es, dass alle Kurse von demselben Anbieter stammen, und kann ein kohärentes Knowledge Graph-Profil aufbauen.

Validierung: So prüfst du dein Course Schema

Bevor du Course Schema Markup live schaltest, prüfe es in drei Schritten:

  1. Syntaxprüfung: Prüfe das JSON-LD mit dem JSON-LD Structured Data Validator auf syntaktische Fehler (fehlende Kommata, ungeschlossene Klammern).
  2. Schema.org-Konformität: Im Google Rich Results Test (search.google.com/test/rich-results) siehst du, ob Google dein Markup als gültiges Course-Schema erkennt und welche Felder fehlen.
  3. Render-Test: Falls dein Course-Markup per JavaScript geladen wird, nutze den "URL inspizieren"-Button in der Google Search Console, um zu prüfen, ob Googlebot das Schema nach dem Rendering sieht.

Checkliste: Course Schema Markup richtig implementiert

  • ☑ Typ EducationalCourse statt Course verwendet
  • name, description und provider ausgefüllt
  • hasCourseInstance mit mindestens einer CourseInstance
  • courseMode in jeder Instanz angegeben
  • startDate im ISO-8601-Format
  • offers.price als Zahl oder numerischer String
  • offers.priceCurrency als ISO-4217-Code (z. B. "EUR")
  • educationalCredentialAwarded für Kurse mit Zertifikat
  • instructor mit vollständigem Person-Objekt
  • ☑ Validierung mit Rich Results Test bestanden

Fazit: Mit CourseInstance und Zertifikat-Properties deutlich sichtbarer

Course Schema Markup auf dem Grundniveau reicht nicht mehr aus, um sich in den Suchergebnissen abzuheben. Wer EducationalCourse mit vollständigen CourseInstance-Objekten, strukturierten Preisinformationen und korrekt eingebundenen Zertifikaten kombiniert, bietet Google alle Informationen, um neben dem gewöhnlichen blauen Link ein informationsreiches Rich Snippet anzuzeigen — mit Kurstyp, Termin, Preis und Kursleiter direkt in der Suche.

Nutze die kostenlose SEO-Analyse von Shift07, um zu prüfen, ob deine Kursseiten strukturierte Daten korrekt implementiert haben und wo noch Optimierungspotenzial liegt. Wenn du dein Schema schnell testen willst, hilft der JSON-LD Structured Data Validator ohne Anmeldung weiter.

Weitere Schema-Typen aus dem Bildungsbereich, die du kennen solltest: das EducationalOrganization Schema für die Einrichtung selbst sowie das allgemeine Course Schema Markup als Einstieg für Lernplattformen.