Since January, Ontario employers with 25 or more staff have had to publish expected compensation on public job postings. The range cannot span more than fifty thousand dollars, and it sits where every competitor hiring the same role can read it.
So the number matters more than it used to. The problem is that salary benchmarking sources disagree with each other, sometimes by more than sixty thousand dollars for one job in one city, and the reasons are not obvious until you know what each one counts.
Salary benchmarking sources, compared on one role
Six published figures for a cyber security analyst in Toronto, gathered the same month. We use this role because it carries plenty of public data, and the same exercise across data scientist, analyst and engineer salaries shows an identical spread, and most technology roles show a comparable spread.
- SalaryExpert: $142,673
- levels.fyi: $113,564
- ZipRecruiter: $94,862
- Indeed: $92,686
- Glassdoor: $81,428
- PayScale: $79,075
Sixty-three thousand dollars between highest and lowest, and our 2026 Canadian salary guide shows the same pattern across other technology roles. Every figure is accurate for what it measures, and they measure three different things. Each one is set out with its methodology in our breakdown of cyber security salary in Canada.
The same job, priced six ways
Cyber security analyst in Toronto, every figure published and collected in August 2026.
| Source | What it measures | Reported |
|---|---|---|
| SalaryExpert | Employer surveys, includes bonus |
$142,673 |
| levels.fyi | Self-reported total comp, includes equity |
$113,564 |
| ZipRecruiter | Scraped job postings, the advertised figure |
$94,862 |
| Indeed | Self-reported, base salary |
$92,686 |
| Glassdoor | Self-reported, base salary |
$81,428 |
| PayScale | Self-reported, base only, excludes bonus |
$79,075 |
| Spread | Highest to lowest | $63,598 |
Figures are the published averages for each source at the time of collection. Where a source reports a range, the midpoint is shown.
See a second role: data scientist, Toronto
| Source | What it measures | Reported |
|---|---|---|
| Robert Half | Own placement data, large-employer skew |
$108,733 to $163,490 |
| PayScale | Self-reported, base only |
$91,541 |
| Job Bank | Administrative data, NOC 21211 |
$66,600 to $149,300 |
Robert Half’s floor sits above Job Bank’s midpoint. Both are correct: one counts what a specialist agency gets asked to fill, the other counts everyone in the occupation.
Change the job title, move the benchmark $22,000
Both figures come from Glassdoor, for Toronto, in the same month. Most employers use these two titles interchangeably.
| Title as advertised | Submissions | Average |
|---|---|---|
| Software engineer | 12,865 | $107,906 |
| Software developer | 9,883 | $85,759 |
| Difference | For work most employers treat as the same | $22,147 |
Why salary benchmarking data disagrees
Employer-reported data comes from compensation surveys, which capture the full package including bonus. Larger and better-resourced companies are the ones that answer surveys, so the sample tilts high before anything else happens. SalaryExpert sits at the top of the list for this reason.
Posting-derived data is scraped from job ads, so the figure is whatever the employer advertised. ZipRecruiter works this way. Advertised ranges are optimistic at the ceiling and negotiated at the floor, which makes them a fair read on employer intent rather than on outcomes.
Self-reported data depends on who submits. Glassdoor, PayScale, Indeed and levels.fyi all rely on it, and the differences between them are mostly definitional: PayScale reports base salary alone, levels.fyi reports total compensation including equity that may never vest. Those two are not comparable even when describing the same job.
Read the list again knowing that, and the spread stops looking like disagreement. SalaryExpert is high because it counts bonus at large employers. PayScale is low because it counts base only.
Job titles move the benchmark before you start
Here is the part that costs employers real money, and it has nothing to do with which source you pick.
On Glassdoor, in Toronto, in the same month: a software engineer averages $107,906 from 12,865 submissions. A software developer averages $85,759 from 9,883 submissions.
Twenty-two thousand dollars, same city, same source, for two titles most employers use interchangeably. The gap is not measurement error. It reflects who self-selects into each title, which employers use which word, and the seniority mix underneath each label.
Practically: benchmark the title you are going to advertise, a point covered in full in our guide to data scientist vs data analyst rather than the one you use internally. If you plan to advertise a software developer role and you benchmarked against software engineer data, your range is roughly twenty thousand dollars off before you have made a single other decision.
Most of the spread is real rather than measurement error
Everything above is about how sources measure. It leaves a bigger question unanswered: even with one source, chosen correctly, the range is enormous.
Glassdoor reports a software engineer in Toronto at an average of $107,906. It also reports a twenty-fifth percentile of $81,249, a seventy-fifth of $148,414, and a ninetieth of $206,753. That is a hundred and twenty-five thousand dollar spread inside one source, one title, one city. It is twice the gap between all six sources on the previous role.
So the sources are not the main problem. Four things move a real salary within that range, and knowing which apply to your role narrows the number faster than switching sources ever will.
Seniority, and not the title. The gap between someone who has shipped and owned systems and someone three years in is the single largest factor. Titles conceal this because one company’s senior is another’s intermediate. Percentile position tracks years of relevant depth far more closely than it tracks job title.
Who the employer is. A large bank, a global technology firm and a forty-person managed services provider pay differently for identical work, and the difference is structural. Employers with equity to offer, formal compensation bands, or a need to compete with American offers sit at the top of the range. Smaller employers competing on autonomy and interesting work sit lower and know it.
What the money is made of. At the top of most technology ranges the number stops being salary. Base plus bonus plus equity is a different package from base alone, and a candidate comparing a $150,000 cash offer against a $180,000 package including unvested stock is comparing two things that are not the same. This is why the ninetieth percentile figures look implausible until you see what they include.
Specialism inside the title. Two people can hold the same title and do work with different scarcity. In security, incident response and cloud architecture price above monitoring. In data, engineering prices above analysis. In software, the platform and infrastructure end prices above application work at the same seniority. Aggregate figures average all of it together.
Practically: before you compare sources, place your role honestly on those four. A mid-level application developer at a forty-person firm is a twenty-fifth percentile hire, and benchmarking that role against an average built partly from Big Tech total compensation will produce a range you cannot fund and a search that stalls.
The salary number no benchmark publishes
There is a fourth figure, and it decides whether your offer is accepted: what a candidate at that level signed for, recently, in your market.
No public source carries it. Offer data is private, it moves faster than any survey cycle, and it swings on circumstance. A candidate holding two competing offers signs at a different number than the same candidate holding none, and neither case reaches a database.
That gap is why benchmarking feels unreliable even when done carefully. You are comparing published averages against a live market, and published averages always describe a slightly older world.
How to benchmark a salary in four steps
Start from Job Bank
The Government of Canada publishes wage data by occupation and region, drawn from administrative sources rather than volunteers.
Establish what each higher figure includes
When a source reports significantly more, find out whether it counts bonus, equity or total compensation before you use it.
Narrow to your actual situation
Region, company size and sector move the figure more than the job title does, once the title is right.
Price the seniority, then set the range
Decide honestly what the first six months require before you look at a number, then set the range from what you can fund. How that range differs from the band you operate within is covered in salary ranges and bands explained.
Once you have the number, the difference between a salary range and the band you operate within is covered in salary ranges and bands explained.
What Ontario pay transparency changed
Before 2026 a range was an internal document. You could open high, negotiate down, and nobody outside the process saw the number.
Now it is published, capped at a fifty thousand dollar span, and directly comparable against every competitor advertising the same role. The obligation falls away above two hundred thousand, which exempts most leadership roles and very little else.
Two consequences worth planning around. Posting low to preserve negotiating room now costs applications before any conversation starts, because candidates deciding where to apply see your number beside everyone else’s. And a range at the full fifty thousand span reads as uncertainty about the role, which is a signal in itself.
The full requirements are in our guide to Ontario job posting rules, and our compliant posting template builds a posting that meets them.
Where a recruiter is useful, and where they are not
A recruiter cannot tell you what the market pays in the abstract any better than Job Bank can. Anyone offering a single authoritative number is selling something.
What a recruiter holds is the fourth figure for roles they have placed themselves: what candidates at that level accepted in the last quarter, how many competing offers were in play, and where deals collapsed on money rather than fit. That is a small, current, specific dataset, and it is the only part of this that is not published anywhere.
It is worth asking for by name.