What you get
Enrichment writes three datasets, all queryable in the SQL editor and joined together incontact_360.
- Wallet metrics
- Activity summary
- NFT holdings
One row per wallet in
user_onchain_metrics:Derived scores
Two fields are computed rather than fetched. Both are heuristics, useful for ranking and segmentation, not accounting.Engagement score (0–100)
A weighted blend of recent activity, capped so no single signal dominates:
A wallet with 20+ transactions, activity most days, a few collections, and a five-figure portfolio approaches 100. A dormant wallet trends toward zero.
Estimated LTV
A weighted blend biased toward realized value:churn_risk is not an enrichment field. It’s derived at query time in contact_360 from last_activity_at: low within 30 days, medium at 30–60, high beyond 60. Enrichment supplies the activity timestamps that drive it.Supported chains
Enrichment reads directly from the chains, so the data reflects real on-chain history. EVM mainnets:eth-mainnet, base-mainnet, matic-mainnet, bsc-mainnet, arbitrum-mainnet, optimism-mainnet, sei-mainnet. Solana: solana-mainnet. Testnets including eth-sepolia, base-sepolia-testnet, monad-testnet, and solana-devnet are also supported.
A wallet is enriched per chain, so metrics reflect the chain you enriched it on. Enrich the same wallet on multiple chains to build a cross-chain picture, activity summaries are stored per chain.
When enrichment runs
1
On profile view (automatic)
Opening a contact profile that has a wallet triggers enrichment if it’s never been enriched or is more than 7 days stale. This keeps active profiles fresh without any work from you.
2
On project-settings save (automatic)
Saving project settings that include contract addresses enriches the holders of those contracts in the background.
3
On demand
Refresh a specific wallet, your contacts, or a contract’s holders whenever you need current numbers.
Enriching on demand
Three ways to enrich beyond the automatic paths:
Enrichment is asynchronous, the request returns as soon as the work is queued. Progress is visible as a live queue count, and the workspace reports itself idle once everything has drained. Each wallet’s
last_enriched_at advances when its refresh completes, so you can also tell per wallet.
Enrichment jobs are deduplicated per wallet and chain, so enqueuing the same wallet twice in quick succession won’t double-spend credits.
Syncing holders
Enrichment refreshes wallets you already have. Sync does the other half: it discovers the current holders of your configured contracts and adds the new ones as contacts, growing your audience from on-chain reality. Run it from the dashboard whenever you want to pull in holders you don’t have yet. Owner, Admin, or Editor can start a sync. A sync runs in two phases. First it reads the current holders of every contract you’ve configured and, for each holder that isn’t already a contact, adds a wallet contact and records that contract balance, this is where new wallets enter your audience. Then it enriches, refreshing metrics for the wallets in the run, both the ones you already had and the ones just discovered. While it runs you can watch two live counts: how many wallets are being processed, and how many brand-new contacts have been discovered and added. Discovery never changes existing contacts, and it stops adding once you reach your plan’s contact limit.Sync vs enrich: the credit difference
Both pull from indexed on-chain data, but they cost very differently, and the difference is deliberate.Reach for Sync to pull in holders you don’t have yet, it’s cheap because it looks up the holder list once per contract. Reach for Enrich when you need each wallet’s portfolio, activity, and scores refreshed, which is where the per-wallet credit cost lives. Discovery adds contacts without spending per-wallet credits; the enrich phase is what draws down your budget.
Cost and limits
Enrichment consumes wallet-data credits, up to 4 per wallet, covering balances, transactions, NFTs, and portfolio. The portfolio call is skipped when it isn’t needed, so a wallet often costs fewer. Each paid plan includes a monthly allowance:
Once the allowance is exhausted, new enrichment is blocked, though the SQL editor and your already-enriched data keep working. On Pay as you go, enrichment draws from your balance at $10 per 10,000 credits (about 4¢ a wallet) rather than a monthly allowance.
Recent results are held briefly, a few minutes for transactions, a little longer for balances, portfolio, and NFTs, so re-enriching the same wallet within those windows reuses the fresh data and doesn’t re-spend credits, unless you explicitly force a refresh.
Using enriched data
Query it in SQL
user_onchain_metrics, wallet_activity_summary, nft_holdings, and the joined contact_360 view.Build audiences
Whales, dormant holders, high-LTV wallets, save any query as a segment.
Score and prioritize
Engagement score feeds contact health and churn signals.
Personalize messages
Reference wallet traits as merge variables in campaigns.
contact_360, where enrichment is already joined to identity and email engagement:
Campaign merge variables for on-chain fields (like
portfolioValueUsd) render from contact metadata, not directly from the enrichment tables. The enrichment tables feed analytics and segmentation through contact_360; for per-recipient personalization, the value needs to be present in the contact’s metadata.
