Skip to content

Commit 7c76378

Browse files
yosriadyclaude
andcommitted
docs: align lifecycle definitions, consolidate to single source, drop em dashes
- Rewrite the canonical User Lifecycle rules in wallet-profiles.mdx to match the hardcoded defaults: New = first seen within 30d; Returning = first seen >30d ago, active recently, <5 active days, no 30+ day gap; Power User = >30d ago and 5+ of last 30 days; Resurrected = re-engaged after a 30+ day gap; Churned = last seen >30d ago. Stages computed against a reference date. - Consolidate the duplicated definitions in overview, metrics, catalog, dau-tracking, and retention down to short summaries that link back to the single authoritative section. - Remove all em dashes across the docs (.mdx and api/openapi.json). - Add CLAUDE.md with writing-style and single-source-of-truth guidance. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent f1b2382 commit 7c76378

12 files changed

Lines changed: 92 additions & 90 deletions

File tree

CLAUDE.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# CLAUDE.md
2+
3+
Guidance for AI agents working in this repository (the Formo docs site, built with Mintlify).
4+
5+
## Writing style
6+
7+
- **Never use em dashes (``).** Rewrite the sentence instead: use a colon for a term/definition, a semicolon or period to split clauses, parentheses for an aside, or a comma. This applies to all content: `.mdx` pages, the OpenAPI spec (`api/openapi.json`), summaries, and titles.
8+
- En dashes (``) are also discouraged; use "to" for ranges (e.g. "5 to 10").
9+
- The arrow character `` is fine where it represents a flow or a UI path (e.g. "Settings → Lifecycle", "page → connect → swap").
10+
11+
## Single source of truth
12+
13+
Define each concept once and link to it elsewhere rather than restating the details (which drift out of sync).
14+
15+
- **User lifecycle stages** (New, Returning, Power User, Resurrected, Churned): the authoritative definition with exact rules and thresholds lives in `features/wallet-intelligence/wallet-profiles.mdx` (`#user-lifecycle`). Other pages should give a brief, contextual mention and link to it. The SQL-oriented restatement in `data/catalog.mdx` is the one allowed exception, since it serves query writers in-context.
16+
17+
## API reference
18+
19+
`api/openapi.json` is the source spec that generates the API reference pages. Keep it valid JSON; descriptions render as published docs, so apply the writing-style rules above to them too.

api/openapi.json

Lines changed: 31 additions & 31 deletions
Large diffs are not rendered by default.

cli/analytics.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
title: "Analytics"
33
sidebarTitle: "Analytics"
44
icon: chart-mixed
5-
description: "Run Formo's pre-built analytics pipes KPIs, funnels, retention, revenue, and top-N breakdowns directly from the terminal, without writing SQL."
5+
description: "Run Formo's pre-built analytics pipes (KPIs, funnels, retention, revenue, and top-N breakdowns) directly from the terminal, without writing SQL."
66
---
77

8-
The `formo analytics` command exposes Formo's pre-built analytics pipes the same data that powers the Formo dashboard as terminal commands. Each pipe is a subcommand: `formo analytics <pipe>`.
8+
The `formo analytics` command exposes Formo's pre-built analytics pipes (the same data that powers the Formo dashboard) as terminal commands. Each pipe is a subcommand: `formo analytics <pipe>`.
99

1010
<Note>
1111
Requires `query:read` scope on your API key.
@@ -45,7 +45,7 @@ Requires `query:read` scope on your API key.
4545
| `--params` | `string` || JSON object of pipe-specific params merged into the query |
4646

4747
<Note>
48-
`--params` may **not** set `date_from`/`date_to`/`filters` use the dedicated
48+
`--params` may **not** set `date_from`/`date_to`/`filters`; use the dedicated
4949
`--date-from`/`--date-to`/`--filters` flags for those. Object/array values in
5050
`--params` are JSON-encoded automatically (e.g. `funnel`'s `steps`).
5151
</Note>
@@ -61,8 +61,8 @@ Some pipes take additional, pipe-specific parameters. Pass them as a JSON object
6161
| Pipe | Key params |
6262
|------|------------|
6363
| `kpis`, `revenue_overview` | `group_by`, `limit`, `include_previous_period` |
64-
| `funnel` | `steps` (required JSON array of `{type,event,name,filters?}`), `window_seconds`, `funnel_type`, `breakdown` |
65-
| `flow` | `start_step` (required JSON `{type,event,resolved_event,...}`), `end_step`, `global_filters`, `window_seconds`, `max_steps` |
64+
| `funnel` | `steps` (required, a JSON array of `{type,event,name,filters?}`), `window_seconds`, `funnel_type`, `breakdown` |
65+
| `flow` | `start_step` (required, a JSON `{type,event,resolved_event,...}`), `end_step`, `global_filters`, `window_seconds`, `max_steps` |
6666
| `retention` | `id_type`, `event_type`, `event_name`, `min_users` |
6767
| `revenue_timeseries` | `address` (required) |
6868
| `revenue_by_metric`, `volume_by_metric`, `top_sources` | `metric_column`, `limit`, `offset` |

cli/profiles.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ The `--conditions` option accepts a JSON array of filter condition objects:
134134
```
135135

136136
<Warning>
137-
`field` **must be a typed path** (prefixed by its category see the table
137+
`field` **must be a typed path** (prefixed by its category; see the table
138138
below). The CLI rejects a bare/untyped field (e.g. `net_worth_usd`) with an
139-
error, because the API would otherwise **silently ignore** it no error, no
139+
error, because the API would otherwise **silently ignore** it: no error, no
140140
filtering, returning the entire unfiltered dataset. Always prefix the field,
141141
e.g. `users.net_worth_usd`.
142142
</Warning>

data/catalog.mdx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,12 @@ This is an **aggregate table**. Most columns require `-Merge` functions. Always
166166
| `os` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(os)` |
167167
| `activity_dates` | AggregateFunction(groupUniqArrayIf, Date, UInt8) | `groupUniqArrayIfMerge(activity_dates)` |
168168

169-
**Lifecycle definitions** (based on `activity_dates`):
170-
- **New**: `first_seen` within 30 days
171-
- **Churned**: `last_seen` >= 30 days ago
172-
- **Power**: 5+ unique active days in last 30 days
173-
- **Resurrected**: had 30+ day gap but returned
174-
- **Returning**: default
169+
**Lifecycle definitions** (based on `activity_dates`, computed against a reference date that defaults to today):
170+
- **New**: `first_seen` within the last 30 days
171+
- **Power**: `first_seen` more than 30 days ago and 5+ unique active days in the last 30 days
172+
- **Resurrected**: `first_seen` more than 30 days ago and re-engaged within the last 30 days after a 30+ day gap
173+
- **Churned**: `last_seen` more than 30 days ago
174+
- **Returning**: default (first seen more than 30 days ago, active recently, but not Power or Resurrected)
175175

176176
**Example:**
177177

data/metrics.mdx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,6 @@ CLV estimates the total revenue a user generates over their entire engagement wi
254254

255255
### User lifecycle
256256

257-
The lifecycle stage of each wallet or visitor, automatically calculated based on their activity patterns. There are five lifecycle stages:
257+
The lifecycle stage of each wallet or visitor (New, Returning, Power User, Resurrected, or Churned), computed from their activity recency and frequency relative to a reference date.
258258

259-
- **New** - Wallets engaging with your app for the first time.
260-
- **Returning** - Users who consistently return after their first interaction.
261-
- **Power Users** - Returning users who very frequently use your app (active on at least 5 days out of the last 30 days).
262-
- **Churned** - Wallets that stopped engaging after being active (e.g., 30 days of inactivity).
263-
- **Resurrected** - Wallets that were once inactive but have re-engaged.
264-
265-
See [User Lifecycle](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for full details on how each stage is determined.
259+
See [User Lifecycle](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for the exact rules and thresholds for each stage.

features/product-analytics/alerts.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Get real-time notifications when high-value users interact with your app. This g
3737
| Setting | Description |
3838
|---------|-------------|
3939
| **Name** | Descriptive name (e.g., "Whale Alert") |
40-
| **Trigger Type** | Event alerts (User alerts coming soon see below) |
40+
| **Trigger Type** | Event alerts (User alerts coming soon; see below) |
4141
| **Conditions** | Filter conditions (optional) |
4242
| **Notification** | Webhook (generic HTTP or Slack via an incoming-webhook URL) |
4343

@@ -59,7 +59,7 @@ Currently, **Event alerts** are the supported, working trigger type. **User aler
5959
You can add conditions to filter on event properties (e.g., `chain_id = 8453`, `status = failed`).
6060
</Tab>
6161
<Tab title="Users (coming soon)">
62-
<Note>User alerts are not yet available the User trigger type is disabled in the dashboard. The behavior below describes the planned functionality.</Note>
62+
<Note>User alerts are not yet available; the User trigger type is disabled in the dashboard. The behavior below describes the planned functionality.</Note>
6363

6464
Triggers when a user profile matches your filters. Formo checks for matching users every 5 minutes and sends a notification for each new user that meets your criteria.
6565

@@ -319,7 +319,7 @@ Each message includes:
319319

320320
### User alerts (coming soon)
321321

322-
<Note>User alerts are not yet available the User trigger type is disabled in the dashboard. The payload format below documents the planned behavior.</Note>
322+
<Note>User alerts are not yet available; the User trigger type is disabled in the dashboard. The payload format below documents the planned behavior.</Note>
323323

324324
When a user alert is triggered, Formo sends matching user profiles to your webhook.
325325

features/wallet-intelligence/overview.mdx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ Click on any wallet address to open its full profile. The wallet profile shows:
6262

6363
Formo automatically categorizes users by lifecycle stage based on their activity:
6464

65-
| Stage | Definition | What it means |
66-
|-------|------------|---------------|
67-
| **New** | First interaction with your app | Recent acquisition |
68-
| **Returning** | Came back after first visit | Engaged user |
69-
| **Power User** | Active 5+ days in last 30 days | Highly engaged |
70-
| **Churned** | No activity for 30+ days | Needs re-engagement |
71-
| **Resurrected** | Returned after being churned | Re-engaged user |
65+
| Stage | What it means |
66+
|-------|---------------|
67+
| **New** | Recent acquisition |
68+
| **Returning** | Engaged user |
69+
| **Power User** | Highly engaged |
70+
| **Resurrected** | Re-engaged after going quiet |
71+
| **Churned** | Needs re-engagement |
7272

73-
Use the lifecycle filter on the Users page to focus on specific user groups.
73+
Use the lifecycle filter on the Users page to focus on specific user groups. See [User Lifecycle](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for the exact rules and thresholds behind each stage.
7474

7575
### Step 4: Create your first segment
7676

@@ -110,7 +110,7 @@ Export this segment as CSV to run targeted re-engagement campaigns on social cha
110110
Formo aggregates onchain data across all major EVM chains to build wallet profiles. This includes token holdings, DeFi positions, wallet age, transaction frequency, and net worth. Data is refreshed periodically to keep profiles current.
111111
</Accordion>
112112
<Accordion title="How are wallet lifecycle stages calculated?">
113-
Wallet lifecycle stages (New, Returning, Power User, Churned, Resurrected) are calculated based on activity recency and frequency on your app. A wallet with no activity for 30+ days is classified as "Churned," while a wallet active 5+ days in the last 30 days is a "Power User." See [wallet profiles](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for details.
113+
Wallet lifecycle stages (New, Returning, Power User, Resurrected, Churned) are calculated based on activity recency and frequency on your app, relative to a reference date that defaults to today. For example, a wallet last seen more than 30 days ago is classified as "Churned," while a wallet first seen 30+ days ago and active on 5+ of the last 30 days is a "Power User." Default thresholds can be customized in Settings → Lifecycle. See [wallet profiles](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for details.
114114
</Accordion>
115115
<Accordion title="Can I export wallet profiles and segments for marketing campaigns?">
116116
Yes. You can export any [segment](/features/wallet-intelligence/segments) as a CSV file for use in targeted re-engagement campaigns. You can also query profiles programmatically via the [Profiles API](/api/profiles/get).

features/wallet-intelligence/wallet-profiles.mdx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ Gain a complete view of each user's behaviour across chains and platforms:
2222

2323
## User Lifecycle
2424

25-
Each user's lifecycle stage is automatically calculated based on their activity:
25+
Each user's lifecycle stage is computed relative to a **reference date** (the end of the queried date range, which defaults to today). The default thresholds are shown below; projects can override them in **Settings → Lifecycle**.
2626

27-
| Lifecycle | Description |
27+
| Lifecycle | Definition |
2828
|:----------|:------------|
29-
| **New** | Wallets engaging with your app for the first time. A spike in new wallets indicates a successful campaign or marketing push. |
30-
| **Returning** | Users who consistently return after their first interaction. Low retention may indicate issues with user experience or platform value. |
31-
| **Power Users** | Returning users who very frequently use your app (active on at least 5 days out of the last 30 days). |
32-
| **Churned** | Wallets that stopped engaging after being active (e.g., 30 days of inactivity). An increase signals a need to reassess engagement strategies. |
33-
| **Resurrected** | Wallets that were once inactive but have re-engaged. Useful for evaluating re-engagement campaigns. |
29+
| **New** | First seen within the last 30 days. |
30+
| **Returning** | First seen more than 30 days ago, active within the last 30 days, but on fewer than 5 distinct days and with no 30+ day inactivity gap in their history. |
31+
| **Power Users** | First seen more than 30 days ago and active on at least 5 of the last 30 days. |
32+
| **Resurrected** | Re-engaged within the last 30 days after a 30+ day inactivity gap. |
33+
| **Churned** | Last seen more than 30 days ago. |
3434

3535
Filter users by lifecycle to create [segments](/features/wallet-intelligence/segments) and audiences. For example, "Show me whales who use app X who are power users" or "Show me high net worth wallets who have churned."
3636

@@ -183,12 +183,12 @@ Each event shows:
183183

184184
The **Apps** and **Tokens** tabs show the user's onchain footprint:
185185

186-
**Apps tab DeFi positions:**
186+
**Apps tab (DeFi positions):**
187187
- Active positions in protocols (Aave, Uniswap, etc.) across supported chains
188188
- USD value and portfolio percentage for each position
189189
- Useful for understanding which crypto apps the wallet interacts with
190190

191-
**Tokens tab token balances:**
191+
**Tokens tab (token balances):**
192192
- All tokens held across supported chains
193193
- Token amounts, USD values, and portfolio percentages
194194

guides/dau-tracking.mdx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,7 @@ Not all active users are equal. Segment by behavior and value.
147147

148148
Formo automatically categorizes users by lifecycle:
149149

150-
| Segment | Definition |
151-
|---------|------------|
152-
| **New** | First activity in last 30 days |
153-
| **Returning** | Multiple sessions, active recently |
154-
| **Power User** | Active 5+ days in last 30 days |
155-
| **Churned** | No activity for 30+ days |
156-
| **Resurrected** | Returned after being churned |
150+
Formo classifies every wallet into one lifecycle stage (**New**, **Returning**, **Power User**, **Resurrected**, or **Churned**) based on activity recency and frequency. See [User Lifecycle](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for the exact rules and thresholds.
157151

158152
View these segments by going to **Users** and applying the **Lifecycle** filter.
159153

0 commit comments

Comments
 (0)