Complete Guide to JobPosting Schema for Google Jobs (2026)
Structured Data & SEO · Updated July 2026

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.

🖊 By WPNova Editorial ⏱ 14 min read 🔄 Updated July 2026

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.

Recruitment Job Board Software

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.

Required JobPosting properties
PropertyTypeWhat it means
titleTextThe job title itself — “Senior DevOps Engineer,” not the posting’s headline or a marketing tagline.
descriptionText (HTML allowed)The full job description: responsibilities, qualifications, and requirements. Can’t be identical to the title or a one-line summary.
datePostedDate (ISO 8601)The original date the job was posted, e.g. 2026-07-10.
hiringOrganizationOrganizationThe actual employer’s name — never the job board’s own name, even on aggregator sites.
jobLocationPlaceThe physical work location with a full PostalAddress. For fully remote roles, use jobLocationType: TELECOMMUTE instead.
The one-to-one rule: each JobPosting block must live on its own dedicated, crawlable page describing exactly one job. Never place JobPosting schema on a search results page or a category page listing multiple openings — Google requires a strict one-page-one-job relationship.

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.

Recommended JobPosting properties
PropertyTypeWhy it matters
baseSalaryMonetaryAmountThe single highest-impact recommended field — powers the salary filter in Google’s job search UI.
employmentTypeText (enum)FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, or OTHER.
validThroughDateThe application deadline. Every listing needs one — Google treats a missing expiry as a quality signal against the posting.
jobLocationTypeTextSet to TELECOMMUTE for fully remote roles.
applicantLocationRequirementsCountryRequired alongside TELECOMMUTE so Google knows which countries or regions can actually apply.
directApplyBooleanIndicates 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.

JSON-LD — single job posting
<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.

JSON-LD — remote job snippet
{
  "@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 minValue and maxValue inside QuantitativeValue rather than a single guessed midpoint.
  • Set unitText correctly — YEAR, HOUR, MONTH, or WEEK — 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 baseSalary entirely 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Frequent JobPosting schema mistakes
ErrorWhy it happensFix
Listing passes Rich Results Test but never appears in Google JobsUsually not a syntax problem — often a thin page, duplicate URL, or weak canonicalConfirm one canonical URL per job, remove thin/duplicate content, and check the live indexed version via URL Inspection
Expired jobs still showing in Google JobsNo validThrough set, or the field wasn’t updated when the role closedSet validThrough on every listing; on closure, return a 404/410 or strip the schema
Multiple JobPosting blocks on one pageSchema added to a category or search-results page listing several jobsMove JobPosting markup to individual job detail pages only — one block per page
Remote jobs not appearing correctlyMissing applicantLocationRequirements alongside jobLocationType: TELECOMMUTEAlways pair the two so Google knows eligible applicant regions
Salary field ignored or listing penalizedEstimated or fabricated salary values instead of real employer-provided figuresOnly include real, current salary data; omit the field if it isn’t disclosed

Do’s and don’ts

Do give each job its own dedicated URL with a single JobPosting block that mirrors the visible page exactly.
Do set and honor validThrough, and remove or noindex the schema the moment a role closes.
Don’t reuse one JobPosting block across a listings or category page that shows multiple openings.
Don’t leave expired listings live with active schema — repeated stale postings can reduce your domain’s overall trust with Google Jobs.

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

WP
WPNova Editorial Team
We build and document WordPress job board, recruitment, and directory websites. This guide is reviewed and updated as Google’s structured data requirements and Search Central documentation change.

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.