How to Calculate Profit on Upwork Agency Contracts (Line-by-Line Math)

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:

  1. Gross billings — hours worked × bill rate (what the client is charged)
  2. Upwork service fee — a flat 10% off the top of everything the client pays
  3. Freelancer pay — hours × the pay rate you owe the person doing the work
  4. Management overhead — the non-billable hours you or a PM spend running the contract
  5. 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: