User Retention (Day N): Percentage of users who return on day N after signup.
Formula
Day N Retention = Users active on day N / Users who signed up N days ago × 100 Computable definition
The canonical formula in the GASP formula grammar. The MCP server compiles it to SQL over the datasets listed below.
all_time(count_distinct(field.user_id where field.product_event_type = 'qualifying' and in_period(field.signup_date) and (field.event_date - field.signup_date) = 30)) / count_distinct(field.user_id where in_period(field.signup_date)) Unit: percent (the formula yields an unscaled ratio)
Notes: Day 30 retention: users who signed up in the period and were active exactly 30 days after signup, over users who signed up in the period. The numerator reads all time because day 30 can fall after period_end. Change 30 for other N.
Data requirements
Grain: Monthly cohort · Frequency: Daily · Aggregation: cohort (month) · Staged: no · Main source: Product Analytics.
| Field | Dataset | Type |
|---|---|---|
event_date | product_event | date |
product_event_type | product_event | string |
signup_date | product_event | date |
signup_date | user | date |
snapshot_date | user | date |
user_id | product_event | string |
user_id | user | string |
Example SQL (Postgres)
SELECT (CAST((SELECT COUNT(DISTINCT user_id) FROM product_event WHERE ((product_event_type = 'qualifying' AND (signup_date >= :period_start AND signup_date <= :period_end)) AND (event_date - signup_date) = 30)) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT user_id) FROM user WHERE snapshot_date = :period_end AND (signup_date >= :period_start AND signup_date <= :period_end)), 0)) AS user_retention_day_n From an agent: with the GASP MCP server, call
lookup_metric({ "name": "User Retention (Day N)" }) or generate_query({ "metric": "User Retention (Day N)", "adapter": "<your adapter JSON>" }).
Benchmarks
- Below 20%: Poor
- 20-40%: Average
- Above 40%: Good