The rate formula, version 1.0.0
The formula below is published verbatim from the project's formula file; the computation script implements it, and any change bumps the version and adds a changelog entry.
Worked example
Manual QA Engineer, Middle, United Kingdom, Hourly (time and materials): 5 observations from 2 classes (job-board, vendor-rate-card); p25 $63, median $79, p75 $89; spread 32.9%; grade A. Monthly at 160 hours: $12,640.
Sources for the worked example
- job-board IT Jobs Watch. Test Analyst Contract Job Trends, Contractor Rates & Skill Sets | IT Jobs Watch. Published 2026-10-18, verified . ev-rate-united-kingdom-001
- vendor-rate-card Vendor rate card (delivery country: United Kingdom); vendor name and link are published only in the evidence file. Published 2026-01-26, verified . ev-rate-united-kingdom-016
- vendor-rate-card Vendor rate card (delivery country: United Kingdom); vendor name and link are published only in the evidence file. Published 2026-01-01, verified . ev-rate-united-kingdom-018
- vendor-rate-card Vendor rate card (delivery country: United Kingdom); vendor name and link are published only in the evidence file. Published 2026-01-01, verified . ev-rate-united-kingdom-023
- vendor-rate-card Vendor rate card (delivery country: United Kingdom); vendor name and link are published only in the evidence file. Published 2026-01-19, verified . ev-rate-united-kingdom-029
- fx European Central Bank. ECB euro foreign exchange reference rates (SDMX EXR). Published 2026-10-16, verified . ev-fx-2026-q4-gbp
Formula text
Version: 1.0.0 (must match `inputs/site.md`). Any change bumps the version and adds a `/changelog/` entry. The full text of this file is published at `/methodology/formula/`.
## 1. Observation normalisation
Every accepted evidence entry becomes one observation `(country, role, seniority, model, usdHourly)`.
- Hourly figures in local currency: `usdHourly = localHourly / fxRate` with the quarterly average rate from `data/taxonomies/currencies.json`.
- Monthly figures (dedicated team, staff augmentation, managed service): `usdHourly = usdMonthly / hoursPerMonth` with `hoursPerMonth` from `inputs/site.md` (160). If the source states a different hours basis, the note records it and the conversion uses the source's basis.
- Annual salary figures are not rate observations; they go to the salary component.
- A source that gives a range `[low, high]` yields two observations, `low` and `high`, each with weight 0.5.
- A source that gives a single figure yields one observation with weight 1.
- A vendor rate card contributes at most one observation pair per vendor per combination.
## 2. Aggregation
For each combination with observations `o_1 .. o_n` and weights `w_i`:
- `p25`, `median`, `p75` = weighted percentiles (linear interpolation) over the observations after the outlier rule in `sources.md`.
- `n` = count of observations after outlier removal.
- Figures are rounded to the nearest whole USD.
When the seniority of a source is unstated, the observation is assigned to `middle` and the note records "seniority assumed middle by source wording". When the model is unstated, it is assigned to `hourly`.
## 3. Confidence grades
- A: at least 3 accepted observations from at least 2 source classes, and `(p75 - p25) / median <= 0.6`.
- B: at least 2 accepted observations from at least 2 source classes, and `(p75 - p25) / median <= 0.9`.
- C: at least 2 accepted observations from 1 source class, or spread above 0.9 with at least 2 classes. Rendered with the label "C: indicative".
- Below C: not published; route listed in `data/not-published.json`.
## 4. Derived figures
- Monthly per engineer: `median x hoursPerMonth`. Annual: `monthly x 12`. Both printed with the hours assumption.
- Region median: median of member-country medians for the same role, seniority and model, only when at least 3 member countries are published; otherwise withheld.
- Role global median: median of country medians for the same seniority and model, at least 5 countries.
## 5. Calculator
Inputs: team size `T`; role mix as counts per role `c_r` with `sum(c_r) = T`; seniority mix per role; country; engagement model; hours per month `H` (default 160).
`monthlyCost = sum over roles r and seniority s of c_{r,s} x median(country, r, s, model) x H`
`annualCost = monthlyCost x 12`
Low and high bands use `p25` and `p75` in place of `median`.
If any required combination is withheld, the calculator shows "no published figure for {role}, {seniority} in {country}" and excludes it from the total with a visible note; it never substitutes a neighbour.
URL state: `/calculator/?c=poland&m=dedicated-team&h=160&r=qa-automation-engineer:middle:3,sdet:senior:1`.
## 6. Outsourcing vs in-house
In-house fully loaded hourly cost for `(country, role, seniority)`:
`inHouseAnnual = salaryUsd x (1 + employerCostPct) + equipmentUsdPerYear + toolsUsdPerYearPerSeat + salaryUsd x recruitingPctOfSalary / assumedTenureYears`
`inHouseHourly = inHouseAnnual / productiveHoursPerYear`
with `assumedTenureYears = 3` (stated on the page) and every other input from `data/overheads.json` and `data/salaries/`. The outsourced side is the published `median` for the same role and seniority at the selected model.
The page shows both figures, the difference in USD and percent, and the overhead line that contributes most to the difference. The page does not say which option is better; it states the numbers and the assumptions.
## 7. Worked example (template, filled by the build from real data)
"{Role}, {seniority}, {country}, {model}: {n} observations from {classes} classes; p25 ${p25}, median ${median}, p75 ${p75}; spread {spread}; grade {grade}. Monthly at {H} hours: ${monthly}."
Percentile method: observations are sorted, each sits at the midpoint of its cumulative weight, and values between midpoints are interpolated linearly.
Figures are medians of published observations converted to USD at the quarterly ECB reference rate shown in the footer. They describe market ranges on the verification date, not quotes. Monthly and annual figures assume the hours stated on this page. Confidence grades are defined on the methodology page. This site does not recommend providers.