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:
| Field | Type | Comment |
|---|---|---|
has_title | boolean | title (job title) present — required |
has_hiring_org | boolean | hiringOrganization with Organization present |
has_job_location | boolean | jobLocation Place or remote flag declared |
has_date_posted | boolean | datePosted present — required |
has_valid_through | boolean | validThrough expiry date declared |
has_base_salary | boolean | baseSalary with range declared |
has_employment_type | boolean | employmentType 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 = falseAND page identified as job listing - Severity: IMPORTANT
- Diagnostic Message: "Job listing page detected but no JobPosting schema found. Required:
title,description,datePosted,hiringOrganization,jobLocation."
- Target Field:
-
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
datePostedis missing — required by Google."
- Target Field:
-
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
hiringOrganizationis missing — required by Google."
- Target Field:
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
- Add
JobPostingJSON-LD to each job listing page - Always include
title,description,datePosted,hiringOrganization,jobLocation - Add
validThrough— remove schema when the role is filled - Include
baseSalaryto appear in salary-filtered searches - Add
jobLocationType: "TELECOMMUTE"for remote roles