Metric

What is time to value, and how do you measure it?

Definition

Time to value is the elapsed time from the start of the relationship — contract start for sales-led, signup for self-serve — to the moment an account reaches a defined value milestone. Without an explicit milestone event the metric does not exist; "time to value" with a vague definition of value is a number people argue about rather than improve.

Formula: Time to value = median(milestone timestamp − start timestamp) across accounts that reached the milestone

What data do you need?

  • A single, written-down value milestone event (first dashboard shared, first integration live, tenth query run)
  • The milestone emitted as a timestamped event at account grain
  • Contract start dates for sales-led accounts, signup dates for self-serve
  • Onboarding stage history if you want a stage-by-stage breakdown
  • The cohort of accounts that never reached the milestone, tracked separately

SQL pattern

Median and p90 time to value by cohort (PostgreSQL)PostgreSQL
WITH first_milestone AS (
  SELECT
    account_id,
    MIN(occurred_at) AS reached_at
  FROM product_milestone_events
  WHERE milestone = 'first_dashboard_shared'
  GROUP BY account_id
)
SELECT
  date_trunc('month', a.contract_start_date)::date AS cohort_month,
  COUNT(*) AS accounts,
  COUNT(m.account_id) AS reached_milestone,
  ROUND(
    100.0 * COUNT(m.account_id) / NULLIF(COUNT(*), 0), 1
  ) AS reached_pct,
  -- Median, not mean: a few accounts that take a year would drag
  -- the average somewhere no real customer lives.
  ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (
    ORDER BY EXTRACT(epoch FROM m.reached_at - a.contract_start_date) / 86400
  )::numeric, 1) AS median_days_to_value,
  ROUND(PERCENTILE_CONT(0.9) WITHIN GROUP (
    ORDER BY EXTRACT(epoch FROM m.reached_at - a.contract_start_date) / 86400
  )::numeric, 1) AS p90_days_to_value
FROM cs_accounts a
LEFT JOIN first_milestone m USING (account_id)
WHERE a.contract_start_date >= CURRENT_DATE - INTERVAL '18 months'
GROUP BY 1
ORDER BY 1;

Common pitfalls

Reporting the mean time to value.→ Durations are right-skewed — a handful of accounts that take 300 days will pull the average past anything typical. Report the median, and p90 for the tail.
Excluding accounts that never reached the milestone.→ That is survivorship bias, and it makes TTV improve every time onboarding gets worse. Report the reached-milestone rate next to the duration.
Leaving the value milestone undefined or letting each team pick one.→ Pick one event, write it down, and version it. Changing the milestone changes the metric, so annotate the switch on the chart.
Starting the clock at the wrong moment.→ Contract signature, kickoff call, and first login are days or weeks apart. State which one starts the clock and apply it consistently across segments.

Where does this metric apply?

This metric commonly uses data from Gainsight, Vitally, Planhat, Amplitude, Segment, plus any warehouse models built on account, subscription, and product-usage tables at the same grain.

Dashboards

Integrations

Metrics

Analytics

FAQ

What makes a good value milestone?
An event that correlates with retention and that the customer would recognize as progress — a first report shared with their team, a first production integration, the first invoice reconciled. If reaching it does not predict renewal, it is an activity marker, not value.
Should self-serve and enterprise share one TTV metric?
No. The start events differ, the milestones differ, and the realistic ranges differ by an order of magnitude. Segment it, or the blended median moves whenever the mix moves.