You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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>
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.
Copy file name to clipboardExpand all lines: cli/analytics.mdx
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,10 +2,10 @@
2
2
title: "Analytics"
3
3
sidebarTitle: "Analytics"
4
4
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."
6
6
---
7
7
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>`.
9
9
10
10
<Note>
11
11
Requires `query:read` scope on your API key.
@@ -45,7 +45,7 @@ Requires `query:read` scope on your API key.
45
45
|`--params`|`string`| ❌ | JSON object of pipe-specific params merged into the query |
46
46
47
47
<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
49
49
`--date-from`/`--date-to`/`--filters` flags for those. Object/array values in
50
50
`--params` are JSON-encoded automatically (e.g. `funnel`'s `steps`).
51
51
</Note>
@@ -61,8 +61,8 @@ Some pipes take additional, pipe-specific parameters. Pass them as a JSON object
Copy file name to clipboardExpand all lines: data/metrics.mdx
+2-8Lines changed: 2 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -254,12 +254,6 @@ CLV estimates the total revenue a user generates over their entire engagement wi
254
254
255
255
### User lifecycle
256
256
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.
258
258
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.
|**Notification**| Webhook (generic HTTP or Slack via an incoming-webhook URL) |
43
43
@@ -59,7 +59,7 @@ Currently, **Event alerts** are the supported, working trigger type. **User aler
59
59
You can add conditions to filter on event properties (e.g., `chain_id = 8453`, `status = failed`).
60
60
</Tab>
61
61
<Tabtitle="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>
63
63
64
64
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.
65
65
@@ -319,7 +319,7 @@ Each message includes:
319
319
320
320
### User alerts (coming soon)
321
321
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>
323
323
324
324
When a user alert is triggered, Formo sends matching user profiles to your webhook.
Copy file name to clipboardExpand all lines: features/wallet-intelligence/overview.mdx
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -62,15 +62,15 @@ Click on any wallet address to open its full profile. The wallet profile shows:
62
62
63
63
Formo automatically categorizes users by lifecycle stage based on their activity:
64
64
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|
72
72
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.
74
74
75
75
### Step 4: Create your first segment
76
76
@@ -110,7 +110,7 @@ Export this segment as CSV to run targeted re-engagement campaigns on social cha
110
110
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.
111
111
</Accordion>
112
112
<Accordiontitle="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.
114
114
</Accordion>
115
115
<Accordiontitle="Can I export wallet profiles and segments for marketing campaigns?">
116
116
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).
Copy file name to clipboardExpand all lines: features/wallet-intelligence/wallet-profiles.mdx
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,15 +22,15 @@ Gain a complete view of each user's behaviour across chains and platforms:
22
22
23
23
## User Lifecycle
24
24
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**.
26
26
27
-
| Lifecycle |Description|
27
+
| Lifecycle |Definition|
28
28
|:----------|:------------|
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. |
34
34
35
35
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."
36
36
@@ -183,12 +183,12 @@ Each event shows:
183
183
184
184
The **Apps** and **Tokens** tabs show the user's onchain footprint:
185
185
186
-
**Apps tab — DeFi positions:**
186
+
**Apps tab (DeFi positions):**
187
187
- Active positions in protocols (Aave, Uniswap, etc.) across supported chains
188
188
- USD value and portfolio percentage for each position
189
189
- Useful for understanding which crypto apps the wallet interacts with
190
190
191
-
**Tokens tab — token balances:**
191
+
**Tokens tab (token balances):**
192
192
- All tokens held across supported chains
193
193
- Token amounts, USD values, and portfolio percentages
Copy file name to clipboardExpand all lines: guides/dau-tracking.mdx
+1-7Lines changed: 1 addition & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -147,13 +147,7 @@ Not all active users are equal. Segment by behavior and value.
147
147
148
148
Formo automatically categorizes users by lifecycle:
149
149
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.
157
151
158
152
View these segments by going to **Users** and applying the **Lifecycle** filter.
0 commit comments