Skip to content

Commit 4c0c9eb

Browse files
yosriadyclaude
andauthored
docs: fix discrepancies between docs and latest implementation (#81)
* docs: fix discrepancies between docs and implementation Audit of docs against ../formono (features, API, MCP, CLI, SDK, data, security, integrations) and fixes for inaccurate or missing content. MCP - Document Scale/Enterprise plan requirement + 403 troubleshooting - Correct tool table to the real allow-list (drop wallet_profiles, top_custom_events; rename top_sources_metrics -> top_sources; add missing tools); group top_* tools together - lifecycle/retention/frequency are first-class tools, not SQL-only API - Add Get Contract page (GET /v0/contracts/{chain}/{address}) + nav Events / SDK - Fix version "1" -> "0"; add transaction reverted status - Restore flattened function args (function_args is emitted both nested and flattened) + explain the behavior - Move address/user_id to top level in connect/disconnect/chain/ signature/identify samples - Add paid-attribution click IDs; fix mobile network_* context fields - Remove non-existent signatureHash from web SDK example - Refresh stale SDK versions; reframe page-event example to a DeFi flow Features - Reframe Funnels/Flows/Retention as chart types (not nav pages); rename "User Flow" chart -> "Flow" - "Ask AI" -> "Ask Formo" across features and guides - Audience Insights / Segments live on the Users page - Alerts: webhook/Slack only (no Telegram/Email); User alerts gated - Remove fabricated behavioral wallet labels; use real label categories - Holdings tab -> Apps/Tokens Data / Chains / Security / Integrations - Remove unimplemented linear (multi-touch) attribution - Catalog: real columns/types, drop non-existent chains/pages tables, add wallet_profiles_labels - Enable contract events for Blast/Kaia/Mode/Mode Testnet/Monad Testnet; add Katana - Roles: add BI-token + audit-log permissions; SSO: any SAML 2.0 IdP; add audit log mention - Integrations: document Slack/webhook/email via Alerts Web SDK examples: remove Blocknative/Porto/Farcaster cards; normalize Crossmint/Openfort/Angular labels to with-N format Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: fix broken links/anchors and typos Broken links/anchors (verified all internal links + heading anchors now resolve, 0 broken): - intro: /guides/ -> /guides/onchain-attribution - custom-events: /features/wallet-intelligence -> .../overview; /sdks/web#custom-events -> #track-events - sdks (web/server/mobile): /data/events#events-api -> /data/events/overview#events-api - sdks/web + install: fix #react--nextjs / #websites / #privy / #react-&-next-js-without-wagmi anchors; install method links now point to the real /sdks/web#... headings - metrics: custom-events#tracking-revenue -> #step-3-...; track comma anchor - wallet-intelligence/overview, security/overview: drop dead anchors Typos: - metrics: "leave" -> "leaves"; "a search engines" -> "a search engine" - what-we-collect: "the their time zone" -> "their time zone" - chains: "on Ethereum on all major EVM chains" -> "and all major EVM chains" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 93e164b commit 4c0c9eb

49 files changed

Lines changed: 340 additions & 255 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/contracts/get.mdx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: 'Get Contract'
3+
description: 'Fetch a single monitored smart contract by chain ID and address. Returns the contract address, chain ID, ABI, and event tracking configuration.'
4+
openapi: 'GET /v0/contracts/{chain}/{address}'
5+
---

chains/overview.mdx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: 'View all EVM and non-EVM blockchain networks supported by Formo, i
66

77
## EVM
88

9-
Formo supports builders on Ethereum on all major EVM chains.
9+
Formo supports builders on Ethereum and all major EVM chains.
1010

1111
- [Analytics](https://docs.formo.so/features/product-analytics/overview) autocaptures wallet events from page visit to transaction for all chains.
1212
- [Wallet profiles](https://docs.formo.so/features/wallet-intelligence/wallet-profiles) are available for nearly all mainnet chains.
@@ -34,7 +34,7 @@ Formo supports builders on Ethereum on all major EVM chains.
3434
| Berachain ||| ✖️ ||
3535
| Berachain Bepolia || ✖️ | ✖️ ||
3636
| Bitlayer ||| ✖️ | ✖️ |
37-
| Blast Mainnet ||| ✖️ ||
37+
| Blast Mainnet ||| ||
3838
| Blast Sepolia || ✖️ | ✖️ ||
3939
| BOB ||| ✖️ ||
4040
| BOB Testnet || ✖️ | ✖️ ||
@@ -70,9 +70,10 @@ Formo supports builders on Ethereum on all major EVM chains.
7070
| Immutable zkEVM Testnet || ✖️ |||
7171
| Ink Mainnet |||||
7272
| Ink Sepolia || ✖️ |||
73-
| Kaia Mainnet ||| ✖️ ||
73+
| Kaia Mainnet ||| ||
7474
| Kaia Kairos || ✖️ | ✖️ ||
7575
| Karak ||| ✖️ | ✖️ |
76+
| Katana ||| ✖️ | ✖️ |
7677
| Lens Mainnet ||| ✖️ | ✖️ |
7778
| Lens Sepolia || ✖️ | ✖️ | ✖️ |
7879
| Lisk Mainnet |||||
@@ -86,10 +87,10 @@ Formo supports builders on Ethereum on all major EVM chains.
8687
| MegaETH Testnet || ✖️ |||
8788
| Metis ||| ✖️ | ✖️ |
8889
| Mitosis ||| ✖️ | ✖️ |
89-
| Mode Mainnet ||| ✖️ ||
90-
| Mode Testnet || ✖️ | ✖️ ||
90+
| Mode Mainnet ||| ||
91+
| Mode Testnet || ✖️ | ||
9192
| Monad Mainnet ||| ✖️ ||
92-
| Monad Testnet || ✖️ | ✖️ ||
93+
| Monad Testnet || ✖️ | ||
9394
| Morph ||| ✖️ ||
9495
| Morph Testnet || ✖️ | ✖️ ||
9596
| Odyssey ||| ✖️ ||

data/attribution.mdx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: 'Attribution'
33
icon: magnifying-glass-chart
4-
description: 'Learn why onchain attribution matters for sustainable growth and how Formo calculates multi-touch attribution from first click to wallet transaction.'
4+
description: 'Learn why onchain attribution matters for sustainable growth and how Formo attributes conversions from first click to wallet transaction.'
55
iconType: solid
66
---
77

@@ -39,11 +39,10 @@ Consider the following example user journey for a DEX called FooSwap with many t
3939
- The user revisits the app from another channel on Farcaster (*"referrer"*)
4040
- The user completes a swap transaction (*"conversion"*) emitting an onchain event
4141

42-
As you've seen in the above example, not everything you care about is onchain. In this example, two touchpoints contribute to the successful conversion: X and Farcaster. Using an [attribution model](/data/attribution#attribution-models), we can assign different weights to these touchpoints to determine their relative importance in the conversion:
42+
As you've seen in the above example, not everything you care about is onchain. In this example, two touchpoints contribute to the successful conversion: X and Farcaster. Using an [attribution model](/data/attribution#attribution-models), we can determine which touchpoint to credit for the conversion:
4343

44-
- Using first touch model, the complete conversion can be attributed to X and the referral
45-
- Using last touch model, the complete conversion can be attributed to Farcaster
46-
- Using a linear attribution model, we could assign a weight of 0.5 to each touchpoint, meaning that both X and Farcaster contributed equally to the conversion
44+
- Using the first-touch model, the complete conversion is attributed to X and the referral
45+
- Using the last-touch model, the complete conversion is attributed to Farcaster
4746

4847
### How attribution works in Formo
4948

@@ -105,13 +104,12 @@ Spend less time building analytics and leave the complex data engineering to us.
105104

106105
### Attribution models
107106

108-
Formo helps you understand the impact of each touchpoint in each user journey, whether with first or last touch (single-touch attribution) or across multiple touchpoints using multi-touch attribution.
107+
Formo helps you understand the impact of touchpoints in each user journey using single-touch attribution, crediting either the first or the last touchpoint within the lookback window.
109108

110109
| Model | Description |
111110
| :---------- | :--------------------------------------------------------------------------------------------------------- |
112111
| First Touch | Gives 100% credit to the first touchpoint within the attribution lookback window |
113112
| Last Touch | Gives 100% credit to the last touchpoint within the attribution lookback window |
114-
| Linear | Gives equal credit to every touchpoint leading up to a conversion within the lookback window |
115113

116114
> Looking for more attribution models? [Let us know](mailto:support@formo.so).
117115
@@ -120,6 +118,6 @@ Formo helps you understand the impact of each touchpoint in each user journey, w
120118
| Term | Definition |
121119
| :--------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
122120
| User journey | Consists of touchpoints and the conversion event. It is possible for a conversion event to have no corresponding touchpoints (eg. utm parameters). In this case we consider it a 'direct' conversion |
123-
| Conversion | The primary event you're interested in analyzing with multi-touch attribution models. Typically some final value generating interaction such as "Mint" or "Swap" or "Stake". |
121+
| Conversion | The primary event you're interested in attributing. Typically a volume or revenue generating conversion event such as "Mint" or "Swap" or "Stake". |
124122
| Touchpoint | Actions (events) a user's taken or exposed to along the journey before doing the conversion event. [Eg. does event A → B → C → D (conversion event) in a 7 day period; For a lookback window of 7 days, A, B, C are all considered touchpoints] |
125123
| Lookback window | The time window where a user's events with this attribution property are counted towards the calculation. The window ends when the conversion metric happens. |

data/catalog.mdx

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ The core event log. Contains all user interaction events - page views, custom ev
5858
|--------|------|-------------|
5959
| `session_id` | String | User session identifier |
6060
| `channel` | String | Event channel |
61-
| `type` | String | Event category: `page`, `track`, `identify`, `connect`, `decoded_log` |
61+
| `type` | String | Event category: `page`, `track`, `identify`, `detect`, `connect`, `disconnect`, `chain`, `signature`, `transaction`, `decoded_log` |
6262
| `anonymous_id` | String | Auto-generated anonymous user ID |
6363
| `user_id` | String | Optional user identifier |
6464
| `address` | String | Wallet address (empty if not connected) |
@@ -87,6 +87,15 @@ The core event log. Contains all user interaction events - page views, custom ev
8787
| `utm_campaign` | String | UTM campaign |
8888
| `utm_term` | String | UTM term |
8989
| `utm_content` | String | UTM content |
90+
| `gclid` | String | Google Ads click ID |
91+
| `gad_source` | String | Google Ads source parameter |
92+
| `fbclid` | String | Meta (Facebook) click ID |
93+
| `msclkid` | String | Microsoft Ads click ID |
94+
| `ttclid` | String | TikTok Ads click ID |
95+
| `twclid` | String | X (Twitter) Ads click ID |
96+
| `li_fat_id` | String | LinkedIn Ads click ID |
97+
| `rdt_cid` | String | Reddit Ads click ID |
98+
| `builder_codes` | String | Builder/referral codes |
9099
| `user_agent` | String | Raw user agent string |
91100
| `device` | String | Device type: `desktop`, `mobile-ios`, `mobile-android`, `tablet`, `bot` |
92101
| `browser` | String | Browser: `chrome`, `safari`, `firefox`, or Web3 wallets |
@@ -134,19 +143,25 @@ This is an **aggregate table**. Most columns require `-Merge` functions. Always
134143
| `last_referrer_url` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_referrer_url)` |
135144
| `first_ref` | AggregateFunction(argMin, String, DateTime) | `argMinMerge(first_ref)` |
136145
| `last_ref` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_ref)` |
146+
| `first_builder_codes` | AggregateFunction(argMin, String, DateTime) | `argMinMerge(first_builder_codes)` |
147+
| `last_builder_codes` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_builder_codes)` |
148+
| `first_paid_source` | AggregateFunction(argMin, String, DateTime) | `argMinMerge(first_paid_source)` |
149+
| `last_paid_source` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_paid_source)` |
150+
| `first_click_id` | AggregateFunction(argMin, String, DateTime) | `argMinMerge(first_click_id)` |
151+
| `last_click_id` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_click_id)` |
137152
| `num_sessions` | AggregateFunction(uniq, String) | `uniqMerge(num_sessions)` |
138153
| `revenue` | SimpleAggregateFunction(sum, Float64) | `sum(revenue)` |
139154
| `volume` | SimpleAggregateFunction(sum, Float64) | `sum(volume)` |
140155
| `points` | SimpleAggregateFunction(sum, Float64) | `sum(points)` |
141-
| `wallets_state` | AggregateFunction(groupUniqArray, String) | `groupUniqArrayMerge(wallets_state)` |
156+
| `wallets_state` | AggregateFunction(groupUniqArray, String) | `groupUniqArrayMerge(wallets_state)` (users table only) |
142157
| `last_type` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_type)` |
143158
| `last_event` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_event)` |
144159
| `last_properties` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(last_properties)` |
145160
| `location` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(location)` |
146161
| `device` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(device)` |
147162
| `browser` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(browser)` |
148163
| `os` | AggregateFunction(argMax, String, DateTime) | `argMaxMerge(os)` |
149-
| `activity_dates` | AggregateFunction(groupUniqArray, Date) | `groupUniqArrayMerge(activity_dates)` |
164+
| `activity_dates` | AggregateFunction(groupUniqArrayIf, Date, UInt8) | `groupUniqArrayIfMerge(activity_dates)` |
150165

151166
**Lifecycle definitions** (based on `activity_dates`):
152167
- **New**: `first_seen` within 30 days
@@ -215,6 +230,14 @@ Aggregated session data with engagement metrics and attribution. Each row repres
215230
| `utm_campaign` | SimpleAggregateFunction(any, String) | Direct access |
216231
| `utm_content` | SimpleAggregateFunction(any, String) | Direct access |
217232
| `utm_term` | SimpleAggregateFunction(any, String) | Direct access |
233+
| `gclid` | SimpleAggregateFunction(any, String) | Direct access |
234+
| `gad_source` | SimpleAggregateFunction(any, String) | Direct access |
235+
| `fbclid` | SimpleAggregateFunction(any, String) | Direct access |
236+
| `msclkid` | SimpleAggregateFunction(any, String) | Direct access |
237+
| `ttclid` | SimpleAggregateFunction(any, String) | Direct access |
238+
| `twclid` | SimpleAggregateFunction(any, String) | Direct access |
239+
| `li_fat_id` | SimpleAggregateFunction(any, String) | Direct access |
240+
| `rdt_cid` | SimpleAggregateFunction(any, String) | Direct access |
218241
| `first_hit` | SimpleAggregateFunction(min, DateTime) | Direct access |
219242
| `latest_hit` | SimpleAggregateFunction(max, DateTime) | Direct access |
220243
| `hits` | AggregateFunction(count) | `countMerge(hits)` |
@@ -279,6 +302,15 @@ Financial metrics with full attribution context. Tracks revenue, transaction vol
279302
| `utm_campaign` | String | UTM campaign |
280303
| `utm_content` | String | UTM content |
281304
| `utm_term` | String | UTM term |
305+
| `builder_codes` | String | Builder/referral codes |
306+
| `gclid` | String | Google Ads click ID |
307+
| `gad_source` | String | Google Ads source parameter |
308+
| `fbclid` | String | Meta (Facebook) click ID |
309+
| `msclkid` | String | Microsoft Ads click ID |
310+
| `ttclid` | String | TikTok Ads click ID |
311+
| `twclid` | String | X (Twitter) Ads click ID |
312+
| `li_fat_id` | String | LinkedIn Ads click ID |
313+
| `rdt_cid` | String | Reddit Ads click ID |
282314
| `event` | String | Revenue-generating event name |
283315
| `rdns` | String | Wallet RDNS identifier |
284316
| `provider_name` | String | Wallet provider name |
@@ -456,44 +488,20 @@ Raw timestamped wallet profile data from blockchain analysis. Contains the unpro
456488

457489
---
458490

459-
### chains
491+
### wallet_profiles_labels
460492

461-
Derived view providing chain usage data with attribution context.
493+
Wallet labels and tags for categorizing and filtering wallet addresses. Each row is a label assigned to an address, optionally scoped to a chain.
462494

463-
**Use cases:** Chain adoption tracking, multi-chain user analysis
495+
**Use cases:** Wallet categorization, risk scoring, user segmentation, compliance filtering
464496

465497
| Column | Type | Description |
466498
|--------|------|-------------|
467-
| `chain_id` | String | Blockchain identifier |
468-
| `date` | DateTime | Activity date |
469-
| `origin` | String | Site domain |
470-
| `device` | String | Device type |
471-
| `browser` | String | Browser |
472-
| `os` | String | Operating system |
473-
| `location` | String | Country code |
474-
| `referrer` | String | Referrer domain |
475-
| `ref` | String | Ref parameter |
476-
| `utm_medium` | String | UTM medium |
477-
| `utm_source` | String | UTM source |
478-
| `utm_campaign` | String | UTM campaign |
479-
| `utm_content` | String | UTM content |
480-
| `utm_term` | String | UTM term |
481-
| `visits` | String | Visit count |
482-
483-
---
484-
485-
### pages
486-
487-
Derived view providing page-level analytics data.
488-
489-
**Use cases:** Page performance analysis, content analytics, top pages
490-
491-
| Column | Type | Description |
492-
|--------|------|-------------|
493-
| `origin` | String | Site domain |
494-
| `pathname` | String | URL path |
495-
| `visits` | Number | Unique session count |
496-
| `hits` | Number | Total page views |
499+
| `address` | String | Wallet address |
500+
| `chain_id` | String | Blockchain identifier (`-` for global labels across all chains) |
501+
| `tag_id` | String | Unique label identifier |
502+
| `value` | String | Optional label value/score |
503+
| `source` | String | System that provided the label |
504+
| `timestamp` | DateTime | When the label was last updated |
497505

498506
---
499507

@@ -652,6 +660,7 @@ Several tables (`users`, `anonymous_users`, `sessions`, `sources`, `identities`)
652660
| `AggregateFunction(uniq, T)` | `uniqMerge(col)` | `uniqMerge(num_sessions)` |
653661
| `AggregateFunction(count)` | `countMerge(col)` | `countMerge(hits)` |
654662
| `AggregateFunction(groupUniqArray, T)` | `groupUniqArrayMerge(col)` | `groupUniqArrayMerge(wallets_state)` |
663+
| `AggregateFunction(groupUniqArrayIf, T, UInt8)` | `groupUniqArrayIfMerge(col)` | `groupUniqArrayIfMerge(activity_dates)` |
655664
| `AggregateFunction(min, T)` | `minMerge(col)` | `minMerge(first_seen)` |
656665
| `SimpleAggregateFunction(min, T)` | `min(col)` | `min(first_seen)` |
657666
| `SimpleAggregateFunction(max, T)` | `max(col)` | `max(last_seen)` |

data/events/chain.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Here’s the payload of a typical call with most common fields removed:
1313
```json
1414
{
1515
"type": "chain",
16+
"address": "0x8e6ca77a7e044ba836a97beb796c124ca3a6a154",
1617
"properties": {
17-
"chain_id": 1,
18-
"address": "0x8e6ca77a7e044ba836a97beb796c124ca3a6a154"
18+
"chain_id": 1
1919
}
2020
}
2121
```

0 commit comments

Comments
 (0)