Skip to main content
In B2B sales, speed is critical. The time it takes for a sales representative to first engage with a new lead can dramatically influence whether that deal is won or lost. Understanding this relationship helps optimize sales processes and resource allocation for maximum effectiveness. This guide provides a model to measure how time-to-first-touch impacts win rates. It answers the question: “How does our initial response time to a new lead affect our chances of winning the deal?”

The Result

The query below buckets leads by how quickly they received a first touch, and then calculates the win rate for each bucket. The results clearly show the optimal window for outreach.
time_to_first_touchwin_ratetotal_leads
Within 1 Hour15%500
1-24 Hours10%2000
1-3 Days6%1500
3-7 Days3%800
7+ Days or No Touch1%400
This data demonstrates a clear correlation: the faster the first touch, the higher the win rate. Leads contacted within the first hour are 5x more likely to convert than those contacted after 3 days, making a powerful case for prioritizing speed in the sales process. The optimal time for a first touch is unambiguously within the first hour.

The Queries

Here are the queries to calculate win rate based on time-to-first-touch. It works by measuring the time from lead assignment to the first sales activity (e.g., call or email), bucketing leads based on this duration, and calculating the win rate for each bucket.
WITH LeadAssignments AS (
    -- Find the first time each lead was assigned
    SELECT
        customer_id,
        ts AS assigned_ts
    FROM customer_stream
    WHERE activity = 'lead_assigned'
    QUALIFY ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY ts ASC) = 1
),
FirstTouch AS (
    -- Find the first sales touch after assignment
    SELECT
        la.customer_id,
        MIN(cs.ts) AS first_touch_ts
    FROM LeadAssignments la
    JOIN customer_stream cs ON la.customer_id = cs.customer_id
    WHERE
        cs.activity IN ('call', 'email')
        AND cs.ts >= la.assigned_ts
    GROUP BY 1
),
LeadResponseTime AS (
    -- Calculate time to first touch in hours
    SELECT
        la.customer_id,
        DATEDIFF('hour', la.assigned_ts, ft.first_touch_ts) AS time_to_first_touch_hours
    FROM LeadAssignments la
    LEFT JOIN FirstTouch ft ON la.customer_id = ft.customer_id
),
Conversions AS (
    -- Identify which customers converted
    SELECT DISTINCT customer_id
    FROM customer_stream
    WHERE activity = 'created_subscription'
),
BinnedLeads AS (
    SELECT
        lrt.customer_id,
        CASE
            WHEN lrt.time_to_first_touch_hours < 1 THEN 'Within 1 Hour'
            WHEN lrt.time_to_first_touch_hours < 24 THEN '1-24 Hours'
            WHEN lrt.time_to_first_touch_hours < 72 THEN '1-3 Days'
            WHEN lrt.time_to_first_touch_hours < 168 THEN '3-7 Days'
            ELSE '7+ Days or No Touch'
        END AS time_to_touch_bucket
    FROM LeadResponseTime lrt
)
SELECT
    bl.time_to_touch_bucket,
    COUNT(DISTINCT bl.customer_id) AS total_leads,
    COUNT(DISTINCT c.customer_id) AS total_wins,
    (COUNT(DISTINCT c.customer_id) * 1.0 / COUNT(DISTINCT bl.customer_id)) AS win_rate
FROM BinnedLeads bl
LEFT JOIN Conversions c ON bl.customer_id = c.customer_id
GROUP BY 1
ORDER BY
    CASE bl.time_to_touch_bucket
        WHEN 'Within 1 Hour' THEN 1
        WHEN '1-24 Hours' THEN 2
        WHEN '1-3 Days' THEN 3
        WHEN '3-7 Days' THEN 4
        ELSE 5
    END;