contractrates.fyi

About the numbers

Rate data methodology

Useful benchmarks need visible assumptions. This is how the directory, planner, hourly role pages, comparisons, and research report calculate and describe their data.

What the records represent

Our source collection currently contains 11,412 rate records. 11,412 qualify for these benchmarks. They are self-reported charges, not independently verified income, accepted offers, or take-home pay. Counts refer to records, not unique people. A freelancer may contribute more than once. The overall “Freelancer” view combines all roles; it is not an extra role to add to the total.

Currencies and legacy records

Explicitly labeled rates must use USD to enter these calculations. 3,553 included legacy records have no currency label; we treat them as USD in line with the site’s USD rate-entry convention. This assumption is not proof of the original currency. We do not convert foreign currencies. All displayed benchmarks are nominal USD, without inflation, purchasing-power, or tax adjustments.

Validation and calculations

A record needs a role and a finite, positive hourly rate. 0 source records are excluded by those checks or by an explicitly non-USD currency. We do not trim high or low positive rates. The mean is the arithmetic average; the median is the midpoint of sorted rates. Percentiles use linear interpolation between adjacent sorted observations (index = (n − 1) × percentile). The “middle 50%” runs from the 25th to the 75th percentile. It is not a confidence interval.

Small samples and rankings

We publish group benchmarks only when at least 5 records match. Groups with 5–24 records are labeled small samples. Research ranking charts and the highest-median country label require at least 25 records per group. Even large samples are self-selected and may not represent the market. More records reduce sensitivity to one observation but do not remove selection bias.

Location and experience

Country is taken from the country at the end of the submitted location, with common aliases normalized. A city name alone is not used to guess the country. Location refers to the freelancer, not necessarily the client. Missing or unrecognized locations are omitted from country groups but retained in role totals. Experience bands are 0–2, 3–5, 6–10, 11–15, and 16+ years. Missing or invalid experience is omitted from those comparisons. Legacy forms may have stored missing experience as zero; we cannot recover that distinction from the records.

Combining filters

The rate planner calculates each role, country, and experience combination from the actual matching records. It does not multiply averages from separate country and experience groups. If fewer than 5 records match, it asks you to broaden the filters instead of silently substituting a larger group.

Dates and freshness

The data includes historical submissions and imported records. A record’s creation date indicates when it entered the database, not necessarily when the quoted work happened. The newest record date does not mean all observations are recent. Summaries are cached for up to 12 hours and regenerate when requested after expiry. We do not present changes between import years as market-rate growth.

Using these numbers

Start with a relevant role and location, examine the sample size and range, and calculate the rate your own costs require. Project scope, client requirements, non-billable time, taxes, and risk can change a quote substantially. Skill frequency measures how often a skill appears in submissions; it is not a measure of hiring demand or a causal estimate of a skill’s value.

Get new rate research and tool updates

Join the list for new benchmarks, practical pricing guides, and updates to the free tools.