Skip to main content

JobPosting Schema Missing

Issue No: 152

Category: Structured Data & Rich Results

Issue type: Issue

Priority: IMPORTANT

Description

Job listing pages are missing JobPosting schema, preventing the role from appearing in Google for Jobs — the highest-intent job search placement available in SERPs.

How do we capture it

  • Detect job pages via URL patterns (/careers/, /jobs/, /vacancies/) or visible salary/employment type content
  • Check JSON-LD for "@type": "JobPosting"
  • If absent → trigger issue

What to store

StructuredDataAudit record with schemaType = JobPosting, issueNumber = 150, plus StructuredDataField rows:

FieldTypeComment
has_titlebooleantitle (job title) present — required
has_hiring_orgbooleanhiringOrganization with Organization present
has_job_locationbooleanjobLocation Place or remote flag declared
has_date_postedbooleandatePosted present — required
has_valid_throughbooleanvalidThrough expiry date declared
has_base_salarybooleanbaseSalary with range declared
has_employment_typebooleanemploymentType declared

Core audit fields used: isPresent, hasDescription, rawJson

Condition for trigger

  • Trigger Rule 1: Schema absent on job page

    • Target Field: isPresent
    • Evaluation Logic: isPresent = false AND page identified as job listing
    • Severity: IMPORTANT
    • Diagnostic Message: "Job listing page detected but no JobPosting schema found. Required: title, description, datePosted, hiringOrganization, jobLocation."
  • Trigger Rule 2: Date posted missing

    • Target Field: has_date_posted
    • Evaluation Logic: has_date_posted = false
    • Severity: IMPORTANT
    • Diagnostic Message: "JobPosting schema present but datePosted is missing — required by Google."
  • Trigger Rule 3: Hiring organization missing

    • Target Field: has_hiring_org
    • Evaluation Logic: has_hiring_org = false
    • Severity: IMPORTANT
    • Diagnostic Message: "JobPosting schema present but hiringOrganization is missing — required by Google."

Sources

Long description

JobPosting enables jobs to appear in Google for Jobs — a dedicated interface embedded in SERPs showing salary, employer, location, and posting date.

Employment types: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER.

For remote roles add: "jobLocationType": "TELECOMMUTE"

{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Frontend Developer",
"description": "<p>We need a React developer with 5+ years of experience...</p>",
"datePosted": "2024-03-01",
"validThrough": "2024-05-01",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Example Corp",
"sameAs": "https://example.com"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressLocality": "Austin",
"addressRegion": "TX",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 100000,
"maxValue": 130000,
"unitText": "YEAR"
}
}
}

How to Fix

  1. Add JobPosting JSON-LD to each job listing page
  2. Always include title, description, datePosted, hiringOrganization, jobLocation
  3. Add validThrough — remove schema when the role is filled
  4. Include baseSalary to appear in salary-filtered searches
  5. Add jobLocationType: "TELECOMMUTE" for remote roles