
Jul 20, 2026
Written by Gregory Shein, CEO & Founder
How to Calculate Profit on Upwork Agency Contracts (Line-by-Line Math)
Ask an Upwork agency owner what a contract earns and you'll usually get the bill rate. Ask what it keeps and the answer gets vague. The gap between those two numbers — service fee, freelancer pay, management time, withdrawal and FX losses — is where agencies quietly lose money for months before anyone notices.
This post walks the full calculation, line by line, on a realistic contract. At the end you get a profit waterfall you can copy into a spreadsheet and rerun monthly, plus the shortcuts for doing it automatically.
The five lines between bill rate and profit
Every hourly Upwork agency contract has the same cost structure. Write it as a waterfall:
- Gross billings — hours worked × bill rate (what the client is charged)
- Upwork service fee — a flat 10% off the top of everything the client pays
- Freelancer pay — hours × the pay rate you owe the person doing the work
- Management overhead — the non-billable hours you or a PM spend running the contract
- Withdrawal and FX losses — what disappears between your Upwork balance and your bank account
Most agencies stop at line 3 and call the result "margin." Lines 4 and 5 are why contracts that look like 25% margin on paper land closer to 15% in the bank.
Line 1: Gross billings
Straightforward: tracked hours × contracted bill rate. Two traps here. First, only hours tracked through Upwork's tracker are protected — manually logged time can be disputed. Second, if the client adds a bonus or reimburses an expense, that amount is also fee-bearing. Upwork takes its cut of the gross invoice, not just the hourly portion.
Line 2: The 10% service fee
Upwork's freelancer service fee is a flat 10% on agency earnings. There is no volume discount ladder anymore — 10% on the first dollar and the millionth. The mental shortcut: whatever the client pays, you receive 90% into your Upwork balance.
That means the real question when bidding is never "is $60/hour a good rate?" — it's "is $54/hour, after fee, enough to pay the freelancer and leave a margin?" Run any rate through the Upwork fee calculator in agency mode before you send the proposal; it does this whole waterfall interactively.
Line 3: Freelancer pay
The two-rate model: you charge the client a bill rate and pay your freelancer a pay rate. The spread is your gross margin — before the fee eats into it. Critically, the 10% fee comes out of your side, not the freelancer's, if you pay a fixed rate. Bill $60, pay $38: you don't keep $22. You keep $60 × 0.9 − $38 = $16.
Line 4: Management overhead
The invisible line. Someone answers the client's messages, reviews the work, sits on weekly calls, chases the freelancer about the deadline. On a well-run contract that's 1–3 hours a week; on a messy one it's 5+. Price that time at what it costs you (owner or PM hourly cost), and charge it to the contract.
If you skip this line, small contracts look profitable when they aren't. A 10-hour-a-week contract carrying 3 hours of management is spending 30% of its size on coordination.
Line 5: Withdrawal and FX
Getting money out of Upwork costs something: a per-withdrawal fee depending on method, and — if your bank account isn't in USD — a currency conversion spread that typically runs 1–3% worse than the mid-market rate depending on route. Agencies billing $20k/month and converting to EUR or local currency can lose $300–600/month on this line alone. Small percentage, real money.
Worked example: one contract, one month
A mid-sized dev contract, one senior developer on it, four weeks:
- Bill rate: $60/hour, 130 hours tracked
- Freelancer pay rate: $38/hour
- Management: PM spends 2 hrs/week at a $45/hour internal cost
- Withdrawal + FX loss: 1.5% of net receipts
| Line | Calculation | Amount |
|---|---|---|
| Gross billings | 130 × $60 | $7,800 |
| Upwork service fee (10%) | −10% × $7,800 | −$780 |
| Net from Upwork | $7,020 | |
| Freelancer pay | 130 × $38 | −$4,940 |
| Management overhead | 8 × $45 | −$360 |
| FX + withdrawal (1.5%) | −1.5% × $7,020 | −$105 |
| Net profit | $1,615 | |
| Net margin | $1,615 ÷ $7,800 | 20.7% |
Notice the shrinkage. The naive spread ($60 − $38 = $22/hour, a "37% margin") became 20.7% once the fee, management, and FX lines were charged. That's a normal, healthy contract. The dangerous ones are where the spread is thin to begin with: bill $45, pay $34, and the same structure produces $40.50 − $34 = $6.50/hour before overhead — roughly an 8% net margin, one sick day away from zero.
The copyable monthly waterfall
Paste this into a spreadsheet, one column per contract, and fill it monthly:
CONTRACT PROFIT WATERFALL — [contract name] — [month]
Hours tracked ______
× Bill rate ______
= Gross billings ______
− Upwork service fee (10%) ______
= Net from Upwork ______
− Freelancer pay (hrs × pay rate) ______
− Management hours × internal cost ______
− FX / withdrawal (× ~1.5%) ______
= NET PROFIT ______
÷ Gross billings = NET MARGIN ______%
Flags:
[ ] Net margin below 15% → renegotiate at renewal
[ ] Management > 15% of gross → fix the process, not the rate
[ ] Margin fell 2 months straight → investigate scope creep
Run every active contract through it and rank by net margin. In most agencies the spread between best and worst contract is 25+ points, and nobody knew before the exercise.
Fixed-price contracts: same waterfall, different line 1
On fixed-price work, line 1 is the milestone value instead of hours × rate, and the fee math is identical — 10% off the top. The difference is that your hours are now the risk variable: every extra hour dilutes the effective rate. Track time internally even when Upwork doesn't require it, then divide net profit by actual hours to get your realized hourly rate. If you price fixed work regularly, the project profitability calculator models cost, hours, and margin scenarios before you commit to a number.
Doing this without a monthly spreadsheet ritual
The waterfall is simple; the pain is data collection. Hours live in Upwork, pay rates in a spreadsheet, management time in nobody's head, and reconciling it across six contracts takes half a day — which is why most agencies do it quarterly or never.
The fix is structural: get bill rate, pay rate, and tracked hours into one system per contract. Corcava's Upwork integration syncs contracts, team members, and time entries automatically (including up to 90 days of history on first connect), and stores a bill rate and pay rate per person per contract — so margin per contract becomes a report you open, not a project you schedule. Management time goes in as non-billable tracked hours on the same project, which fills line 4 for free.
That's the operating model behind our Upwork agency management stack: every contract — platform or direct — is a project with hours, two rates, and a live margin. For the broader discipline of margin-first agency operations, the profitable agency guide covers rate setting, utilization, and pricing beyond the Upwork case. And if some of your revenue is off-platform, the same math applies minus the 10% line — see how to invoice clients on Upwork for the on/off-platform billing split.
Common mistakes to avoid
- Quoting the spread as the margin. $60 bill / $38 pay is not "37% margin." The fee comes out of your side.
- Ignoring bonuses and expenses. Fee applies to the gross invoice, including reimbursements. Price them up 11% (÷0.9) or eat the difference.
- Averaging across contracts. A 30% contract and a 5% contract average to a comfortable-looking 17.5% while one of them is bleeding. Always compute per contract.
- Free management. Owner time is the most expensive labor in the agency. Charge it to the contract that consumes it.
- Checking annually. Rates drift, scope creeps, freelancers get raises. Monthly waterfall or you find out at tax time.
Run the numbers on your own contracts
Start with the calculator, then make it automatic:
- Model any contract in 30 seconds with the Upwork fee calculator — agency mode takes bill rate, freelancer cost, management hours, and FX in one screen.
- Start a free 14-day Corcava trial, connect Upwork, set pay and bill rates per contract, and get the waterfall as a live report — $9/user/month, no credit card required.
- See how the full stack fits together on the Upwork agency management page.
