Investment pitch deck generation from financial statements
- Published
You've just received a financial statement from a prospective company. Your fund or investment committee needs a polished pitch deck within hours, not days. The traditional workflow involves manually extracting data, writing summaries, designing slides, and creating visual representations. It's repetitive, error-prone, and takes time you don't have.
This is where automation becomes genuinely useful. By connecting three complementary AI tools through an orchestration platform, you can transform a raw financial PDF into a presentation-ready deck with minimal human intervention. The workflow extracts key metrics from the financial statement, generates compelling narrative content, and converts complex data into infographics; all without jumping between applications or re-entering data.
This guide walks through building that workflow using Chat with PDF by Copilotus (for document analysis), Preswald AI (for content generation), and Text2Infographic (for visual conversion). We'll focus on practical implementation details so you can actually build this yourself.......
The Automated Workflow
Why this combination of tools?
Chat with PDF by Copilotus handles document intelligence without requiring you to manually read through balance sheets and income statements. Preswald AI generates structured, investment-grade presentation content from extracted data. Text2Infographic transforms those numbers into visual assets. Together, they cover the entire pipeline from raw financial data to finished output.
Choosing an orchestration platform
For this workflow, n8n is the best choice. Unlike Zapier (which has limited PDF handling), n8n gives you direct HTTP access to all three tools and better control over data transformation between steps. Make (Integromat) is a close second, but n8n's node library and JSON handling make the financial data extraction cleaner.
Claude Code is also viable if you're comfortable building Python scripts, but we'll focus on n8n for this walkthrough since most users won't want to maintain code.
Workflow overview
Here's the data flow:
- Receive a PDF financial statement (via email, webhook, or direct upload)
- Extract key financial metrics using Chat with PDF
- Generate narrative sections (executive summary, investment thesis) using Preswald AI
- Convert financial tables into infographics using Text2Infographic
- Assemble slides into a presentation file
- Store the output and notify stakeholders
Step 1: PDF extraction and analysis
Start by uploading the financial statement to Chat with PDF by Copilotus. You'll need your API key from the Copilotus dashboard.
The extraction prompt should be specific. Rather than asking the model to "summarise the financial statement," you want structured JSON output:
Extract the following data from this financial statement in JSON format:
{
"company_name": "",
"fiscal_year": "",
"revenue": {
"current_year": 0,
"previous_year": 0,
"growth_percentage": 0
},
"ebitda": {
"current_year": 0,
"margin_percentage": 0
},
"net_income": {
"current_year": 0,
"previous_year": 0
},
"total_assets": 0,
"debt_to_equity": 0,
"cash_on_hand": 0,
"key_segments": []
}
Be precise with numbers. Round to nearest thousand where appropriate.
In n8n, create an HTTP Request node with these settings:
Method: [POST](/tools/post)
URL: https://api.copilotus.io/v1/chat/pdf
Headers:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Body:
{
"pdf_url": "{{ $json.pdf_url }}",
"prompt": "Extract the following data...",
"response_format": "json"
}
The output from this node is a JSON object containing your extracted financials. Pass this directly to the next node; don't store it yet.
Step 2: Generate presentation content
Preswald AI takes structured data and generates presentation copy. Their API expects a content brief:
POST https://api.preswald.io/v1/generate/presentation
Authorization: Bearer YOUR_PRESWALD_API_KEY
Content-Type: application/json
{
"presentation_type": "investor_pitch",
"company_name": "{{ $json.company_name }}",
"financial_data": {
"revenue": {{ $json.revenue.current_year }},
"revenue_growth": {{ $json.revenue.growth_percentage }},
"ebitda": {{ $json.ebitda.current_year }},
"net_income": {{ $json.net_income.current_year }}
},
"sections": [
"executive_summary",
"financial_highlights",
"investment_thesis"
],
"tone": "professional",
"length": "medium"
}
In n8n, add another HTTP Request node. Map the extracted financial data from Step 1 using the variable syntax shown above. Preswald will return structured slide content:
{
"slides": [
{
"title": "Executive Summary",
"content": "Generated narrative text...",
"bullet_points": []
},
{
"title": "Financial Highlights",
"content": "...",
"bullet_points": ["Revenue grew X%", "EBITDA margin improved to Y%"]
}
]
}
Step 3: Convert financial tables to infographics
Text2Infographic turns data tables into visual representations. You'll feed it the numerical data from Step 1 and slide content from Step 2:
POST https://api.text2infographic.io/v1/generate
Authorization: Bearer YOUR_TEXT2INFOGRAPHIC_API_KEY
Content-Type: application/json
{
"title": "{{ $json.company_name }} Financial Overview",
"data_type": "financial",
"data": {
"labels": ["Revenue", "EBITDA", "Net Income"],
"values": [
{{ $json.revenue.current_year }},
{{ $json.ebitda.current_year }},
{{ $json.net_income.current_year }}
],
"comparison": {
"labels": ["Current Year", "Previous Year"],
"datasets": [
{
"label": "Revenue",
"values": [{{ $json.revenue.current_year }}, {{ $json.revenue.previous_year }}]
}
]
}
},
"style": "corporate",
"format": "svg"
}
This returns an SVG image which you can embed directly into your presentation.
Step 4: Assembling everything in n8n
Your n8n workflow now has three sequential HTTP nodes. The final step is assembly. You have two options:
Option A: Create a simple JSON output file containing all extracted data, generated content, and infographic URLs. This serves as a template for manual assembly.
Option B: Use a nodes library like LibreOffice or a Python script to programmatically build a PPTX file.
For most users, Option A is sufficient. Add a Write Binary File node:
{
"filename": "{{ $json.company_name }}_pitch_deck_data.json",
"data": {
"company": {{ $json.company_name }},
"extracted_financials": {{ $json }},
"presentation_content": {{ $json.slides }},
"infographic_url": "{{ $json.infographic_svg }}",
"generated_at": "{{ now() }}"
}
}
If you want full automation, use Claude Code as a separate step. Create a webhook that triggers a Claude Code task:
import json
import base64
from pptx import Presentation
from pptx.util import Inches, Pt
data = json.loads(os.environ['WORKFLOW_DATA'])
# Create presentation
prs = Presentation()
blank_slide_layout = prs.slide_layouts[6]
# Add title slide
slide = prs.slides.add_slide(blank_slide_layout)
title_shape = slide.shapes.title
title_shape.text = data['company_name'] + " Pitch Deck"
# Add financial highlights slide
slide = prs.slides.add_slide(blank_slide_layout)
for idx, slide_content in enumerate(data['presentation_content']['slides']):
if idx < 3:
text_frame = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(5)).text_frame
text_frame.text = slide_content['title']
text_frame.word_wrap = True
# Save and return
prs.save('/tmp/pitch_deck.pptx')
Handling file delivery
The final n8n node should either upload the completed deck to cloud storage (Google Drive, S3) or send it via email:
Method: POST
URL: https://api.sendgrid.com/v3/mail/send
Headers:
Authorization: Bearer YOUR_SENDGRID_API_KEY
Body:
{
"personalizations": [{
"to": [{"email": "{{ $json.recipient_email }}"}],
"subject": "Pitch Deck Ready: {{ $json.company_name }}"
}],
"from": {"email": "noreply@yourfund.com"},
"content": [{
"type": "text/plain",
"value": "Your pitch deck has been generated and is ready for review."
}],
"attachments": [{
"content": "{{ $binary.file_content | base64 }}",
"type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"filename": "{{ $json.company_name }}_pitch_deck.pptx"
}]
}
Testing the workflow
Before running this in production, test with a real financial statement PDF. Start with just the first two steps (PDF extraction and content generation) to confirm data quality. Check that:...
- Extracted figures match the source document
- Generated content is coherent and tone-appropriate
- No hallucination of financial data
Once you're confident, add the infographic step and final assembly.
The Manual Alternative
If you prefer more control without building a full workflow, here's what a semi-automated approach looks like:
- Manually upload the PDF to Chat with PDF by Copilotus and copy the extracted JSON
- Paste that JSON into Preswald AI's web interface to generate slides
- Use Text2Infographic's web tool to create one or two key charts
- Manually assemble everything in PowerPoint
This takes about 45 minutes instead of 2-3 hours of fully manual work, and requires no coding. The tradeoff is that you can't batch process multiple decks or schedule this to run unattended.
If you're only building pitch decks occasionally (fewer than five per month), this manual approach is reasonable. The automation investment only pays off if you're doing this repeatedly.
Pro Tips
API rate limits and cost management
Chat with PDF by Copilotus charges per page, not per request. A 50-page financial statement with footnotes costs roughly double what a 25-page one does. Before sending every PDF through the workflow, consider whether you could strip out non-essential pages (cover pages, regulatory boilerplate) to reduce cost.
Preswald AI has generous rate limits (2000 requests per month on their professional plan), so that's rarely a bottleneck. Text2Infographic's API calls are cheap, but the SVG output is larger than PNG, which matters if you're generating hundreds of infographics monthly.
Error handling
Add a conditional node in n8n after the PDF extraction step. If the returned JSON is missing critical fields (revenue, ebitda), fail gracefully and email a warning to your team. Don't let bad data propagate into the presentation:
IF $json.revenue == null OR $json.revenue == undefined
THEN send email to alerts@yourfund.com with subject "Failed to extract revenue from PDF"
ELSE continue to next step
Data validation
Financial figures should be reasonable. Add a validation rule that flags if revenue or net income values are suspiciously small (under $100k) or implausibly large. This catches OCR errors where "123.5M" becomes "1235M".
Customising the prompt
The extraction prompt you use with Chat with PDF should change depending on financial statement type. A balance sheet, income statement, and cash flow statement need different JSON structures. Consider building multiple n8n workflows, one for each document type, rather than a single generic workflow.
Scheduling and batching
Set up an n8n Cron trigger to run this workflow daily at a specific time, pulling files from a designated folder. This way, any PDFs dropped into that folder process automatically overnight. Email the completed decks to stakeholders before they arrive at the office.
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| Chat with PDF by Copilotus | Pay-as-you-go | £0.50–£10 | £0.10 per page average; depends on document volume |
| Preswald AI | Professional | £49 | Includes 2000 generations; overage at £0.05 each |
| Text2Infographic | Professional | £29 | Covers 500 infographics; SVG export included |
| n8n | Cloud Professional | £20 | Includes 100k n8n credits per month; sufficient for ~200 workflows |
| SendGrid (email delivery) | Essential | £20 | Covers 50k email sends; pitch decks rarely exceed this |
| Total | ~£118–£130 | Assumes 20 decks per month; cost per deck is £5–£7 |
If you're processing fewer than 5 decks per month, keep using the manual approach with free tools. The workflow becomes cost-effective around 10+ decks monthly.
This workflow works well for investor-focused decks with consistent structure. If you need highly customised designs or industry-specific visuals (biopharma, real estate, etc.), you'll want additional design input or a more sophisticated templating system. But for getting structured, data-driven decks out quickly with minimal handoff, this three-tool combination delivers real value.
More Recipes
User onboarding video series from feature documentation
SaaS companies need to convert technical documentation into engaging onboarding videos for different user segments.
Course curriculum and assessment generation from subject outline
Educators spend weeks designing course materials and assessments when they could generate them from a high-level curriculum outline.
Technical documentation generation from code
Developers struggle to maintain up-to-date documentation alongside code changes.