How Zorlya reads salary and why missing is not zero

By ZorlyaUpdated 5 min read

In this post
  1. What counts as a salary figure
  2. When a model reads the salary
  3. What the score does with a salary
  4. What happens when something is missing
  5. What the score cannot know
  6. Salary bands from Zorlya’s own postings
  7. How to use this

Most job postings publish no salary. Of the 130+ sources Zorlya reads, many never carry a salary, and the ones that do often give hourly or monthly pay. A tool that treated a blank as zero would rank every unpaid-looking job last. A tool that treated it as average would drag every score toward the middle. Zorlya does neither, and this post shows what it does, where the edges are, and what it cannot know.

What counts as a salary figure

The columns that hold a salary number mean one thing: a yearly amount. A source’s figure becomes a number only when the source says it is yearly, or says nothing about a period. Several adapters follow that rule in their code:

  • Himalayas stores its numbers only when the period is annual.
  • Jobicy turns a figure into numbers only when it is a yearly dollar amount.
  • Job postings that carry structured data are read as numbers only when the unit is a year, or no unit is given.

Everything else stays as the text the source wrote. Job Bank quotes hourly Canadian dollars, so the figure stays as that text. MyCareersFuture quotes monthly Singapore dollars, so it stays as text too, and a salary the employer marked private is not stored at all. Turning monthly Singapore dollars into annual US dollars would need a currency rate and an assumption about months, and the adapter does not invent either.

The app shows a numeric range with its currency when there is one, and otherwise shows the source’s own text. So you may see “SGD $9,000 to $15,000 Monthly” on a card, and the score will not use it.

When a model reads the salary

If an adapter gave no salary, Zorlya can ask a model to read the ad text. The answer is accepted only if it passes four checks. The posting must show something that looks like pay, a dollar sign followed by a digit or a number ending in k. The model must say the currency is USD. Each figure must fall between $10,000 and $2,000,000. And if the minimum is above the maximum, the two are swapped.

The check errs toward storing nothing. A wrong salary silently moves a score, while a missing one only removes a piece of evidence. A rule-based reader of the same kind is built and running in shadow mode beside the model, as the post on model use describes. It reads forms such as $120k to $150k and converts hourly pay by 2,080 hours and monthly pay by 12 only when the ad states the unit, and it reads nothing for other currencies or a text with two different bands.

What the score does with a salary

Salary fit compares the top of the posted range with the floor you set in your profile. The ratio decides:

Table
Top of range against your floor Salary fit
2 times or more 100
1.3 to 2 times 85 to 100
1 to 1.3 times 70 to 85
0.85 to 1 times 50 to 70
0.7 to 0.85 times 30 to 50
below 0.7 times under 30, never below 5

If a posting gives only a minimum, that figure is used.

What happens when something is missing

There are three cases, and they differ.

No floor, and the posting states a salary. Salary fit is 55. You told Zorlya salary does not decide this for you, so the figure is a mild positive and not a judgement.

No floor, and the posting is silent. Nothing was measured on either side. The salary part is left out of the score, and its weight is shared among the other parts. At the default weights, an excellent job with no published salary scores 93.1 with salary left out and 84.5 if a neutral 50 is averaged in. The scoring post has the full example.

A floor, and the posting is silent. Salary fit is 45, and it counts. Here Zorlya knows what you need and cannot tell whether the job meets it, so it scores slightly under neutral and keeps the weight, 20% by default. This is a judgement, and it has a cost: the score is a little lower than if the part were left out, so a job from a source that never publishes pay carries a small penalty.

None of the three cases is zero. A zero would say the job pays nothing, which no posting means.

What the score cannot know

  • Currency. The scorer compares a stored yearly number to your floor, which is in dollars, and it does not check the currency. A source that reports a yearly figure in another currency records that currency, but the scoring code reads only the number. How often that happens has not been measured, and no currency conversion is done.
  • Total pay. A posted range is a base figure at best. Bonus, equity and benefits are not in it.
  • What is paid. An advertised range is not a paid salary. Employers often post wide ranges.
  • Whether the range is real. A range can be a legal formality. Zorlya reads it as published.

Salary bands from Zorlya’s own postings

Zorlya can now build a salary band from stored postings. It uses US dollar postings only, matched by title and place as written, and shows the 25th, 50th and 75th percentiles of the range midpoints, rounded to the nearest $500. It needs at least 15 postings from at least 5 companies. Below that it would show an empty state with a labelled “Research with AI” button, instead of a guess. This is built and runs in shadow mode by default: Zorlya works out its own band and logs it, and the benchmark tool still shows the model’s answer while we compare the two. Zorlya has not measured how many titles clear the bar in production.

How to use this

Set a salary floor if you have one, because it is what makes the salary part meaningful. Read the posted text when a card shows a non-dollar or non-yearly figure, since the score ignores it. And treat a missing salary as a question to ask the employer, not as a verdict on the job.

ShareLinkedInX

Zorlya writes these posts from its own product and data. About Zorlya · All posts

Keep reading

Related posts.