
- Key user events (connect wallet, transactions, conversions, drop off)
- When whales and high-value users visit your app
- Webhooks (including Slack via incoming webhooks)
How to set up your first alert
Get real-time notifications when high-value users interact with your app. This guide walks you through creating alerts for whale detection and key events.Step 1: Navigate to Alerts
- Go to the Formo Dashboard
- Select your project
- Click Settings in the left navigation (gear icon)
- Select the Alerts tab
Step 2: Create a new alert
- Click Create Alert
- Configure your alert:
| Setting | Description |
|---|---|
| Name | Descriptive name (e.g., “Whale Alert”) |
| Trigger Type | Events or Users (see below) |
| Conditions | Filter conditions (optional) |
| Notification | Webhook (generic HTTP or Slack) |
Step 3: Choose a trigger type
Select whether the alert fires on events or users:- Events
- Users
Triggers when a new event matches your filters. Each matching event is sent to your webhook.
You can add conditions to filter on event properties (e.g.,
| Event Type | When it fires |
|---|---|
| connect | User connects their wallet |
| transaction | User submits a transaction |
| page | User visits a specific page |
| custom | Your custom tracked events |
chain_id = 8453, status = failed).Step 4: Configure notifications
- Webhook
- Slack (via Webhook)
- Select Webhook as the notification type
- Enter your webhook URL (generic HTTPS endpoint or Slack incoming webhook)
- Formo sends a POST request with batched data
- Optional secret: In the alert configuration, you can provide a signing secret used to verify requests on your server.
- For generic webhooks (non-Slack URLs), Formo uses your secret to compute an HMAC-SHA256 signature over the string
{timestamp}.{body}, where:timestampis the Unix timestamp (seconds) used for the requestbodyis the exact JSON payload string sent in the request
| Header | Description |
|---|---|
Content-Type | application/json |
User-Agent | Formo-Alerts/1.0 |
X-Formo-Alert-Id | The alert ID in Formo |
X-Webhook-Signature | HMAC-SHA256 signature (generic webhooks with a secret only) |
X-Webhook-Timestamp | Unix timestamp used in the signature (generic webhooks with a secret only) |
X-Webhook-Event | alert.event.triggered or alert.user.triggered (generic webhooks with a secret only) |
Step 5: Test your alert
- Save your alert configuration
- Trigger a test event:
- Visit your app in a browser
- Connect a wallet
- Perform the action that matches your alert
- Check your Slack channel or webhook endpoint for the notification
Alert payloads
Event alerts
When an event alert is triggered, Formo batches all matching events into a single webhook call.Webhook payload
The webhook payload uses thealert.event.triggered event type and contains raw analytics events:
Top-level properties:
| Property | Type | Description |
|---|---|---|
id | string | Unique event ID (e.g., evt_3f7f9c4e-...) |
type | string | Always alert.event.triggered |
created | number | Unix timestamp (seconds) when the webhook was created |
data | array | Array of raw analytics events that matched your filters |
data:
| Property | Type | Description |
|---|---|---|
project_id | string | Your Formo project ID |
session_id | string | User session ID |
channel | string | Event channel (e.g., web, import) |
type | string | Event type (e.g., connect, transaction, page, track) |
anonymous_id | string | Anonymous user ID |
user_id | string | Identified user ID (if available) |
address | string | Wallet address (if available) |
event | string | Event name |
context | object | Context data (IP, user agent) |
properties | object | Event-specific properties |
version | string | SDK version |
timestamp | string | ISO 8601 timestamp |
message_id | string | Unique message ID |
origin | string | Origin domain |
locale | string | User locale |
location | string | Country code |
timezone | string | User timezone |
page_path | string | Page path |
page_title | string | Page title |
page_url | string | Full page URL |
page_query | string | URL query string |
page_hash | string | URL hash |
library_name | string | SDK library name |
library_version | string | SDK library version |
referrer_url | string | Full referrer URL |
referrer | string | Referrer domain |
ref | string | Ref parameter |
utm_source | string | UTM source |
utm_medium | string | UTM medium |
utm_campaign | string | UTM campaign |
utm_term | string | UTM term |
utm_content | string | UTM content |
user_agent | string | Raw user agent string |
device | string | Device type (e.g., desktop, mobile) |
browser | string | Browser name |
os | string | Operating system |
Slack payload
For Slack incoming webhooks (hooks.slack.com), Formo formats each event as an individual Slack Block Kit card message.
Each message includes:
- A header with the alert name
- A user link (clickable link to Formo profile)
- Event properties (key-value pairs from the event, up to 10 properties)
- Metadata fields: Country, Device, Browser, OS, Referrer, Referral, UTM Source, UTM Medium, UTM Campaign, UTM Term, UTM Content — only shown when non-empty
- A timestamp and View User button
- Up to 25 events per batch, with an overflow summary if more were found
User alerts
When a user alert is triggered, Formo sends matching user profiles to your webhook.Webhook payload
The webhook payload uses thealert.user.triggered event type:
Top-level properties:
| Property | Type | Description |
|---|---|---|
id | string | Unique event ID (e.g., evt_3f7f9c4e-...) |
type | string | Always alert.user.triggered |
created | number | Unix timestamp (seconds) when the webhook was created |
data | array | Array of user profiles that matched your filters |
data contains the full wallet profile. All fields from the profile are included — key properties:
Wallet identity:
| Property | Type | Description |
|---|---|---|
address | string | Wallet address |
net_worth_usd | number | Wallet net worth in USD |
tx_count | number | Total transaction count |
first_onchain | string | First on-chain transaction timestamp |
last_onchain | string | Last on-chain transaction timestamp |
updated_at | string | When the wallet profile was last updated |
ens | string | ENS name |
farcaster | string | Farcaster username |
lens | string | Lens handle |
basenames | string | Base name |
linea | string | Linea name |
avatar | string | null | ENS/Farcaster avatar URL |
display_name | string | Display name |
description | string | Profile description |
profile_url | string | Link to user profile in Formo dashboard |
discord, telegram, website, github, twitter, linkedin, email, instagram, facebook, tiktok, youtube, reddit, linea
Project-level engagement:
| Property | Type | Description |
|---|---|---|
first_seen | string | When the user was first seen (UTC) |
last_seen | string | When the user was last active (UTC) |
num_sessions | number | Total unique sessions |
revenue | number | Total revenue |
volume | number | Total transaction volume |
points | number | Total loyalty points |
lifecycle | string | Lifecycle stage (New, Returning, Power user, Churned, Resurrected) |
activity_dates | string[] | Array of dates the user was active |
location | string | Country code |
device | string | Device type |
browser | string | Browser name |
os | string | Operating system |
| Property | Type | Description |
|---|---|---|
first_referrer | string | First-touch referrer domain |
first_referrer_url | string | First-touch full referrer URL |
first_ref | string | First-touch referral code |
first_utm_source | string | First-touch UTM source |
first_utm_medium | string | First-touch UTM medium |
first_utm_campaign | string | First-touch UTM campaign |
first_utm_term | string | First-touch UTM term |
first_utm_content | string | First-touch UTM content |
last_referrer | string | Last-touch referrer domain |
last_referrer_url | string | Last-touch full referrer URL |
last_ref | string | Last-touch referral code |
last_utm_source | string | Last-touch UTM source |
last_utm_medium | string | Last-touch UTM medium |
last_utm_campaign | string | Last-touch UTM campaign |
last_utm_term | string | Last-touch UTM term |
last_utm_content | string | Last-touch UTM content |
| Property | Type | Description |
|---|---|---|
last_type | string | Last event type (e.g., connect, page, track) |
last_event | string | Last event name |
last_properties | string | JSON-encoded properties of the last event |
Slack payload
For Slack incoming webhooks, Formo formats user profiles as a rich card layout:- A header with the alert name
- Per user: a clickable address header with avatar image (if available), a field grid with key profile data, and a View Profile button
- Up to 25 users per batch, with an overflow summary if more were found
| Field | Source | Conditional |
|---|---|---|
| Lifecycle | lifecycle (e.g., New, Returning, Power user) | Yes — only shown when non-empty |
| Net Worth | net_worth_usd (formatted as $1,234) | No — always shown |
| First Seen | first_seen (formatted date) | No — always shown |
| Location | location | Yes — only shown when non-empty |
| Browser | browser | Yes — only shown when non-empty |
| Device | device | Yes — only shown when non-empty |
| OS | os | Yes — only shown when non-empty |
| Referrer | first_referrer or last_referrer | Yes — only shown when non-empty |
| Referral | first_ref or last_ref | Yes — only shown when non-empty |
| UTM | first_utm_* or last_utm_* (comma-joined) | Yes — only shown when non-empty |
Examples
Whale detection alert
Notify when high-value users visit:| Setting | Value |
|---|---|
| Name | Whale Alert |
| Trigger type | Users |
| Condition | net_worth_usd > 100000 |
| Notification | Slack webhook |
Failed transaction alert
Track when users encounter issues:| Setting | Value |
|---|---|
| Name | Failed TX Alert |
| Trigger type | Events |
| Condition | type = transaction, status = failed |
| Notification | Webhook |
Webhook integration examples
Send to Slack:Next Steps
Wallet Profiles
Learn more about user data available in alerts
Custom Events
Track custom events to alert on
Webhooks API
Full webhook documentation
User Segments
Target specific user groups with alerts