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