Why your jobs don't show up in Google for Jobs
Your structured data is valid, yet the job is nowhere to be found. Eight common causes and how to rule them out.
The Rich Results Test comes back green, and still your job is nowhere in Google for Jobs. That green check only means your markup is syntactically valid. Google itself says there is no guarantee that features based on structured data will actually appear in search results. Between "valid" and "shown" sits a list of conditions the test never checks. If the test doesn't even come back green for you yet, start with the basics of JobPosting markup and come back here after. Below are the eight causes that come up most in practice.
1. Your markup sits on a list page
The classic job site mistake. JobPosting markup belongs on a page with a single job, not on a search results or list page. Google even sends an explicit Search Console message for this: "A list page should not include structured data for individual jobs".
Enriching your list page feels logical, because that is where most traffic lands. Google sees it the other way around: a list page with ten JobPosting blocks is ten pieces of duplicate data without a canonical source. The solution is to remove the markup from the listing and keep it on the detail page only.
2. Your description is too thin
Google requires a full description in HTML: responsibilities, qualifications, skills, working hours, and education and experience requirements. The description also may not be identical to the title. A three-line posting that says "send us your CV" does not clear the bar, and incomplete job descriptions are an explicit policy violation.
So what counts as complete? Think of the posting the way a good recruiter writes it: what will you do, what should you know, what are the hours, what education or experience does the role require. If one of those is missing from the page, the description is incomplete in Google's eyes, however tidy the markup looks.
A practical detail few people know: inside the description, Google only recognises <p>, <ul> and <li>. Headings, <strong> and <em> are ignored in the display. Build your formatting entirely out of headings and bold lines, and Google receives one unbroken block of text.
3. The markup says more than the page shows
Everything in the structured data must also be visible on the page. If the salary is in the markup but not in the text, you are violating the content guidelines. This goes wrong most often with ATS integrations: the system sends along more fields than the template actually renders.
When you audit your fields, look at salary, closing date and location first. Those are the fields an ATS sends by default and a template drops most often.
Checking is a two-screen job: the source code with the JSON-LD on one side, the page as a visitor sees it on the other. Every field in the markup should be something you can point at on the page. If you can't, either the field goes or the template gains it.
4. Your title contains more than the job title
The title field holds the job title and nothing else. No vacancy codes, no addresses, no dates, no salaries, no company names. Google's own example: not "Apply now for IT job - FRENCH speaker in Bucharest", but "Market Specialist, French speaker". Heavy use of characters like exclamation marks can also count as spammy markup.
If your job site shows postings on behalf of employers, there is an extra rule that runs against instinct: you may not rewrite the title yourself to meet the guidelines. You publish the title as the employer supplied it. The cleanup has to happen at the source.
5. The location or remote flag is wrong
As soon as you use jobLocation, addressCountry is required. Many implementations fill in a city and leave the country empty, and that alone puts the job out of the running.
Then the mistake nearly everyone makes: TELECOMMUTE is meant exclusively for fully remote roles. Occasional working from home does not count, and neither does "remote negotiable". A role with two fixed office days in Utrecht is, to Google, a role in Utrecht, jobLocation and all. Flag it as remote and your data is wrong. For a genuinely remote role you must also name at least one country via applicantLocationRequirements, otherwise Google does not know where it may show the job.
6. Expired jobs are still live
Google does not allow expired postings, and structurally leaving them up risks a manual action. There are three valid ways to expire a job: set validThrough to a date in the past, remove the page entirely (a 404 or 410), or take the JobPosting markup off the page. One of the three is enough.
This is the part most job sites automate for publishing but forget for cleanup. How to set up that expiry process properly is covered in the chapter on sitemaps and the Indexing API.
7. There is no visible way to apply
A job without a way to apply is not allowed. The same goes for jobs behind a login: users must be able to read the full posting without signing in. It sounds obvious, but it also fails technically. If your apply button only renders through JavaScript the crawler never executes, that button does not exist for Google.
Don't test this in your own browser. Use URL inspection in Search Console, which shows the page as Googlebot sees it, including what survives rendering.
8. You haven't waited long enough
Google warns about this itself: after publishing, it can take several days before a page is found and crawled. A job that went live yesterday and is invisible today is not a problem yet.
Check the status in URL inspection in Search Console; a regular search tells you nothing about whether the page is sitting in the queue. If you want the wait structurally shorter, that is Indexing API territory, not a matter of more patience.
How to run the diagnosis
Walk through these questions in order, and you rule out every cause in a controlled way:
- Is the URL in the index? Check URL inspection in Search Console. If not, this is your problem and the rest of the list can wait.
- Is the markup valid? Check the Rich Results Test. Errors here are the easy category, because the test points them out literally.
- Is the content complete, and is everything in the markup visible on the page itself?
- Is there an open manual action in Search Console? You'll find it under "Manual actions", and while it stands, nothing happens.
- Is a duplicate of this job winning? The same posting on your own site, an aggregator or the ATS domain can claim the display.
This order keeps you from staring at a green test while the real problem is that the page isn't in the index at all.
Sorting this out pays off. Google for Jobs is simply live in the Netherlands and Belgium, and the job panel sits at the top of the search results, exactly above the spot you would otherwise pay to advertise on. The rules above decide who is in it. To tick off every requirement in one pass, use the Google for Jobs checklist.