← Guides

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.

Assumptions and limits. The rate floors and project checks on this page use the calculator’s formula with the example inputs printed beside them; change the inputs and those results change with them. The wage figures are national medians for employees, and “income” means income before personal taxes.

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.

Table 1. The three evidence_class values in the worksheet, and the budget number each one is compared with.
evidence_classWhat it recordsWhere it comes fromCompare it with
employee_wagePay for employees in an occupation, per hour or per yearGovernment wage surveys such as BLS Occupational Employment and Wage StatisticsThe freelance floor needed to match that pay (Table 2)
advertised_quoteA price someone posted or offered for defined workJob postings, published price lists and written quotes you receivedYour listed hourly floor, or your project check for a fixed fee
collected_feeMoney you received for finished work, after refunds and payment feesYour own invoices and payment records, or anonymized records a peer gave you permission to useYour 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.

Table 2. Employee median wage and the freelance floor needed to match it. Wages: U.S. Bureau of Labor Statistics, Occupational Employment and Wage Statistics, May 2025 national estimates, median hourly wage, retrieved September 23, 2026. Income goal: wage × 2,080. Both floors: $5,000 business costs, 25 billable hours a week, 4 weeks with no billing, rounded up to the cent. Defaults: $0 benefits, 100% collected, 0% fees. Full budget: $10,000 benefits, 95% collected, 10% fee on collections.
Occupation (SOC code)Median hourly wageFloor, calculator defaultsFloor, full budgetAdded by the full budgetFull-budget floor ÷ wage
Software Developers (15-1252)$65.38$117.50$147.17$29.672.25×
Management Analysts (13-1111)$48.97$89.05$113.90$24.852.33×
Web Developers (15-1254)$44.54$81.37$104.92$23.552.36×
Market Research Analysts and Marketing Specialists (13-1161)$37.87$69.81$91.40$21.592.41×
Editors (27-3041)$37.46$69.10$90.57$21.472.42×
Writers and Authors (27-3043)$36.98$68.27$89.59$21.322.42×
Film and Video Editors (27-4032)$36.26$67.02$88.13$21.112.43×
Graphic Designers (27-1024)$30.27$56.64$75.99$19.352.51×
Bookkeeping, Accounting, and Auditing Clerks (43-3031)$24.36$46.40$64.01$17.612.63×
Photographers (27-4021)$21.47$41.39$58.15$16.762.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.

Table 3. Example values — replace with your own. The first two columns are the two example rows in the download; the collected_fee column shows how a payment record reads. Columns not listed are blank, except occupation_title (Web Developers) and currency (USD), which both example rows fill; in the download, the employee_wage row's limitations cell also names the BLS series the wage came from.
Worksheet fieldemployee_wageadvertised_quotecollected_fee
scope_definitionWeb Developers, United States, all industriesFive-page small-business website, as described in the client emailAn earlier five-page small-business website you delivered, same scope
source_urlhttps://www.bls.gov/oes/Leave blankLeave blank
private_evidence_referenceLeave blankClient email of 2026-09-18Invoice INV-2026-031 in your own ledger
observation_date2026-09-232026-09-182026-09-23
reference_period / payment_dateMay 2025 (reference_period)Leave blank2026-08-29 (payment_date)
occupation_code15-125415-125415-1254
geographyUnited StatesUS remoteUS remote
employment_statusEmployeeIndependent contractorIndependent contractor
price_unitHourFixed project feeFixed project fee
Amount columnwage_cell: $44.54quoted_amount: $2,500.00invoiced_amount and gross_collected: $3,200.00
refunds / fees_amountLeave blankLeave blank$0.00 refunds; $96.00 fees (fee_basis: 3% of collected)
total_project_hoursLeave blankLeave blank40, documented in your time log
inclusion_decisionIncludedIncludedIncluded
limitationsNational median hourly wage for employees, before the conversion to a freelance floorRelayed by the client; hours, revision rounds, accessibility checks and handoff not statedYour own project; one record
comparison_notesExample row: floor to match this wage at 25 billable hours with the calculator defaults: $81.37 an hourExample 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.

Table 4. Worked budget scenario. Inputs are example values.
LineCalculationResult
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 weekEntered25
Weeks with no billing each yearEntered4
Invoices eventually collected (%)Entered95%
Fees on collected payments (%)Entered10%
Annual billable hours25 × (52 − 4)1,200
Budget to retain$75,000 + $5,000 + $10,000$90,000.00
Share of each billed dollar you keep0.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

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

  1. For each class: the number of included records, the observation window, the scope, the exclusions and any differences you could not resolve.
  2. The budget figure each class was compared with ($87.72 listed floor, $75.00 retained per hour, or your own), and the result.
  3. The lowest and highest included record, labeled as the range of your records.
  4. 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

Open the calculator → · Rate floor tables · Freelance rate by skill · More guides