GTM Playbooks
RevOpsIntermediateLast reviewed Run it in your LLM

Measure Win Rate by Lead Source, Not One Blended Number

The problem

Ops leaders report one blended win rate, which hides that outbound, inbound demo requests, partners, and events convert and close very differently, so budget and SDR time keep going to the channels that look fine on average instead of the ones that turn pipeline into revenue.

Copy, paste, run

Run it in your LLM

One prompt for Claude or ChatGPT that runs the whole analysis on your own closed opportunity export: it checks the source values, builds the per-source table next to the blended row, marks sources with too few deals, and writes a recommendation for each source with the numbers behind it. Type run the example after pasting it to test it on the fictional data built into the prompt.

Download .mdSKILL.mdExample CSV
# Win Rate by Lead Source

You are a revenue operations analyst reporting to the CRO and the CFO. Replace the single blended win rate with a per-source view of how closed opportunities from each lead source actually converted over the last four quarters, show which sources have too few deals to judge, and say where budget and SDR time should move, with every number traceable to the export.

## Rules

- Use only the data in this conversation. Do not invent win rates, benchmarks, industry averages, or deals. If an input is missing, ask for it, or use the fallback this prompt defines and label it as an assumption.
- Run the calculations in code (Python or your data analysis tool) if you can. If you cannot run code, say so at the top and show the working source by source.
- Show the formula next to every headline number.
- Every default in this prompt (20 closed deals, the four quarters) is a starting assumption the user can change, not a benchmark.
- Read only. Do not tell the user to change lead source values in the CRM as part of this run; list the records that need a source instead.
- Amounts are CRM opportunity amounts, which are bookings, not recognized revenue. Say so in the summary.
- Format: money to the nearest dollar, rates as percentages with one decimal, ratios with two decimals.

## Step 0. Inputs

If the user says "run the example", use the EXAMPLE DATA section at the end of this prompt, do not ask any questions, and label every output "Example data (fictional)".

Otherwise ask for everything below in one message, skipping anything the user already gave:

1. A CSV export of every opportunity closed won or closed lost in the period, one row per opportunity, with these columns (ask the user to map theirs):
   - opportunity_id, lead_source, stage (Closed Won or Closed Lost, or the user's names for them), amount, created_date, close_date
   Where to get it: in Salesforce, an Opportunities report filtered to Closed = true with the Lead Source field. In HubSpot, a deals report or export filtered to closed won and closed lost deal stages, with the lead source property your team uses (a custom deal property, or the original traffic source of the associated contact or company). Ask which field the user's team treats as the source of record if there is more than one.
2. The period: by default the last four full quarters before today.
3. Optional: the cost of each source over the same period (program spend plus the people time spent on it, such as SDR salaries for outbound or a partner manager for partner). Without it, skip the cost columns and say so.
4. Any change to the default minimum of 20 closed deals per source.

Then report a data check before any analysis: rows read, rows dropped and why (not closed won or lost, closed outside the period, no amount), deals with a blank lead source (grouped as "Unknown" and listed so someone can fix them), the source values found, and any values that look like the same source spelled differently. Ask the user to confirm a mapping for those before going on, unless they said "run the example".

## Step 1. Per-source table

For each lead source, and for all sources together (the blended row):

- Closed = won + lost deals closed in the period
- Win rate (count) = won / closed
- Win rate (dollars) = won amount / closed amount. This is also the pipeline-to-revenue yield: dollars won per dollar of the source's pipeline that reached a decision.
- Average won deal = won amount / won
- Median cycle = median days from created_date to close_date, won deals only
- Revenue per closed opportunity = won amount / closed. This is what one more opportunity from the source has been worth on average.
- If costs were given: bookings per $1 of cost = won amount / cost. The blended row uses total cost.
- Enough data = closed is 20 or more.

## Step 2. Recommendations

Apply these rules to sources with enough data, comparing each with the blended row:

- Shift more in: revenue per closed opportunity above blended AND bookings per $1 of cost above blended (or no cost given)
- Review before spending more: below blended on both
- Hold: above on one and below on the other
- Sources without enough data get "Too few deals to judge" and no recommendation. Say how many more closed deals they need.

For each recommendation write one line of reasoning that cites the numbers. Do not estimate what extra spend would produce: past conversion does not say how a source scales.

## Step 3. Output

Start with a five-line summary:

- Headline: "The blended win rate is {count rate} by count and {dollar rate} by dollars; by source it runs from {lowest} ({source}) to {highest} ({source}) among sources with enough data."
- The source with the most won dollars and the one with the highest revenue per closed opportunity.
- Sources with too few deals to judge.
- The biggest change the recommendations imply for budget or SDR time, stated as a direction, not a forecast.
- One line: "Amounts are CRM bookings for deals closed in {period}, not recognized revenue."

Then these tables:

1. Data check
2. Per-source table (source, closed, won, win rate count, win rate dollars, average won deal, median cycle days, revenue per closed opportunity, cost, bookings per $1, enough data), with the blended row last
3. Recommendations with the reason for each
4. Deals with no lead source, and suspected duplicate source values
5. Assumptions, each labeled as an assumption

If you can create files, offer the per-source table as a CSV download.

## EXAMPLE DATA (fictional, for testing this prompt)

Use this only when the user says "run the example". The company and deals are made up.

- Period: 2025-10-01 to 2026-09-30
- Cost per source over the period (example inputs): Inbound demo request $120,000, Outbound $240,000, Partner $60,000, Event $90,000
- Defaults: all as written above

```csv
opportunity_id,lead_source,stage,amount,created_date,close_date
W-001,Inbound demo request,Closed Won,15000,2025-09-06,2025-10-06
W-002,Inbound demo request,Closed Lost,30000,2025-08-27,2025-10-14
W-003,Inbound demo request,Closed Lost,30000,2025-09-18,2025-10-23
W-004,Inbound demo request,Closed Lost,30000,2025-09-10,2025-11-01
W-005,Inbound demo request,Closed Lost,30000,2025-10-03,2025-11-10
W-006,Inbound demo request,Closed Lost,30000,2025-08-16,2025-11-19
W-007,Inbound demo request,Closed Lost,30000,2025-09-22,2025-11-28
W-008,Inbound demo request,Closed Lost,30000,2025-08-09,2025-12-07
W-009,Inbound demo request,Closed Lost,30000,2025-09-24,2025-12-16
W-010,Inbound demo request,Closed Lost,30000,2025-10-30,2025-12-25
W-011,Inbound demo request,Closed Lost,30000,2025-11-23,2026-01-03
W-012,Inbound demo request,Closed Lost,30000,2025-09-24,2026-01-12
W-013,Inbound demo request,Closed Lost,30000,2025-10-23,2026-01-21
W-014,Inbound demo request,Closed Lost,30000,2025-11-16,2026-01-30
W-015,Inbound demo request,Closed Lost,20000,2025-12-31,2026-02-07
W-016,Inbound demo request,Closed Lost,20000,2025-11-13,2026-02-16
W-017,Inbound demo request,Closed Lost,20000,2025-12-20,2026-02-25
W-018,Inbound demo request,Closed Lost,20000,2025-11-06,2026-03-06
W-019,Inbound demo request,Closed Lost,20000,2025-12-22,2026-03-15
W-020,Inbound demo request,Closed Lost,20000,2026-01-27,2026-03-24
W-021,Inbound demo request,Closed Lost,20000,2026-02-20,2026-04-02
W-022,Inbound demo request,Closed Lost,20000,2025-12-22,2026-04-11
W-023,Inbound demo request,Closed Lost,20000,2026-01-20,2026-04-20
W-024,Inbound demo request,Closed Lost,20000,2026-02-13,2026-04-29
W-025,Inbound demo request,Closed Lost,20000,2026-03-07,2026-05-08
W-026,Inbound demo request,Closed Lost,20000,2026-03-30,2026-05-17
W-027,Inbound demo request,Closed Lost,20000,2026-04-21,2026-05-26
W-028,Inbound demo request,Closed Won,25000,2026-04-14,2026-06-03
W-029,Inbound demo request,Closed Won,25000,2026-04-23,2026-06-12
W-030,Inbound demo request,Closed Won,25000,2026-05-02,2026-06-21
W-031,Inbound demo request,Closed Won,25000,2026-05-11,2026-06-30
W-032,Inbound demo request,Closed Won,25000,2026-05-20,2026-07-09
W-033,Inbound demo request,Closed Won,25000,2026-05-29,2026-07-18
W-034,Inbound demo request,Closed Won,25000,2026-06-07,2026-07-27
W-035,Inbound demo request,Closed Won,15000,2026-07-06,2026-08-05
W-036,Inbound demo request,Closed Won,15000,2026-07-15,2026-08-14
W-037,Inbound demo request,Closed Won,15000,2026-07-24,2026-08-23
W-038,Inbound demo request,Closed Won,15000,2026-08-02,2026-09-01
W-039,Inbound demo request,Closed Won,15000,2026-08-11,2026-09-10
W-040,Inbound demo request,Closed Won,15000,2026-08-20,2026-09-19
W-041,Outbound,Closed Won,40000,2025-07-18,2025-10-06
W-042,Outbound,Closed Lost,50000,2025-08-16,2025-10-17
W-043,Outbound,Closed Lost,50000,2025-09-11,2025-10-29
W-044,Outbound,Closed Lost,50000,2025-10-06,2025-11-10
W-045,Outbound,Closed Lost,50000,2025-10-01,2025-11-22
W-046,Outbound,Closed Lost,50000,2025-10-27,2025-12-04
W-047,Outbound,Closed Lost,50000,2025-09-12,2025-12-16
W-048,Outbound,Closed Lost,50000,2025-10-22,2025-12-28
W-049,Outbound,Closed Lost,50000,2025-09-11,2026-01-09
W-050,Outbound,Closed Lost,50000,2025-10-30,2026-01-21
W-051,Outbound,Closed Lost,50000,2025-12-08,2026-02-02
W-052,Outbound,Closed Lost,50000,2026-01-03,2026-02-13
W-053,Outbound,Closed Lost,50000,2025-11-07,2026-02-25
W-054,Outbound,Closed Lost,30000,2026-01-30,2026-03-09
W-055,Outbound,Closed Lost,30000,2025-12-16,2026-03-21
W-056,Outbound,Closed Lost,30000,2026-01-25,2026-04-02
W-057,Outbound,Closed Lost,30000,2025-12-15,2026-04-14
W-058,Outbound,Closed Lost,30000,2026-02-02,2026-04-26
W-059,Outbound,Closed Lost,30000,2026-03-13,2026-05-08
W-060,Outbound,Closed Lost,30000,2026-04-09,2026-05-20
W-061,Outbound,Closed Lost,30000,2026-02-11,2026-06-01
W-062,Outbound,Closed Lost,30000,2026-03-14,2026-06-12
W-063,Outbound,Closed Lost,30000,2026-04-10,2026-06-24
W-064,Outbound,Closed Lost,30000,2026-05-05,2026-07-06
W-065,Outbound,Closed Lost,30000,2026-05-31,2026-07-18
W-066,Outbound,Closed Won,50000,2026-04-21,2026-07-30
W-067,Outbound,Closed Won,50000,2026-05-03,2026-08-11
W-068,Outbound,Closed Won,50000,2026-05-15,2026-08-23
W-069,Outbound,Closed Won,40000,2026-06-16,2026-09-04
W-070,Outbound,Closed Won,40000,2026-06-28,2026-09-16
W-071,Partner,Closed Won,35000,2025-08-07,2025-10-06
W-072,Partner,Closed Lost,30000,2025-09-14,2025-10-22
W-073,Partner,Closed Lost,30000,2025-08-04,2025-11-07
W-074,Partner,Closed Lost,30000,2025-09-17,2025-11-23
W-075,Partner,Closed Lost,30000,2025-08-11,2025-12-09
W-076,Partner,Closed Lost,30000,2025-10-04,2025-12-26
W-077,Partner,Closed Lost,30000,2025-11-16,2026-01-11
W-078,Partner,Closed Lost,30000,2025-12-17,2026-01-27
W-079,Partner,Closed Lost,30000,2025-10-25,2026-02-12
W-080,Partner,Closed Lost,30000,2025-12-01,2026-03-01
W-081,Partner,Closed Lost,30000,2026-01-01,2026-03-17
W-082,Partner,Closed Lost,30000,2026-01-30,2026-04-02
W-083,Partner,Closed Won,46000,2026-02-07,2026-04-18
W-084,Partner,Closed Won,46000,2026-02-23,2026-05-04
W-085,Partner,Closed Won,46000,2026-03-12,2026-05-21
W-086,Partner,Closed Won,46000,2026-03-28,2026-06-06
W-087,Partner,Closed Won,46000,2026-04-13,2026-06-22
W-088,Partner,Closed Won,35000,2026-05-09,2026-07-08
W-089,Partner,Closed Won,35000,2026-05-26,2026-07-25
W-090,Partner,Closed Won,35000,2026-06-11,2026-08-10
W-091,Partner,Closed Won,35000,2026-06-27,2026-08-26
W-092,Partner,Closed Won,35000,2026-07-13,2026-09-11
W-093,Event,Closed Won,25000,2025-08-22,2025-10-06
W-094,Event,Closed Lost,25000,2025-09-27,2025-11-04
W-095,Event,Closed Lost,25000,2025-08-31,2025-12-04
W-096,Event,Closed Lost,25000,2025-10-28,2026-01-03
W-097,Event,Closed Lost,25000,2025-10-05,2026-02-02
W-098,Event,Closed Lost,25000,2025-12-10,2026-03-03
W-099,Event,Closed Lost,25000,2026-02-05,2026-04-02
W-100,Event,Closed Lost,25000,2026-03-22,2026-05-02
W-101,Event,Closed Lost,25000,2026-02-11,2026-06-01
W-102,Event,Closed Lost,25000,2026-04-01,2026-06-30
W-103,Event,Closed Won,25000,2026-06-15,2026-07-30
W-104,Event,Closed Won,25000,2026-07-15,2026-08-29
W-105,Outbound,Closed Lost,40000,2025-06-02,2025-09-12
W-106,Inbound demo request,Closed Won,18000,2025-08-04,2025-09-26
```

How to run it

  1. Open Claude or ChatGPT with code execution on (Claude's analysis tool, ChatGPT data analysis). Without it the model does arithmetic by hand, and you should check every number.
  2. Paste the prompt. To test it first, send "run the example" and compare with the expected results below.
  3. Attach a CSV of every opportunity closed won or closed lost in the last four quarters with lead source, amount, created date, and close date (a Salesforce Opportunities report or a HubSpot deals export). Add the cost of each source over the same period if you have it. The prompt lists the columns.
  4. Read the data check first and confirm how messy source values map, then take the per-source table and recommendations to the quarterly budget review.

Before you paste CRM data

Pasting an export sends it to the LLM vendor. Check your company's AI and data policy, prefer a business or enterprise plan, and drop account names and contacts: the prompt only needs deal IDs, lead sources, stages, amounts, and dates. It reads the export and changes nothing in your CRM.

Expected results on the example data

A correct run of "run the example" should match these, give or take rounding. They are computed from the prompt's definitions by a reference implementation that is tested against hand-worked numbers. The data is fictional.

Blended win rate
34 of 104 = 32.7% by count; $1,065,000 / $3,230,000 = 33.0% by dollars
Range by source (enough data)
20.0% (Outbound) to 50.0% (Partner) by count
Blended revenue per closed opportunity
$1,065,000 / 104 = $10,240
Blended bookings per $1 of cost
$1,065,000 / $510,000 = 2.09
Too few deals to judge (under 20 closed)
Event, 12 closed, needs 8 more
Rows excluded
2, closed before the period: W-105, W-106
Expected per-source table
SourceRecommendationClosedWin rate (count)Win rate ($)Avg won dealMedian cycle (days)Revenue per oppBookings per $1
PartnerShift more in2250.0%57.1%$40,00060$20,0007.33
Inbound demo requestHold4035.0%30.1%$20,00040$7,0002.33
OutboundReview before spending more3020.0%22.0%$45,00090$9,0001.13
EventToo few deals to judge1225.0%25.0%$25,00045$6,2500.83
All sources (blended)10432.7%33.0%$31,32455$10,2402.09

Outbound has the largest average won deal and the lowest win rate. By dollars per closed opportunity and per $1 of cost it still trails the blended row, so the rules say review it before adding spend. Event has a 25.0% win rate on only 12 deals, where one deal moves the rate by 8.3 points, so it gets no recommendation yet.

The calculator takes one dollar-weighted win rate. Run it with a single source's rate to see how much pipeline that source would need to cover the gap on its own history. Open the Pipeline coverage calculator.

Implementation steps

  1. 1

    Agree on one lead source field before you count anything: in Salesforce, the Lead Source field on the opportunity; in HubSpot, a custom deal property if your team keeps one, or the original traffic source of the associated contact or company; map its values to a short list (for example Outbound, Inbound demo request, Partner, Event) and group blanks as Unknown so they stay visible

  2. 2

    Export every opportunity closed won or closed lost in the last four full quarters, filtered by close date: opportunity ID, lead source, stage, amount, created date, and close date; open deals stay out because they have no result yet

  3. 3

    Compute per source and for all sources together: win rate by count = won / closed, win rate by dollars = won amount / closed amount, average won deal = won amount / won, and median days from created to close for won deals

  4. 4

    Compute what each source turns into revenue: pipeline-to-revenue yield = won amount / closed amount (the dollar win rate, read as dollars won per dollar of pipeline that reached a decision), and revenue per closed opportunity = won amount / closed deals, what one more opportunity from the source has been worth

  5. 5

    Flag sources with too few closed deals to trust: under 20 closed (an assumption you can change) gets no recommendation, with the number of deals still needed; with 12 closed deals, one deal moves the win rate by 8.3 points

  6. 6

    Add the cost of each source over the same four quarters if you have it, including people time (SDR salaries for outbound, a partner manager for partner) as well as program spend, and compute bookings per $1 of cost = won amount / cost

  7. 7

    Recommend by written rules against the blended row: shift more in if revenue per closed opportunity and bookings per $1 are both above blended, review before spending more if both are below, hold otherwise; run it with the copy-paste prompt on this page in Claude or ChatGPT, or with formulas in the template

  8. 8

    Repeat each quarter on the same definitions: keep each quarter's table, track the share of deals with an Unknown source as a data quality number, and bring the table to the budget review next to the blended rate it replaces, along with the CAC payback by channel table, which turns the same sources and costs into cost per new customer and months to earn it back

Template outline

The structure to recreate in your own workspace. Field names and thresholds are starting points.

Google Sheet: Win rate by lead source FYxx Qx (RevOps prepares it; finance reviews the cost tab)

Tab closed_deals (CRM export, closed won and closed lost, last 4 full quarters by close date):
  opportunity_id, lead_source, stage, amount, created_date, close_date
  source_mapped = lookup in source_map, "Unknown" if blank
  won = stage is Closed Won; cycle_days = close_date - created_date

Tab source_map: raw_value, source (one row per spelling found in the export)

Tab costs (finance, same period): source, program_spend, people_cost, cost = program_spend + people_cost

Tab by_source (one row per source plus a blended row):
  closed = COUNTIFS(source_mapped, source)
  won = COUNTIFS(source_mapped, source, won, TRUE)
  win_rate_count = won / closed
  win_rate_dollars = SUMIFS(amount, source_mapped, source, won, TRUE) / SUMIFS(amount, source_mapped, source)
  avg_won_deal = won_amount / won
  median_cycle_won = MEDIAN(FILTER(cycle_days, source_mapped = source, won))
  revenue_per_opp = won_amount / closed
  bookings_per_cost = won_amount / cost
  enough = closed >= 20
  recommendation = IF(NOT(enough), "Too few deals to judge",
    IF(AND(revenue_per_opp > blended, bookings_per_cost > blended), "Shift more in",
    IF(AND(revenue_per_opp < blended, bookings_per_cost < blended), "Review before spending more", "Hold")))

Worked example (example data, fictional; costs are example inputs, not benchmarks):
  Period 2025-10-01 to 2026-09-30, 104 closed deals
  Source                Closed  Won  Count   Dollars  Avg won   Median days  Per opp   Per $1 cost
  Partner                 22     11  50.0%   57.1%    $40,000       60      $20,000   7.33 ($60,000)
  Inbound demo request    40     14  35.0%   30.1%    $20,000       40       $7,000   2.33 ($120,000)
  Outbound                30      6  20.0%   22.0%    $45,000       90       $9,000   1.13 ($240,000)
  Event                   12      3  25.0%   25.0%    $25,000       45       $6,250   0.83 ($90,000)
  Blended                104     34  32.7%   33.0%    $31,324       55      $10,240   2.09 ($510,000)
  Checks: 11 + 14 + 6 + 3 = 34 won; $440,000 + $280,000 + $270,000 + $75,000 = $1,065,000 won
    of $770,000 + $930,000 + $1,230,000 + $300,000 = $3,230,000 closed
  Partner: shift more in. Inbound: hold (below on per opp, above per $1). Outbound: review before spending more.
  Event: too few deals to judge, needs 8 more closed deals

Tab history: quarter, source, closed, win_rate_count, win_rate_dollars, revenue_per_opp, unknown_share

Cost, time saved, and break-even

Tool cost here is your share of an LLM plan, which depends on your vendor, so it is an input. Every number below is an example input; replace each with your own figure.

Inputs (all assumptions)

Replace each value with your own figure.

  • THours per quarter to build the per-source table in spreadsheets by hand (export, clean source values, pivots, cycle math, write-up)8AssumptionTime the next quarterly channel review from export to finished table.
  • VHours per quarter with the prompt or the template (export, check the mapping, review)1.5AssumptionTime the first quarterly run.
  • RLoaded hourly cost of the RevOps or FP&A analyst$75AssumptionSalary plus benefits, divided by working hours.
  • KMonthly tool cost for the LLM plan$20AssumptionYour share of the Claude or ChatGPT plan, from current vendor pricing and your invoices; HubSpot or Salesforce and Google Sheets are usually already paid for.

Formulas

Time saved per quarterT - V
8 - 1.5 = 6.5 hours
Time saved per week(T - V) / 13
6.5 / 13 = 0.5 hours, the time-saved estimate on this page
Value of time saved per quarter(T - V) x R
6.5 x $75 = $487.50
Tool cost per quarter3 x K
3 x $20 = $60
Break-even hours per quarter3 x K / R
$60 / $75 = 0.8 hours, so the run covers its tool cost once it saves about 48 minutes a quarter
Revenue per closed opportunity (example data)won amount / closed deals
Partner $440,000 / 22 = $20,000; blended $1,065,000 / 104 = $10,240.38
  • Amounts are CRM opportunity amounts, which are bookings, not recognized revenue. For ARR or recognized revenue by source, join the deals to billing before you compare sources.
  • Use full cost per source for the same period. Leaving SDR salaries out of outbound, or partner manager time out of partner, makes those sources look cheaper than they are.
  • Past conversion does not say how a source scales. The math counts analyst time only; do not add a return on shifted budget without your own results from the next quarters.
  • Rerun the math after the first quarter with your real run time V.

Common questions

Why is a blended win rate misleading?
It averages sources that convert very differently. In the example data the blended win rate is 32.7%, while Partner wins 50.0% of closed deals and Outbound 20.0%. A change in source mix also moves the blended rate when no source got better or worse, so it cannot tell you where to put budget.
What is the difference between count and dollar-weighted win rate?
Count win rate = won deals / closed deals. Dollar win rate = won amount / closed amount. They differ when won and lost deals are different sizes: in the example, Inbound demo requests win 35.0% by count but 30.1% by dollars, because the deals they lose are larger than the ones they win.
How many closed deals does a source need before I trust its win rate?
This playbook uses 20 closed deals as a starting assumption you can change. Below that, a single deal moves the rate a lot: with 12 closed deals, one deal is 8.3 points. Sources under the minimum are reported but get no recommendation until they have more closed deals.
What is pipeline-to-revenue yield?
Dollars won per dollar of a source's pipeline that reached a decision: won amount / closed amount, the same number as the dollar win rate. The playbook pairs it with revenue per closed opportunity (won amount / closed deals), which in the example is $20,000 for Partner against $10,240.38 blended.
Which lead source field should I use?
One field your team agrees is the source of record: in Salesforce, the Lead Source field on the opportunity; in HubSpot, a custom deal property or the original traffic source of the associated contact or company. Map its values to a short list, group blanks as Unknown, and track the Unknown share each quarter.

Keep going

View all RevOps

Need help implementing a playbook?

Our team builds custom Clay workflows and AI automations for revenue teams.

Get it built for you