Skip to content

Commit 0fee37c

Browse files
yosriadyclaude
andauthored
docs: fix staleness vs latest ../formono and tighten guides (#86)
* docs: fix staleness vs latest ../formono and tighten guides Audited the docs against the current backend, SDKs, frontend, and the published @formo/cli, and corrected stale or incorrect content. HIGH - wallet-labels: replace the old session-count lifecycle table with a link to the canonical 6-stage definition; drop invented labels (DeFi Active, ETH Staker) in favor of real filters (Apps, Lifecycle). - integrations: only webhook alerts ship (Slack via webhook URL); drop the unimplemented Email channel. - metrics: channel #5 is "Referrals" (code value), not "Affiliates". MED - chains: BOB and BOB Testnet are indexed for contract events. - mcp: document the project_users tool; fix the "not a tool" note and the lifecycle tool description. - cli: output defaults to TOON (not raw JSON); document the incur output flags; jq examples need --json; query desc had wrong formats. - charts: add Stacked Bar and Area chart types. - guides: chart button is "Add Chart"; chart type is "Funnel"/"Flow" not "Conversion Funnel"/"User Path"; nav is "Explorer"; fix typos. - events: points is a Number (not String). - security: bump SRI example to analytics@1.33.0 with the hash from the GitHub release; remove the non-existent "Delete forms" role permission. LOW - metrics: complete AI-assistant domains; widen Email/Organic Social rules; channels are assigned at ingestion, not query time. - sql-explorer: reframe the session-count bucket query so it no longer masquerades as the lifecycle definition. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: fix broken example link (next-app-router -> with-next-app-router) The getformo/examples repo folder is named with-next-app-router; the bare next-app-router path 404s. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 24f5526 commit 0fee37c

23 files changed

Lines changed: 77 additions & 69 deletions

chains/overview.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ Formo supports builders on Ethereum and all major EVM chains.
3636
| Bitlayer ||| ✖️ | ✖️ |
3737
| Blast Mainnet |||||
3838
| Blast Sepolia || ✖️ | ✖️ ||
39-
| BOB ||| ✖️ ||
40-
| BOB Testnet || ✖️ | ✖️ ||
39+
| BOB ||| ||
40+
| BOB Testnet || ✖️ | ||
4141
| BNB Smart Chain Mainnet |||||
4242
| BNB Smart Chain Testnet || ✖️ |||
4343
| Boba ||| ✖️ | ✖️ |

cli/analytics.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ formo analytics revenue_timeseries \
9494
--params '{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
9595

9696
# Pipe results to jq for processing
97-
formo analytics kpis | jq '.data'
97+
formo analytics kpis --json | jq '.data'
9898
```
9999

100100
The response shape matches the dashboard data: `{ meta, data, rows, statistics }`.

cli/overview.mdx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,23 @@ The CLI stores configuration at `~/.config/formo/config.json` with restricted pe
149149

150150
## Output format
151151

152-
- **Interactive mode (TTY):** The CLI displays colored, human-readable output with status icons and formatting.
153-
- **Piped/scripted mode:** The CLI outputs raw JSON, making it easy to pipe into `jq` or other tools.
152+
By default, commands print compact, human-readable TOON output. Pass one of the standard output flags to change the format:
153+
154+
| Flag | Description |
155+
|------|-------------|
156+
| `--format <toon\|json\|yaml\|md\|jsonl>` | Output format (default: `toon`) |
157+
| `--json` | Shorthand for `--format json` |
158+
| `--verbose` | Include the full response envelope (`ok`, `data`, `meta`) |
159+
| `--filter-output <keys>` | Filter output by key paths (e.g. `data,meta.duration`) |
160+
161+
Status messages (login confirmation, errors, and similar) are written to stderr in interactive terminals, so they never pollute piped output.
154162

155163
```bash
156-
# Human-friendly output
164+
# Default TOON output
157165
formo profiles get vitalik.eth
158166

159-
# Pipe JSON to jq
160-
formo profiles get vitalik.eth | jq '.net_worth_usd'
167+
# JSON output, piped to jq
168+
formo profiles get vitalik.eth --json | jq '.net_worth_usd'
161169
```
162170

163171
## AI agent usage

cli/query.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: "Query"
33
sidebarTitle: "Query"
44
icon: database
5-
description: "Run ClickHouse SQL queries against your Formo analytics data warehouse directly from the terminal and output results in table, JSON, or CSV format."
5+
description: "Run ClickHouse SQL queries against your Formo analytics data warehouse directly from the terminal, with results in TOON, JSON, or other output formats."
66
---
77

88
The `formo query run` command lets you execute SQL queries against your Formo analytics data warehouse directly from the terminal.
@@ -34,12 +34,12 @@ formo query run "SELECT address, net_worth_usd FROM wallet_profiles ORDER BY net
3434
formo query run "SELECT DATE(timestamp) as day, COUNT(DISTINCT address) as dau FROM events WHERE timestamp > now() - INTERVAL 7 DAY GROUP BY day ORDER BY day"
3535

3636
# Pipe results to jq for processing
37-
formo query run "SELECT count(*) as total FROM events" | jq '.data'
37+
formo query run "SELECT count(*) as total FROM events" --json | jq '.data'
3838
```
3939

4040
### Tips
4141

4242
- SQL queries execute against your project's analytics data warehouse.
4343
- Wrap your query in double quotes to prevent shell interpretation.
4444
- Use single quotes inside your SQL for string literals.
45-
- Pipe the output to `jq` for JSON processing in scripts.
45+
- Pass `--json` and pipe the output to `jq` for processing in scripts (default output is TOON).

data/events/track.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Include these optional properties in a custom event to track values associated w
5050
| `volume` | Number | The volume amount as a result of an event. For e.g., a token swap worth $20.00 would result in a volume of 20.00. Can be positive or negative e.g. send -100 to track outflows. |
5151
| `revenue` | Number | The revenue amount as a result of an event. For e.g., a transaction with a protocol fee of $5.00 would result in a revenue of 5.00. Must be a non-negative number.|
5252
| `currency` | String | The currency of the revenue as a result of the event, set in ISO 4217 format. If this is not set, Formo assumes the revenue is in USD. |
53-
| `points` | String | An abstract value such as points or XP associated with an event, to be used by various teams. |
53+
| `points` | Number | An abstract value such as points or XP associated with an event, to be used by various teams. |
5454

5555
<Frame caption="Revenue tracking.">
5656
<img src="/images/revenue.png" alt="Revenue tracking." />
@@ -63,10 +63,10 @@ Include these optional properties in a custom event to track values associated w
6363
"type": "track",
6464
"event": "Product Reviewed",
6565
"properties": {
66-
"volume": "-100.5",
67-
"revenue": "20.5",
66+
"volume": -100.5,
67+
"revenue": 20.5,
6868
"currency": "USD",
69-
"points": "100",
69+
"points": 100,
7070
"product_id" : "9578257311",
7171
"rating" : 3.0,
7272
"review_body" : "Good value for the price."

data/metrics.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,19 @@ To minimize the amount of traffic that falls within the "Direct / None" category
8686

8787
### Channel
8888

89-
The acquisition channel that brought a session to your app. Every session is assigned to exactly one of 12 channels at query time, using a priority-ordered ladder over referrer domain, `utm_medium`, and 8 ad-platform click IDs (`gclid`, `gad_source`, `fbclid`, `msclkid`, `ttclid`, `twclid`, `li_fat_id`, `rdt_cid`).
89+
The acquisition channel that brought a session to your app. Every session is assigned to exactly one of 12 channels when its events are ingested, using a priority-ordered ladder over referrer domain, `utm_source`, `utm_medium`, and 8 ad-platform click IDs (`gclid`, `gad_source`, `fbclid`, `msclkid`, `ttclid`, `twclid`, `li_fat_id`, `rdt_cid`). The channel is stored on the event, so queries read it back without recomputing.
9090

9191
| # | Channel | Definition |
9292
|---|---------|------------|
9393
| 1 | Paid Search | Paid signal + referrer is a search engine (Google, Bing, DuckDuckGo, Yahoo, Yandex, Baidu, Brave, Kagi, Naver, ...) |
9494
| 2 | Paid Video | Paid signal + referrer is a video platform (YouTube, Vimeo, Twitch, Dailymotion, Loom, Wistia) |
9595
| 3 | Paid Social | Paid signal + referrer is a social platform (Meta, X, LinkedIn, Reddit, TikTok, Pinterest, Snapchat, Threads, Discord, Telegram, Farcaster, ...) |
96-
| 4 | Email | `utm_medium`\{`email`, `e-mail`, `e_mail`, `newsletter`\} |
97-
| 5 | Affiliates | `utm_medium=affiliate` or non-empty `ref` query parameter |
96+
| 4 | Email | `utm_medium`\{`email`, `e-mail`, `e_mail`, `newsletter`\}, or referrer is a known email or newsletter domain (Gmail, Proton Mail, Yahoo Mail, Outlook, Substack, Beehiiv, Paragraph) |
97+
| 5 | Referrals | `utm_medium=affiliate` or non-empty `ref` query parameter |
9898
| 6 | Display | `utm_medium`\{`display`, `banner`, `expandable`, `interstitial`\} |
99-
| 7 | AI | Referrer is an AI assistant domain (ChatGPT, Claude, Gemini, Copilot, Perplexity, DeepSeek, Phind, Poe, Mistral Chat, Meta AI, You.com, Pi) |
99+
| 7 | AI | Referrer is an AI assistant domain (ChatGPT, Claude, Gemini, Copilot, Perplexity, DeepSeek, Phind, Poe, Mistral Chat, Meta AI, You.com, Pi, Grok, Qwen, Kimi, Hugging Face, Genspark) |
100100
| 8 | Organic Search | `utm_medium=organic` or referrer is a search engine with no paid signal |
101-
| 9 | Organic Social | `utm_medium`\{`social`, `social-network`, `social-media`, `sm`\} or referrer is a social platform with no paid signal |
101+
| 9 | Organic Social | `utm_medium`\{`social`, `social-network`, `social-media`, `sm`, `social network`, `social media`\} or referrer is a social platform with no paid signal |
102102
| 10 | Organic Video | Referrer is a video platform with no paid signal |
103103
| 11 | Referrers | Any other non-empty referrer not matched by the rules above |
104104
| 12 | Direct | No referrer, no UTM, no click ID (typed URL, bookmark, or stripped referrer) |

features/product-analytics/charts.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ Here is the current list of supported chart types on Formo:
6666
- Table
6767
- Number
6868
- Bar
69+
- Stacked Bar
6970
- Line
71+
- Area
7072
- Pie
7173

7274
Add beautiful, interactive visualizations that make your data easy to understand.
@@ -149,7 +151,9 @@ After running your query, select the chart type that best represents your data:
149151
| Chart Type | Best for |
150152
|------------|----------|
151153
| **Line** | Trends over time |
154+
| **Area** | Cumulative trends over time |
152155
| **Bar** | Comparing categories |
156+
| **Stacked Bar** | Comparing categories across segments |
153157
| **Pie** | Showing proportions |
154158
| **Number** | Single KPI metric |
155159
| **Table** | Detailed data exploration |

features/wallet-intelligence/wallet-labels.mdx

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ Each tracked user on Formo is assigned labels based on their onchain activity an
1717

1818
### User lifecycle labels
1919

20-
| Label | Description |
21-
|-------|-------------|
22-
| **New User** | Number of sessions = 1 |
23-
| **Returning User** | Number of sessions > 1 and < 10 |
24-
| **Power User** | Number of sessions > 10 |
20+
Every wallet is assigned a lifecycle stage based on its recency and active days: **New**, **Returning**, **Power User**, **Resurrected**, **At Risk**, or **Churned**. See [User lifecycle](/features/wallet-intelligence/wallet-profiles#user-lifecycle) for the exact rules and thresholds.
2521

2622
### Attestations
2723

@@ -53,9 +49,10 @@ Wallet labels turn anonymous addresses into actionable user profiles. This guide
5349
Formo automatically analyzes each wallet's onchain activity and assigns relevant labels. Labels update as users' behavior changes.
5450

5551
**Label sources:**
56-
- **Onchain activity** - Protocols used, tokens held, transaction patterns
57-
- **Attestations** - Verified credentials from Coinbase, Gitcoin Passport, etc.
58-
- **App behavior** - Session count, engagement patterns on your app
52+
- **Lifecycle** - Engagement stage derived from each wallet's recency and active days
53+
- **Attestations** - Verified credentials from Coinbase, Binance, Human Passport, and OFAC sanction lists
54+
- **Campaigns** - Participation in incentive campaigns such as Merkl
55+
- **Onchain registries** - Standards such as ERC-8004 that identify AI agent wallets
5956

6057
### Step 1: View labels on a user profile
6158

@@ -78,7 +75,7 @@ Use labels to find specific user types:
7875

7976
| Goal | Label Filter |
8077
|------|--------------|
81-
| Find DeFi power users | Label = "DeFi Active" AND Label = "Power User" |
78+
| Find power users | Lifecycle = "Power User" |
8279
| Find verified humans | Human Passport Score > 50 |
8380
| Exclude sanctioned wallets | Label != "Sanctioned User" |
8481
| Find Coinbase users | Label = "Coinbase Verified Account" |
@@ -90,7 +87,7 @@ Labels become powerful when combined with other criteria:
9087
**High-value DeFi users:**
9188
| Filter | Value |
9289
|--------|-------|
93-
| Label | DeFi Active |
90+
| Apps | Uniswap, Aave (or other DeFi protocols) |
9491
| Net Worth | > $50,000 |
9592
| Lifecycle | Power User |
9693

@@ -104,9 +101,8 @@ Labels become powerful when combined with other criteria:
104101
**At-risk whales:**
105102
| Filter | Value |
106103
|--------|-------|
107-
| Label | ETH Staker |
108104
| Net Worth | > $100,000 |
109-
| Lifecycle | Churned |
105+
| Lifecycle | At Risk |
110106

111107
### Step 4: Save as a segment
112108

@@ -131,7 +127,7 @@ Turn useful label combinations into reusable segments:
131127
3. Export clean lists for marketing or rewards
132128

133129
**Quality scoring:**
134-
1. Combine multiple positive labels (DeFi Active + Power User + Coinbase Verified)
130+
1. Combine multiple positive labels (Power User + Coinbase Verified Account + Human Passport Score > 50)
135131
2. Users matching more labels = higher quality
136132
3. Prioritize multi-label users for outreach
137133

@@ -146,8 +142,8 @@ Set up alerts based on labels:
146142

147143
1. Go to **Settings** > **Alerts**
148144
2. Create an alert for `connect` events
149-
3. Add condition: Label = "DeFi Active" AND Net Worth > $100,000
150-
4. Get notified when high-value DeFi users connect
145+
3. Add condition: Lifecycle = "Power User" AND Net Worth > $100,000
146+
4. Get notified when high-value power users connect
151147

152148
### Next Steps
153149

guides/contract-events.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ Each contract event is automatically linked to a wallet address and session, so
7878

7979
Now that contract events are flowing, use them as steps in funnels and other charts.
8080

81-
Click **Dashboards** > **Create Chart** > **Conversion Funnel**.
81+
Click **Dashboards** > **Add Chart** > **Funnel**.
8282

8383
In the funnel builder, you'll see a list of all of your events including events from the frontend (page views, wallet connects) and contract events (swaps, transfers) in the step dropdown.
8484

8585
Example funnel:
8686
1. "Wallet Connected" (frontend event with type `connect`)
87-
2. "Transaction" (frontend event with type type `transcation`)
87+
2. "Transaction" (frontend event with type `transaction`)
8888
3. "Swap" (contract event: Swap)
8989

9090
This funnel measures: Of users who connected a wallet, how many made a transaction, and of those, how many executed a swap?
@@ -97,7 +97,7 @@ This funnel measures: Of users who connected a wallet, how many made a transacti
9797

9898
For advanced analysis, use the **Explorer** (SQL editor).
9999

100-
Navigate to **Explore** in the sidebar. The schema browser on the left shows available tables: `events`, `users`, `anonymous_users`.
100+
Navigate to **Explorer** in the sidebar. The schema browser on the left shows available tables: `events`, `users`, `anonymous_users`.
101101

102102
The `events` table includes contract events with columns like:
103103
- `type`: Event type (e.g., `decoded_log` for contract events, `connect` for wallet connections)

guides/custom-dashboard.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Click **Share** in the top right to generate a public link. Copy it and share wi
9393
| **Funnel Chart** | Page view > Connect > Transaction | Where users drop off and your biggest opportunity |
9494
| **Retention Chart** | D7, D30 cohort retention | Whether users actually come back (stickiness) |
9595
| **Traffic Sources** | Referrer breakdown | Best acquisition channels to double down on |
96-
| **User Path (Sankey)** | Common flows | How real users navigate your protocol |
96+
| **Flow (Sankey)** | Common flows | How real users navigate your protocol |
9797

9898
## Next Steps
9999

0 commit comments

Comments
 (0)