A job posting schema generator for Google for Jobs
This job posting schema generator writes the JobPosting JSON-LD that makes a vacancy eligible for
the job search experience in Google, the panel usually called Google for Jobs. Fill in the role, the
company, where the work happens and what it pays, and the block builds itself alongside. Nothing
leaves your browser.
Job posting structured data has more rules that interact than most types. Two of them account for most rejected listings, and the form is built around both.
Where the work happens decides the location fields
An on-site role takes a jobLocation: a Place whose PostalAddress says where people report to,
ideally down to the street, and at least the town and country. A fully remote role has no such
place. It takes jobLocationType: "TELECOMMUTE" instead, and then Google requires
applicantLocationRequirements, the countries a candidate may live in. A hybrid role takes both.
Choose the mode and the generator emits the matching combination. An office address left filled in on a remote role is dropped with a warning, because a remote job pinned to a street address is shown to commuters who will never be asked to commute.
Salary as MonetaryAmount
baseSalary is not a string such as "£48k–£60k". It is a MonetaryAmount with a three-letter
currency, whose value is a QuantitativeValue. A range sets minValue and maxValue; a single
figure sets value; both carry a unitText saying whether the number is per hour, day, week, month
or year. Type plain numbers and the nesting is written for you. A maximum below the minimum, a
thousands separator or a currency symbol in the amount are all caught before they reach the page.
Pay is only recommended, but in the job panel it is the filter candidates use first, and in several jurisdictions publishing it is a legal requirement anyway.
employmentType, validThrough and the rest
employmentType takes one or more fixed values: FULL_TIME, PART_TIME, CONTRACTOR,
TEMPORARY, INTERN, VOLUNTEER, PER_DIEM or OTHER. Tick every one that applies; a single
choice is written as a string and several as an array.
validThrough is the expiry. It is optional in the strict sense and the most useful field to set,
because it retires the listing automatically when the closing date passes. The tool rejects an
expiry that falls before datePosted.
The description accepts simple HTML, paragraphs and lists, since that is how the full job text is
meant to arrive. Closing tags are escaped in the jobposting JSON-LD output so they cannot end the
surrounding script element early.
What this checks, and what Google checks
The panel on the right covers syntax, value formats and the fields Google marks as required or recommended. Eligibility for the job experience is judged on the live page, including whether the markup matches the visible text. Test the published URL with Google's Rich Results Test, or lint the block here with the structured data validator. The hiring company deserves its own markup too: the organization schema generator covers it, and the local business schema generator covers a branch people visit.