Google silently drops job listings that are missing even one required field — no warning, no partial credit. Here’s exactly what to include, what to skip, and how to check your work before you publish.
Most job pages that fail to appear in Google for Jobs aren’t victims of some algorithm mystery — they’re missing a property, or they’ve got a mismatch between what the schema says and what’s visible on the page. Google validates JobPosting markup against a strict checklist, and if something required is absent, malformed, or doesn’t match the page content, the entire listing is quietly excluded. No error message reaches you unless you go looking for it in Search Console.
This guide covers every property Google actually uses — required, recommended, and beta — with working JSON-LD you can copy, a remote-job variant, the salary formatting rules that trip people up most, and the operational habits (expiring listings, canonical URLs) that matter as much as the code itself.
What JobPosting schema is, and why it matters
JobPosting is a schema.org data type, written in JSON-LD, that describes a single job opening in a format machines can parse — title, employer, location, salary, and posting date, laid out in a structured block rather than left for Google to guess at from surrounding text. When it’s implemented correctly, your listing becomes eligible for Google’s dedicated job search experience: the rich result with filters for location, salary, and employment type that dominates the results page for job-related queries.
Without it, your job page can still rank as a normal blue link. With it, you’re competing for a completely different, higher-visibility surface — one where Indeed, LinkedIn, and ZipRecruiter listings currently crowd out sites that skip structured data entirely.
Required properties (non-negotiable)
These five must be present, accurate, and matched to what’s visible on the page. Miss one and the listing isn’t eligible — Google doesn’t partially display a job.
| Property | Type | What it means |
|---|---|---|
title | Text | The job title itself — “Senior DevOps Engineer,” not the posting’s headline or a marketing tagline. |
description | Text (HTML allowed) | The full job description: responsibilities, qualifications, and requirements. Can’t be identical to the title or a one-line summary. |
datePosted | Date (ISO 8601) | The original date the job was posted, e.g. 2026-07-10. |
hiringOrganization | Organization | The actual employer’s name — never the job board’s own name, even on aggregator sites. |
jobLocation | Place | The physical work location with a full PostalAddress. For fully remote roles, use jobLocationType: TELECOMMUTE instead. |
Recommended properties
None of these are required for eligibility, but Google explicitly states that listings with more of these fields are shown preferentially — users consistently prefer postings with a real salary over ones without.
| Property | Type | Why it matters |
|---|---|---|
baseSalary | MonetaryAmount | The single highest-impact recommended field — powers the salary filter in Google’s job search UI. |
employmentType | Text (enum) | FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, or OTHER. |
validThrough | Date | The application deadline. Every listing needs one — Google treats a missing expiry as a quality signal against the posting. |
jobLocationType | Text | Set to TELECOMMUTE for fully remote roles. |
applicantLocationRequirements | Country | Required alongside TELECOMMUTE so Google knows which countries or regions can actually apply. |
directApply | Boolean | Indicates whether the URL allows candidates to apply directly, without leaving the page. |
Beta properties
Google introduced a set of beta properties around degree and experience requirements, part of a broader push — followed by employers like Google, Apple, and IBM — to support skills-first hiring. They may not visibly affect search results yet, but implementing them now costs little and positions your listings ahead of the curve if they graduate to fully supported status.
educationRequirements— accepts plain text or a structured EducationalOccupationalCredential.experienceRequirements— years of experience or an OccupationalExperienceRequirements object.experienceInPlaceOfEducation— a boolean flagging whether relevant experience can substitute for the formal education requirement.
Full JSON-LD code example
A complete, standards-compliant example combining the required and recommended properties. Replace every value with your actual job data — Google checks that the markup matches the visible page content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior DevOps Engineer",
"description": "<p>We're looking for a Senior DevOps Engineer to own our CI/CD pipeline, manage cloud infrastructure, and mentor junior engineers. Requires 5+ years with AWS, Terraform, and Kubernetes.</p>",
"datePosted": "2026-07-10",
"validThrough": "2026-09-10",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Acme Technologies",
"sameAs": "https://acmetech.example.com",
"logo": "https://acmetech.example.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "500 Market St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94105",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 130000,
"maxValue": 165000,
"unitText": "YEAR"
}
},
"directApply": true
}
</script>
Remote job schema
Fully remote roles use a different location pattern. Drop jobLocation in favor of jobLocationType, and always pair it with applicantLocationRequirements so Google knows which countries or regions are actually eligible to apply — omitting this is one of the most common reasons remote listings underperform in Google Jobs.
{
"@type": "JobPosting",
"title": "Remote Customer Success Manager",
"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": {
"@type": "Country",
"name": "USA"
}
}
Salary markup, done correctly
Salary is the field with the most avoidable mistakes. A few rules that keep it clean:
- Use a real figure the employer actually offers — never estimate or fabricate a number to “fill the field.” Google can flag inflated or invented salary data with a manual action.
- For a range, use
minValueandmaxValueinsideQuantitativeValuerather than a single guessed midpoint. - Set
unitTextcorrectly —YEAR,HOUR,MONTH, orWEEK— since Google normalizes salaries for filtering and comparison across listings. - If your company doesn’t disclose salary and you’re not legally required to, omit
baseSalaryentirely rather than guessing. You lose the salary filter’s visibility boost, but that’s a smaller cost than an inaccurate figure. - Several jurisdictions — including California, Colorado, New York, and Washington — legally require salary disclosure in job postings; check applicable state or regional law before omitting it for roles based there.
How to implement it in WordPress
-
Confirm your theme or plugin generates it automatically
A job board theme or plugin built with Google Jobs in mind should output a valid JobPosting block for every listing without manual coding. Check a live job page’s source code (or the Rich Results Test) before assuming it’s missing.
-
If it’s missing, add it via your SEO plugin
Rank Math and Yoast SEO Premium both support custom schema types, including JobPosting, with field mapping to your job listing’s custom fields — no need to hand-write JSON-LD for every post.
-
Map fields to match what’s visible on the page
Whatever tool you use, the title, description, location, and salary in the schema must exactly mirror the content a visitor sees. Mismatches — even minor ones — are treated as a spam signal.
-
Validate before publishing at scale
Run a handful of live job URLs through Google’s Rich Results Test. Confirm the JobPosting type is detected with no errors before rolling the same template out across hundreds of listings.
-
Submit a sitemap and connect the Indexing API
A sitemap gives Google full-site coverage; the Indexing API is what actually gets new and updated job pages crawled within hours instead of days. For a job board with daily postings, skipping the Indexing API means new jobs go stale in search before they’re even indexed.
Common errors and how to fix them
| Error | Why it happens | Fix |
|---|---|---|
| Listing passes Rich Results Test but never appears in Google Jobs | Usually not a syntax problem — often a thin page, duplicate URL, or weak canonical | Confirm one canonical URL per job, remove thin/duplicate content, and check the live indexed version via URL Inspection |
| Expired jobs still showing in Google Jobs | No validThrough set, or the field wasn’t updated when the role closed | Set validThrough on every listing; on closure, return a 404/410 or strip the schema |
| Multiple JobPosting blocks on one page | Schema added to a category or search-results page listing several jobs | Move JobPosting markup to individual job detail pages only — one block per page |
| Remote jobs not appearing correctly | Missing applicantLocationRequirements alongside jobLocationType: TELECOMMUTE | Always pair the two so Google knows eligible applicant regions |
| Salary field ignored or listing penalized | Estimated or fabricated salary values instead of real employer-provided figures | Only include real, current salary data; omit the field if it isn’t disclosed |
Do’s and don’ts
validThrough, and remove or noindex the schema the moment a role closes.
Frequently asked questions
What are the required fields for JobPosting schema?
Five properties are required: title, description, datePosted, hiringOrganization, and jobLocation (or jobLocationType for fully remote roles). Missing any one makes the listing ineligible for Google Jobs.
Does JobPosting schema work for both job boards and single-employer career pages?
Yes, both. Job boards need to ensure each listing has its own unique URL and that hiringOrganization correctly identifies the actual employer — not the board itself.
What happens if I don’t update expired job listings?
Expired listings with active schema create a poor user experience and can affect your domain’s standing with Google Jobs over time. Set validThrough on every posting, and when a role closes, either return a 404/410 status or remove the JobPosting markup while keeping the page live.
Should I include a salary if my company doesn’t publicly disclose it?
No — don’t fabricate or estimate a figure. You’ll lose the salary-filter visibility boost, but inventing a number risks a manual action. Several US states now legally require salary disclosure in job postings, so check applicable law for the role’s location.
Can I post the same job to multiple job boards with schema on each?
Yes, but only one URL should serve as the canonical source. Third-party boards like Indeed and LinkedIn publish their own JobPosting schema for listings on their platforms; you publish yours separately on your own site.
How long does it take for a new job to appear in Google Jobs?
With a submitted sitemap alone, it can take days. Connecting the Google Indexing API for job posting URLs prompts Googlebot to crawl the page much sooner, often within hours.
Skip the manual schema setup entirely
WPNova’s Job Board Theme generates valid JobPosting structured data automatically for every listing — required and recommended properties included — so you’re not hand-coding JSON-LD for hundreds of jobs.
See the Job Board Theme →Resources and validation tools
-
Google Search Central: JobPosting structured data
Google’s canonical documentation for required, recommended, and beta properties.
-
Google Rich Results Test
Validate a live job URL and confirm Google detects the JobPosting type with no errors.
-
Schema Markup Validator
General-purpose schema.org syntax validation, useful alongside Google’s own tool.
-
Schema.org: JobPosting reference
The full property list, including fields Google doesn’t currently process but other search and AI engines may.
-
How to Create a Job Board Website Like Indeed Using WordPress
The full build guide this schema reference supports — theme setup, features, and monetization.
-
WPNova Job Board WordPress Theme
Built-in JobPosting schema generation for every listing, no manual markup required.
Schema requirements reflect Google Search Central’s JobPosting documentation as of July 2026 and are subject to change. Always confirm current required properties against Google’s official documentation before publishing at scale.