JobPosting ist der Schema.org-Typ für eine einzelne offene Stelle. Er übersetzt das, was auf Ihrer Karriereseite als Fließtext steht, in Felder: Titel, Ort, Vertragsart, Gehalt, Bewerbungsfrist. Ohne dieses Markup muss jede Maschine raten, ob Ihre Seite eine Stellenanzeige ist oder ein Blogbeitrag über Personalmangel.
Der Aufwand liegt bei einer halben Stunde pro Anzeige, wenn Sie die Vorlage einmal gebaut haben. Was danach damit passiert, ist die spannendere Frage, und die Antwort darauf ist im Moment weniger eindeutig, als viele Ratgeber behaupten.
Wie Google Stellenanzeigen derzeit ausspielt
Die JobPosting-Dokumentation im Search Central trägt den Stand 18. Dezember 2025 (abgerufen Ende August 2026). Sie beschreibt eine eigene Darstellung in den Suchergebnissen, mit Firmenlogo, Filtern nach Ort und Jobtitel und einer Detailansicht. In der Länderliste für dieses Ergebnis stehen 14 europäische Länder, Deutschland, Österreich und die Schweiz sind darunter. Von einer Einschränkung durch EU-Recht, dem Digital Markets Act oder einem Rückbau in Europa steht in der Google-Dokumentation zu JobPosting nichts.
Das ist der dokumentierte Stand. Der beobachtete ist unruhiger. Google for Jobs stand in der EU seit Jahren unter kartellrechtlichem Druck, mehrere Jobbörsen haben sich bei der Kommission beschwert, und die Darstellung hat sich in den letzten Jahren mehrfach verändert, mal als großes Widget über den organischen Treffern, mal als schmale Linkliste zu Karriereseiten. Ich kann Ihnen deshalb nicht versprechen, wie eine bestimmte Suchanfrage nächsten Monat in Deutschland aussieht. Wer das verspricht, hat es nicht nachgesehen.
Für die Entscheidung, ob Sie das Markup einbauen, ändert das wenig. Jobbörsen, Aggregatoren, Karriere-Metasuchen und inzwischen auch Sprachmodelle lesen JobPosting aus, weil es das einzige verbreitete Format für diesen Zweck ist. Die Google-Darstellung ist der sichtbarste Kanal, aber nicht der einzige.
Wer JobPosting-Markup braucht
Ein Klinikum mit 60 offenen Stellen braucht es aus dem gleichen Grund wie ein Sanitärbetrieb mit dreien: Beide konkurrieren um dieselben Leute, und die suchen selten auf Ihrer Website, sondern bei Google, Indeed oder StepStone. Der Unterschied liegt nur im Aufwand. Das Klinikum erzeugt das Markup aus dem Bewerbermanagementsystem, der Handwerksbetrieb schreibt es einmal per Hand und kopiert es für die nächste Stelle.
Die harte Vorbedingung ist dieselbe: eine eigene URL je Stelle. Eine Karriereseite, auf der drei Anzeigen untereinander stehen, lässt sich nicht sinnvoll auszeichnen. Google sagt dazu deutlich, dass strukturierte Daten auf die detaillierteste Unterseite gehören und nicht auf eine Übersicht. Also https://beispiel-klinikum.de/karriere/pflegefachkraft-intensiv/ statt eines Ankers auf der Sammelseite. Wer die Grundlagen dazu noch braucht: die Funktionsweise strukturierter Daten ist bei JobPosting dieselbe wie bei allen anderen Typen, nur die Feldliste ist eine andere.
Die Felder, auf die es ankommt
Google verlangt fünf Pflichtfelder: title, description, datePosted, hiringOrganization und jobLocation. Ohne die fällt die Anzeige durch die Prüfung. In der Praxis entscheiden aber die empfohlenen Felder darüber, ob eine Anzeige gefunden und gefiltert wird, denn nach genau diesen Kriterien sucht jemand, der einen Job braucht.
- title. Nur die Berufsbezeichnung. Keine internen Kürzel, kein Standort, kein „ab sofort" und kein Gehalt im Titel.
- description. Der vollständige Anzeigentext als HTML, mit Aufgaben, Anforderungen, Arbeitszeit und Qualifikation. Google erkennt hier
<p>,<ul>und<li>. - datePosted und validThrough. Beide im ISO-8601-Format.
datePostedist das Veröffentlichungsdatum,validThroughdas Ende der Bewerbungsfrist. - hiringOrganization. Name, Website und Logo des Arbeitgebers. Wenn Sie auf Ihrer Startseite bereits ein Organisation-Objekt haben, verweisen Sie per
@iddarauf, statt eine zweite Organisation zu erfinden. Das gilt auch, wenn dort ein LocalBusiness-Eintrag mit allen Feldern liegt. - jobLocation. Die vollständige Postanschrift des Arbeitsorts, nicht der Firmensitz der Zentrale.
- employmentType. Feste Werte, unter anderem
FULL_TIME,PART_TIME,CONTRACTOR,TEMPORARYundINTERN. Mehrere Werte sind als Array erlaubt. - baseSalary. Als
MonetaryAmountmit Währung, Wert und Zeiteinheit (HOUR,MONTH,YEAR). Eine Spanne geben Sie überminValueundmaxValuean. - identifier. Ihre interne Stellennummer. Dadurch erkennen Aggregatoren dieselbe Stelle wieder, auch wenn sie über mehrere Kanäle läuft.
- applicantLocationRequirements und jobLocationType. Nur bei echten Remote-Stellen.
jobLocationTypebekommt den WertTELECOMMUTE,applicantLocationRequirementsdas Land, aus dem heraus jemand arbeiten darf. - directApply. Ein Wahrheitswert.
trueheißt: Auf der verlinkten Seite kann man sich direkt bewerben, ohne Weiterleitung zu einem Portal und ohne Zwangsregistrierung.
Eine Meinung dazu, die von der offiziellen Empfehlung abweicht: validThrough gehört ins Pflichtprogramm. Google führt es als optional, aber es ist das einzige Feld, das eine abgelaufene Anzeige von selbst stilllegt, wenn im Unternehmen niemand daran denkt. Genau daran denkt niemand.
Das vollständige JSON-LD zum Kopieren
Das folgende Beispiel ist eine Teilzeitstelle mit Gehaltsspanne, so wie sie ein mittelständischer Betrieb ausschreiben würde. Es gehört in den <head> oder ans Ende des <body> der Einzelseite.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Medizinische Fachangestellte",
"identifier": {
"@type": "PropertyValue",
"name": "Praxis Mustermann",
"value": "MFA-2026-14"
},
"description": "<p>Wir suchen eine Medizinische Fachangestellte für unsere Praxis.</p><ul><li>Patientenannahme und Terminvergabe</li><li>Blutentnahme, EKG, Wundversorgung</li><li>Abrechnung nach EBM und GOÄ</li></ul><p>Voraussetzung ist eine abgeschlossene Ausbildung als MFA. Berufserfahrung ist willkommen, aber keine Bedingung.</p>",
"datePosted": "2026-10-26",
"validThrough": "2026-12-31T23:59",
"employmentType": "PART_TIME",
"directApply": true,
"hiringOrganization": {
"@type": "Organization",
"name": "Praxis Dr. Mustermann",
"sameAs": "https://praxis-mustermann.de",
"logo": "https://praxis-mustermann.de/images/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "Hauptstraße 12",
"addressLocality": "Nürnberg",
"postalCode": "90403",
"addressRegion": "Bayern",
"addressCountry": "DE"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "EUR",
"value": {
"@type": "QuantitativeValue",
"minValue": 2400,
"maxValue": 2900,
"unitText": "MONTH"
}
}
}
</script>
Nach dem Einbau prüfen Sie die Seite im Rich-Results-Test. Wie Sie Schema-Auszeichnungen zuverlässig gegenprüfen, hängt am Werkzeug: Der Schema-Markup-Validator meldet jeden Syntaxfehler, der Rich-Results-Test sagt Ihnen zusätzlich, ob Google das Ergebnis überhaupt ausspielen könnte.
Wenn Ihre Karriereseite unter WordPress läuft, brauchen Sie kein eigenes Plugin. Yoast und Rank Math decken JobPosting nicht ab, aber jedes Plugin für benutzerdefinierte Felder plus ein kleiner Filter in der functions.php reicht, um die Werte in die Vorlage zu schreiben. Der Weg zu sauberem Schema-Markup unter WordPress ist hier derselbe wie bei Produkten oder Rezepten: eigener Post-Type, Felder pflegen, JSON-LD im Template erzeugen.
Praxis-Tipp: Legen Sie Stellenanzeigen als eigenen Custom Post Type an, nicht als normale Seite. Dann können Sie über einen einzigen Cron-Job jede Nacht prüfen, welche Anzeige das validThrough-Datum überschritten hat, und den Beitrag automatisch auf einen Status setzen, der die Seite aus dem Index nimmt.
Fehlerbilder und was mit besetzten Stellen passieren muss
Die Fehler, die wir bei Audits tatsächlich finden, sind fast immer Prozessfehler, keine Syntaxfehler. Das Markup war beim Anlegen richtig und ist im Betrieb verwahrlost.
- Die Anzeige ist besetzt und steht noch online. Der häufigste Fall, mit Abstand.
- validThrough fehlt oder liegt in der Vergangenheit. Fehlt es, läuft die Anzeige ewig weiter. Liegt es versehentlich in der Vergangenheit, etwa durch ein falsch getipptes Jahr, verschwindet sie, obwohl die Stelle offen ist.
- description ist der nackte Fließtext. Ein Satz „Wir suchen Verstärkung für unser Team" ohne Aufgaben, Anforderungen und Arbeitszeit erfüllt die Vorgabe nicht.
- Gehalt als Freitext. „nach Tarif" oder „2.400 bis 2.900 Euro" im Beschreibungstext ist für Filter wertlos. Nur
baseSalaryalsMonetaryAmountwird gelesen. - Dieselbe Anzeige unter mehreren URLs. Entsteht typischerweise durch Kampagnenparameter oder eine zweite Version auf einer Landingpage. Setzen Sie ein Canonical auf die eine echte Adresse.
- Markup auf der Übersichtsseite. Ein JobPosting-Block, der auf
/karriere/liegt und alle Stellen zusammenfasst, ist ein Regelverstoß, keine Abkürzung.
Der erste Punkt ist der teuerste, denn Google hat dafür ausdrücklich eine manuelle Maßnahme vorgesehen. Wer abgelaufene Anzeigen stehen lässt, riskiert, dass die gesamte Domain für dieses Ergebnis gesperrt wird, und das trifft dann auch die Stellen, die wirklich offen sind. Sie dürfen eine besetzte Stelle also nicht einfach offline nehmen und hoffen, sondern brauchen einen der drei sauberen Wege: validThrough auf ein vergangenes Datum setzen, das JobPosting-Objekt aus der Seite entfernen, oder die URL mit 404 beziehungsweise 410 beantworten.
Damit ist das Thema ein Indexierungsthema, kein Schema-Thema. Eine gelöschte Stellenseite bleibt je nach Crawlfrequenz Tage bis Wochen im Index, und in dieser Zeit landen Bewerber auf einer Fehlerseite. Wenn es schnell gehen muss, ist das Entfernen-Tool in der Search Console der richtige Griff, alles Weitere zu den Wegen, Seiten aus dem Google-Index zu nehmen, gilt hier unverändert. Der elegantere Weg ist ohnehin, die URL zu erhalten und den Inhalt zu ersetzen: ein Hinweis, dass die Stelle besetzt ist, plus Link auf die aktuellen Ausschreibungen. Das behält den aufgebauten Linkwert und fängt den Besucher auf.
Gut zu wissen: Wenn Sie eine Stelle mehrfach im Jahr ausschreiben, etwa Ausbildungsplätze, legen Sie jedes Mal eine neue URL mit neuer identifier an. Eine alte Anzeige mit neuem datePosted wiederzubeleben, sieht für Aggregatoren nach Manipulation aus.
Fazit
JobPosting-Markup ist technisch schnell gemacht und dann eine Pflegeaufgabe. Wie Google Stellenanzeigen in Deutschland künftig darstellt, ist offen, die Dokumentation und die Beobachtung im SERP gehen auseinander. Für die Auszeichnung selbst ist das zweitrangig: Sie ist die Voraussetzung dafür, dass Ihre Anzeigen überhaupt maschinenlesbar sind, und der einzige Fehler mit echten Folgen ist die abgelaufene Anzeige, die niemand abschaltet.