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 × 100GRR = 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 persegmentvalue
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.
Adjusted Variant
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.
Dual-Lens Note
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.
Related Metrics
Connected in the GASP relationship graph.
Upstream: what drives this
- Renewal Rate drives GRR (Customer Success)
- Churned MRR component of GRR (Core)
- Contraction MRR component of GRR (Core)
- MRR component of GRR (Core)
Downstream: what this drives
- GRR measures Customer (Entity)
- GRR measures Subscription (Entity)