Skip to main content
All posts
Guide3 March 2026·16 min read

The Complete Guide to Employer Schema Markup (JSON-LD) for Careers Pages

The Complete Guide to Employer Schema Markup (JSON-LD) for Careers Pages

Employer schema markup is structured data added to your careers pages that tells search engines and AI models exactly who you are, what you pay, and what it's like to work at your company — in a machine-readable format.

Companies with schema markup on their careers pages see 32% higher citation rates in AI-generated responses and 40% better factual accuracy when AI discusses their employer brand. Yet only 18% of UK employers currently implement any form of structured data on their hiring pages.

This guide walks through the five essential schema types, provides copy-paste JSON-LD code examples, covers implementation on every major platform, and explains how to test and validate your markup.

Source: OpenRole audit data, March 2026


Table of Contents

  1. What Is Schema Markup?
  2. Why Do Employers Need Schema Markup?
  3. The 5 Essential Schema Types
  4. Code Examples for Each Schema Type
  5. How to Add Schema to Your Careers Page
  6. How to Test Your Schema Markup
  7. Common Mistakes to Avoid

What Is Schema Markup?

Schema markup is a standardised vocabulary (defined at schema.org) that you add to your website's HTML to help machines understand your content. Think of it as a translation layer between your human-readable careers page and the machines that index it.

How Does It Work?

You embed a block of JSON-LD (JavaScript Object Notation for Linked Data) in your page's <head> or <body>. It looks like this:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Acme Corp",
  "description": "A fintech company building payment infrastructure"
}
</script>

This code is invisible to visitors but readable by Google, Bing, ChatGPT, Claude, Perplexity, and every other AI system that crawls the web.

Why JSON-LD?

There are three formats for schema markup: JSON-LD, Microdata, and RDFa. Use JSON-LD. Google recommends it, it's the easiest to implement, and it doesn't require modifying your HTML structure — you simply add a <script> block.


Why Do Employers Need Schema Markup?

AI Models Parse Structured Data First

When ChatGPT, Claude, or Google AI Overviews constructs a response about your company, it prioritises sources in this order:

  1. Structured data (schema markup, knowledge graphs) — highest trust
  2. Verified third-party sources (Wikipedia, LinkedIn, Crunchbase)
  3. Unstructured web content (your careers page prose, blog posts)
  4. User-generated content (Reddit, Glassdoor, forum posts)
  5. Training data memories (whatever the model learned during pre-training)

Without schema markup, your authoritative employer information competes with Reddit threads and two-year-old Glassdoor reviews for AI's attention.

The Numbers Are Clear

From OpenRole's UK employer audit of 517 companies:

  • Employers with schema markup scored 47/100 on average vs 29/100 without
  • Schema markup correlated with 32% higher citation rates across AI platforms
  • Salary data accuracy improved from 38% to 91% when baseSalary was included in JobPosting schema
  • 92% of top-scoring employers (60+/100) had implemented at least Organisation schema

Google Benefits Too

Beyond AI visibility, schema markup powers Google's rich results — enhanced search listings that show salary ranges, company ratings, and job details directly in search results. Jobs with rich results get 2–3x more clicks than plain listings.


What Are the 5 Essential Schema Types for Employers?

1. Organisation Schema

Where: Your homepage Purpose: Tells machines who you are — company name, description, size, location, industry Priority: Essential — implement this first

2. JobPosting Schema

Where: Each individual job listing page Purpose: Describes the role, salary, location, employment type, and requirements Priority: Essential — Google requires this for job search inclusion

3. FAQPage Schema

Where: Your careers page or dedicated FAQ section Purpose: Provides structured answers to common candidate questions Priority: High — this is the format AI extracts most reliably

4. EmployerAggregateRating Schema

Where: Your careers page or reviews section Purpose: Provides a machine-readable company rating from employee reviews Priority: Medium — useful if you have a strong rating to showcase

5. HowTo Schema

Where: Your interview process page or hiring section Purpose: Describes your hiring process as a series of steps Priority: Medium — helps AI answer "What is the interview process at [Company]?"


Code Examples: Ready-to-Use JSON-LD Blocks

Organisation Schema (Homepage)

Add this to your homepage <head>:

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Acme Corp",
  "alternateName": "Acme Corporation Ltd",
  "url": "https://www.acmecorp.co.uk",
  "logo": "https://www.acmecorp.co.uk/images/logo.png",
  "description": "Acme Corp is a London-based fintech company building payment infrastructure for European businesses. Founded in 2018, we employ 280 people across London and Berlin.",
  "foundingDate": "2018-03-15",
  "founder": {
    "@type": "Person",
    "name": "Jane Smith"
  },
  "numberOfEmployees": {
    "@type": "QuantitativeValue",
    "value": 280
  },
  "industry": "Financial Technology",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "100 Finsbury Square",
    "addressLocality": "London",
    "postalCode": "EC2A 1RS",
    "addressCountry": "GB"
  },
  "sameAs": [
    "https://www.linkedin.com/company/acmecorp",
    "https://twitter.com/acmecorp",
    "https://www.glassdoor.co.uk/Overview/Working-at-Acme-Corp-EI_IE123456.htm",
    "https://github.com/acmecorp"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "contactType": "Recruiting",
    "email": "careers@acmecorp.co.uk",
    "url": "https://www.acmecorp.co.uk/careers"
  }
}

Key fields to customise:

  • name — your exact legal or trading name
  • description — one paragraph, factual, include location and employee count
  • numberOfEmployees — update this annually
  • sameAs — link every official profile (LinkedIn, Glassdoor, GitHub, etc.)
  • address — your primary office location

JobPosting Schema (Job Listing Pages)

Add this to each individual job page:

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Software Engineer",
  "description": "<p>We're looking for a Senior Software Engineer to join our Payments team. You'll design and build APIs processing £2B+ in annual transaction volume, working in a team of 6 engineers shipping fortnightly.</p><p><strong>Requirements:</strong></p><ul><li>5+ years experience with Go or Python</li><li>Experience with distributed systems</li><li>Familiarity with payment processing or financial infrastructure</li></ul>",
  "datePosted": "2026-02-15",
  "validThrough": "2026-04-15",
  "employmentType": "FULL_TIME",
  "workHours": "Flexible, core hours 10:00-16:00",
  "jobLocationType": "TELECOMMUTE",
  "applicantLocationRequirements": {
    "@type": "Country",
    "name": "United Kingdom"
  },
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Corp",
    "sameAs": "https://www.acmecorp.co.uk",
    "logo": "https://www.acmecorp.co.uk/images/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "London",
      "addressRegion": "Greater London",
      "addressCountry": "GB"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "GBP",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 85000,
      "maxValue": 110000,
      "unitText": "YEAR"
    }
  },
  "jobBenefits": "28 days holiday + bank holidays, private health insurance (Vitality), £1,500 annual learning budget, enhanced parental leave (16 weeks), pension 5% employer contribution, work from home 3 days/week",
  "experienceRequirements": "5+ years software engineering experience",
  "qualifications": "Degree in Computer Science or equivalent practical experience"
}

Critical fields most employers miss:

  • baseSalarythis is the single most impactful field for AI accuracy
  • jobBenefits — list your actual benefits, not "competitive package"
  • validThrough — keep this current; expired listings hurt credibility
  • jobLocationType — use TELECOMMUTE for remote/hybrid roles

FAQPage Schema (Careers Page)

Add this to your main careers page:

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is it like to work at Acme Corp?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Acme Corp is a 280-person fintech company headquartered in London with an office in Berlin. Engineers work in cross-functional squads of 5-7 people, shipping fortnightly. We're hybrid — 2 days in the London office, 3 days remote. The engineering team uses Go, Python, and PostgreSQL."
      }
    },
    {
      "@type": "Question",
      "name": "What salary does Acme Corp pay software engineers?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Software Engineer salaries at Acme Corp: Junior Engineer (0-2 years): £45,000-£58,000. Mid-Level Engineer (2-5 years): £58,000-£78,000. Senior Engineer (5+ years): £85,000-£110,000. Engineering Manager: £100,000-£130,000. All roles include equity and a 5% pension contribution."
      }
    },
    {
      "@type": "Question",
      "name": "What benefits does Acme Corp offer?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Acme Corp benefits include: 28 days holiday plus bank holidays, private health insurance through Vitality, £1,500 annual learning and development budget, enhanced parental leave (16 weeks full pay), 5% employer pension contribution, cycle to work scheme, £500 home office budget for new joiners, and free lunch on office days."
      }
    },
    {
      "@type": "Question",
      "name": "What is the interview process at Acme Corp?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Our interview process has four stages: 1) 30-minute recruiter call. 2) 45-minute technical screen (coding exercise). 3) Half-day onsite with two technical interviews and a culture conversation. 4) Offer within 5 working days. Total process: typically 2-3 weeks."
      }
    },
    {
      "@type": "Question",
      "name": "Does Acme Corp allow remote work?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Acme Corp operates a hybrid model: 2 days per week in our London or Berlin office, 3 days remote. Some roles are fully remote for candidates based in the UK. We also offer 4 weeks per year of work-from-anywhere."
      }
    }
  ]
}

Why this matters: AI models extract FAQ-formatted answers 3.2x more often than information buried in prose paragraphs. Each Q&A pair maps directly to how candidates query AI.

EmployerAggregateRating Schema

Add this if you have a strong employee rating to promote:

{
  "@context": "https://schema.org",
  "@type": "EmployerAggregateRating",
  "itemReviewed": {
    "@type": "Organization",
    "name": "Acme Corp",
    "sameAs": "https://www.acmecorp.co.uk"
  },
  "ratingValue": "4.3",
  "bestRating": "5",
  "worstRating": "1",
  "ratingCount": "187",
  "reviewCount": "142"
}

Note: Only use this if your rating is genuinely positive (4.0+). A low rating in structured data will be cited just as readily as a high one.

HowTo Schema (Interview Process)

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Acme Corp Interview Process",
  "description": "Our hiring process for engineering roles at Acme Corp, from application to offer.",
  "totalTime": "P21D",
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Application Review",
      "text": "We review every application within 5 working days. If there's a match, our recruiter will reach out to schedule an initial call.",
      "url": "https://www.acmecorp.co.uk/careers#apply"
    },
    {
      "@type": "HowToStep",
      "position": 2,
      "name": "Recruiter Call",
      "text": "A 30-minute call with a recruiter to discuss the role, your experience, and answer your questions about Acme Corp.",
      "url": "https://www.acmecorp.co.uk/careers#recruiter-call"
    },
    {
      "@type": "HowToStep",
      "position": 3,
      "name": "Technical Screen",
      "text": "A 45-minute technical exercise conducted over video call. We share the problem in advance so you can prepare.",
      "url": "https://www.acmecorp.co.uk/careers#technical-screen"
    },
    {
      "@type": "HowToStep",
      "position": 4,
      "name": "Onsite Interviews",
      "text": "A half-day at our London office (or via video) with two technical interviews and a values conversation. Lunch is on us.",
      "url": "https://www.acmecorp.co.uk/careers#onsite"
    },
    {
      "@type": "HowToStep",
      "position": 5,
      "name": "Offer",
      "text": "We aim to make offers within 5 working days of the final interview. Our recruiter will walk you through compensation, benefits, and start date options.",
      "url": "https://www.acmecorp.co.uk/careers#offer"
    }
  ]
}

How Do You Add Schema Markup to Your Careers Page?

Implementation varies by platform. Here's how to add JSON-LD on every major CMS and framework:

WordPress

Option 1: Plugin (easiest) Install Yoast SEO or Rank Math. Both support Organisation and JobPosting schema. For FAQPage schema, use the built-in FAQ block in Gutenberg.

Option 2: Manual (more control) Add to your theme's header.php or use a plugin like Insert Headers and Footers:

<script type="application/ld+json">
<?php echo json_encode($your_schema_array, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); ?>
</script>

Webflow

In Webflow, go to Page Settings → Custom Code → Head Code for the relevant page. Paste the entire <script type="application/ld+json">...</script> block.

For dynamic job listing pages using CMS Collections, use Webflow's embed element within the collection template and reference CMS fields for dynamic values (title, salary, etc.).

Custom HTML

Add the <script type="application/ld+json"> block directly in your page's <head> section. This is the simplest approach and works on any website.

React / Next.js

In Next.js, use the <Head> component or the new metadata API:

// app/careers/page.tsx (App Router)
export const metadata = {
  title: 'Careers at Acme Corp',
};

export default function CareersPage() {
  const faqSchema = {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "What salary does Acme Corp pay?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Senior Engineers: £85,000-£110,000. Mid-level: £58,000-£78,000."
        }
      }
    ]
  };

  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
      />
      {/* Page content */}
    </>
  );
}

For dynamic job listings, generate the JobPosting schema server-side using your job data:

// app/jobs/[slug]/page.tsx
export default async function JobPage({ params }) {
  const job = await getJob(params.slug);

  const jobSchema = {
    "@context": "https://schema.org",
    "@type": "JobPosting",
    "title": job.title,
    "datePosted": job.postedDate,
    "baseSalary": {
      "@type": "MonetaryAmount",
      "currency": "GBP",
      "value": {
        "@type": "QuantitativeValue",
        "minValue": job.salaryMin,
        "maxValue": job.salaryMax,
        "unitText": "YEAR"
      }
    },
    "hiringOrganization": {
      "@type": "Organization",
      "name": "Acme Corp"
    }
  };

  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jobSchema) }}
      />
      {/* Job listing content */}
    </>
  );
}

Gatsby, Nuxt, SvelteKit

The pattern is identical to React/Next.js: generate the JSON-LD object from your data and inject it as a <script type="application/ld+json"> element. Use your framework's head management solution (react-helmet for Gatsby, useHead for Nuxt, <svelte:head> for SvelteKit).


How Do You Test Your Schema Markup?

After implementation, validate your markup using these tools:

Google Rich Results Test

URL: https://search.google.com/test/rich-results

Enter your page URL and Google will show:

  • Which schema types were detected
  • Whether you qualify for rich results (enhanced search listings)
  • Any errors or warnings in your markup

This is the most important validation step. If Google can't read your schema, AI models likely can't either.

Schema.org Validator

URL: https://validator.schema.org/

Validates your JSON-LD against the full schema.org vocabulary. More comprehensive than Google's tool — it checks every property, not just the ones Google uses for rich results.

OpenRole's Free Audit

Run a free audit on OpenRole to see how your structured data translates to actual AI responses. Our audit checks whether the schema you've implemented is actually improving your AI visibility.

Manual AI Testing

After deploying schema markup, wait 2–4 weeks for AI models to recrawl your site, then ask:

  • ChatGPT: "What does [Company] pay for [Role]?"
  • Claude: "Tell me about working at [Company]"
  • Perplexity: "What benefits does [Company] offer?"
  • Google: Search "[Company] careers" and check AI Overview

Compare the responses to your structured data. If AI cites your published figures, the markup is working.


What Are the Most Common Schema Markup Mistakes?

Based on auditing 517 UK employer websites, here are the errors we see most frequently:

Mistake 1: Missing baseSalary in JobPosting

The problem: 78% of UK employers with JobPosting schema omit the baseSalary field entirely.

Why it matters: Salary is the single most-queried piece of employer information in AI. Without baseSalary, AI guesses — and gets it wrong by £10,000–£25,000 on average.

The fix: Always include baseSalary with minValue and maxValue. Use broad ranges if you're uncomfortable with exact figures.

Mistake 2: Wrong @type Values

The problem: Using @type: "Company" instead of @type: "Organization", or @type: "Job" instead of @type: "JobPosting".

Why it matters: Schema.org has specific type names. Incorrect types are silently ignored by validators and AI models.

The fix: Always reference schema.org for exact type names. The correct types are: Organization, JobPosting, FAQPage, EmployerAggregateRating, HowTo.

Mistake 3: Invalid or Missing Dates

The problem: Using formats like "15/02/2026" or "Feb 2026" instead of ISO 8601 format.

Why it matters: Google rejects JobPosting schema with invalid dates, and stale validThrough dates cause listings to be marked as expired.

The fix: Always use ISO 8601 format: "2026-02-15". Set a calendar reminder to update validThrough before it passes.

Mistake 4: Schema on the Wrong Pages

The problem: Putting Organisation schema on the careers page instead of the homepage, or putting a single JobPosting schema on a page listing multiple jobs.

Why it matters: Search engines expect specific schema types on specific pages. Organisation schema should be on your homepage (or "About" page). Each job should have its own page with its own JobPosting schema.

The fix: Organisation → homepage. FAQPage → careers page. JobPosting → one per individual job page.

Mistake 5: Duplicating Content Incorrectly

The problem: Copy-pasting the same JobPosting schema across multiple job pages without updating the title, salary, or description.

Why it matters: Google may penalise duplicate structured data. AI models may cite the wrong salary for the wrong role.

The fix: Generate schema dynamically from your job data. If using a CMS, build a template that pulls fields automatically.

Mistake 6: Forgetting to Update

The problem: Implementing schema once and never updating it. Employee count from 2023, salary ranges from two years ago, expired job listings.

Why it matters: Outdated schema is worse than no schema — it teaches AI to cite incorrect information with high confidence.

The fix: Review your schema quarterly. Update numberOfEmployees, salary ranges, and benefits annually at minimum. Remove expired JobPosting entries immediately.


Where Can You Generate Employer Schema for Free?

Use OpenRole's free employer schema generator to create Organisation, JobPosting, and FAQPage schema markup in minutes. Enter your company details, and we'll generate validated JSON-LD that you can copy directly into your website.

For a broader view of how schema markup fits into your overall AI visibility strategy, read the UK AI Employer Visibility Report 2026 — our audit of 517 UK companies found that schema markup was the single strongest predictor of AI accuracy.


Last updated: March 2026. Schema.org vocabulary evolves — check schema.org/Organization and schema.org/JobPosting for the latest supported properties.