GASP
Core Retention Metrics Outcome

Gross Revenue Retention (GRR)

Gross Revenue Retention (GRR): The percentage of revenue retained from existing customers, excluding expansion revenue. Also known as Gross Dollar Retention.

Also known as: GRR

Formula

GRR = (Beginning MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100
GRR = Sum of min(Beginning MRR, Current MRR) per customer / Beginning MRR × 100

Computable definition

The canonical formula in the GASP formula grammar. The MCP server compiles it to SQL over the datasets listed below.

(metric.mrr at period_start - metric.contraction_mrr - metric.churned_mrr) / metric.mrr at period_start over cohort(field.customer_id, period_start)

Unit: percent (the formula yields an unscaled ratio)

Per customer variant
sum(min(field.mrr_end, field.mrr_start)) / sum(field.mrr_start) over cohort(field.customer_id, period_start)
Adjusted variant (see the adjusted variant)
(sum(field.mrr_start) + sum(field.mrr_change where field.event_type in ('contraction', 'churn') and field.change_nature = 'permanent')) / sum(field.mrr_start) over cohort(field.customer_id, period_start)

Breakdowns

  • by_segment: one row per segment value

Notes: Period is trailing 12 months. The main formula is core.md's formula method, the canonical one; variants.per_customer is the cohort method, which nets each customer's movements within the period and so reads equal to or higher than the main formula. Capped at 100% by construction. by_segment returns one row per customer segment, because retention differs most between SMB and enterprise; each snapshot and event counts in the segment it carries.

Data requirements

Grain: Customer cohort at period start · Frequency: Monthly · Aggregation: cohort (trailing 12 months) · Staged: yes, a cohort or prior-period comparison that a staged dataset makes cheaper · Main source: Billing.

Field Dataset Type
customer_id customer string
customer_id revenue_event string
customer_id subscription string
customer_status customer string
event_date revenue_event date
event_type revenue_event string
mrr subscription decimal
mrr_change revenue_event decimal
snapshot_date customer date
snapshot_date subscription date
subscription_status subscription string
Example SQL (Postgres)
SELECT (CAST(((((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'contraction' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) - ((-(SELECT COALESCE(SUM(mrr_change), 0) FROM revenue_event WHERE event_date >= :period_start AND event_date <= :period_end AND event_type = 'churn' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))))) AS DOUBLE PRECISION) / NULLIF(((SELECT COALESCE(SUM(mrr), 0) FROM subscription WHERE snapshot_date = :period_start AND subscription_status = 'active' AND customer_id IN (SELECT customer_id FROM customer WHERE snapshot_date = :period_start AND customer_status = 'active'))), 0)) AS grr

Access: recommended sensitivity tier confidential, access scope unscoped. Guidance your policy engine enforces.

From an agent: with the GASP MCP server, call lookup_metric({ "name": "Gross Revenue Retention (GRR)" }) or generate_query({ "metric": "Gross Revenue Retention (GRR)", "adapter": "<your adapter JSON>" }).

Benchmarks

  • Below 80%: Severe retention problem
  • 80-85%: Below average for most segments
  • 85-90%: Average for SMB-focused businesses (Median for bootstrapped SaaS: 92%)
  • 90-95%: Good, typical for mid-market
  • 95%+: Excellent, typical for enterprise (90th percentile: 98%)

What It Tells You

The baseline health of your customer relationships, independent of upsell. Investors examine GRR alongside NRR because strong expansion can mask high churn.

This metric has an adjusted form that leaves out temporary revenue movements. Tag CEL events with the change_nature field (permanent, temporary, scheduled_reversal) and filter to permanent to compute Adjusted GRR. That keeps permanent contraction, a risk signal, apart from expected reversals, which are neutral.

See the CEL change_nature spec

GRR measures revenue retained from existing customers and leaves expansion out. The Operating and Market forms of other metrics differ in which expansion classifications they count, so GRR has nothing to filter. One calculation serves internal planning and investor reporting.

Connected in the GASP relationship graph.

Upstream: what drives this

Downstream: what this drives

Try searching for:

↑↓navigate↵select