← All posts

Upwork ICP Targeting: Stop Bidding on Every Job

When an agency's Upwork pipeline is dead, the instinct is always the same: send more proposals. In my experience running lead generation systems for agencies, volume is almost never the real problem. Upwork ICP targeting is: which jobs you let into the funnel before anyone writes a word.

Here's a real example from an account I rebuilt recently. A conversion rate optimization consultant was bidding on every job matching obvious keywords: conversion, landing page, funnel, CRO. Sounds reasonable. When I simulated that keyword set against real job data, here's what the "CRO leads" actually were: roughly a third web design and development jobs, a big slice of funnel-builder gigs (GoHighLevel, ClickFunnels), and another chunk of SEO and pixel-setup work. Less than a third were jobs the consultant could actually win.

Every one of those misfires is a wasted connect, a wasted proposal, and a small hit to your visibility. Fixing targeting is the highest-ROI hour you can spend on Upwork. Here's how I do it.

What Upwork ICP targeting actually means

Ideal client profile work on Upwork is not the same exercise as it is in cold email. In email you pick the companies and go find them. On Upwork you cannot pick anyone. You can only decide which of the jobs already posted deserve a proposal, which means your ICP has to be expressed as a search: words that must appear, words that must not, and filters on the client behind the post.

So an Upwork ICP is three things at once. The buyer (who posted it, and have they ever actually paid anyone). The problem (is the job about the outcome you sell, or merely adjacent to it). The fit (can you win it against the specific crowd that applies to jobs phrased that way). A job can pass one of those and fail the other two, and every one of those near-misses looks like a lead right up until you have spent the connect.

What bad targeting costs, in dollars

The reason this is worth an afternoon is that misfires are not free. Upwork's own resources page states that "Each Connect costs $0.15", and jobs draw a variable number of Connects rather than a flat one, so the price of a proposal is set by the job you chose before your cover letter exists.

Do the arithmetic on your own feed rather than mine. Take last month's proposal count, take the share that went to jobs you now recognize as off-target, and price them at Upwork's published per-Connect figure. On most accounts I audit, the number that comes back is not the interesting part. The interesting part is that the same spend, aimed at jobs the account could actually win, was available the whole time.

That is the honest case for targeting. It is not that good targeting is cheaper. It is that bad targeting spends the identical budget on proposals that were never going to convert.

Aim for 200-300 well-matched jobs per month

That's the volume sweet spot I target across an agency's job searches. Enough flow to produce steady conversations, small enough that every job is genuinely in your wheelhouse. If your searches surface thousands of jobs monthly, your targeting is too loose, and your proposals are competing in categories you can't win.

Require payment verification, always

I covered this in the benchmarks post, but it belongs in every targeting checklist: in the Sales and Marketing data I analyzed, verified clients reply at roughly 36 times the rate of unverified ones. Since about 19 in 20 Sales & Marketing jobs come from verified clients anyway, this filter costs you almost no volume and removes the emptiest segment of the market. Non-negotiable.

Build searches around anchor pairs, not single keywords

Single keywords are how you end up in the web-design swamp. "Landing page" finds landing page design jobs. "Audit" finds accounting jobs.

What works is pairing an anchor term with a context term, so both must appear: "landing page" plus "conversion", "audit" plus "funnel". The job has to be about your outcome, not just mention your surface. Most of the junk disappears at this step, before you've excluded anything.

Exclusions: precise phrases only

This is the step where I see the most self-inflicted damage, and I learned its cost the hard way.

The tempting move is excluding broad words: "design", "website", "build", "Shopify". Don't. Those words appear in almost every legitimate job post too. A real CRO job for a Shopify store naturally says "Shopify". When I tested a broad exclusion list against real job data, it killed 95% of legitimate leads. The searches looked clean and produced almost nothing.

The fix: exclude precise multi-word phrases that only appear in jobs you'd never want. "Web developer", yes. "Landing page design", yes. "Amazon PPC", yes. Bare "Shopify" or "page", never. A carefully built list of precise phrases kept roughly half of all legitimate leads flowing while still removing the junk. Sloppy exclusions killed ten times more good leads than bad ones.

Watch for homonyms

My favorite example: a CRO scanner that kept surfacing pharmaceutical jobs. In pharma, CRO means Contract Research Organization. Every niche has one of these. The only way to find them is to read what your searches return, regularly, and prune.

Speed is part of targeting

A perfectly targeted proposal that arrives on page three of applicants underperforms a decent one that arrives in the first five. Clients read early proposals first, and many hire from them. This is the part that's hard to do manually: watching the feed 24/7 and getting a tailored proposal in within minutes of posting. It's exactly what I automate for clients, and it's why "Day 1 lead flow" keeps showing up in the results.

The checklist

Verified clients only. 200-300 matched jobs a month. Anchor-pair search logic. Phrase-level exclusions, never broad words. Prune homonyms monthly. Bid within minutes, not hours.

How to know your targeting is actually working

Run the check monthly, and read it in this order.

Look at what the searches returned, not at what they blocked. Open the last two weeks of matched jobs and mark each one win, maybe, or never. If "never" is more than a small minority, the search is too loose. If the total volume collapsed, the exclusions are too broad, which is the failure that hides best because a quiet feed looks like a clean one.

Then look at reply rate by search rather than for the account as a whole. An account average hides the useful signal. One search pulling its weight while three drag is a completely different problem from every search performing the same, and the fix is opposite in each case: prune in the first, rebuild the anchor pairs in the second.

Last, check that the jobs you lost were lost on price or scope, not on relevance. Losing a job you were right for is competition. Losing jobs because you were never the right fit is targeting, still.

When the problem is the channel, not the filter

One honest caveat on everything above. Targeting can only select from what gets posted. If your buyers do not hire on marketplaces, no search logic rescues that, and the tell is specific: you cannot fill a month with genuinely matched jobs no matter how you phrase the query. That is not a filter you can fix. It is a signal to go find those buyers where they are, which I compared channel by channel in Upwork vs cold email vs LinkedIn. If the answer turns out to be the inbox, cold email deliverability for agencies is the plumbing that decides whether the messages arrive.

There is also a version of this that is neither the filter nor the channel. The mix of what gets posted keeps shifting, and Upwork's published numbers show spend concentrating into fewer, larger clients, which is a good reason to raise the floors in the searches above, not widen them, when a month comes in thin. I worked through that read of the figures in is Upwork slowing down.

Targeting is the first lever, not the only one. Reply rate benchmarks covers what good looks like once the targeting is right, and boosted proposals covers why paid placement cannot rescue a bad job filter.

If you'd rather have this built for you, that's literally the job. You can check your current numbers against the benchmark data first, free and with no email required. Then book a call, tell me your niche, and I'll sketch the search logic live on the call.

New posts by email

One email per new post, written by me. No sequences, no pitch drip, unsubscribe anytime.

Want these numbers working for you?

I build automated Upwork lead generation systems for agencies: profile, targeting, bidding, all of it.

Book a call, then decide
Vlad Timinski
Vlad Timinski

Founder of Space Sales. I analyzed 926,019 real Upwork bids to find what actually wins work, and I build automated lead generation systems for agencies. The method is free to run on the benchmarks page.