Alchemy RecipeIntermediateworkflow

Investment pitch deck generation from financial statements and market research

Published

Investment pitch decks are expensive to produce and tedious to assemble. You're juggling financial statements from multiple sources, cross-referencing market research, formatting data into visuals, and manually building slide templates from scratch. A finance team might spend two to three days pulling together a single deck, when most of that work is repetitive data extraction and formatting.

The real bottleneck is the handoff problem. Your financial analyst exports numbers into a spreadsheet. A designer waits for those numbers, then manually builds charts. A researcher adds market context, but has to check whether the numbers have changed. By the time the deck reaches your founder, something is stale or inconsistent. Nobody is checking whether the supporting data actually justifies the claims on each slide.

This workflow automates the entire pipeline. It reads your financial statements, pulls relevant market research, generates visual assets, and produces a ready-to-present pitch deck without anyone touching a keyboard between start and finish. You feed it documents; you get a Figma-ready design file with all the data baked in. This is an intermediate difficulty workflow because it requires careful data mapping and some understanding of how financial visualisations work, but the actual setup takes less than an hour.

The Automated Workflow

We are going to wire together three primary tools: wispr-flow-ai to extract structured data from documents, nsketch-ai to generate charts and visual layouts, and v0 to produce the final Figma file with proper design polish. The orchestration happens in n8n, which offers the most flexibility for complex data transformations and conditional logic without hitting rate limits as quickly as Zapier.

Architecture Overview

The workflow follows this sequence:

  1. Financial statements and market research PDFs arrive in a Dropbox folder
  2. wispr-flow-ai extracts tables, figures, and narrative content into structured JSON
  3. nsketch-ai receives the extracted data and generates chart specifications
  4. v0 takes those specifications and produces a complete Figma component library
  5. The final deck is saved to Figma and a summary email is sent

The entire process runs asynchronously. You can feed it documents at 9 a.m. and have a ready deck by lunch.

Prerequisites and Setup

You need accounts for all three AI tools plus n8n. If you are self-hosting n8n, deploy it on a cheap VPS (AWS Lightsail or Linode work fine, roughly £8 per month). If you prefer managed hosting, n8n Cloud costs from £30 per month for the Team plan, which includes better rate limiting and reliability.

Create API keys for:

  • wispr-flow-ai: Document processing key
  • nsketch-ai: Design generation key
  • v0: Figma integration key
  • Figma API token: For pushing final designs

Store these in n8n as environment variables rather than hardcoding them into nodes.

Step 1:

Document Intake and Data Extraction

Set up a Dropbox trigger in n8n that watches for new files in a folder called /pitch-deck-source. When a file appears, it passes to wispr-flow-ai.


POST https://api.wispr-flow-ai.com/v1/extract
Content-Type: application/json
Authorization: Bearer YOUR_WISPR_API_KEY

{
  "document_url": "https://dropbox-download-url.com/statement.pdf",
  "extraction_type": "financial_tables",
  "include_narrative": true,
  "output_format": "json"
}

The response contains structured data:

{
  "extraction_id": "ext_abc123",
  "tables": [
    {
      "title": "Revenue by Segment",
      "headers": ["2021", "2022", "2023"],
      "rows": [
        {"label": "SaaS", "values": [2100000, 3400000, 5200000]},
        {"label": "Professional Services", "values": [800000, 950000, 1100000]}
      ]
    }
  ],
  "narrative_insights": [
    "Revenue grew 53% year-over-year in 2023",
    "SaaS segment now represents 82.5% of total revenue"
  ],
  "extraction_confidence": 0.94
}

In your n8n workflow, map this extraction to a JavaScript object that normalises the format. This step matters because different financial statements use different table structures. Your normalisation layer handles that variation.

// Normalise financial data in n8n Script node
const extractedData = $node["wispr-flow-ai"].json;
const normalised = {
  revenue_segments: [],
  growth_metrics: [],
  margins: [],
  narrative: extractedData.narrative_insights
};

extractedData.tables.forEach(table => {
  if (table.title.toLowerCase().includes('revenue')) {
    normalised.revenue_segments.push({
      name: table.title,
      data: table.rows
    });
  }
});

return normalised;

Step 2:

Market Research Contextualisation

Whilst wispr-flow-ai is processing, spin up a parallel branch that calls the market research API. You could use a dedicated market research tool or just call OpenAI's API directly with a prompt that includes recent market data. For this example, we will use a structured market data API.

Create an HTTP request node that queries your market research source:


POST https://api.market-research.io/v1/context
Content-Type: application/json
Authorization: Bearer YOUR_MARKET_API_KEY

{
  "industry": "SaaS",
  "market_segment": "enterprise-software",
  "query_type": "tam_sizing",
  "include_recent_reports": true
}

The response gives you market size, growth projections, and competitive context:

{
  "total_addressable_market": 142000000000,
  "compound_annual_growth_rate": 0.127,
  "market_share_potential": 0.005,
  "competitor_landscape": [
    {"company": "Competitor A", "market_share": 0.18},
    {"company": "Competitor B", "market_share": 0.12}
  ],
  "growth_drivers": [
    "Increased automation spending",
    "Digital transformation initiatives"
  ]
}

In n8n, use a Wait node to ensure both the financial extraction and market research calls are complete before proceeding. Then merge the data structures.

Step 3:

Chart and Layout Generation with nsketch-ai

Now that you have structured financial data and market context, feed both to nsketch-ai, which generates chart specifications and layout suggestions.


POST https://api.nsketch-ai.com/v1/generate-charts
Content-Type: application/json
Authorization: Bearer YOUR_NSKETCH_API_KEY

{
  "financial_data": {
    "revenue_segments": [
      {"name": "SaaS", "values": [2100000, 3400000, 5200000]},
      {"name": "Professional Services", "values": [800000, 950000, 1100000]}
    ],
    "years": [2021, 2022, 2023]
  },
  "market_context": {
    "tam": 142000000000,
    "cagr": 0.127,
    "competitive_positioning": "mid-market challenger"
  },
  "chart_types": ["revenue_growth", "market_opportunity", "unit_economics"],
  "style": "minimal_professional",
  "output_format": "figma_components"
}

nsketch-ai returns component specifications ready for Figma:

{
  "generation_id": "gen_xyz789",
  "charts": [
    {
      "type": "bar_chart",
      "title": "Revenue Growth Trajectory",
      "figma_component": {
        "name": "BarChart_Revenue",
        "fills": [
          {"name": "primary", "color": "#1E40AF"},
          {"name": "secondary", "color": "#60A5FA"}
        ],
        "data_bindings": {
          "labels": ["2021", "2022", "2023"],
          "values": [2100000, 3400000, 5200000]
        }
      }
    }
  ],
  "layout_suggestions": [
    {
      "slide_type": "title",
      "content": "Investment Opportunity in Enterprise SaaS"
    },
    {
      "slide_type": "financials",
      "components": ["BarChart_Revenue", "GrowthMetrics"]
    }
  ]
}

Store this response in n8n as a workflow variable. You will pass it to v0 in the next step.

Step 4:

Figma Deck Assembly with v0

v0 takes the nsketch-ai output and produces a complete, pixel-perfect Figma file ready for presentation. This is where design quality matters; v0 handles typography, spacing, colour contrast, and alignment automatically.


POST https://api.v0.dev/api/generate
Content-Type: application/json
Authorization: Bearer YOUR_V0_API_KEY

{
  "project": "investment_pitch_deck",
  "design_system": {
    "typography": {
      "heading": "Inter, 32px, bold",
      "body": "Inter, 14px, regular"
    },
    "colours": {
      "primary": "#1E40AF",
      "accent": "#F59E0B",
      "background": "#FFFFFF",
      "text": "#1F2937"
    },
    "spacing": "8px grid"
  },
  "components": {
    "charts": [{
      "name": "BarChart_Revenue",
      "type": "bar_chart",
      "data": {"labels": ["2021", "2022", "2023"], "values": [2.1, 3.4, 5.2]}
    }],
    "text_blocks": [{
      "slide": 1,
      "type": "title",
      "content": "Enterprise SaaS Investment Opportunity"
    }]
  },
  "slides": [
    {"type": "title_slide", "title": "Investment Opportunity"},
    {"type": "financial_overview", "components": ["BarChart_Revenue"]},
    {"type": "market_analysis", "components": ["MarketOpportunity"]},
    {"type": "competitive_positioning", "components": ["CompetitorLandscape"]},
    {"type": "financial_projections", "components": ["RevenueProjection"]},
    {"type": "closing", "title": "Summary"}
  ],
  "output_format": "figma_file"
}

v0 responds with a Figma file ID and a shareable link:

{
  "project_id": "proj_abc123xyz",
  "figma_file_id": "file_123abc",
  "figma_url": "https://www.figma.com/file/file_123abc/Investment-Pitch-Deck",
  "status": "ready",
  "design_tokens": {
    "colour_palette": ["#1E40AF", "#F59E0B", "#FFFFFF"],
    "fonts": ["Inter"]
  }
}

Step 5:

Final Output and Notification

In your n8n workflow, add an HTTP node that creates a new Figma comment on the generated file with a summary of the data sources and extraction confidence scores. This provides an audit trail.

// Create Figma comment with metadata
const comment = `
Pitch Deck Auto-Generated
Generated: ${new Date().toISOString()}

Financial Data Source: ${$node.extractedData.source}
Extraction Confidence: ${$node.wispr_extraction.extraction_confidence}

Market Data: ${$node.market_research.data_freshness}

Review checklist:
- [ ] Numbers match source documents
- [ ] Market assumptions are current
- [ ] Competitive positioning is accurate
- [ ] Formatting is consistent across slides
`;......

return { comment, file_id: $node.v0_output.figma_file_id };

Send a Slack notification (or email) to the founder with the Figma link:


POST https://hooks.slack.com/services/YOUR/WEBHOOK/URL

{
  "text": "Pitch deck ready for review",
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Your investment pitch deck has been generated from the latest financial statements and market research.\n\n<https://www.figma.com/file/file_123abc|View in Figma>"
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*Revenue (2023):*\n£5.2M"
        },
        {
          "type": "mrkdwn",
          "text": "*Growth YoY:*\n+53%"
        }
      ]
    }
  ]
}

Error Handling and Retries

wispr-flow-ai sometimes struggles with scanned PDFs or unusual formatting. In n8n, add a conditional branch: if extraction confidence drops below 0.85, pause the workflow and send a Slack message asking for manual review. This prevents garbage data flowing downstream.

// Check extraction quality
if ($node["wispr-flow-ai"].json.extraction_confidence < 0.85) {
  return {
    action: "pause",
    reason: "Low extraction confidence",
    file: $node.trigger.file_name,
    confidence_score: $node["wispr-flow-ai"].json.extraction_confidence
  };
}

return { action: "continue" };

For rate limiting, nsketch-ai allows 60 requests per minute on the standard plan. If you are processing multiple pitch decks simultaneously, add a queue node in n8n that spaces requests two seconds apart. This prevents hitting the rate limit.

The Manual Alternative

If you want more control over specific slides or messaging, stop the workflow before the v0 step. Export the nsketch-ai output as a JSON file that you can import into Figma manually using a plugin like Airtable or Retool. This gives you a starting point with all the charts already built, but lets you craft the narrative yourself.

Alternatively, if your market research is sensitive or frequently changes, run steps 1 through 3 automatically, but manually review the nsketch-ai output and add comments in n8n before passing to v0. This is still orders of magnitude faster than building from scratch.

Pro Tips

Reuse extraction templates. wispr-flow-ai learns from repeated patterns. The first financial statement takes longer to extract; the tenth one is much faster because the system recognises your standard format. Create extraction templates for your standard financial statement format and version them in n8n.

Cache market research data. Market reports do not change daily. In n8n, cache the output from your market research API for 72 hours. This saves API calls and prevents stale data pushing into the deck multiple times a day. Add a node that compares the cached timestamp to the current time.

Version your design tokens. If your brand guidelines change, update the colour palette in your v0 request once, and every future deck automatically uses the new colours. Store design tokens as a shared n8n variable rather than hardcoding them in the API request.

Monitor extraction drift. Run the same financial statement through wispr-flow-ai twice per month and compare the results. If extraction confidence drops, the tool may be encountering a new format. Log these comparisons and alert yourself when confidence dips below your threshold.

Stagger API calls. Do not call wispr-flow-ai, nsketch-ai, and v0 all at once. Use n8n Wait nodes to enforce 2-3 second delays between calls. This prevents overwhelming the API endpoints and keeps your request logs clean for debugging.

Cost Breakdown

ToolPlan NeededMonthly CostNotes
wispr-flow-aiPro£45Includes 500 document extractions; overage £0.10 per extraction
nsketch-aiProfessional£65Unlimited chart generations; includes Figma export
v0Designer Plus£50Unlimited Figma file generation; includes component library access
n8nCloud Team£30Self-hosted is free; pay for compute if you scale
Total£190/monthPlus Figma subscription (£12/month) if you do not already have it

Calculation per pitch deck: If you generate 8 pitch decks per month, cost per deck is approximately £24 in API fees, plus labour time saved (roughly 6-8 hours per manual deck, worth £180–£240 at £30/hour).

Breaking even happens in month one if you generate more than three decks monthly. After that, every additional deck costs only the marginal API fee.

More Recipes