
Jul 26, 2026
Written by Gregory Shein, CEO & Founder
Upwork Bill Rate vs Pay Rate: How Agencies Set the Spread
Every Upwork agency runs on two numbers per person per contract: the bill rate (what the client is charged) and the pay rate (what the freelancer receives). The distance between them — the spread — funds everything else: the owner's time, sales, bench time, tools, and profit. Set it right and the agency compounds; set it by gut feel and you discover, months later, that your busiest contract pays you $4 an hour to manage it.
This post defines the two-rate model precisely, shows how Upwork's fee quietly shrinks the spread you think you have, and gives you margin bands and a worked example for setting rates deliberately.
The two-rate model, defined
- Bill rate — the hourly rate on the Upwork contract. The client sees it; Upwork charges the client this amount per tracked hour.
- Pay rate — what you've agreed to pay the freelancer for those same hours. The client never sees it; Upwork doesn't know it (for agency members you configure what the agency remits, but your real cost basis — sub-contractor invoices, salary allocation — lives in your books).
- Spread — bill rate minus pay rate. Not your margin. This is the single most common Upwork agency math error.
Why the spread is not the margin
Upwork's 10% freelancer service fee comes off the top of what the client pays — which means, if your freelancers are on fixed pay rates, the fee comes entirely out of your side of the spread.
Bill $60, pay $38:
Naive: $60 − $38 = $22/hr → "37% margin"
Real: $60 × 0.90 − $38 = $54 − $38 = $16/hr → 26.7% gross margin
The fee ate 27% of the spread ($6 of $22). The thinner the spread, the worse the effect: bill $45, pay $36, and $40.50 − $36 = $4.50 — the 10% fee consumed half of your $9 spread. General rule: the fee costs you (bill rate ÷ spread) × 10% of your spread. Thin-spread contracts are disproportionately fragile on Upwork.
And that's gross margin per delivery hour. Management time, bench time between contracts, sales cost, and FX still come out of it — the full ladder is in how to calculate profit on Upwork agency contracts.
Margin bands: what the spread should be
Work backwards from a target gross margin after the fee. The formula for the pay rate you can afford:
Max pay rate = Bill rate × 0.90 × (1 − target gross margin)
Practical bands that hold up across dev/design/marketing agencies:
| Band | Gross margin after fee | When it's acceptable |
|---|---|---|
| Danger | under 20% | Only knowingly: a strategic client, a bench-clearing stopgap, or a senior you're retaining. Time-box it. |
| Floor | 20–30% | Sustainable only with near-zero management overhead (long-running, autonomous contractor). |
| Target | 30–45% | The healthy default. Funds management, sales, and bench risk with room for profit. |
| Premium | 45%+ | Specialized niches, productized delivery, or rates the client accepts for accountability and speed. Don't apologize for it. |
Applying the formula at a $60 bill rate: 30% margin allows pay up to $60 × 0.9 × 0.70 = $37.80; 40% allows $32.40. Notice how narrow the workable window is — this is why "we'll just pay a bit more to close the hire" decisions, made twice, quietly move a contract from Target to Danger.
Worked example: a three-person contract
An agency staffs an Upwork contract billed at a single $58/hour rate with three people, and wants to know if the deal works. Fee-adjusted receipt: $58 × 0.9 = $52.20/hour.
| Person | Hours/mo | Pay rate | Fee-adj. margin/hr | Margin % | Band |
|---|---|---|---|---|---|
| Senior dev | 80 | $40 | $12.20 | 21% | Floor |
| Mid dev | 100 | $30 | $22.20 | 38% | Target |
| QA | 30 | $22 | $30.20 | 52% | Premium |
Monthly totals: gross $58 × 210 = $12,180; after fee $10,962; pay $40×80 + $30×100 + $22×30 = $6,860; gross profit $4,102 (33.7%) — a Target-band contract in aggregate, carried by the mid and QA seats while the senior seat barely clears the floor.
Three operator decisions fall out of this table:
- The senior seat is mispriced. If the client's work shifts senior-heavy (say 120 senior hours, 60 mid), blended margin drops under 27%. Either negotiate a tiered rate for senior work or cap senior hours in the SOW.
- The mix is the margin. Same bill rate, same people — profitability swings ±10 points purely on staffing mix. This is what a blended rate view is for: model your seat mix and see the weighted outcome before committing. The blended rate calculator does exactly this — enter each role's rate and hours and it returns the blended rate and margin.
- Single-rate contracts subsidize seniors with juniors. That's fine and normal — as long as you chose it, and monitor the mix monthly.
To stress-test the whole contract (fee, management hours, FX) rather than just the spread, run it through the Upwork fee calculator in agency mode.
Setting pay rates without winging it
The spread has two ends. On the pay side:
- Anchor to role bands, not individuals. Define pay bands per role/seniority (e.g., mid dev $28–34) and hire into them. Negotiating each pay rate against each bill rate ad hoc produces the incoherent spreads you'll find in next quarter's margin review.
- Raises must reprice the contract. A $3/hour raise on a $58 bill rate cuts margin by ~5 points. Pair pay raises with bill-rate increases at renewal, or accept the band change explicitly.
- Transparency policy: decide once. Whether freelancers know bill rates is a culture choice, but access shouldn't be accidental. Your systems should let contractors see their tasks and hours without exposing margins and other people's rates.
On the bill side: raise rates on new contracts first (your win rate will tell you when you've overshot — track it per rate point in your platform bidding workflow), and reprice existing contracts at natural boundaries: renewals, scope changes, new milestones.
Copyable spread-setting table
Fill this per role before your next bid — the middle columns force the fee into the math:
ROLE PAY RATE ÷0.9 BREAK-EVEN BILL TARGET-BAND BILL (÷0.9÷0.65)
Senior dev $______ $______ $______
Mid dev $______ $______ $______
Junior dev $______ $______ $______
Designer $______ $______ $______
QA $______ $______ $______
Rules:
- Never bid below break-even bill for the expected staffing mix
- Aggregate contract margin target: 30–45% after fee
- Recheck actual (not planned) margin monthly per contract
Example row: pay $32 → break-even bill $35.56 → target-band bill ≈ $54.70.
Keeping the two rates honest in production
Planned spreads and actual spreads diverge — seniors cover for juniors, scope drifts, someone gets a raise mid-contract. The only defense is recording both rates where the hours live. Corcava's Upwork integration stores a bill rate and a pay rate per person per contract (bill rate auto-filled from the Upwork contract), syncs the tracked hours against them, and reports realized margin per contract and per person — so the bands in this post become a monthly report instead of a bidding-day intention. Role-based permissions keep pay and margin data away from contractor accounts. That per-seat margin view is a core piece of the Upwork agency management stack, and the monthly review ritual around it is covered in the Upwork agency reporting guide.
Set your spreads on purpose
- Model your next contract's staffing mix with the blended rate calculator, then stress-test it after fees in the Upwork fee calculator.
- Start a free 14-day Corcava trial — sync your Upwork contracts, enter pay rates, and see the realized spread on every contract this month. $9/user/month, no credit card required.
- Full picture: the Upwork agency management page.