Upwork Agency Reporting: What to Review Weekly and Monthly

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:

  1. 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.
  2. Delivery engine — hours, utilization, workload. Reviewed weekly because staffing mistakes compound daily.
  3. 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%
Team3339684224%

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%
Total312$16,832−$1,383 −$10,460 −$945 $4,04424%

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