Documentation

Everything it measures, and why each number is the one worth having.

The rest of this site is deliberately short. This page is not. Figures below use the sample month kept in the repository’s fixtures - the same data the analytics test suite runs against - unless they are marked as an example.

01

The funnel

Five stages, and the one that loses you the most.

Every proposal carries a status and a timestamp for each milestone it reaches: submitted, viewed, messaged, interview, offer, hired. Storing the times as well as the status is what makes time-to-view and time-to-reply possible.

The weakest stage is ranked by how many conversions were lost there, not by how far below a target percentage it sits. Ranking proportionally always crowns whichever late stage happens to be at zero on a handful of samples - it would tell someone with 60 views, 6 replies and no interviews to work on interviewing, when the 54 proposals dying at reply are the actual problem.

Sent13
Opened-11 lost here2
Replied2
Interview-1 lost here1
Hired1
The biggest single loss is the one to fix first - not whichever percentage looks worst.
View rate
How many clients opened your proposal at all.
Reply rate
How many wrote back.
Hire rate
How many became contracts.
View to reply
Of the clients who read it, how many answered. This is the score for your cover letter, and the only stage the letter actually controls.
Reply to interview
Whether conversations survive first contact. Usually price or portfolio.
Median days to view
How long before you know a proposal landed, so you know when to stop waiting on one.

02

The connect ledger

Purchases, spend, boosts and refunds in one signed ledger.

You enter connects once, on the proposal form. Everything else is derived: a purchase is a positive entry, a proposal is a negative one, a boost is its own line, a refund reverses it. Balance, burn rate and weeks of runway all fall out of that.

Saving the same proposal twice cannot double-charge you - each proposal has at most one ledger entry of each type, enforced in the database rather than in application code.

Example
Bought 80 connectsPURCHASE+80
Proposal - Shopify migrationPROPOSAL-16
Boost on the same proposalBOOST-25
Proposal - Next.js dashboardPROPOSAL-11
Refund, job removedREFUND+16
Balance44
You type the connects once, on the proposal. Every other line here is derived, which is why saving the same proposal twice cannot double-charge you.
Net connects
Spent, minus everything Upwork refunded.
Balance
Derived from the ledger, not typed in.
Burn rate and runway
Connects per week, and how many weeks are left.
Ledger reconciliation
Your logged balance against the real Upwork balance, so a missed proposal shows up as a gap.

03

Boost cohorts

Boosted and unboosted proposals, scored on the same axes.

Boosting costs connects and Upwork will not tell you whether it worked. The boost page splits your proposals into the two cohorts and compares view rate, reply rate and hire rate directly.

Invites and direct offers are kept out of these rates entirely. They cost no connects and convert far better, so mixing them in would flatter every number on the page.

Example

23.8% opened

Boosted

21 sent · 5 opened · 0 hired

19.4% opened

Not boosted

72 sent · 14 opened · 3 hired

Four points more views, and every hire still came from the proposals that were not boosted. That is a week of connect spend answered.
Boosted vs unboosted
The same funnel, computed separately for each cohort.
Net boost cost
After the interview and auction refunds Upwork gives back.
Boost cost per hire
Whether the premium is buying anything at all.

04

Importing a spreadsheet

Three tabs, one at a time, in a specific order.

The importer detects which sheet you gave it from its headers. Import the job tracker first, then the boost tracker, then the connect purchases.

Boost rows enrich proposals the job tracker already created rather than creating their own, because the same boost usually appears in both tabs and counting it twice would inflate your connect total. Re-importing the same file is safe: proposals match on job URL, purchases on date and quantity.

Job tracker
Boost tracker
Connect purchases
One signed connect ledger
Order matters: job tracker, then boost tracker, then purchases. Boost rows enrich proposals that already exist rather than creating duplicates.

05

Unit economics

Connects priced the way you would price ad spend.

Connects are valued at what you actually paid for them, not at list price. That gives a real cost per view, cost per reply and cost per hire in dollars, and a ratio of lifetime gross profit to acquisition cost.

Above 3x is healthy. Below 1x means the connects cost more than the work returns. The spend planner is the one forward-looking screen: it projects what a given budget should buy at your current rates.

Spent on connects$174.00
Cost per hire$12.45
Return per $1$7.95
Above 3x is healthy, below 1x means the connects are costing more than the work returns.
Cost per view / reply / hire
What each outcome costs in dollars, priced from what you really paid for the connects.
Return per dollar
Earnings divided by connect spend.
LTGP:CAC
Lifetime gross profit against acquisition cost. Above 3x is healthy, below 1x loses money.
Spend planner
The one forward-looking screen: what a given budget should buy at your current rates.

06

Cover letters

Ranked by the one stage a letter actually controls.

Tag a proposal with the template you used and the comparison builds itself. Templates are ranked by view-to-reply rather than by hire rate, because that is the only step a letter is responsible for - everything before it is job selection, everything after it is price and portfolio.

The AI features are optional. Generation runs two passes - a draft, then a review against your budget and tone - grounded in your resume, profile and the letters that got you hired, and in the ones that got opened and ignored, so it avoids those.

It also quietly learns: what you like or dislike, what you edit before sending, and what you were hired after sending shape later drafts, with a hire weighted above an interview and an interview above a reply. There is no separate training step - it runs after you use the product, and everything it has learned is listed in Settings, editable or deletable at any time. Without an OpenAI API key those panels explain themselves and everything else works normally.

Per-template conversion
Ranked by view-to-reply, the stage a letter actually controls.
Draft, then review
A first pass grounded in your resume and winning letters, then a second pass checked against your stated budget and tone.
Learns quietly
Feedback, edits and outcomes shape future drafts - a hire counts for more than an interview, which counts for more than a reply.
Editable, not a black box
Everything it has learned is listed in Settings, where you can correct or delete it.

07

How proposals get in

Type them, import them, or connect Upwork's API.

Logging one by hand takes about twenty seconds: paste the job URL, tap the connects you spent, flag a boost. Everything else is optional and can be filled in later. This is the whole product - the other two routes are conveniences on top of it.

Connecting Upwork's own API syncs the job title, URL, description, bid, status, applied date and full cover letter. It cannot sync connects spent or boost connects, because Upwork does not report those per proposal - which is exactly why this app exists.

The browser extension covers that gap. It reads the proposal, connect-purchase and payment pages you open yourself and posts what it finds to your account: the connect cost of each application, the required skills, the client's rating, hire rate and total spend, and your available balance.

What the extension cannot do is act. It sends no requests to upwork.com, never signs in, never submits or withdraws a proposal, never opens a background tab, and never reads cookies, localStorage or credentials. It is declared for four page types and is not injected on the feed, search, messages, contracts or your profile. If you did not open a page, it was never read.

Be aware of the trade-off before you install it: Upwork's automation policy defines a prohibited bot to include a browser extension that collects data, and says an extension that reads their pages could trigger a warning, restriction or block. Reading is inside that definition, so a read-only extension reduces the exposure rather than removing it. Manual entry produces exactly the same numbers, and the CSV importer covers everything you sent before installing anything.

Whichever route the data arrives by, sync never overwrites what you typed. Connects, boost connects and funnel milestones are yours; a sync only fills them in while they are still untouched. A proposal you marked as an interview stays an interview even though Upwork only knows it was submitted.

By hand
Job URL, connects, boost flag. About twenty seconds, and the only route that is always available.
Upwork API
Titles, URLs, descriptions, bids, statuses, applied dates and full cover letters. No connect costs - Upwork does not expose them.
Browser extension
Connect cost per application, required skills, client rating, hire rate and total spend, available balance. Read-only, on pages you opened.
CSV import
Your whole back catalogue, including everything sent before you installed anything.

08

The AI assistant

Ask it, or tell it, and it drafts the change for you to confirm.

A chat panel in the dashboard, grounded in your own data rather than generic advice. It can answer questions - your funnel diagnosis, which proposals are still open, what is on your calendar - by reading your account, scoped to you the same way every other page is.

Tell it what happened in plain language - "log this proposal", "add a task to follow up Friday", "set up a call with the client" - and it prepares a proposal, task, meeting or note. It is never written until you confirm the specific card it shows you; dismissing the card discards the draft.

It is scoped to this product on purpose. It declines requests outside proposals, tasks, meetings, notes and your own numbers - it will not act as a general assistant, and it cannot reach anything an ordinary page in your account could not.

Ask about your numbers
Funnel diagnosis, open tasks, upcoming meetings, a specific proposal - answered from your real data.
Draft a proposal, task, meeting or note
Say what happened and it prepares the entry in the right fields.
Nothing saves itself
Every draft is a card you review and confirm, or dismiss, before anything is written.
Scoped to this product
It declines requests outside your proposals, tasks, meetings, notes and numbers.

09

What it stores

What you entered, imported, or captured from pages you opened.

ProposalIQ is not affiliated with Upwork. It never signs in as you, never submits anything, and never sends a request to upwork.com on your behalf.

If you connect the Upwork API, the tokens are encrypted at rest and decrypted only in memory for the duration of a call. Disconnecting deletes them and nothing else, so reconnecting later resumes rather than duplicating.

Get started

Start free. Basic is free, no card required.