Template · Executives

Quarterly investor update

A few days into each quarter, Claude Code reads the finance exports, dashboards and weekly briefings saved in your folder over the quarter and drafts the update: headline metrics, highlights, lowlights, asks. A second model reads it as a skeptical board member and lists the questions it raises, so you can answer them before anyone else asks.

Download .json

Schedule0 9 5 1,4,7,10 *Quarterly investor updateQuarterly · 5th
Pipeline
  1. This quarter’s files Shell
  2. Draft the update Claude Code · Opus
  3. Board member read Claude API · Opus 5
  4. Approve update You
  5. Save update Shell
Fileupdates/2026-Q3.mdARR $18.4M (+9% QoQ), 3 asks, 6 board questions answeredSaved
The pipeline

What each step does

  1. This quarter’s files

    Shell

    Lists the files added or changed in the last 100 days, leaving out past updates.

  2. Draft the update

    Claude Code · Opus

    Reads the files and drafts the update with metrics, highlights, lowlights and asks.

  3. Board member read

    Claude API · Opus 5

    A skeptical board member reads the draft and lists the questions it raises.

  4. Approve update

    You

    Shows you the draft and the board questions. Reject with answers to fold them in.

  5. Save update

    Shell

    Saves the approved update in the updates folder.

Set it up

From copy to first run

  1. Copy the pipeline JSON with the button above.
  2. In Jimothy, open Pipelines → New pipeline, paste it under “Or import a pipeline JSON” and click Import.
  3. Under Workspace, choose the folder with the quarter’s metrics exports and briefings (the weekly briefing template’s folder works).
  4. Fill in the variables below under Pipeline settings → Variables.
  5. Triggers → Add trigger → Schedule, cron 0 9 5 1,4,7,10 * (09:00 on the 5th of each quarter’s first month).
Variables

What to fill in

The prompts and commands read these as {{vars.<name>}}. The examples are placeholders: replace them with your own.

VariableWhat to put in itExample
companyYour company, stage and what investors care about.Acme, Series B, $18M ARR, reporting tool for finance teams
asksStanding asks for investors, e.g. intros or hires. Leave empty if none.Intros to VP Sales candidates with mid-market SaaS experience.
updatesFolderFolder where approved updates are saved.updates
Show the pipeline JSON
{
  "jimothyPipeline": 1,
  "name": "Quarterly investor update",
  "description": "Drafts the quarterly investor update from your metrics and briefings, with a board member’s questions to answer first.",
  "icon": "workflow",
  "color": "#7c3aed",
  "repo": {
    "mode": "inplace",
    "localPath": ""
  },
  "concurrency": 1,
  "variables": {
    "company": "Acme, Series B, $18M ARR, reporting tool for finance teams",
    "asks": "Intros to VP Sales candidates with mid-market SaaS experience.",
    "updatesFolder": "updates"
  },
  "steps": [
    {
      "id": "gather",
      "name": "This quarter’s files",
      "type": "shell",
      "description": "Lists the files added or changed in the last 100 days, leaving out past updates.",
      "timeoutMinutes": 2,
      "command": "u={{vars.updatesFolder}}; find . -type f -mtime -100 -not -path \"./$u/*\" -not -name '.*' | sort | head -300"
    },
    {
      "id": "draft",
      "name": "Draft the update",
      "type": "agent",
      "description": "Reads the files and drafts the update with metrics, highlights, lowlights and asks.",
      "harnessId": "claude-code",
      "model": "opus",
      "dependsOn": [
        "gather"
      ],
      "timeoutMinutes": 40,
      "prompt": "Draft the quarterly investor update for {{vars.company}} for the quarter that just ended.\n\nFiles from the quarter:\n{{steps.gather.output}}\n\nRead them (do not modify anything). Compute any metric changes with a script, not in your head. Write in Markdown:\n# <Company> · <Quarter> update\n## TL;DR (three bullets)\n## Metrics (table: metric, this quarter, last quarter, change; only metrics the files support)\n## Highlights\n## Lowlights (be candid: misses, churn, delays, and what we're doing about them)\n## Priorities next quarter\n## Asks\n{{vars.asks | default:\"(no standing asks)\"}}\n\nCite the source file in brackets after each number. Under 900 words.{{#if steps.approve.output}}\n\nYour previous draft was rejected with this feedback, and the board questions below were raised. Rewrite it:\n{{steps.approve.output}}{{/if}}"
    },
    {
      "id": "questions",
      "name": "Board member read",
      "type": "agent",
      "description": "A skeptical board member reads the draft and lists the questions it raises.",
      "harnessId": "anthropic-api",
      "model": "claude-opus-5",
      "dependsOn": [
        "draft"
      ],
      "timeoutMinutes": 10,
      "systemPrompt": "You are an experienced, skeptical board member at {{vars.company}}.",
      "prompt": "Read this draft investor update:\n\n{{steps.draft.output}}\n\nList the questions you would ask on the board call, most important first: numbers that don't reconcile, trends it glosses over, lowlights without a plan, metrics conspicuously missing. One line each, at most eight."
    },
    {
      "id": "approve",
      "name": "Approve update",
      "type": "approval",
      "description": "Shows you the draft and the board questions. Reject with answers to fold them in.",
      "dependsOn": [
        "questions"
      ],
      "loopBackTo": "draft",
      "maxLoops": 3,
      "approvalMessage": "**Questions a board member would ask**\n\n{{steps.questions.output}}\n\nReject with answers to fold them into the update, or approve to save it.\n\n---\n\n{{steps.draft.output}}"
    },
    {
      "id": "save",
      "name": "Save update",
      "type": "shell",
      "description": "Saves the approved update in the updates folder.",
      "dependsOn": [
        "approve"
      ],
      "timeoutMinutes": 1,
      "command": "mkdir -p {{vars.updatesFolder}} && f={{vars.updatesFolder}}/update-$(date +%F).md && printf '%s\\n' {{steps.draft.output}} > \"$f\" && echo \"Saved $(pwd)/$f\""
    }
  ]
}