Build a Freelance Benchmark Evidence Packet
By Andrew James Flores, Nathan Management · Updated September 23, 2026 · Editorial Standards
A rate benchmark is only as useful as the records behind it. This guide shows you how to collect three kinds of pay evidence (employee wages, advertised quotes and fees you actually collected), keep them apart in one worksheet, and test each against your own rate floor. It includes a filled comparison set: May 2025 federal wage medians for ten occupations, converted into the freelance hourly floor needed to match that pay.
1. Write one question and freeze your inclusion rules
Start with a question narrow enough to answer from records, for example: “What do US small businesses pay an independent web developer for a five-page site built on an existing content management system?” Write down the scope, currency, geography, employment status, observation window and price unit before you collect anything. Rules written afterwards tend to bend toward the answer you were hoping for.
Include a record only when it has an identifiable source, a capture date, an amount or range, a unit and an employment status. Keep every excluded record with its reason (missing scope, wrong geography, unknown unit, duplicate) so anyone reading your packet can see what was left out. Open the original posting or table instead of trusting a search snippet, and log each search query with its date so you can repeat the collection next year.
2. Keep three evidence classes apart
Each class answers a different question, so each is compared with a different number from your budget. Mixing them is the quickest way to get a misleading benchmark: an employee’s hourly wage, a posted budget and a paid invoice can all work out to “$45 an hour” and mean three different things.
| evidence_class | What it records | Where it comes from | Compare it with |
|---|---|---|---|
employee_wage | Pay for employees in an occupation, per hour or per year | Government wage surveys such as BLS Occupational Employment and Wage Statistics | The freelance floor needed to match that pay (Table 2) |
advertised_quote | A price someone posted or offered for defined work | Job postings, published price lists and written quotes you received | Your listed hourly floor, or your project check for a fixed fee |
collected_fee | Money you received for finished work, after refunds and payment fees | Your own invoices and payment records, or anonymized records a peer gave you permission to use | Your retained requirement per billable hour |
Where surveys go. A rate survey is recorded under the class that matches what its respondents reported: employee_wage when they are employees describing their pay, advertised_quote when freelancers report the rate they charge. Surveys never go under collected_fee, which is reserved for payments you can document. Put the survey’s dates, sample size, recruitment method and its definition of “rate” in the limitations column.
What to capture for each class. For employee wages, keep the occupation code and title, the release and reference period, the geography, the exact wage cell (for example, national median hourly) and the table URL. For advertised quotes, keep the posting URL, the posted date if shown, your capture date, the low and high amounts, currency, unit, scope and whether the buyer wanted an employee or a contractor. For collected fees, separate the quoted, invoiced, paid, refunded and retained amounts, and record payment dates, the fee basis and documented project hours.
3. A filled comparison set: ten occupations, May 2025
Here is the employee_wage class filled in for ten occupations that freelancers commonly work in. The wages are national median hourly wages from the federal OEWS survey. Source: U.S. Bureau of Labor Statistics, OEWS May 2025 national estimates, median hourly wage, retrieved September 23, 2026. OEWS publishes estimates for about 830 occupations each year; its frequently asked questions page covers the survey’s scope and definitions.
To turn each wage into a freelance comparison, the full-time annual equivalent (median hourly wage × 2,080 hours, which is 40 hours × 52 weeks) becomes the income goal in the calculator. Table 2 runs each wage twice. The first floor uses the calculator’s default assumptions ($5,000 business costs, no benefits budget, every invoice paid, no payment fees), the same basis as the per-skill floors in the freelance rate by skill guide. The second uses the full budget from the worked scenario in section 5: a $10,000 benefits budget, 95% of invoices collected and a 10% fee on collections, with the same $5,000 costs, 25 billable hours a week and 4 weeks with no billing.
| Occupation (SOC code) | Median hourly wage | Floor, calculator defaults | Floor, full budget | Added by the full budget | Full-budget floor ÷ wage |
|---|---|---|---|---|---|
| Software Developers (15-1252) | $65.38 | $117.50 | $147.17 | $29.67 | 2.25× |
| Management Analysts (13-1111) | $48.97 | $89.05 | $113.90 | $24.85 | 2.33× |
| Web Developers (15-1254) | $44.54 | $81.37 | $104.92 | $23.55 | 2.36× |
| Market Research Analysts and Marketing Specialists (13-1161) | $37.87 | $69.81 | $91.40 | $21.59 | 2.41× |
| Editors (27-3041) | $37.46 | $69.10 | $90.57 | $21.47 | 2.42× |
| Writers and Authors (27-3043) | $36.98 | $68.27 | $89.59 | $21.32 | 2.42× |
| Film and Video Editors (27-4032) | $36.26 | $67.02 | $88.13 | $21.11 | 2.43× |
| Graphic Designers (27-1024) | $30.27 | $56.64 | $75.99 | $19.35 | 2.51× |
| Bookkeeping, Accounting, and Auditing Clerks (43-3031) | $24.36 | $46.40 | $64.01 | $17.61 | 2.63× |
| Photographers (27-4021) | $21.47 | $41.39 | $58.15 | $16.76 | 2.71× |
The full budget adds $16.76 to $29.67 an hour to every floor. Leave benefits, unpaid invoices and fees out of your budget and each comparison in your packet starts that far too low.
The full-budget floor needed to match a median wage runs from $58.15 an hour for photographers to $147.17 for software developers, between 2.25 and 2.71 times the employee wage. Under these inputs every row starts from the same multiple of about 2.03: the 2,080 paid hours of an employee year are spread over 1,200 billable hours (1.73 times), then grossed up for 95% collection and a 10% fee (divided by 0.855). The rest of each multiple comes from the $15,000 of costs and benefits, which weigh more on a smaller wage. They add 0.22 to the software developer multiple and 0.68 to the photographer multiple.
That is why a flat rule such as “charge double the salary rate” misleads. The multiple moves with your own inputs, and billable hours move it most. Keep the web developer full-time equivalent ($44.54 × 2,080 = $92,643.20 a year) and change only the hours: at 20 billable hours a week the floor is $131.15, at 25 it is $104.92, and at 30 it is $87.43.
Two adjustments are yours to make. To match an employee’s pay after taxes instead of before, raise your income goal to cover self-employment tax: 15.3% (12.4% for Social Security and 2.9% for Medicare) on 92.35% of net profit, according to the IRS. An employer pays part of that tax for its employees; a freelancer pays all of it. The self-employment tax guide works through the numbers. And if your clients are local, compare against state or metropolitan OEWS estimates, which can sit well above or below the national median.
4. Fill and deduplicate the worksheet
Download the benchmark evidence worksheet (CSV). It holds the 32 column headers, two filled example rows and three empty rows for your own records. The example rows are the employee_wage and advertised_quote columns of Table 3; each one’s comparison_notes cell begins with “Example row” so you can find and delete them. Your working copy stays on your computer; the download sends nothing anywhere. Table 3 adds a third column to show how a collected_fee record reads.
| Worksheet field | employee_ | advertised_ | collected_ |
|---|---|---|---|
scope_ | Web Developers, United States, all industries | Five-page small-business website, as described in the client email | An earlier five-page small-business website you delivered, same scope |
source_ | https://www.bls.gov/oes/ | Leave blank | Leave blank |
private_ | Leave blank | Client email of 2026-09-18 | Invoice INV-2026-031 in your own ledger |
observation_ | 2026-09-23 | 2026-09-18 | 2026-09-23 |
| reference_ | May 2025 (reference_ | Leave blank | 2026-08-29 (payment_ |
occupation_ | 15-1254 | 15-1254 | 15-1254 |
geography | United States | US remote | US remote |
employment_ | Employee | Independent contractor | Independent contractor |
price_ | Hour | Fixed project fee | Fixed project fee |
| Amount column | wage_ | quoted_ | invoiced_ |
| refunds / fees_ | Leave blank | Leave blank | $0.00 refunds; $96.00 fees (fee_ |
total_ | Leave blank | Leave blank | 40, documented in your time log |
inclusion_ | Included | Included | Included |
limitations | National median hourly wage for employees, before the conversion to a freelance floor | Relayed by the client; hours, revision rounds, accessibility checks and handoff not stated | Your own project; one record |
comparison_ | Example row: floor to match this wage at 25 billable hours with the calculator defaults: $81.37 an hour | Example row: covers 22.64 estimated hours at the $87.72 floor (after $100 of direct costs, $116.96 once grossed up, and a 20% extra-time allowance), against 40 for your scope; your project check for that scope is $4,327.49 (section 6 of the benchmark evidence methodology guide). | Retained $77.60 an hour against the $75.00 requirement (section 6) |
Column rules. Use exactly one of the three evidence_class values per row. source_url points to public evidence; private_evidence_reference points to a confidential record, such as an invoice number, without exposing it. observation_date is the day you captured the record, while release_or_posted_date and reference_period describe the source. Leave unknown cells blank and explain them in limitations; a zero means a documented zero.
Duplicates. Set duplicate_key from the original posting ID, or from the same issuer, role, scope and posted date. The same job syndicated to five boards counts once: keep the original row, mark the copies excluded in inclusion_decision, and name the retained key in exclusion_reason. Put your inclusion rules in scope_definition and your assessment in comparison_notes.
Ranges and payments. A single quote goes in quoted_amount; an advertised range goes in amount_low and amount_high. Keep both ends of a range: if a posting offers $2,500 to $4,000, the midpoint is a price nobody offered, so compare each end with your own project price instead. For a payment, the retained amount is gross_collected minus refunds minus fees_amount; divide it by total_project_hours only when those hours are documented. The example project had no direct costs, so nothing else is subtracted: ($3,200.00 − $0.00 − $96.00) ÷ 40 = $77.60 retained per hour.
5. Work out the budget side
Every comparison needs your own numbers. Here is the scenario used throughout this guide, laid out the way the calculator computes it. Enter the same values in the calculator to check each line, then replace them with yours and keep the export alongside your worksheet.
| Line | Calculation | Result |
|---|---|---|
| Personal income goal, before taxes ($/year) | Entered | $75,000.00 |
| Business operating costs ($/year) | Entered | $5,000.00 |
| Personal benefits budget ($/year) | Entered | $10,000.00 |
| Billable hours per working week | Entered | 25 |
| Weeks with no billing each year | Entered | 4 |
| Invoices eventually collected (%) | Entered | 95% |
| Fees on collected payments (%) | Entered | 10% |
| Annual billable hours | 25 × (52 − 4) | 1,200 |
| Budget to retain | $75,000 + $5,000 + $10,000 | $90,000.00 |
| Share of each billed dollar you keep | 0.95 × (1 − 0.10) | 0.855 |
| Revenue to invoice | $90,000 ÷ 0.855 | $105,263.16 |
| Hourly floor | $105,263.16 ÷ 1,200 | $87.7193… per hour, quoted as $87.72 |
| Retained requirement per billable hour | $90,000 ÷ 1,200 | $75.00 |
Check the rounding: at $87.72 an hour, 1,200 hours invoice $105,264.00. Collecting 95% brings in $100,000.80, the 10% fee takes $10,000.08, and $90,000.72 remains. After $15,000.00 of costs and benefits, $75,000.72 is left before personal taxes, 72 cents over the goal because the rate was rounded up. Enter benefits as actual yearly dollars, not a percentage of salary, and apply a percentage fee once, in the fee field, never again as a business cost.
6. Compare each class with the right number
- Advertised quotes against your listed floor. A posted hourly rate below $87.72, or a fixed fee below your project check, pays less than your budget needs once the expected 5% of unpaid invoices and the 10% fee are counted; even with every invoice paid, anything under $83.34 falls short. For the example quote in Table 3, the scope you estimate at 40 hours becomes 48 planned hours with a 20% extra-time allowance. At this guide’s floor that time costs 48 × $87.7193… = $4,210.53, and the $100 stock-photo license adds $116.96 once it is grossed up for collection and fees ($100 ÷ 0.855), so the calculator’s project check is $4,327.49, rounded up. The $2,500 quote sits $1,827.49 below it.
- Collected fees against your retained requirement. Payment records are already net of unpaid invoices and fees, so compare them with $90,000 ÷ 1,200 = $75.00 retained per billable hour, not with the $87.72 listed floor. The example project, which had no direct costs, kept $77.60 an hour, $2.60 above the requirement. The project check prices in the 20% allowance, 5% unpaid invoices and a 10% fee, while this project ran exactly 40 hours with a 3% fee; quote with the project check and use retained-per-hour to check afterwards.
- Employee wages through the conversion in Table 2. Set a wage beside a freelance quote only after converting it into the floor needed to match it.
When the classes disagree, the author’s practice is to weigh collected fees first, advertised quotes second and employee wages third, because that is the order in which they record money that actually changed hands. Investigate a gap before acting on it: check units, employment status, which costs each figure includes, geography and project risk. A client who pays your floor today is evidence; a posting you never answered is a lead.
7. Write up the packet and date it
- For each class: the number of included records, the observation window, the scope, the exclusions and any differences you could not resolve.
- The budget figure each class was compared with ($87.72 listed floor, $75.00 retained per hour, or your own), and the result.
- The lowest and highest included record, labeled as the range of your records.
- The capture date of every record and the date you plan to refresh the packet.
Wage data is released once a year, and your costs drift in between. Consumer prices rose 3.4% over the 12 months ended August 2026 (BLS Consumer Price Index, not seasonally adjusted). The author’s practice is to rerun the packet each January, before any rate increase conversation, and whenever scope or costs change. When a comparison set is too small to show a pattern, write that in the packet and collect more records before quoting a range.
Sources
- U.S. Bureau of Labor Statistics — Occupational Employment and Wage Statistics, May 2025 national estimates, median hourly wage: public API series OEUN0000000000000 + SOC code without hyphen + 08 (Web Developers, 15-1254: OEUN000000000000015125408).
Open the calculator → · Rate floor tables · Freelance rate by skill · More guides