The "founder email" converts like crazy and scales like garbage. Here is the middle path.
A personal email from the founder converts trials at a rate no automated sequence touches - and at 50 signups a week it stops scaling. The middle path: drafts generated from each user's real usage, that you read, edit, and send yourself.
The middle path
Everyone knows the trick: a personal email from the founder ("hey, saw you've been using the app - how's it going?") converts trials at a rate no automated sequence touches. And everyone hits the same wall: at 50 signups a week, you either stop sending them or start sending fake-personal ones - "Hi {firstName}, I noticed you signed up!" - which users smell instantly and which burns the exact trust the founder email runs on. The middle path: drafts generated from each user's real usage, that you read, edit, and send yourself. The personal part stays personal - your judgment, your send button. The 20 minutes of digging through analytics per email goes away.
The pipeline
Usage lives in Vevee (@vevee/sdk), which meters my users' AI consumption per user. A daily cron picks high-intent users and composes a draft for each:
import { createClient } from "@vevee/sdk";
const vevee = createClient({ apiKey: process.env.VEVEE_SECRET_KEY! });
interface OutreachDraft {
subject: string;
body: string; // plain text, founder voice
whyThisUser: string; // for ME: why they surfaced today
suggestedTiming: string; // "send today" / "wait for their next session"
}
for (const user of highIntentUsers) {
const draft = await vevee.compose<OutreachDraft>(
"founder-outreach",
user.id,
{ founderName: "Sal", signal: user.signal } // e.g. "hit_limit_twice"
);
if (draft.status === "generated") {
await pushToReviewQueue(user, draft.output); // Slack, Notion, inbox - anywhere I can edit
}
}The intent prompt is the whole product
The compose type's intent prompt does all the work: "Draft a short, plain email from the founder to this user. Reference ONE specific thing they actually did - a feature they use heavily, a wall they hit, a workflow they repeat. Ask one genuine question. No marketing language, no exclamation marks, no 'just checking in.' If their usage gives you nothing specific to say, say so in whyThisUser instead of inventing something." Data sources: user usage, user events, conversion signals. That last instruction matters most. The system is allowed to return "nothing specific to say" - and those users do not get an email. Fake-personal at scale is exactly the failure mode this exists to avoid.
What shows up in my review queue
Here is a real entry. The structured fields (why this user, suggested timing) are for me; the subject and body are the draft itself:
- To: jonas@-
- Why this user: hit the free cap twice this week; usage tripled since the 1st; 0 pricing-page visits - may not know paid tiers exist.
- Suggested timing: send today, he was active 2h ago.
- Subject: the 100-image ceiling
- Hey Jonas - I'm Sal, I build the thing you've been hammering this week (in the best way - you've run more background removals this month than almost anyone).
- I noticed you hit the free cap twice. I'd genuinely like to know: are you batch-processing something for work, or is this a side project that grew teeth? Asking because the answer changes what I'd point you at.
- - Sal
Picking who surfaces
The selection is the other half. Mine is deliberately dumb and runs on the same metering data: hit a limit this week, or usage grew >2x week-over-week, or trial ends within 3 days with real activity. Each fires a signal string into the compose vars so the draft knows why it is being written. The same platform's analytics confirms the loop - tag sends and watch checkout_completed for replies-turned-customers:
await vevee.capture({ distinctId: user.id, event: "paywall_shown",
properties: { surface: "founder_email", signal: user.signal } });The line I won't cross
The moment a "founder email" is sent by a machine it is a newsletter with extra steps, and one user discovering that costs more than the automation saved. Compose handles the part that was never the point (assembling the user's story from usage tables); you keep the part that was (deciding what to say to a human, and saying it). Also enforced for free: users who opted out of AI personalization come back as opted_out - no draft is generated, no usage assembled into a prompt. They can still get a genuinely hand-written note, which is rather the spirit of the thing.
Keep reading
I rewrote my cancel flow with one LLM call. It argues better than I do.
The cancel flow is where SaaS revenue goes to die politely. "Are you sure? You'll lose access to Premium features" has never changed a single mind - but reminding a user of their own 312 generations this month is an argument.
ComposeThe trial-ending email everyone sends is the same email. Here's the one that converts
"Your trial ends in 3 days! Upgrade now to keep access." You've received a hundred of these. You've deleted a hundred of these. The email fails because it's about your product, not about the user's trial.