Cybrial
Independent design. Ongoing growth.Manchester · Working everywhere

Guide · Search, local and AI

Your Job Board Is Invisible, and the Fix Is Structural

By Measured 4 October 2026

An agency spends its week writing adverts nobody can find, on a job board a search engine has never successfully read.

The short answer

Job adverts appear in Google's jobs experience through JobPosting structured data on an indexable page. Most agency job boards fail the first condition before the second is even relevant: the vacancies load through JavaScript from an applicant tracking system, each one has no distinct URL, and there is no crawlable list linking to them, so there is nothing for a crawler to read. The fixes in order are a real URL per vacancy, a crawlable index page linking to all of them, valid JobPosting markup with the required properties, and removing the posting when the role closes. What the advert must legally say is a separate matter with its own guide on this site.

What this guide is

There is no recruitment client on this site. This is a technical method rather than a case study, and it says so rather than implying otherwise.

It also does not cover what an advert is required to say — the full name of the firm, whether you are acting as an agency or an employment business, and the rule against advertising a role you have no authority for. That is a genuine legal obligation with its own guide here, and this page assumes you have read it.

First, is the vacancy a page at all?

Before any structured data is worth discussing, the advert has to exist at a URL a crawler can reach. On a large share of agency sites it does not, and nobody has noticed because the board looks fine in a browser.

The three ways it goes wrong:

  • The board is an embedded widget from the applicant tracking system. The vacancies load into an iframe or through a script after the page renders. A human sees jobs; a crawler sees an empty container.
  • Every vacancy shares one URL, with the job selected by a fragment or a query parameter the site ignores. There is one page, not forty, so there is nothing to rank for forty different searches.
  • The vacancies exist at real URLs but nothing links to them. They are reachable only by searching the on-site filter, which a crawler does not operate. They are orphans, and orphans do not get indexed.

The test takes a minute. Open a vacancy, copy the URL, open it in a private window, and see whether the job is there. Then search a distinctive sentence from the advert in quotes on Google. If neither works, structured data is not your problem yet.

The fix is a real, server-rendered page per vacancy, plus a crawlable index that links to every live one, plus those URLs in your sitemap. Most applicant tracking systems can do this — it is usually a configuration or a hosted-careers-page option nobody enabled, not a rebuild.

JobPosting: the properties that matter

Once the page exists, JobPosting structured data is what makes it eligible for the jobs experience in search results. It is JSON-LD in the page head, and the properties that matter most in practice are:

  • title — the job title alone. Not "Exciting opportunity! Senior Nurse — Bolton — £38k — apply today". Just the title; the other fields carry the rest.
  • description — the full advert, in HTML, not a summary.
  • datePosted, and validThrough — the closing date. Without validThrough a posting goes stale and stale postings are a known cause of an agency being dropped from the experience.
  • hiringOrganization — and this is where agencies need care. If you are recruiting on behalf of a named client, the hiring organisation is the client, not you.
  • jobLocation, with a real postal address, or jobLocationType for genuinely remote roles.
  • employmentType — FULL_TIME, PART_TIME, CONTRACTOR and so on.
  • baseSalary, with currency and a unit. Optional, and the single biggest lever you have — see below.
  • identifier — your own reference, which keeps duplicates straight.

Two failure modes are worth naming because they are so common. Marking up the index page rather than the individual vacancy, which does nothing. And leaving expired roles marked up and live, which is the fastest way to lose eligibility across the whole site rather than just that page.

Validate with Google's own Rich Results Test and watch the job postings report in Search Console. Both are free and both will tell you more in ten minutes than any amount of speculation.

Publish the salary

The structured data field is optional. Publishing it is the highest-return decision on an agency job board, and most agencies avoid it.

The reasons for avoiding it are real: the client has not agreed a figure, the range is wide, and a competitor can see what you are paying. The cost of avoiding it is also real and larger. Candidates filter and sort on salary, "competitive" is read as "low", and the applications you do get are from people who have no idea whether the role is worth their time — so your screening load goes up while your quality goes down.

A band with its basis stated solves most of it: "£34,000–£38,000 depending on experience, plus bonus". If the client genuinely will not allow a figure, say that explicitly rather than writing "competitive", because a stated reason reads as honesty and a euphemism reads as evasion.

There is a wider direction of travel here too. Pay transparency has been moving steadily towards disclosure across several jurisdictions, and candidate expectation has moved faster than regulation. An agency board that hides salary now looks dated regardless of what any rule requires.

What the search data says about this sector

Our own recruitment figures are published in full on the recruitment industry page, and the shape of them is unusual.

So the build half of the market is both expensive and genuinely contested, and the search half is empty.

Those are terms a studio selling to agencies competes for, not terms your candidates or clients use. They are published so our own market is checkable rather than asserted.

The inference that does transfer: in a sector where everyone is buying £60 clicks for the obvious phrase and nobody has written anything for the adjacent one, the structural work described above is unusually cheap leverage. Forty indexable, marked-up vacancies is forty pages competing for forty specific job searches, and it costs configuration rather than media spend.

What to check on your own site

  • Open a vacancy, copy the URL, open it in a private window. Is the job there?
  • Search a distinctive sentence from one of your adverts in quotes. Does your page come up?
  • Does every live vacancy have its own URL?
  • Is there a crawlable page linking to all of them, not just a filter?
  • Are those URLs in your sitemap?
  • Does each vacancy carry JobPosting JSON-LD — on the vacancy, not the index?
  • Does every posting have validThrough?
  • Are closed roles removed or expired, rather than left marked up?
  • Where you recruit for a named client, is hiringOrganization the client rather than you?
  • Is the salary published, or at least a band with a stated basis?
  • Does the Rich Results Test pass, and what does the Search Console job postings report say?
  • Does every advert meet the legal content requirements? Separate guide, and it is not optional.

The first two are the whole audit in two minutes, and a surprising number of agency boards fail them.

Sources

Everything this page relies on.

  1. Google Search Central documentation on JobPosting structured data and the job postings report in Search Console. Property requirements and eligibility criteria change — validate against Google’s current documentation and the Rich Results Test rather than relying on this page.

  2. This is a practice note: there is no recruitment client on this site. It covers whether an advert can be found, not what it must say — the legal content requirements are in the recruitment advertising guide and this page is not a substitute for it.

Common questions

Questions people actually search for.

Why do our jobs never appear in Google's jobs results?

Usually because they are not indexable pages at all. If the board is an embedded widget from your applicant tracking system, or every vacancy shares one URL, or nothing links to the individual roles, there is nothing for a crawler to read and structured data is irrelevant. Open a vacancy in a private window and search a distinctive sentence from the advert — that is the test.

What does JobPosting markup need?

Title (the job title alone, not a sales line), full description in HTML, datePosted and validThrough, hiringOrganization, jobLocation with a real address, employmentType and an identifier. baseSalary is optional and worth including. Mark up the individual vacancy, not the index page.

If we recruit for a client, who is the hiring organisation?

The client, where you are advertising a named client's role. Putting the agency there misrepresents the posting. This also interacts with what the advert is legally required to say about whether you act as an agency or an employment business — covered in the separate guide.

What happens if we leave old jobs up?

Stale postings are a known cause of losing eligibility, and the loss is not confined to the offending page. Set validThrough on everything and expire or remove roles when they close — it is the cheapest piece of hygiene on the list.

Should we publish salaries?

Yes, or a band with its basis stated. Candidates filter and sort on it, "competitive" is read as "low", and hiding it raises your screening load while lowering application quality. If a client genuinely forbids a figure, say that explicitly — a stated reason reads as honesty where a euphemism reads as evasion.

How competitive is recruitment search?

Lopsided. Everyone is bidding on the hard phrase and nobody has written for the open one.

Can anyone find your vacancies?

Send me your job board. I will tell you whether your vacancies are indexable pages at all, whether the structured data validates, and how many of your live roles Google can currently see.