Live · Bench Open Issue 218 · 2026-04-30 · 15:42 UTC Coverage: 144 public SaaS · 28 private rounds tracked research@yourbusiness.com
SNOWNDR128%+2.1pp| DDOGRoF53.4+4.8| MDBEV/NTM9.4x−0.6| CRWDARR YoY28%+1.4| NETMagic0.94flat| ZSFCF Mgn26.1%+3.2| SNOWNDR128%+2.1pp| DDOGRoF53.4+4.8| MDBEV/NTM9.4x−0.6| CRWDARR YoY28%+1.4| ZSFCF Mgn26.1%+3.2
Methodology · v3.4

Every metric, defined in code.

If a number we publish is not reproducible from the formulae on this page, we don't publish it. The bench is rebuilt every Monday at 06:00 UTC from filed-quarter data. Errata are logged in place. Sample-size minimums apply to every cohort statistic.

Metric definitions

01 · Rule of 40

Trailing-four-quarter growth + FCF margin

The headline efficiency band. We compute it on a TTM basis to smooth quarterly noise. Constant-cohort.

Names crossing 40 are flagged green; names below 30 with declining ARR are flagged caution.

● Refreshed weekly Mon 06:00 UTC
01# rule_of_forty.py
02
03def rule_of_40(arr_yoy, fcf_mgn):
04    # trailing four quarters
05    return arr_yoy + fcf_mgn
06
07# thresholds
08HEALTHY = 40
09CAUTION = 30
01# magic_number.py
02# sales-efficiency: net new ARR / S&M (lagged 1q)
03
04def magic_number(arr_q, arr_q_prior, sm_q_prior):
05    net_new = (arr_q - arr_q_prior) * 4
06    return net_new / sm_q_prior
07
08HEALTHY = 0.75
09CAUTION = 0.50
02 · Magic Number

Sales-efficiency, lagged one quarter

Implied sales efficiency: every dollar of S&M spend in the prior quarter generated n dollars of net-new ARR this quarter. Annualised by multiplying net-new ARR by four.

We lag S&M by one quarter to attribute spend to the cycle that produced the booking.

● Healthy ≥ 0.75 · Caution ≤ 0.50
03 · NDR / Net Dollar Retention

Cohort retention, including expansion & downsell

Net dollar retention compares ARR from a fixed cohort one year ago against ARR from the same cohort today, after expansion, contraction, and churn.

We rebuild NDR on a single standard (the SaaSO standard, see RPT-215) when issuer disclosure deviates from it.

● Healthy ≥ 110% · Best-in-class ≥ 120%
01# ndr.py
02# SaaSO standard, includes expansion + downsell
03
04def ndr(arr_t, arr_t_minus_1, cohort_filter):
05    cohort_t = arr_t.filter(cohort_filter)
06    cohort_p = arr_t_minus_1.filter(cohort_filter)
07    return cohort_t.sum() / cohort_p.sum()
08
09BEST_IN_CLASS = 1.20
10HEALTHY = 1.10
01# ev_ntm_revenue.py
02# forward 4q revenue, consensus, debt-adjusted
03
04def ev_ntm_rev(mkt_cap, debt, cash, ntm_rev):
05    ev = mkt_cap + debt - cash
06    return ev / ntm_rev
07
08# source: consensus, refreshed Mon 06:00 UTC
04 · EV / NTM Revenue

Forward revenue multiple, debt-adjusted

Enterprise value (market cap + debt − cash) divided by the next-twelve-months consensus revenue. We use a single consensus source for comparability across the bench.

Compared against ARR YoY and Rule of 40 in the comp tables to surface valuation dispersion.

● Refreshed weekly Mon 06:00 UTC
05 · ARR Triangulation (Private)

Round-price + multiple-implied ARR

For private names we triangulate ARR from disclosed round metrics, public-comp multiple ranges, and operator-source check-ins. Confidence band published with every estimate.

We do not publish private-bench numbers without two independent corroborations.

● Confidence band: ±15% typical
01# private_arr_triangulation.py
02
03def triangulate_arr(round_post_money, sector_mult, ops_check):
04    implied = round_post_money / sector_mult
05    return weighted_avg(implied, ops_check, w=[0.6, 0.4])
06
07# requires 2+ independent corroborations
Sample-Size Floor

Cohort statistics require n ≥ 30.

We do not publish a cohort statistic if the cohort sample size falls below thirty. Below that floor we publish individual names but withhold the aggregate. Current cohort coverage:

CohortCoverage nFloorStatusRefresh
All Public SaaS14430● n ≥ floorMon 06:00 UTC
Enterprise SaaS ($1B+ ARR)6230● n ≥ floorMon 06:00 UTC
Vertical SaaS3430● n ≥ floorMon 06:00 UTC
DevTools1830⚠ below floornames only
SecOps2230⚠ below floornames only
Data Infra1430⚠ below floornames only
Private Rounds2830⚠ below floortracked, not aggregated
Refresh Schedule

Predictable cadence. Errata applied in place.

Bench Refresh
Mon 06:00 UTC

Full bench rebuild from filed-quarter data and consensus. New filings ingested overnight Sunday.

Weekly Note
Mon 09:00 UTC

The weekly research note is published to subscribers at 09:00 UTC, three hours after the bench refresh.

Mid-Week Deep Dive
Thu 14:00 UTC

A second, longer-form piece — typically a vertical or thematic deep-dive — published Thursday afternoon.

Quarterly Scorecards
Q-end + 14d

Earnings-season scorecards land within fourteen days of the quarterly print, with full cohort grading.