Jul 24, 2026
Written by Gregory Shein, CEO & Founder
Upwork Agency Reporting: What to Review Weekly and Monthly
Upwork gives an agency owner plenty of numbers — earnings, hours, Connects spent — and almost none of the ones that run a business. There's no per-contract margin (Upwork doesn't know your pay rates), no win rate by job type, no utilization, and nothing at all about your direct clients. So most agencies report by vibe: the month "felt busy," a contract "seems fine."
This guide is the antidote: a concrete reporting cadence — what to look at weekly, what to look at monthly, the exact table structures, and the thresholds that should trigger action rather than a shrug.
The principle: three report families, two cadences
An Upwork agency has exactly three engines, and each needs its own report:
- Sales engine — proposals out, interviews, wins. Leading indicators; reviewed weekly because a bad bidding week shows up as a revenue hole 4–8 weeks later.
- Delivery engine — hours, utilization, workload. Reviewed weekly because staffing mistakes compound daily.
- Money engine — margin per contract, fee drag, mix. Reviewed monthly because margins move slowly but fatally.
Weekly reports should take 15 minutes to read and be built from data that collects itself. If a report requires an export-and-reconcile ritual, it will stop happening by week six — the case for wiring hours and bids into one system first (see Upwork time tracking for agencies).
The weekly report
Section 1: Bidding activity per rep
If you run multiple people submitting proposals, this table is non-negotiable:
| Rep | Proposals sent | Connects spent | Replies | Interviews | Wins | Reply rate |
|---|---|---|---|---|---|---|
| Dana | 14 | 168 | 4 | 2 | 1 | 29% |
| Igor | 11 | 132 | 1 | 0 | 0 | 9% |
| Priya | 8 | 96 | 3 | 2 | 1 | 38% |
| Team | 33 | 396 | 8 | 4 | 2 | 24% |
Two things jump out immediately in a table like this: Igor's 9% reply rate (proposal quality or job selection problem — review his last five proposals) and Priya's efficiency (fewer bids, best conversion — find out what she's filtering for and make it the team rule). Neither insight exists if you only track team totals.
Getting this data requires logging every bid as a record — job link, Connects cost, status, outcome — which is exactly what a platform bidding workflow gives you. Bids logged as outreach records roll up into this table automatically instead of living in browser tabs.
Section 2: Win rate and cost per win
Weekly, keep it coarse: wins ÷ proposals, and Connects cost per win. In the table above: 2 wins from 33 proposals (6% — normal range for cold bidding is roughly 5–15%), and 396 Connects ≈ $60–70 for two contracts. Cheap acquisition — if the contracts are priced right, which is the monthly report's job.
Section 3: Delivery snapshot
One line per person: hours tracked (Upwork-synced + direct), billable %, and anything anomalous. You're scanning for two failure modes — someone under ~60% billable (bench time or untracked work) and someone over ~95% (no slack; the next win has nowhere to land).
The monthly report
Section 1: Per-contract margin table
The core of the whole system. One row per contract, Upwork and direct together:
| Contract | Channel | Hours | Gross | Fee (10%) | Freelancer pay | Mgmt cost | Net profit | Margin |
|---|---|---|---|---|---|---|---|---|
| E-comm build | Upwork | 128 | $7,040 | −$704 | −$4,224 | −$270 | $1,842 | 26% |
| API retainer | Upwork | 60 | $3,600 | −$360 | −$2,100 | −$180 | $960 | 27% |
| Legacy PHP | Upwork | 84 | $3,192 | −$319 | −$2,436 | −$360 | $77 | 2% |
| Direct retainer | Direct | 40 | $3,000 | — | −$1,700 | −$135 | $1,165 | 39% |
| Total | 312 | $16,832 | −$1,383 | −$10,460 | −$945 | $4,044 | 24% |
The blended 24% looks respectable — and hides a contract earning 2%. That legacy PHP row is the entire reason to build this report: billed at $38/hr with a $29/hr senior on it plus heavy management, it's working capital tied up for nothing. Action: renegotiate at renewal or exit. (Full line-by-line math for each row is in how to calculate profit on Upwork agency contracts; to model a renegotiated rate before proposing it, use the Upwork fee calculator agency mode.)
Threshold rules worth adopting: below 15% margin → renewal conversation; below 8% → exit plan; management cost above 15% of gross → process problem, not pricing problem.
Section 2: Revenue mix and fee drag
Three numbers: Upwork revenue, direct revenue, and total Upwork fees paid. The fee line reframes decisions — an agency billing $14k/month on-platform pays about $1,400/month, roughly $17k/year, in service fees. That's not an argument to leave Upwork (it's your lead flow); it is the budget line that justifies investing in direct-channel outreach and tells you what a direct client is "worth" in fee savings alone.
Section 3: Pipeline health
Month-level bidding rollup: proposals, win rate trend (this month vs trailing 3-month average), average size of won contracts, and win rate by job category. The category cut is where agencies find their niche empirically — if "Shopify migrations" wins at 22% and "generic full-stack" at 4%, your positioning question has answered itself.
Section 4: Utilization
Billable hours ÷ available hours, per person and team. Pair it with the margin table: high utilization with low margin means you're busy losing money — a pricing problem; low utilization with high margin means a sales problem. The distinction decides where next month's effort goes. (Deeper margin levers are covered in the profitable agency guide.)
Copyable report skeleton
=== WEEKLY — [week of] === (15 min, Monday)
BIDDING (per rep): proposals / Connects / replies / interviews / wins
→ flag: reply rate <10%, zero follow-ups sent
WINS: count, est. monthly value, cost per win (Connects $)
DELIVERY (per person): hours, billable %,
→ flag: <60% or >95% billable
BLOCKERS: contracts at risk, clients gone quiet
=== MONTHLY — [month] === (60 min, first Monday)
MARGIN TABLE (per contract): hours / gross / fee / pay / mgmt / net / %
→ flag: <15% renegotiate, <8% exit, mgmt >15% of gross
MIX: Upwork $ vs direct $, total fees paid YTD
PIPELINE: win rate vs 3-mo avg, avg contract size, win rate by category
UTILIZATION: per person + team, vs 75–85% target
DECISIONS MADE: (a report that produces no decisions is decoration)
Making the report cost nothing to produce
Every section above fails in practice for the same reason: the data lives in four places. Hours in Upwork, bids in a spreadsheet, pay rates in your head, direct-client invoices in a billing app. The report takes half a day, so it becomes quarterly, then never.
The structural fix is the one-system setup: Corcava's Upwork integration syncs contracts, people, and hours with bill and pay rates attached, bids live as outreach records with outcomes, direct clients run through the same projects and tracker — and the weekly and monthly views above are standing reports rather than assembly work. That's the reporting layer of the Upwork agency management stack.
Start with one month of real numbers
- Start a free 14-day Corcava trial — connect Upwork, import 90 days of hours, add pay rates, and the margin table exists by the end of the afternoon. $9/user/month, no credit card required.
- See how bidding, delivery, and reporting connect on the Upwork agency management page.