Chart your export here
Drop a CSV here. xmetric reads every row in this browser and draws a first chart you can regroup or change the measure of. Nothing is uploaded.
No file loaded yet. You can also drop a CSV on this box.
How to export HubSpot deal stage duration columns
HubSpot automatically tracks timestamp and duration properties for every stage in your pipeline (available on Professional and Enterprise subscriptions as of October 2026): Date entered [stage ID], Date exited [stage ID], Latest time in [stage ID], and Cumulative time in [stage ID].
- In HubSpot, go to CRM > Deals and click Edit columns in the top right of the table.
- Search for
Cumulative time inand check every stage in your pipeline, plusDays to close,Create Date,Close Date,Deal Stage,Amount, andDeal Owner. - Click Export, choose CSV, and select Properties and associations in your view (the default option under Customize).
| HubSpot Export Column | Raw Export Format | How xmetric Uses It |
|---|---|---|
Record ID & Deal Name | String | Identifies individual stalled deals |
Deal Stage | String | Current active stage or closed status |
Deal Owner | String | Compares cycle velocity across reps |
Amount | Currency | Weights velocity by deal size tier (SMB vs. Mid-Market vs. Enterprise) |
Days to close | Integer / Float | Total elapsed days from Create Date to Close Date |
Cumulative time in [Stage Name] | Duration or Seconds | Total cumulative time spent in each stage, even if a deal moved backward and re-entered |
Date entered [Stage Name] | Timestamp | Calculates days sitting in the current open stage |
Three deal velocity formulas and SQL equivalents
1. Median vs. Average Days per Stage (Avoiding Outlier Skew)
One neglected deal that sat in "Proposal Sent" for 240 days before being closed-lost will distort your HubSpot average stage duration. Always compare MEDIAN days in stage between Closed Won deals and Closed Lost deals.
xmetric / Tableau formula (converting seconds/hours to days):
MEDIAN([Cumulative time in Proposal (Seconds)] / 86400.0)SQL equivalent:
SELECT
"Deal Stage" AS outcome_group,
COUNT(*) AS deals,
ROUND(MEDIAN("Cumulative time in Discovery" / 86400.0), 1) AS median_days_discovery,
ROUND(MEDIAN("Cumulative time in Demo" / 86400.0), 1) AS median_days_demo,
ROUND(MEDIAN("Cumulative time in Proposal" / 86400.0), 1) AS median_days_proposal,
ROUND(MEDIAN("Days to close"), 1) AS median_total_days_to_close
FROM hubspot_deals
WHERE "Deal Stage" IN ('Closed Won', 'Closed Lost')
GROUP BY 1;2. Stalled Open Deal Detector (FIXED LOD by Stage Benchmark)
Flag any currently open deal that has already spent more days in its current stage than 75% of historically Closed Won deals ever spent in that stage.
xmetric / Tableau formula ([Won Stage Benchmark Days]):
{ FIXED : PERCENTILE(IF [Deal Stage] = 'Closed Won' THEN [Days in Current Stage] END, 0.75) }xmetric / Tableau formula ([Stalled Risk Flag]):
IF [Deal Stage] != 'Closed Won'
AND [Deal Stage] != 'Closed Lost'
AND DATEDIFF('day', [Date entered Current Stage], TODAY()) > [Won Stage Benchmark Days]
THEN 'Stalled (>P75 Won Cycle)'
ELSE 'On Track'
END3. Sales Velocity Dollars per Day
Combine deal count, average deal value (Amount), win rate, and median sales cycle length into the classic RevOps velocity metric: how many dollars of new ARR each rep's pipeline produces per day.
xmetric / Tableau formula:
(COUNTD([Record ID]) * AVG([Amount]) * [Win Rate])
/ NULLIF(MEDIAN([Days to close]), 0)Limits of HubSpot's native stage time reports
- Skipped stages show as blank/null: If a rep creates a deal directly in "Proposal" and skips "Discovery" and "Demo", HubSpot leaves
Cumulative time in Discoveryblank (and while a deal is currently in a stage for the first time, itsCumulative time in [stage ID]value remains blank until the deal leaves the stage). Do not wrap skipped stages inZN()when computing median stage duration, or skipped deals will pull your median down toward zero. Keep nulls asNULLsoMEDIAN()only evaluates deals that actually completed that stage. - Formatting differences between CSV and XLSX exports: Depending on your HubSpot export settings,
Cumulative time in [Stage]may export asHH:mm:sstext strings or raw seconds/minutes. If you get text, convert it to seconds with a calculated field before taking the median.
Questions people ask
Why do Closed Lost deals sometimes show a shorter cycle time than Closed Won deals?
Only disqualifications in Stage 1 ("Discovery") close fast. By Stage 3 ("Proposal" or "Negotiation"), Closed Lost deals usually linger 2x to 3x longer than Closed Won deals because reps hesitate to close out dead opportunities. Grouping velocity by stage in xmetric makes this crossover visible immediately.
Can I filter velocity by deal size (SMB vs. Enterprise)?
Yes. Write a calculated tier (IF [Amount] < 15000 THEN 'SMB' ELSEIF [Amount] < 50000 THEN 'Mid-Market' ELSE 'Enterprise' END) in the formula playground, then drag the tier onto Columns in the xmetric app (/app/).
Is our HubSpot deal data kept private?
Yes. Files you drop are read in your browser and nothing is uploaded, unless you sign in and save a workbook online. The app also imports Excel (.xlsx) exports.
Drop your HubSpot deals.csv above for a first chart, then build the stage velocity view and stalled deals list in the xmetric app.