Upwork proposal samples that open with a diagnosis, not a greeting.
Six full Upwork message and cover letter samples — SEO, web development, copywriting, design, data and virtual assistant work. Each one names the problem behind the job post before pitching a fix. Copy any of them, swap the [square brackets] for the client's real details, and send.
Free plan includes 5 generations a month. No card required.
Samples by niche
Read the job post, then the opening line. That gap is the whole difference between a proposal that gets a reply and one that gets skimmed.
SEO
Upwork proposal sample for seo gigs
The job post: "Need an SEO expert. Traffic dropped after our site redesign in March."
The diagnosis: A post-redesign drop is almost always lost URLs and internal links, not lost content.
Hi [Client Name],
A traffic drop that starts the month of a redesign is rarely a content problem — it's usually URLs. When templates change, old paths get retired without redirects and internal links to your best pages disappear, so Google slowly demotes the pages that used to earn your traffic.
Here's how I'd handle it:
1. Crawl the current site and diff it against your pre-March URL list to find every page that 404s, redirects in a chain, or lost its internal links.
2. Rebuild the redirect map and restore links to your top [number] revenue pages, then request re-indexing for those first.
3. Fix whatever the redesign changed in titles, headings and rendering, and give you a weekly recovery chart so you can see the trend, not guess at it.
If it helps, I can send you a short list of the specific URLs that broke before you decide anything. No obligation.
— [Your Name]
Web development
Upwork proposal sample for web development gigs
The job post: "Shopify store needs a developer. Cart abandonment is high and the site feels slow."
The diagnosis: "Slow" on a Shopify store usually means third-party scripts, not theme code.
Hi [Client Name],
High cart abandonment paired with a site that "feels slow" usually points at the apps, not the theme. Every review widget, popup and tracking pixel adds blocking JavaScript, and on mobile that delay lands right where shoppers decide whether to keep going.
My plan:
1. Audit the store on a real mobile connection and rank every script by how much it costs you in load time.
2. Remove or defer what isn't earning its place, and move the rest behind interaction so the checkout path loads first.
3. Rebuild the cart and checkout steps to hold form state, then measure abandonment for two weeks against your current baseline.
Want me to run that script audit on [store URL] first so you can see the numbers before committing? Happy to send it over either way.
— [Your Name]
Copywriting
Upwork proposal sample for copywriting gigs
The job post: "Looking for a copywriter to rewrite our homepage. We get traffic but no signups."
The diagnosis: Traffic without signups is a clarity problem, not a persuasion problem.
Hi [Client Name],
Traffic without signups usually isn't a persuasion problem — it's a clarity problem. Visitors land, can't tell in five seconds who the product is for or what changes after they sign up, and leave without ever reaching your call to action. More adjectives won't fix that.
How I'd approach the rewrite:
1. Read your support tickets, reviews and sales notes to pull the exact words customers use for the problem they hired you to solve.
2. Rewrite above the fold so the first line names that problem and the second names the outcome, in their language.
3. Restructure the rest of the page around the three objections that stop people from signing up, and give you a second headline variant to test.
I can send you a rewritten hero section for [Company Name] before we talk terms, so you can judge the voice on real copy.
— [Your Name]
Design
Upwork proposal sample for design gigs
The job post: "Need a UI designer for our SaaS dashboard. Users say it's confusing."
The diagnosis: "Confusing" dashboards usually show everything equally, so nothing reads as important.
Hi [Client Name],
When users call a dashboard confusing, it's usually because every metric is presented with equal weight. Nothing tells them what to look at first, so each visit starts with a decision they didn't want to make. A visual refresh alone tends to leave that intact.
Here's the sequence I'd follow:
1. Map the three questions your users actually open the dashboard to answer, using session recordings or a handful of short calls.
2. Redesign the default view around those three answers, with everything else one click deeper.
3. Deliver a component set in [Figma] so your engineers ship consistent screens without asking me for specs.
Happy to send a redesigned version of your main screen first so you can react to something concrete, [Client Name].
— [Your Name]
Data & analytics
Upwork proposal sample for data & analytics gigs
The job post: "Need help with our reporting. Numbers in our dashboard don't match Stripe."
The diagnosis: Mismatched revenue numbers are a definition problem before they're a pipeline problem.
Hi [Client Name],
When dashboard revenue doesn't match Stripe, the pipeline usually isn't broken — the definitions are. Refunds, disputes, proration and failed retries each get counted differently in each system, so both numbers are "right" and neither is trustworthy for decisions.
What I'd do:
1. Reconcile one month line by line against Stripe to find exactly where the two totals diverge and by how much.
2. Write down a single definition of recognised revenue, refunds and churn, then rebuild the queries to match it.
3. Add a daily automated check that flags any drift over [threshold] so this can't silently return.
I can reconcile last month for you as a first step and show you the gap before we scope the rest.
— [Your Name]
Virtual assistant
Upwork proposal sample for virtual assistant gigs
The job post: "Need a VA for inbox and scheduling. I'm drowning in admin."
The diagnosis: Drowning in admin is usually a triage problem, not a volume problem.
Hi [Client Name],
Most founders who feel buried in admin don't have a volume problem — they have a triage problem. Everything arrives in one inbox at the same priority, so a scheduling request interrupts the same attention that client work needs. Adding hands without adding rules just moves the pile.
How I'd start:
1. Spend the first week sorting your last [number] days of email into what only you can answer, what I can answer, and what needs no answer.
2. Build the routing and templates for the middle group, then run your inbox to zero daily and hold your calendar to your stated focus blocks.
3. Send a Friday summary of what I handled and what's waiting on you, so nothing needs chasing.
Want me to do the first sort on a sample of [number] emails so you can see how I'd triage before committing to hours?
— [Your Name]
The structure every sample above follows
Line one names the problem behind the request, using the client's own numbers where they gave them
Line two shows you've seen this failure mode before, without a portfolio dump
Middle gives three ordered steps and what changes after each one
Close offers one small, specific, free next step that's easy to say yes to
Plain text with punctuation and [square bracket] placeholders — nothing to clean up