Appearance
Google for Jobs
Get your Recruitly jobs into the Google for Jobs widget — the boxed jobs experience at the top of Google results, with rich cards showing salary, location and employer. Google lists a job only when the page hosting it carries valid schema.org/JobPosting structured data (JSON-LD) on a public URL Google can crawl.
Job page → JobPosting JSON-LD → Google crawls → Google for Jobs widgetNo structured data = no listing. A visually rendered jobs list is not enough — Google reads the machine-readable <script type="application/ld+json"> block, not your HTML layout. The data must also be present in the initial server-rendered HTML: markup injected client-side after page load (for example by a JavaScript jobs widget) is unreliable for crawling.
Three routes, pick by where your job pages live
| Where the job page lives | What you do |
|---|---|
| Recruitly-hosted job pages (the pages your adverts link to) | Nothing — JobPosting JSON-LD is emitted automatically. See below. |
| WordPress with the Recruitly plugin | Add one snippet to functions.php. → WordPress guide |
| Any other website / custom stack | Render the JSON-LD server-side from the Public Jobs API. → Custom website guide |
Whichever route you take, finish with Testing & Search Console.
Recruitly-hosted job pages: built in
Every public job page Recruitly hosts for you already emits a JobPosting block automatically — nothing to install. What each page includes:
| JSON-LD field | Source in Recruitly |
|---|---|
title | Job title |
description | The full advert description (HTML is allowed by Google) |
datePosted | Job created date |
validThrough | Job closing date, when set |
identifier | Your job reference (PropertyValue, name = your agency) |
hiringOrganization | Your agency name, plus website as sameAs |
jobLocation | Place → PostalAddress: city, region, postcode, 2-letter country code |
employmentType | Permanent → FULL_TIME · Contract → CONTRACTOR · Temporary → TEMPORARY |
jobLocationType | TELECOMMUTE when the job is marked remote working |
baseSalary | MonetaryAmount: currency + min/max with unitText HOUR/DAY/WEEK/MONTH/YEAR from the pay tenure |
directApply | false (candidates apply on the page) |
A job needs at least a title and description for the block to be emitted, and a real location plus a salary to rank well. When a job is closed or unpublished the page stops being served, so expired listings clean themselves up.
Eligibility rules that trip people up
- One job = one public, crawlable URL. No login walls, not blocked by
robots.txt, included in your sitemap. descriptionmust be the full description, not a teaser.- Every job needs at least a country in its location; city + region + postcode geo-match far better.
- Remove or expire pages when jobs close — Google penalises sites that keep dead listings.
- Google requires a
hiringOrganization. For confidential clients use your agency name or "Confidential Employer".