Investor Report
Generate a concise, data-driven investor report for Solum Health. Pulls metrics from
Google Sheets and customer conversation insights from Fireflies. Outputs a DOCX file
matching the investor update template.
Template Structure
The DOCX template lives at:
~/Documents/Claude/Agents/Investor Report/Investor Update Template.docx
The report follows this EXACT structure. No headings, no markdown. Just bold section
labels followed by bullet lists. Font is Arial 11pt, US Letter, 1" margins.
Subject: Solum Health Investor Update: {Month} {Year}
{1-2 sentence exec summary of the month. Written by the founder. Conversational.}
Metrics:
* Revenue: ${MRR} MRR / ${ARR} ARR ({direction} from ${prev} last month, {+/-pct}%)
* Clients: {live} live, {signed} signed ({direction} from {prev} last month)
* Cash: ${cash}
* Burn: ${burn}/mo
* Runway: {months} months
{Optional: chart image if available}
Asks:
* {Specific request to investors: intros, hires, advice}
* {Another ask}
Highlights:
* {Win 1 in founder voice}
* {Win 2 in founder voice}
* {Win 3 in founder voice}
Lowlights:
* {Challenge 1 with context}
* {Challenge 2 with context}
Shout outs:
* {Thank specific investors or people who helped}
Goals/priorities for next month:
* {Goal 1 with specific target}
* {Goal 2 with specific target}
* {Goal 3 with specific target}
DOCX Generation
Generate the report as a .docx file using docx-js. Match the template exactly:
- Font: Arial 11pt (22 half-points)
- Page: US Letter (12240 x 15840 DXA), 1" margins
- Line spacing: 1.15 (276 twips)
- Section labels: Bold, no colon space after
- Bullet items: Standard bullet list with 720 indent, 360 hanging
- Metric labels (Revenue:, Cash:, etc.): Bold within the bullet
- Empty paragraph between sections
- No headings, no horizontal rules, no tables for metrics
Save output to: ~/Documents/Claude/Agents/Investor Report/Solum Health Investor Update {Month} {Year}.docx
Data Sources
1. Google Sheets (KPI Dashboard)
Spreadsheet ID: 1zjXHQGdQXerCsWJ9fNZGaNoS-U8vwXHt
Sheet GID: 1150083451
Try reading via gws sheets +read. If unavailable, ask the user to paste metrics or
provide them inline. Never block the report on a single data source.
Core metrics to extract:
- Clients (Live) and Clients (Signed)
- ARR and MRR
- Cash on Hand
- Monthly Burn
- Runway (Months)
- MoM deltas for all
2. Fireflies (Customer Conversations)
Pull customer-facing calls from the reporting period.
fireflies_get_transcripts: mine=true, fromDate={periodStart}, toDate={periodEnd}, limit=50, format=json
If period has 50+ meetings, paginate with a second call for the earlier half.
Filter to customer calls only:
KEEP calls where:
- Title contains a company name + "Solum" (e.g., "TRAAC X Solum Health")
- Title contains "Assessment", "FUP", "Onboarding", "Demo", "Touchpoint", "Alignment"
- At least one participant is NOT @getsolum.com
EXCLUDE calls where:
- All participants are @getsolum.com (internal)
- Title contains "Daily", "Weekly Master-Room", "Roman Coliseum", "CEO Operations",
"Growth Solum", "Product Operations", "Standup", "Interview"
- Title suggests personal/non-business meetings
For calls with summaries, extract:
- Customer name and topics discussed
- Expansion signals (new locations, more services, referrals)
- Risk signals (pricing concerns, churn, competitor mentions)
- Key themes across all calls
Writing Rules
These are non-negotiable:
- Use the founder's actual words. If the user provides bullet points or notes, use
their phrasing. Clean up typos and grammar but do NOT rewrite their voice.
- No AI language. Ban: "significant progress", "gaining traction", "we're excited",
"leveraging", "streamlining", "driving growth", "robust". If it sounds like ChatGPT
wrote it, rewrite it.
- No em dashes. Use commas or periods instead.
- Short sentences. 2-3 sentences per bullet max.
- Specific over vague. Name the client, name the number, name the action.
- First person. "We" not "the company" or "Solum Health".
- Conversational. Like you're writing to people who already know the business.
- Honest about lows. Say what went wrong, say why, say what you're doing. No spin.
Workflow
- Determine period: Default = previous calendar month. Parse user input for custom range.
- Collect metrics: Try Google Sheet first. Fall back to user-provided data.
- Pull Fireflies data: Get customer calls for the period. Fetch summaries. Analyze themes.
- Ask the user for their input: Before generating, ask for:
- Any specific highlights they want to include
- Any lowlights or challenges
- Asks for investors
- Shout outs
- Goals for next month
If the user already provided this info, skip asking.
- Generate the DOCX: Use docx-js to create the file matching the template format exactly.
- Validate: Run
python scripts/office/validate.py on the output.
- Tell the user where the file was saved.
DOCX Code Reference
Use this structure for generating the document with docx-js:
const { Document, Packer, Paragraph, TextRun, AlignmentType, LevelFormat } = require('docx');
const fs = require('fs');
const doc = new Document({
numbering: {
config: [{
reference: "bullets",
levels: [{
level: 0,
format: LevelFormat.BULLET,
text: "\u2022",
alignment: AlignmentType.LEFT,
style: { paragraph: { indent: { left: 720, hanging: 360 } } }
}]
}]
},
styles: {
default: {
document: {
run: { font: "Arial", size: 22 } // 11pt
}
}
},
sections: [{
properties: {
page: {
size: { width: 12240, height: 15840 },
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }
}
},
children: [
// Subject line: "Subject:" bold + rest normal
new Paragraph({
children: [
new TextRun({ text: "Subject:", bold: true }),
new TextRun(" Solum Health Investor Update: {Month} {Year}")
]
}),
// Empty line
new Paragraph({}),
// Exec summary
new Paragraph({ children: [new TextRun("{exec summary}")] }),
// Empty line
new Paragraph({}),
// Metrics header
new Paragraph({ children: [new TextRun({ text: "Metrics:", bold: true })] }),
// Metric bullets with bold labels
new Paragraph({
numbering: { reference: "bullets", level: 0 },
children: [
new TextRun({ text: "Revenue:", bold: true }),
new TextRun(" ${value} ({delta})")
]
}),
// ... more metrics
// Empty line
new Paragraph({}),
// Asks header
new Paragraph({ children: [new TextRun({ text: "Asks:", bold: true })] }),
// Ask bullets (normal text)
// ... same pattern for Highlights, Lowlights, Shout outs, Goals
]
}]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync(outputPath, buffer);
});
Each section follows the same pattern:
- Bold label paragraph (e.g., "Highlights:")
- Bullet list items using numbering reference
- Empty paragraph separator
Integration Notes
- Depends on: Fireflies MCP, docx npm package (install globally:
npm install -g docx)
- Optional: Google Sheets via gws CLI
- Template reference:
~/Documents/Claude/Agents/Investor Report/Investor Update Template.docx
- Output goes to same directory with month/year in filename
1---2name: investor-report3description: Generate concise investor reports for Solum Health. Pulls metrics from Google Sheets, analyzes customer conversations from Fireflies, and produces a structured DOCX report matching the investor update template. Use this skill when the user says "investor report", "investor update", "monthly report for investors", "board update", "generate investor deck", "how are we doing this month", or any variation of wanting a periodic investor-facing summary. Default period: previous calendar month. User can specify a different period.4---56# Investor Report78Generate a concise, data-driven investor report for Solum Health. Pulls metrics from9Google Sheets and customer conversation insights from Fireflies. Outputs a DOCX file10matching the investor update template.1112## Template Structure1314The DOCX template lives at:15`~/Documents/Claude/Agents/Investor Report/Investor Update Template.docx`1617The report follows this EXACT structure. No headings, no markdown. Just bold section18labels followed by bullet lists. Font is Arial 11pt, US Letter, 1" margins.1920```21Subject: Solum Health Investor Update: {Month} {Year}2223{1-2 sentence exec summary of the month. Written by the founder. Conversational.}2425Metrics:26 * Revenue: ${MRR} MRR / ${ARR} ARR ({direction} from ${prev} last month, {+/-pct}%)27 * Clients: {live} live, {signed} signed ({direction} from {prev} last month)28 * Cash: ${cash}29 * Burn: ${burn}/mo30 * Runway: {months} months3132{Optional: chart image if available}3334Asks:35 * {Specific request to investors: intros, hires, advice}36 * {Another ask}3738Highlights:39 * {Win 1 in founder voice}40 * {Win 2 in founder voice}41 * {Win 3 in founder voice}4243Lowlights:44 * {Challenge 1 with context}45 * {Challenge 2 with context}4647Shout outs:48 * {Thank specific investors or people who helped}4950Goals/priorities for next month:51 * {Goal 1 with specific target}52 * {Goal 2 with specific target}53 * {Goal 3 with specific target}54```5556## DOCX Generation5758Generate the report as a `.docx` file using `docx-js`. Match the template exactly:5960- Font: Arial 11pt (22 half-points)61- Page: US Letter (12240 x 15840 DXA), 1" margins62- Line spacing: 1.15 (276 twips)63- Section labels: Bold, no colon space after64- Bullet items: Standard bullet list with 720 indent, 360 hanging65- Metric labels (Revenue:, Cash:, etc.): Bold within the bullet66- Empty paragraph between sections67- No headings, no horizontal rules, no tables for metrics6869Save output to: `~/Documents/Claude/Agents/Investor Report/Solum Health Investor Update {Month} {Year}.docx`7071## Data Sources7273### 1. Google Sheets (KPI Dashboard)7475**Spreadsheet ID:** `1zjXHQGdQXerCsWJ9fNZGaNoS-U8vwXHt`76**Sheet GID:** `1150083451`7778Try reading via `gws sheets +read`. If unavailable, ask the user to paste metrics or79provide them inline. Never block the report on a single data source.8081Core metrics to extract:82- Clients (Live) and Clients (Signed)83- ARR and MRR84- Cash on Hand85- Monthly Burn86- Runway (Months)87- MoM deltas for all8889### 2. Fireflies (Customer Conversations)9091Pull customer-facing calls from the reporting period.9293```94fireflies_get_transcripts: mine=true, fromDate={periodStart}, toDate={periodEnd}, limit=50, format=json95```9697If period has 50+ meetings, paginate with a second call for the earlier half.9899**Filter to customer calls only:**100101KEEP calls where:102- Title contains a company name + "Solum" (e.g., "TRAAC X Solum Health")103- Title contains "Assessment", "FUP", "Onboarding", "Demo", "Touchpoint", "Alignment"104- At least one participant is NOT @getsolum.com105106EXCLUDE calls where:107- All participants are @getsolum.com (internal)108- Title contains "Daily", "Weekly Master-Room", "Roman Coliseum", "CEO Operations",109 "Growth Solum", "Product Operations", "Standup", "Interview"110- Title suggests personal/non-business meetings111112For calls with summaries, extract:113- Customer name and topics discussed114- Expansion signals (new locations, more services, referrals)115- Risk signals (pricing concerns, churn, competitor mentions)116- Key themes across all calls117118## Writing Rules119120These are non-negotiable:1211221. **Use the founder's actual words.** If the user provides bullet points or notes, use123 their phrasing. Clean up typos and grammar but do NOT rewrite their voice.1242. **No AI language.** Ban: "significant progress", "gaining traction", "we're excited",125 "leveraging", "streamlining", "driving growth", "robust". If it sounds like ChatGPT126 wrote it, rewrite it.1273. **No em dashes.** Use commas or periods instead.1284. **Short sentences.** 2-3 sentences per bullet max.1295. **Specific over vague.** Name the client, name the number, name the action.1306. **First person.** "We" not "the company" or "Solum Health".1317. **Conversational.** Like you're writing to people who already know the business.1328. **Honest about lows.** Say what went wrong, say why, say what you're doing. No spin.133134## Workflow1351361. **Determine period:** Default = previous calendar month. Parse user input for custom range.1372. **Collect metrics:** Try Google Sheet first. Fall back to user-provided data.1383. **Pull Fireflies data:** Get customer calls for the period. Fetch summaries. Analyze themes.1394. **Ask the user for their input:** Before generating, ask for:140 - Any specific highlights they want to include141 - Any lowlights or challenges142 - Asks for investors143 - Shout outs144 - Goals for next month145 If the user already provided this info, skip asking.1465. **Generate the DOCX:** Use docx-js to create the file matching the template format exactly.1476. **Validate:** Run `python scripts/office/validate.py` on the output.1487. **Tell the user** where the file was saved.149150## DOCX Code Reference151152Use this structure for generating the document with docx-js:153154```javascript155const { Document, Packer, Paragraph, TextRun, AlignmentType, LevelFormat } = require('docx');156const fs = require('fs');157158const doc = new Document({159 numbering: {160 config: [{161 reference: "bullets",162 levels: [{163 level: 0,164 format: LevelFormat.BULLET,165 text: "\u2022",166 alignment: AlignmentType.LEFT,167 style: { paragraph: { indent: { left: 720, hanging: 360 } } }168 }]169 }]170 },171 styles: {172 default: {173 document: {174 run: { font: "Arial", size: 22 } // 11pt175 }176 }177 },178 sections: [{179 properties: {180 page: {181 size: { width: 12240, height: 15840 },182 margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }183 }184 },185 children: [186 // Subject line: "Subject:" bold + rest normal187 new Paragraph({188 children: [189 new TextRun({ text: "Subject:", bold: true }),190 new TextRun(" Solum Health Investor Update: {Month} {Year}")191 ]192 }),193 // Empty line194 new Paragraph({}),195 // Exec summary196 new Paragraph({ children: [new TextRun("{exec summary}")] }),197 // Empty line198 new Paragraph({}),199 // Metrics header200 new Paragraph({ children: [new TextRun({ text: "Metrics:", bold: true })] }),201 // Metric bullets with bold labels202 new Paragraph({203 numbering: { reference: "bullets", level: 0 },204 children: [205 new TextRun({ text: "Revenue:", bold: true }),206 new TextRun(" ${value} ({delta})")207 ]208 }),209 // ... more metrics210 // Empty line211 new Paragraph({}),212 // Asks header213 new Paragraph({ children: [new TextRun({ text: "Asks:", bold: true })] }),214 // Ask bullets (normal text)215 // ... same pattern for Highlights, Lowlights, Shout outs, Goals216 ]217 }]218});219220Packer.toBuffer(doc).then(buffer => {221 fs.writeFileSync(outputPath, buffer);222});223```224225Each section follows the same pattern:2261. Bold label paragraph (e.g., "Highlights:")2272. Bullet list items using numbering reference2283. Empty paragraph separator229230## Integration Notes231232- Depends on: Fireflies MCP, docx npm package (install globally: `npm install -g docx`)233- Optional: Google Sheets via gws CLI234- Template reference: `~/Documents/Claude/Agents/Investor Report/Investor Update Template.docx`235- Output goes to same directory with month/year in filename