
Jul 22, 2026
Written by Gregory Shein, CEO & Founder
Upwork Time Tracking for Agencies: One Timesheet, No Double Entry
Upwork agencies run into a time-tracking problem that solo freelancers never see. A freelancer has one tracker (Upwork's) and one client set. An agency has eight people, six Upwork contracts, two direct clients, internal work — and Upwork's tracker only covers one slice of it. The default "solution" is two sets of books: Upwork's Work Diary for platform hours and a spreadsheet or second tracker for everything else. Then someone reconciles them monthly, badly.
This post lays out how to run agency time tracking so every hour — platform, direct, and internal — lands in one system, without giving up Upwork's payment protection or asking anyone to log time twice.
Why you can't just use Upwork's tracker
Upwork's desktop tracker is non-negotiable for hourly platform contracts: it logs time in 10-minute segments, captures Work Diary screenshots, and is the condition for Hourly Payment Protection. Manually logged hours can be disputed; tracker hours generally can't. So your team keeps using it. That part is settled.
The problem is everything the tracker can't see:
- Direct-client hours. Referrals, off-platform regulars, retainer clients — invisible to Upwork by definition.
- Fixed-price work. Upwork doesn't require tracking on milestones, so those hours vanish unless you capture them yourself — and without them you have no idea what a milestone actually cost.
- Non-billable time. Proposals, internal meetings, code review, management. This is the time that decides whether the agency is profitable, and no client-facing tracker records it.
- Cross-contract utilization. "Is Maria overloaded or does she have room for the next win?" requires all her hours in one place, not 60% of them.
So agencies bolt on a second system — and create the reconciliation tax.
The real cost of double bookkeeping
Put a number on it. A typical 8-person agency running two tracking systems:
- Ops lead exports Upwork Work Diary weekly and re-keys hours into the master sheet: 1.5 hrs/week
- Chasing people who forgot to log direct hours in system #2: 1 hr/week
- Monthly reconciliation of mismatches (tracker says 31.5, sheet says 29): 3 hrs/month
- Rebuilding utilization and margin views after every correction: 2 hrs/month
That's roughly 15 hours a month of pure administration. At a $45/hour internal cost, $675/month — over $8,000 a year — spent producing numbers that are stale by the time anyone reads them. And that's the good case, where the reconciliation actually happens. In most agencies it slips, and decisions get made on hours nobody trusts.
The subtler cost: your margin math inherits the errors. Per-contract profitability (the waterfall from how to calculate profit on Upwork agency contracts) is only as good as the hours feeding it. Mis-keyed hours quietly move contracts across the "profitable / not profitable" line.
The right architecture: track once, sync the rest
The fix is not a better spreadsheet. It's a one-directional data flow:
- Upwork hourly contracts → team keeps using the Upwork tracker (protection stays intact) → hours sync automatically into your system.
- Direct clients, fixed-price work, internal time → tracked natively in your system (desktop, web, or mobile).
- Reports, utilization, payroll, margins → computed from the one merged timesheet.
Nobody logs anything twice. Upwork remains the source of truth for platform billing; your system becomes the source of truth for running the business.
Corcava implements step 1 through its Upwork integration: connect the agency account via OAuth once, and it pulls contracts, team members, and time entries automatically — including up to 90 days of history on the first sync, so your reports aren't empty on day one. Each Upwork contract maps to a Corcava project with a pay rate and bill rate per person, hours flow in continuously in the background, and synced entries behave like normal time entries in every report. You can connect multiple Upwork organizations (agency, freelancer profiles, even client accounts) and see them side by side. That single connection is most of what makes the Upwork agency management setup work.
Worked example: what the merged timesheet unlocks
Take one developer, one week, in the merged system:
| Work | Source | Hours | Billable |
|---|---|---|---|
| Upwork contract A (e-commerce build) | Synced from Upwork | 18.0 | Yes — $55/hr bill |
| Upwork contract B (API maintenance) | Synced from Upwork | 6.5 | Yes — $60/hr bill |
| Direct client retainer | Corcava tracker | 8.0 | Yes — $65/hr bill |
| Internal: code review + standups | Corcava tracker | 4.5 | No |
| Total | 37.0 | 32.5 billable (88%) |
From this one table the agency can answer, without opening a second tool: this person's utilization is 88%; contract B has capacity to grow; the week generated 18×$55 + 6.5×$60 + 8×$65 = $1,900 in billings against this person's pay; and 4.5 non-billable hours is a normal overhead ratio. Multiply by eight people and you have the workload view that decides whether to accept the next contract — before you bid on it. (To sanity-check what utilization your rates require, run the project profitability calculator; to see what an Upwork rate nets after the 10% fee, the Upwork fee calculator.)
Setup checklist: one timesheet in an afternoon
Copy this and work down it:
UPWORK AGENCY TIME TRACKING SETUP
Connect & map (60–90 min)
[ ] Connect the Upwork agency account via OAuth (Settings → Integrations)
[ ] Review auto-matched users; map each Upwork freelancer to a team member
[ ] Map every active contract to a project (one project per contract)
[ ] Enter pay rate + bill rate per person per contract
[ ] Verify the 90-day historical import landed in the right projects
Cover the gaps (30 min)
[ ] Create projects for every direct client and retainer
[ ] Create an "Internal" project with non-billable tasks
(proposals, meetings, admin, management)
[ ] Add a task convention for fixed-price milestones so those
hours are captured even though Upwork doesn't require it
Team rollout (one announcement)
[ ] Rule 1: Upwork hourly work → keep using the Upwork tracker. Nothing changes.
[ ] Rule 2: everything else → Corcava tracker (desktop/web/mobile)
[ ] Rule 3: nobody re-enters Upwork hours anywhere, ever
Weekly hygiene (10 min/week)
[ ] Check the integration status page — every contract syncing?
[ ] Scan for team members with < expected hours (forgot to track?)
[ ] Refresh from Upwork after hiring or adding contracts
[ ] Review billable % per person; investigate anything under ~60%
Three policies that keep it clean
One project per contract. Resist merging "all Contract-A-client work" into one bucket if there are two contracts. Per-contract projects are what make per-contract margin possible, and renegotiation happens per contract.
Non-billable is mandatory, not optional. If proposal writing and management aren't tracked, utilization reads as artificially high and you'll overcommit the team. Bidding time in particular belongs in your platform bidding workflow records — it's the cost side of your win-rate math.
Synced hours are append-only in spirit. Corcava lets you edit synced entries like any other, but treat corrections as exceptions with a note. The moment people casually edit synced time, you've rebuilt the two-books problem inside one tool.
What this replaces
Agencies that make this switch typically retire: the Work Diary export ritual, the master timesheet spreadsheet, a standalone tracker subscription for direct work, and the monthly "whose numbers are right" meeting. What remains is one timesheet feeding utilization, payroll inputs, per-contract margin, and — for direct clients — invoices generated straight from approved hours.
Get the merged timesheet running this week
- Start a free 14-day Corcava trial — connect Upwork, map your contracts, and watch the last 90 days of hours appear. $9/user/month, all features, no credit card required.
- See the full agency operating model on the Upwork agency management page.