The Core Problem
DeFi marketing suffers from blind targeting. Traditional user personas — "DeFi trader," "yield farmer," "liquidity provider" — are too broad to drive personalized engagement. A user who farms stablecoins at 5% APY has completely different needs than a memecoin degen chasing 100x plays, yet most DeFi projects blast the same Telegram messages to everyone.
The result: high churn, low engagement, and wasted marketing spend. Users unsubscribe because 80% of the messages they receive are irrelevant to their trading style.
DeFiKit solved this with a behavioral segmentation engine that uses on-chain wallet activity to classify users into trading personas. Every signal, every DM, and every promotion is tailored to the user's actual on-chain behavior — not their self-reported preferences.
The Solution: On-Chain Behavioral Segmentation
DeFiKit's segmentation engine analyzes every connected wallet and assigns behavioral tags based on transaction patterns:
```typescript
interface UserSegment {
walletAddress: string;
primaryPersona: TradingPersona;
secondaryPersonas: TradingPersona[];
activityScore: number; // 0-100 based on tx frequency
riskTolerance: 'conservative' | 'moderate' | 'aggressive';
topAssets: string[]; // top 5 tokens traded
lastActiveDate: Date;
averageTradeSize: number; // in USD
}
```
The engine runs on the same NestJS backend as the signal pipeline, querying Solana RPC for wallet transaction history on a scheduled basis (every 6 hours, configurable).
The Six Trading Personas
| Persona | Behavior | Typical Trades | Best Signal Type |
|---------|----------|----------------|------------------|
| Conservative Farmer | Frequent small deposits to lending protocols | staking, supplying, borrowing | Yield opportunity alerts |
| Swing Trader | 2-5 trades/day, $500-$5,000 per trade | mid-cap tokens, trend following | Technical analysis signals |
| Degen Trader | 10+ trades/day, high frequency | memecoins, new pairs, small caps | Alpha alerts, snipe signals |
| Whale Watcher | Few trades but $10K+ each | large caps, OTC | Whale movement alerts |
| Arbitrage Bot | 50+ trades/day automated | DEX spreads, MEV | Gas-optimized arbitrage signals |
| Newcomer | < 10 total transactions | small test trades, faucets | Educational content, demo signals |
DeFiKit's engine starts new users as "Newcomer" and upgrades their persona classification after 15+ transactions with a clear pattern.
Architecture: The Segmentation Pipeline
The segmentation engine runs as a background worker consuming from the same SQS queue used by BotMatrix:
```
Wallet Connected → RPC History Fetcher → Transaction Analyzer → Persona Classifier → Segment Storage
```
RPC History Fetcher
Fetches the last 200 transactions for a given wallet address from Solana RPC. Uses connection pooling to avoid rate limits:
```typescript
async function fetchWalletHistory(walletAddress: string): Promise<Transaction[]> {
const connection = new Connection(process.env.SOLANA_RPC_URL!);
const signatures = await connection.getSignaturesForAddress(
new PublicKey(walletAddress),
{ limit: 200 }
);
const transactions = await Promise.all(
signatures.map(sig => connection.getTransaction(sig.signature))
);
return transactions.filter(tx => tx !== null) as Transaction[];
}
```
Transaction Analyzer
For each transaction, the analyzer extracts:
- **Token transfers**: which tokens, amounts, and direction (in/out)
- **Program interactions**: which DeFi protocols were used (Raydium, Orca, Jupiter, etc.)
- **DEX operations**: swaps, adds/removes liquidity, staking
- **Timing**: timestamp + time between consecutive transactions
```typescript
interface AnalyzedTransaction {
tokenIn: string;
tokenOut: string;
amountIn: number;
amountOut: number;
dexUsed: string;
protocolType: 'swap' | 'liquidity' | 'stake' | 'transfer';
timestamp: Date;
profitLoss?: number; // estimated from known pool prices
}
```
Persona Classifier
A rule-based classifier (not ML — rules are transparent and debuggable) assigns primary and secondary personas based on trade frequency, size, and protocol interaction patterns:
```typescript
function classifyPersona(analysis: WalletAnalysis): UserSegment {
const tradesPerDay = analysis.totalTrades / analysis.daysActive;
const avgTradeSize = analysis.totalVolume / analysis.totalTrades;
if (avgTradeSize > 10000) return { primary: 'whale_watcher', ... };
if (tradesPerDay > 50 && avgTradeSize < 100) return { primary: 'arbitrage_bot', ... };
if (tradesPerDay > 10 && avgTradeSize < 1000) return { primary: 'degen_trader', ... };
if (tradesPerDay > 2) return { primary: 'swing_trader', ... };
if (analysis.stakingYieldRefs > 0) return { primary: 'conservative_farmer', ... };
return { primary: 'newcomer', ... };
}
```
Marketing Automation Based on Segments
Segment-Targeted Signal Delivery
Instead of broadcasting all signals to all users, DeFiKit's BotMatrix filters signals by persona relevance:
```typescript
// Signal routing logic
function shouldDeliverToUser(signal: Signal, user: UserSegment): boolean {
switch (user.primaryPersona) {
case 'conservative_farmer':
return signal.type === 'yield_opportunity' || signal.type === 'staking_alert';
case 'degen_trader':
return signal.type === 'alpha_alert' || signal.type === 'new_pair_listing';
case 'swing_trader':
return signal.type === 'technical_setup' || signal.type === 'support_resistance_break';
case 'whale_watcher':
return signal.type === 'whale_movement' || signal.estimatedProfit > 1000;
case 'newcomer':
return signal.type === 'educational' || signal.confidence > 90;
default:
return true; // fallback: deliver everything
}
}
```
This targeting improved per-user signal relevance from 22% to 79% in A/B tests.
Personalized DM Campaigns
Each segment receives different DM campaigns with different cadences:
| Segment | DM Type | Frequency | Best Time |
|---------|---------|-----------|-----------|
| Conservative Farmer | Yield opportunity alerts | 2x/week | Mon morning, Thu afternoon |
| Swing Trader | Technical setup breakdowns | Daily | Market open (9:30 AM ET) |
| Degen Trader | Alpha signals + new pairs | 3-5x/day | Volatile hours (window 2 AM-6 AM UTC) |
| Whale Watcher | Large transaction alerts | On-event | Immediate |
| Newcomer | Educational series (5 parts) | 1x/day for 5 days | Evenings |
| Inactive (any) | Re-engagement with free credits | 1x/week after 7 days idle | Weekend |
```typescript
// Campaign scheduling based on persona
const campaignRules = {
conservative_farmer: {
type: 'yield_digest',
frequency: 'biweekly',
daysOfWeek: ['Monday', 'Thursday'],
timeWindow: { start: '08:00', end: '10:00' }, // ET
contentTemplate: 'yield_opportunity_v1',
},
degen_trader: {
type: 'alpha_flash',
frequency: 'event_driven', // triggers on new pair detection
timeWindow: { start: '02:00', end: '06:00' }, // UTC
contentTemplate: 'alpha_alert_v2',
},
};
```
Results
| Metric | Before Segmentation | After Segmentation |
|--------|-------------------|-------------------|
| Signal relevance (user-rated) | 22% | 79% |
| Per-user signal delivery (avg/day) | 35 | 8 (targeted) |
| DM unsubscribe rate | 4.2% | 0.7% |
| User engagement (DAU/MAU) | 31% | 67% |
| Signal conversion to trade | 2.1% | 8.3% |
| Newcomer → active trader rate | 12% | 41% |
Key Takeaways
- **On-chain data is the best source of truth for DeFi targeting**: Users' wallets don't lie about their trading preferences — self-reported surveys do
- **Six personas cover 94% of DeFi users**: The remaining 6% are edge cases that fall back to a generic profile
- **Fewer signals = more engagement**: Reducing from 35 to 8 signals per user per day improved relevance 3.6x and cut unsubscribe rate by 83%
- **Rule-based classification beats ML for DeFi**: Trading behavior is pattern-based and interpretable. Rule-based systems are debuggable when segment assignments look wrong
- **Segmentation enables progressive onboarding**: Newcomers get educational content first, then graduate to real signals when their wallet activity changes