Ultron

Investor Update Drafter

Compose a monthly investor update from metrics, milestones, and qualitative notes in your voice, ready to send via email.

Next.jsTypeScriptZod

Capabilities

Pull period metrics from Stripe, warehouse, or a spreadsheet
Convert founder shorthand on wins, lows, and asks into a structured update
Draft TL;DR + Metrics + Wins + Lows + Asks + Forward in 5 minutes
Match the founder's voice from past updates so it doesn't read as templated
System Prompt
You are a founder's chief of staff. You ghostwrite investor updates that sound like the founder, not a template.

WORKFLOW:
1. Call ingest_metrics from the user's revenue, growth, and ops dashboards.
2. Call gather_qualitative for wins, lows, and asks the founder typed in plain English.
3. Call draft_update structured as: TL;DR · Metrics · Wins · Lows · Asks · Forward.
4. Call match_voice against past updates to keep tone consistent.

RULES:
- Lead with TL;DR in 3 bullets max. Investors skim.
- Never sandbag bad metrics. State the number, then the why, then the action.
- Asks must be specific (intro to X, hire role Y, advice on Z) — never "any thoughts welcome".
- Match founder voice: if they swear in past updates, swear; if not, don't.
Agent Source
import { agent, tool } from "@agent-sdk"
import { z } from "zod"

const metricsInput = z.object({
  period: z.string(),
  source: z.enum(["stripe", "warehouse", "spreadsheet"]).default("stripe"),
})

export default agent({
  model: "claude-sonnet-4-6",
  permissionMode: "bypassPermissions",
  maxTurns: 14,
  systemPrompt: `...`, // see System Prompt section above
  tools: {
    ingest_metrics: tool({
      description: "Pull metrics for the period",
      inputSchema: metricsInput,
      execute: async ({ period, source }) => { /* dashboard pull */ },
    }),
    gather_qualitative: tool({
      description: "Read founder's plain-language notes for wins/lows/asks",
      inputSchema: z.object({ notes: z.string() }),
      execute: async ({ notes }) => { /* parsed */ },
    }),
    draft_update: tool({
      description: "Assemble update with TL;DR, metrics, wins, lows, asks, forward",
      inputSchema: z.object({ metrics: z.any(), notes: z.any() }),
      execute: async ({ metrics, notes }) => { /* markdown email */ },
    }),
    match_voice: tool({
      description: "Calibrate tone against past updates",
      inputSchema: z.object({ draft: z.string(), pastUpdates: z.array(z.string()) }),
      execute: async ({ draft, pastUpdates }) => { /* tuned draft */ },
    }),
  },
})

File Structure

agents/
investor-update-drafter.ts
lib/investor-update/
metrics.ts
draft.ts
voice.ts
app/api/investor-update/
route.ts
Setup
$ npm install
$ cp .env.example .env.local
# Add metrics source credentials
$ npm run dev

Environment Variables

STRIPE_SECRET_KEYStripe key for revenue metrics (optional)
AGENT_API_KEYServer-side API key for token exchange

Sell This Agent

Investor updates take a Sunday afternoon and get skipped if late. This produces a draft in 5 minutes that sounds like you wrote it.

Setup fee
$2,000
Monthly retainer
$300/mo
Target marketFunded founders, VCs, Chiefs of staff

Included

Full agent source code
Metrics ingestion
Voice matching
Connect to Ultron pipelineUnlock
Auto-send via Mailchimp / ResendUnlock
Turn views into income.Drop your video link, get paid as the view count climbs.
Submit a video