- Workflow
- 1. Clarify Requirements
- Ask the user
-
- Single-slide or multi-slide (3-4 slides)?
- Ask the user
-
- Any specific focus areas or topics to emphasize?
- Only after user confirms
- , proceed to research
- 2. Research & Planning
- Data Sources:
- Primary
-
- Company filings (BamSEC, SEC EDGAR - "Item 1. Business", MD&A), investor presentations, corporate website
- Market data
-
- Bloomberg, FactSet, CapIQ (price, shares, market cap, net debt, EV, ownership)
- Estimates
-
- FactSet/CapIQ consensus for NTM revenue, EBITDA, EPS
- News
-
- Press releases from last 90 days, M&A activity, guidance changes
- Required Metrics:
- Financials
-
- Revenue, EBITDA, margins (%), EPS, FCF for ±3 years
- Valuation
-
- Market Cap, EV, EV/Revenue, EV/EBITDA, P/E multiples
- Growth
-
- YoY growth rates (%)
- Ownership
-
- Top 5 shareholders with % ownership
- Segments
-
- Product mix and/or geographic mix (% breakdown)
- Normalization:
- Convert all amounts to consistent currency
- Scale consistently ($mm or $bn throughout, not mixed)
- Before Building:
- Print outline to chat with 4-5 bullet points per item (actual numbers, no placeholders)
- Print style choices: fonts, colors (hex codes), chart types for each data set
- Get user alignment: "Does this outline and visual strategy align with your vision?"
- 3. Slide-by-Slide Creation
- CRITICAL: You MUST create ONE slide at a time and get user approval before proceeding to the next slide.
- For EACH slide:
- Create ONLY this one slide with PptxGenJS
- MANDATORY: Convert to image for review
- - You MUST convert slides to images so you can visually verify them:
- soffice
- --headless
- --convert-to pdf presentation.pptx
- pdftoppm
- -jpeg
- -r
- 150
- -f
- 1
- -l
- 1
- presentation.pdf slide
- MANDATORY VISUAL REVIEW
-
- You MUST carefully examine the rendered slide image before proceeding:
- Text overlap check
-
- Scan every text element - do any labels, bullets, or titles collide with each other?
- Text cutoff check
-
- Is any text truncated at boundaries? Are all words fully visible?
- Chart boundary check
-
- Do charts stay within their containers? Are ALL axis labels fully visible?
- Quadrant integrity
-
- Does content in one quadrant bleed into adjacent quadrants?
- If ANY overlap or cutoff is detected
-
- Fix immediately using these strategies in order:
- First
-
- Reduce font size (go down 1-2pt)
- Second
-
- Shorten text (abbreviate, remove less critical info)
- Third
-
- Adjust element positions or container sizes
- Re-render and verify again
- - do not proceed until all text fits cleanly
- Show slide image to user with download link
- STOP and wait for explicit user approval
- before creating the next slide. Do NOT proceed until user confirms.
- YOU MUST CHECK FOR THESE SPECIFIC ISSUES ON EVERY PAGE:
- Table rows colliding with text below them
- Chart x-axis labels cut off at bottom
- Long bullet points wrapping into adjacent content
- Quadrant content bleeding into adjacent quadrants
- Title text overlapping with content below
- Legend text overlapping with chart elements
- Footer/source text colliding with main content
- Slide Format Requirements
- Information Density is Critical
- The #1 goal is MAXIMUM information density.
- A busy executive should understand the entire company story in 30 seconds. Fill every quadrant to capacity.
- Per quadrant targets:
- Company Overview
-
- 6-8 bullets minimum (HQ, founded, employees, CEO/CFO, market cap, ticker, industry, key stat)
- Business & Positioning
-
- 6-8 bullets (revenue drivers, products, market share %, competitive moat, customer count, geographic mix)
- Key Financials
-
- Table with 8-10 rows OR chart + 4-5 key metrics (Revenue, EBITDA, margins, EPS, FCF, growth rates, valuation multiples)
- Fourth quadrant
- 5-7 bullets (ownership %, recent M&A, developments, catalysts) Information packing techniques: Combine related facts: "HQ: Austin, TX; Founded: 2003; 140K employees" Always include numbers: "$50B revenue" not "large revenue" Add context: "EBITDA margin: 25% (vs. 18% industry avg)" Include YoY changes: "Revenue: $125M (+28% YoY)" Use percentages: "Enterprise: 62% of revenue" If a quadrant looks sparse, add more: Segment breakdowns with % Geographic revenue splits Customer concentration (top 10 = X%) Recent contract wins with $ values Guidance vs. consensus Insider ownership % Line spacing - use single textbox per section: def add_section ( slide , x , y , w , header_text , bullets , header_size = 10 , bullet_size = 8 ) : """Header + bullets in single textbox with natural spacing""" tb = slide . shapes . add_textbox ( x , y , w , Inches ( len ( bullets ) * 0.18 + 0.3 ) ) tf = tb . text_frame tf . word_wrap = True
Header paragraph
p
tf . paragraphs [ 0 ] p . text = header_text p . font . bold = True p . font . size = Pt ( header_size ) p . font . color . rgb = RGBColor ( 0 , 51 , 102 ) p . space_after = Pt ( 6 )
Small gap after header
Bullet paragraphs
- for
- bullet
- in
- bullets
- :
- p
- =
- tf
- .
- add_paragraph
- (
- )
- p
- .
- text
- =
- bullet
- p
- .
- font
- .
- size
- =
- Pt
- (
- bullet_size
- )
- p
- .
- space_after
- =
- Pt
- (
- 3
- )
- return
- tb
- Key spacing principles:
- Put header + bullets in SAME textbox (no separate header textbox)
- Use
- space_after = Pt(6)
- after header,
- Pt(3)
- between bullets
- Don't hardcode gaps - let paragraph spacing handle it naturally
- If content overflows, reduce font by 1pt rather than removing content
- 3-4 dense slides
- - use quadrants, columns, tables, charts
- Bullets for ALL body text
- - NEVER paragraphs.
- Use ONE textbox per section with all bullets inside
- - do NOT create separate textboxes for each bullet point. Use PptxGenJS bullet formatting:
- // CORRECT: Single textbox with bullet list - each array item becomes a bullet
- // Position in top-left quadrant (Company Overview) - after header with accent bar
- slide
- .
- addText
- (
- [
- {
- text
- :
- 'Headquarters: Austin, Texas; Founded 2003'
- ,
- options
- :
- {
- bullet
- :
- {
- indent
- :
- 10
- }
- ,
- breakLine
- :
- true
- }
- }
- ,
- {
- text
- :
- 'Employees: 140,000+ globally across 6 continents'
- ,
- options
- :
- {
- bullet
- :
- {
- indent
- :
- 10
- }
- ,
- breakLine
- :
- true
- }
- }
- ,
- {
- text
- :
- 'CEO: Elon Musk; CFO: Vaibhav Taneja'
- ,
- options
- :
- {
- bullet
- :
- {
- indent
- :
- 10
- }
- ,
- breakLine
- :
- true
- }
- }
- ,
- {
- text
- :
- 'Market Cap: $850B (#6 globally by market cap)'
- ,
- options
- :
- {
- bullet
- :
- {
- indent
- :
- 10
- }
- ,
- breakLine
- :
- true
- }
- }
- ,
- {
- text
- :
- 'Segments: Automotive (85%), Energy (10%), Services (5%)'
- ,
- options
- :
- {
- bullet
- :
- {
- indent
- :
- 10
- }
- }
- }
- ]
- ,
- {
- x
- :
- 0.45
- ,
- y
- :
- 0.95
- ,
- w
- :
- 4.5
- ,
- h
- :
- 2.6
- ,
- fontSize
- :
- 11
- ,
- fontFace
- :
- 'Arial'
- ,
- valign
- :
- 'top'
- ,
- paraSpaceAfter
- :
- 6
- }
- )
- ;
- // WRONG: Multiple separate textboxes for each bullet - causes alignment issues
- // slide.addText('Headquarters: Austin', { x: 0.5, y: 1.0, bullet: true });
- Bullet formatting tips:
- bullet:
- - controls bullet indentation (smaller = tighter)
- paraSpaceAfter: 6
- - space after each paragraph in points
- Pack multiple related facts into each bullet (e.g., "HQ: Austin; Founded: 2003")
- Include specific numbers and percentages for information density
- Title case
- for titles (not ALL CAPS), left-aligned
- Consistent fonts
- everywhere including tables
- Company's brand colors
- - YOU MUST research actual brand colors via web search before creating slides. Do not guess or assume colors.
- Follow brand guidelines if provided
- Visual Reference
- See
- examples/Nike_Strip_Profile_Example.pptx
- for layout inspiration. Adapt colors to each company's brand.
- First Page Layout
- Must pass "30-second comprehension test" for a busy executive.
- Slide Setup (CRITICAL)
- Use 4:3 aspect ratio
- (standard IB pitch book format):
- const
- pptx
- =
- new
- pptxgen
- (
- )
- ;
- pptx
- .
- layout
- =
- 'LAYOUT_4x3'
- ;
- // 10" wide × 7.5" tall - MUST USE THIS
- Slide Coordinate System
- PptxGenJS uses inches. 4:3 slide =
- 10" wide × 7.5" tall
- .
- x
-
- horizontal position from left edge (0 = left, 10 = right)
- y
-
- vertical position from top edge (0 = top, 7.5 = bottom)
- Content must stay within bounds
- - leave 0.3" margin on all sides
- First Page Positioning (in inches)
- ┌─────────────────────────────────────────────────────────────────┐
- │ y=0.2 Title: Company Name (Ticker) │
- ├────────────────────────────┬────────────────────────────────────┤
- │ y=0.6 Company Overview │ y=0.6 Business & Positioning │
- │ x=0.3, w=4.7 │ x=5.0, w=4.7 │
- │ h=3.0 │ h=3.0 │
- ├────────────────────────────┼────────────────────────────────────┤
- │ y=3.7 Key Financials │ y=3.7 Stock/Recent Developments │
- │ x=0.3, w=4.7 │ x=5.0, w=4.7 │
- │ h=3.5 │ h=3.5 │
- └────────────────────────────┴────────────────────────────────────┘
- y=7.5
- Title Section (y=0.2)
- Company Name (Ticker)
- - Example:
- Tesla, Inc. (TSLA)
- slide
- .
- addText
- (
- 'Tesla, Inc. (TSLA)'
- ,
- {
- x
- :
- 0.3
- ,
- y
- :
- 0.2
- ,
- w
- :
- 9.4
- ,
- h
- :
- 0.35
- ,
- fontSize
- :
- 18
- ,
- bold
- :
- true
- }
- )
- ;
- 4-Quadrant Layout (y=0.6 to y=7.2)
- Quadrant
- Position
- Content
- 1
- x=0.3, y=0.6, w=4.7, h=3.0
- Company Overview
-
- HQ, founded, key stats, business summary (4-5 bullets)
- 2
- x=5.0, y=0.6, w=4.7, h=3.0
- Business & Positioning
-
- revenue drivers, products/services, competitive position, growth drivers (4-5 bullets)
- 3
- x=0.3, y=3.7, w=4.7, h=3.5
- Key Financials
-
- Revenue, EBITDA, margins, EPS, FCF + Valuation (Mkt Cap, EV, multiples) —
- table OR chart, not both
- 4
- x=5.0, y=3.7, w=4.7, h=3.5
- For public companies
-
- 1Y stock price chart + top shareholders.
- For private
-
- Recent developments or Ownership/M&A history
- Font Sizes - USE THESE EXACT VALUES
- Element
- Size
- Notes
- Slide title
- 24pt
- Bold, company brand color
- Quadrant headers
- 14pt
- Bold, with accent bar
- Body/bullet text
- 11pt
- Regular weight
- Table text
- 10pt
- Use 9pt for dense tables
- Chart labels
- 9pt
- Keep labels short
- Source/footer
- 8pt
- Bottom of slide
- CRITICAL: If text overflows, REDUCE font size by 1pt and re-render.
- Visual Accents (REQUIRED)
- Each quadrant header MUST have a colored accent bar to the left:
- // Add accent bar for quadrant header
- slide
- .
- addShape
- (
- pptx
- .
- shapes
- .
- RECTANGLE
- ,
- {
- x
- :
- 0.3
- ,
- y
- :
- 0.6
- ,
- w
- :
- 0.08
- ,
- h
- :
- 0.25
- ,
- fill
- :
- {
- color
- :
- 'E31937'
- }
- // Use company brand color
- }
- )
- ;
- slide
- .
- addText
- (
- 'Company Overview'
- ,
- {
- x
- :
- 0.45
- ,
- y
- :
- 0.6
- ,
- w
- :
- 4.5
- ,
- h
- :
- 0.3
- ,
- fontSize
- :
- 14
- ,
- bold
- :
- true
- ,
- fontFace
- :
- 'Arial'
- }
- )
- ;
- Visual elements to include:
- Accent bars next to all section headers (brand color)
- Thin horizontal divider line between top and bottom quadrants
- Company logo in top-right corner if available
- Subtle gridlines in tables (light gray #CCCCCC)
- First Page Formatting
- Font: Arial
- (or as specified by user/brand guidelines)
- Quadrant titles
-
- Title Case (not ALL CAPS), e.g., "Company Overview" not "COMPANY OVERVIEW"
- Bullets
-
- Bold key terms at start, e.g., "
- Market Position:
- Leading global manufacturer..."
- White background only — no boxes, fills, or shading
- Section headers: bold text, follow brand guidelines for styling
- All quadrants equally sized and aligned
- Subsequent Pages: Free-Form Layouts
- Two-column (40/60 or 50/50), full-slide charts, or sidebar layouts
- Each page elaborates on first page content
- Maintain consistent typography and color scheme
- Suggested flow: Products/Market → Financial Analysis → Leadership
- Charts (Multi-Slide Profiles)
- For multi-slide profiles
-
- Include 2-3 actual PptxGenJS charts. Never use placeholder divs or static images.
- For single-slide profiles
- Use tables for financials (more space-efficient). Only add a chart if it replaces the table, not in addition to it. Data Type Chart Type Revenue trends Line or column (multi-year) Geographic breakdown Horizontal bar Product mix Pie with percentages Financial comparison Column Stock price (1Y daily) Line Chart Code Examples Horizontal Bar (fits in bottom-right quadrant for 4:3 slide): slide . addChart ( pptx . charts . BAR , [ { name : 'FY2024 Revenue by Region' , labels : [ 'North America' , 'EMEA' , 'China' , 'APLA' ] , values : [ 21.4 , 13.6 , 7.6 , 6.7 ] } ] , { x : 5.0 , y : 4.1 , w : 4.5 , h : 3.0 , // Fits in bottom-right quadrant (4:3) barDir : 'bar' , chartColors : [ 'FF6B35' ] , showValue : true , dataLabelFontSize : 10 , catAxisLabelFontSize : 10 , valAxisLabelFontSize : 10 , dataLabelFormatCode : '$#,##0.0B' , title : 'Revenue by Geography' , titleFontSize : 12 , titleBold : true } ) ; Pie Chart (fits in bottom-right quadrant for 4:3 slide): slide . addChart ( pptx . charts . PIE , [ { name : 'Product Mix' , labels : [ 'Footwear' , 'Apparel' , 'Equipment' ] , values : [ 68 , 29 , 3 ] } ] , { x : 5.0 , y : 4.1 , w : 4.5 , h : 3.0 , // Fits in bottom-right quadrant (4:3) showPercent : true , showLegend : true , legendPos : 'r' , dataLabelFontSize : 10 , legendFontSize : 10 , chartColors : [ 'FF6B35' , '2C2C2C' , '4A4A4A' ] , title : 'Revenue Mix FY24' , titleFontSize : 12 , titleBold : true } ) ; Line Chart (full width for subsequent slides): slide . addChart ( pptx . charts . LINE , [ { name : 'Revenue ($B)' , labels : [ 'FY21' , 'FY22' , 'FY23' , 'FY24' , 'FY25E' ] , values : [ 44.5 , 46.7 , 48.5 , 51.4 , 54.2 ] } ] , { x : 0.3 , y : 1.2 , w : 9.4 , h : 5.5 , // Full width for 4:3 slide chartColors : [ 'FF6B35' ] , showValue : true , lineSmooth : true , dataLabelFontSize : 11 , catAxisLabelFontSize : 11 , valAxisLabelFontSize : 11 , title : 'Revenue Trend & Forecast' , titleFontSize : 14 , titleBold : true } ) ; Financial Data Formatting Always use native PptxGenJS tables or charts - NEVER plain text prose or HTML tables. Use slide.addTable() for financial data (fits in bottom-left quadrant for 4:3 slide): // Add header with accent bar first slide . addShape ( pptx . shapes . RECTANGLE , { x : 0.3 , y : 3.7 , w : 0.08 , h : 0.25 , fill : { color : 'E31937' } } ) ; slide . addText ( 'Key Financials & Valuation' , { x : 0.45 , y : 3.7 , w : 4.5 , h : 0.3 , fontSize : 14 , bold : true , fontFace : 'Arial' } ) ; // Financial data table slide . addTable ( [ [ { text : 'Metric' , options : { bold : true , fill : '003366' , color : 'FFFFFF' } } , { text : 'FY24' , options : { bold : true , fill : '003366' , color : 'FFFFFF' } } , { text : 'FY25E' , options : { bold : true , fill : '003366' , color : 'FFFFFF' } } ] , [ 'Revenue' , '$51.4B' , '$54.2B' ] , [ 'YoY Growth' , '+6.0%' , '+5.5%' ] , [ 'EBITDA' , '$8.9B' , '$9.5B' ] , [ 'EBITDA Margin' , '17.3%' , '17.5%' ] , [ 'EPS' , '$3.42' , '$3.75' ] , [ 'Market Cap' , '$185B' , '—' ] , [ 'EV/EBITDA' , '12.5x' , '11.7x' ] ] , { x : 0.45 , y : 4.1 , w : 4.3 , h : 3.0 , // Below header in bottom-left quadrant fontFace : 'Arial' , fontSize : 10 , border : { pt : 0.5 , color : 'CCCCCC' } , valign : 'middle' , colW : [ 1.8 , 1.25 , 1.25 ] // Column widths } ) ; ❌ Incorrect: Plain text like Note: FY2024 revenue growth +1.0%, Net Income $5.1B... ❌ Incorrect: HTML tables that don't convert properly to PowerPoint For projections, use Bear/Base/Bull case scenarios in structured tables. Quality Checklist First Page Title section with company name, ticker, industry Exactly 4 equal quadrants below title All bullets, no paragraphs, 1 line max each Financials in table or chart (not both) All Slides No text overflow or cutoff Consistent fonts and colors throughout Charts render correctly No placeholder text - all actual data Consistent scaling ($mm or $bn, not mixed) Sources cited Investment banking quality (GS/MS/JPM standard) Note: Reference the PPTX skill for PowerPoint file creation.