My Tool Studio
Schema Markup·5 min read

Job Posting Schema for Google Jobs: Setup and Expiry

Google's job search experience has a simple entry requirement: the job page has to carry valid JobPosting markup. Get it right and the role can appear in Google's job listings, where people filter by location, pay and employment type. Skip it, and the posting is just another web page competing in ordinary results. This guide covers the required fields, remote and hybrid roles, a worked example with a closing date, and the expiry rules that trip up more employers than anything else.

{"@type": "JobPosting","name": "…","url": "…"}RICH RESULTJobPosting

How Google for Jobs reads a careers page

Why a plain careers page stays invisible.

The situation is almost always the same. A company posts openings on its own site instead of paying a job board, applicants trickle in from elsewhere, and someone eventually asks why the roles never show up when people search for the job title and the city. The answer is that Google's job experience doesn't parse prose. It reads JobPosting structured data, and pages without it aren't treated as listings at all.

Once the markup is in place and the page is indexed, Google takes the title, company, location, salary and dates into its own interface. Candidates can filter by the employment type you declared and click through to apply. The page content still matters, but the markup is the ticket in.

The required JobPosting fields, and what each one proves

Five properties, one exception.

Google requires title, description, datePosted, hiringOrganization and jobLocation. The title should be the role name alone, Line Cook rather than URGENT!! Line Cook $$ Apply Now, because decorated titles break Google's guidelines. The description must be the full job text, not a one-line summary, and it needs to match what a person sees on the page. Basic HTML such as paragraphs and lists is fine.

hiringOrganization is an Organization node naming the employer, and jobLocation is a Place wrapping a PostalAddress with street, city, region, postal code and country. The one exception is a fully remote role, which replaces jobLocation with jobLocationType TELECOMMUTE plus applicantLocationRequirements listing the countries applicants may live in. Salary through baseSalary isn't required, but listings without it can't be matched on pay, and candidates notice the gap.

On-site, remote and hybrid roles

The Workplace type field does the wiring.

The Job Posting Schema Generator has three workplace options. On-site writes the office address as jobLocation. Fully remote drops the address, writes jobLocationType TELECOMMUTE and adds one Country entry for each code you type, such as US, CA. Google needs at least one country for a remote job, and the Still missing box reminds you.

Hybrid writes both: the office address as jobLocation and TELECOMMUTE alongside it, with applicant countries if you list them. Google's documentation allows that combination for jobs that can be done on site or from home. Picking the right option matters, because a remote role marked up with no location is one of the most common reasons a posting never appears.

A worked JobPosting example with validThrough

Small fragment, complete story.

Say a restaurant posts a cook position on June 1 and wants applications closed by the end of August. The core of the markup comes out like this: {"@type": "JobPosting", "title": "Line Cook", "datePosted": "2026-06-01", "validThrough": "2026-08-31", "employmentType": "FULL_TIME"}. Four data points plus the type, and Google now knows what the role is, when it opened, when it stops accepting people, and what kind of contract it is.

The full block adds the description, the hiring organization, the address and a baseSalary written as a MonetaryAmount holding a QuantitativeValue, for example 18 USD with unitText HOUR. Choose Range (min to max) under Compensation and the tool writes minValue and maxValue instead, with units from Hourly to Yearly. The Employment type dropdown covers all eight values Google accepts, from FULL_TIME to PER_DIEM, so there is no free text to get wrong.

Expired job postings: the validThrough contract

The rule most employers break.

validThrough is a promise. When the date passes, Google expects the listing to be gone, and the guidelines are clear about the cleanup: remove the JobPosting markup, remove the page, or set validThrough to a date in the past. Leaving stale markup live advertises a job that doesn't exist.

Google can take manual action against sites that keep expired listings marked up, and that affects more than the one stale posting. The practical fix is dull and effective: put the close date in your CMS next to the posting, and make unpublishing the page part of the hiring workflow the moment a role is filled.

JobPosting mistakes that get listings rejected

Four failures that show up constantly.

Most JobPosting problems in Search Console trace back to a handful of causes:

  • Markup on a list page. JobPosting belongs on the page for one specific job, never on a careers index showing ten roles at once.
  • Description mismatch. The description property says one thing and the visible page says another.
  • Free-text employment types. The value must be one like FULL_TIME or CONTRACTOR; writing Full time with a space doesn't count.
  • Too little location detail. A jobLocation of just United States is not enough for an on-site role; give at least the city, region and country.

Practical habits for healthy JobPosting markup

Three things that pay off every hire.

First, set Valid through even though it's only recommended, because it doubles as your own reminder and lets Google expire the listing cleanly. Second, request indexing in Search Console right after publishing; job postings are time-sensitive, and every day spent waiting for a crawl is a day of the posting window lost.

Third, run every new posting through Test in Google Rich Results Test before you tell anyone it's live. It catches typos in enum values and missing required fields quickly, which beats finding them in a report two weeks later. Then check the live URL once the page is published.

Job Posting Schema Generator and the neighboring tools

Where this fits in the toolbox.

The Job Posting Schema Generator handles one job page at a time, which is the right level of detail. Your company's identity is a separate entity: build it once with the Organization Schema Generator and keep the hiring organization name here consistent with it. If the employer is a shop or clinic with opening hours, the Local Business Schema Generator is the better home for the company-level markup.

Before adding a block, check whether your applicant tracking system or a jobs plugin already outputs JobPosting markup. The Schema Markup Extractor shows what a page carries, and editing an existing block is safer than adding a second one.

Try it now

Open Job Posting Schema Generator

The tool is one click away. No sign up, no upload, no payment.

Open Job Posting Schema Generator