If you are an agency, your job board has a branding problem you may not have noticed.
Every job on it says your name. A candidate looking at forty listings sees the same organisation forty times, because the board was built on the assumption that the site owner is the employer. That assumption is right for a company careers page and wrong for a recruiter, where the site owner is the one filling the role and forty different companies are the ones hiring.
It matters in two places, and the second is the expensive one.
On the page, listings are harder to scan. “Senior Backend Engineer” tells a candidate much less than “Senior Backend Engineer at Northwind Logistics”, and the company is often the thing that makes someone click.
In the structured data, it is worse. Your JobPosting markup carries a hiringOrganization, and that is what Google for Jobs reads to decide which company a listing belongs to. If every job declares the agency, then every job you post is attributed to the agency — including for the candidates searching by employer name, who never reach you at all.
Turn on per-job company information
LoxoWP can store and display the real company for each job. It is a single checkbox — Use Job Company Information, in the plugin settings — and it is off by default, deliberately, since a single-employer careers site wants exactly the opposite behaviour.
One practical detail that saves a step: the setting gates output, not storage. The sync stores company data on every job regardless, so switching it on takes effect immediately on jobs you have already synced. You do not need to re-run a full import or wait for the next sync.
With it on, each job carries its own company name, logo, website and Loxo company id, and the board uses those instead of your site-wide Company Settings. Jobs with no company attached fall back to the site-wide values, so a mixed board degrades sensibly rather than showing blanks.
Hidden companies stay hidden
This is the part that matters if you have ever run a confidential search, and it is worth being precise about, because getting it wrong is a client-relationship problem rather than a bug.
When a recruiter marks a company as hidden in Loxo, the API still returns a record — but with the company masked. A naive importer stores whatever it is given, and the confidential client’s name ends up on a public web page.
LoxoWP checks company_hidden before storing anything, and when it is set, no company data is persisted at all — not the name, not the id, not the logo. There is nothing in the database to leak later, which is a stronger guarantee than storing it and hiding it at render time.
The logo gets a second check. Loxo serves a placeholder image called missing.png for companies without one, and storing that URL gives you a board full of identical broken-looking placeholder graphics. The importer recognises it and stores an empty string instead, so the template can make the correct decision — show nothing — rather than showing a placeholder.
Where the company website comes from
The job payload carries the company’s name, id and logo, but not its website. That takes a second API call, and doing it naively is how you turn a 200-job sync into a 400-request one.
Three things keep it cheap:
- Results are memoised in-process, so twelve jobs for the same client during one sync resolve the company once.
- Successful lookups are cached for a day in a transient, so tomorrow’s sync does not repeat them.
- Failures are negatively cached for an hour. This is the one people skip. Without it, a client whose company endpoint is erroring gets re-requested once per job, on every sync, forever. An hour is short enough to recover quickly and long enough to stop the hammering.
The website ends up as sameAs on the hiring organisation in your structured data, which is how search engines connect a listing to a real company rather than a name string.
What the structured data looks like
With per-job company on, the hiringOrganization in each job’s JSON-LD becomes the actual employer:
"hiringOrganization": {
"@type": "Organization",
"name": "Northwind Logistics",
"sameAs": "https://northwind.example",
"logo": "https://cdn.loxo.example/companies/northwind-large.png"
}
sameAs and logo are omitted entirely when they are empty, rather than emitted as empty strings. That distinction is not cosmetic — an empty string is a value, and a validator reading "logo": "" sees a declared-but-invalid image rather than an absent optional field.
Two honest caveats. Whether Google chooses to display a company logo in a job result is Google’s decision, not something any plugin can promise — what you control is emitting correct, complete markup. And if you want to confirm your own pages, run a live URL through Google’s Rich Results Test yourself; that is a manual check, and no plugin’s changelog is a substitute for it.
Putting it on the page
The company block renders wherever you want it — in the single-job template, in listing cards, or both. There is a shortcode:
and a matching editor block with toggles for showing the logo and the name independently, which is usually what you want: logo plus name on the job detail page, name only in a compact list.
If your theme needs different markup, job-company.php is one of the overridable templates. Copy it into your theme and it takes precedence, the same as any other LoxoWP template.
Worth doing at the same time
Two small things pair naturally with this change:
Check your fallback values. The site-wide Company Settings are still used for jobs with no company attached. If they were filled in years ago with a placeholder, now is when it becomes visible.
Look at what your listing template shows. Once the company is available per job, listing cards that show only a title and location are leaving the most clickable field on the table.
For the full field reference, see the job company information docs. If you have not set up structured data at all yet, start with getting Loxo jobs into Google for Jobs — per-job company data makes that markup accurate, but it does not replace it.
The short version: agency job boards label every job with the agency, in the markup as well as on the page. One setting swaps that for the real hiring company, applies to jobs you have already synced, and keeps confidential clients confidential by never storing their details in the first place.
