Analytics·EVM · Solana · Multi-chain
Formo
Web3 product analytics built for crypto teams — autocaptures page views, sessions, wallet connects, signatures, transactions, and chain switches with a single SDK. Ships React, Next.js, React Native, and HTML script integrations and tight wagmi support.
- 01product analytics for dapps (Mixpanel/Amplitude alternative)
- 02wagmi-aware autocapture of wallet events
- 03funnel analysis from visit → connect → transact
- 04session replay-style behavior dashboards
- 05privacy-first onchain user analytics
- pnpm add @formo/analytics
| Variable | Scope | Description |
|---|---|---|
| NEXT_PUBLIC_FORMO_WRITE_KEY | Client | Formo SDK Write Key from app.formo.so → project settings. Client-safe; identifies the project, not a user. |
Install `@formo/analytics` and wrap your app with `FormoAnalyticsProvider`. With wagmi (recommended): `<FormoAnalyticsProvider writeKey={process.env.NEXT_PUBLIC_FORMO_WRITE_KEY!} options={{ wagmi: { config: wagmiConfig, queryClient } }}><App /></FormoAnalyticsProvider>` — this autocaptures page views, wallet connect/disconnect, chain switches, signatures, and transactions. For Next.js App Router put the provider in a `'use client'` component wrapping your `app/layout.tsx` children. For static sites use the CDN: `<script src='https://cdn.formo.so/analytics@latest' defer onload="window.formofy('${FORMO_WRITE_KEY}')"></script>`. Track custom events with `analytics.track('event_name', { ...properties })` and identify users with `analytics.identify(walletAddress, { ...traits })` after they connect. Use the same Write Key on your marketing site and dapp so Formo can stitch the cross-domain journey.
- ⚑Wagmi autocapture only fires when you actually use wagmi React hooks (`useAccount`, `useSignMessage`, etc.) — if your dapp uses raw viem or ethers, transactions and signatures will NOT autocapture and you must `analytics.track()` them yourself.
- ⚑Next.js App Router: the provider MUST be a `'use client'` component or it will fail to mount; common cause of 'no events arriving in Formo'.
- ⚑GDPR: although Formo brands as privacy-first, it still sets a session identifier — gate the provider behind your CMP for EU/UK users.
- ⚑PII: don't pass email or full name to `identify(address, { ... })`. Stick to wallet address as the primary identity and leave PII to your auth/CRM.
- ⚑Sampling / volume: free tier is event-capped — high-traffic dapps will silently drop events past the cap; instrument server-side aggregates for billing-critical metrics rather than relying solely on client events.
- ⚑Solana support shipped in Feb 2026 and is newer than the EVM path — non-wagmi adapters (e.g. Solana wallet-adapter) require manual `track('wallet_connected', { address, chainId: 'solana' })` calls; not all events autocapture yet.