Skip to main content
Understanding a prospect’s engagement level is key to forecasting sales. A simple but powerful metric is the number of distinct sessions a user has on your website before they request a demo. More sessions can indicate higher intent and a better-educated prospect, which often translates to higher conversion rates. This guide provides a model to analyze the impact of pre-demo session counts on win rates. It answers the question: “How does the number of sessions a user has before requesting a demo affect their likelihood of becoming a paying customer?”

The Result

The query below buckets accounts by the number of sessions they had before a demo and calculates the win rate for each bucket. This reveals the relationship between pre-demo engagement and sales efficiency.
sessions_bucketwin_rate
115%
235%
3-550%
5+60%
The data suggests a strong correlation between the number of pre-demo sessions and the probability of winning a deal. Prospects with 2 sessions are more than twice as likely to convert as those with only one. This insight can help teams focus their efforts on more engaged prospects.
Warning This use case requires session_id to be present in your customer_stream table. session_id is not a standard field and needs to be generated by the Aero Team.

The Queries

The query below joins marketing engagement data with sales data to calculate these metrics. It counts unique sessions that occur before a demo is requested for each account.
WITH DealOutcomes AS (
    -- Get deal outcomes for all customers who requested a demo
    SELECT
        customer,
        MIN(CASE WHEN activity = 'requested_demo' THEN ts END) as demo_ts,
        MIN(CASE WHEN activity = 'created_subscription' THEN ts END) as win_ts
    FROM customer_stream
    WHERE customer IS NOT NULL
    GROUP BY 1
    HAVING demo_ts IS NOT NULL
),
AccountSessions AS (
    -- Count the number of sessions for each account before a demo request
    SELECT
        do.customer,
        do.win_ts IS NOT NULL AS is_win,
        COALESCE(COUNT(DISTINCT CASE WHEN cs.ts < do.demo_ts THEN cs.session_id END), 0) AS num_sessions
    FROM DealOutcomes do
    LEFT JOIN customer_stream cs ON do.customer = cs.customer
    GROUP BY 1, 2
),
BinnedAccounts AS (
    -- Bucket accounts by the number of sessions
    SELECT
        *,
        CASE
            WHEN num_sessions = 1 THEN '1'
            WHEN num_sessions = 2 THEN '2'
            WHEN num_sessions BETWEEN 3 AND 5 THEN '3-5'
            WHEN num_sessions > 5 THEN '5+'
            ELSE '0'
        END AS sessions_bucket
    FROM AccountSessions
)
SELECT
    sessions_bucket,
    (COUNT(CASE WHEN is_win THEN 1 END) * 1.0 / COUNT(*)) AS win_rate,
    COUNT(*) as num_accounts
FROM BinnedAccounts
GROUP BY 1
ORDER BY 1;