/ docs / 09-business / populate-template.py
populate-template.py
   1  #!/usr/bin/env python3
   2  """Populate the SBT Business Plan template with Audit&Fix content."""
   3  
   4  import shutil
   5  from docx import Document
   6  from docx.shared import Pt, Inches
   7  from copy import deepcopy
   8  
   9  
  10  def set_cell(table, row, col, text):
  11      """Set cell text, preserving cell formatting."""
  12      cells = table.rows[row].cells
  13      if col >= len(cells):
  14          col = len(cells) - 1  # Fall back to last cell if merged
  15      cell = cells[col]
  16      # Clear existing content
  17      for p in cell.paragraphs:
  18          p.clear()
  19      # Set text on first paragraph
  20      if cell.paragraphs:
  21          cell.paragraphs[0].text = text
  22      else:
  23          cell.add_paragraph(text)
  24  
  25  
  26  def add_rows(table, count):
  27      """Add rows to a table by copying the last row's format."""
  28      template_row = table.rows[-1]
  29      for _ in range(count):
  30          new_row = deepcopy(template_row._tr)
  31          table._tbl.append(new_row)
  32          # Clear text in new row
  33          for cell in table.rows[-1].cells:
  34              for p in cell.paragraphs:
  35                  p.clear()
  36  
  37  
  38  def set_para(doc, index, text):
  39      """Set paragraph text at given index."""
  40      doc.paragraphs[index].text = text
  41  
  42  
  43  def fill_single_cell_table(table, text):
  44      """Fill a 1x1 table with text."""
  45      set_cell(table, 0, 0, text)
  46  
  47  
  48  # Copy template
  49  SRC = 'templates/1. Self-Employment Assistance_SBT_Business_plan_template_2505.docx'
  50  DST = 'auditandfix-business-plan.docx'
  51  shutil.copy2(SRC, DST)
  52  
  53  doc = Document(DST)
  54  
  55  # ============================================================
  56  # KEY DETAILS
  57  # ============================================================
  58  
  59  # Table 0: Registration details (10x2)
  60  t = doc.tables[0]
  61  set_cell(t, 0, 1, 'Audit&Fix')
  62  set_cell(t, 1, 0, 'Date registered: 03/03/2026')
  63  set_cell(t, 2, 1, 'New South Wales, Australia')
  64  set_cell(t, 3, 1, 'Sole Trader')
  65  set_cell(t, 4, 1, 'Jason (100%)')
  66  set_cell(t, 5, 1, 'On file — appears on invoices only')
  67  set_cell(t, 6, 1, 'N/A (Sole Trader)')
  68  set_cell(t, 7, 1, 'ABN registration, business name registration')
  69  set_cell(t, 8, 1, 'Software development, AI/ML expertise')
  70  set_cell(t, 9, 1, 'NSW, Australia (remote/digital business)')
  71  
  72  # Table 1: Contact details (5x2)
  73  t = doc.tables[1]
  74  set_cell(t, 0, 1, 'Jason')
  75  set_cell(t, 1, 1, '[Business phone]')
  76  set_cell(t, 2, 1, '[Mobile]')
  77  set_cell(t, 3, 1, '[Business email]')
  78  set_cell(t, 4, 1, '[Address — NSW, Australia]')
  79  
  80  # Table 2: Online details (4x2)
  81  t = doc.tables[2]
  82  set_cell(t, 1, 1, 'https://www.auditandfix.com')
  83  # Row 0 col 1 already has "Address/details" header
  84  # Add GitHub
  85  if len(t.rows) > 2:
  86      set_cell(t, 2, 0, 'GitHub')
  87      set_cell(t, 2, 1, 'https://github.com/harvest316/333Method')
  88  
  89  # ============================================================
  90  # EXECUTIVE SUMMARY
  91  # ============================================================
  92  
  93  # Table 3: Plan Summary (1x1)
  94  fill_single_cell_table(doc.tables[3],
  95      'Audit&Fix is an AI-powered conversion rate optimization (CRO) platform that helps small local businesses '
  96      'improve their website conversion rates through automated analysis and actionable recommendations. '
  97      'We scrape search engine results, capture and analyse website screenshots using AI vision models, '
  98      'score conversion potential, and generate personalised improvement proposals delivered via multi-channel outreach.\n\n'
  99      'Key highlights:\n'
 100      '• 300 customers targeted in Year 1 (mid-case), generating $89,100 in revenue\n'
 101      '• 96%+ gross margins — variable cost ~$12.39 per customer including PayPal fees\n'
 102      '• Massive addressable market: ~662,000 identified prospects (29.8% of keywords scraped)\n'
 103      '• Modest startup capital: $9,294 (including pre-launch API investment)\n'
 104      '• Net profit ~$78,108 vs drawings $52,286 — surplus of $25,822\n'
 105      '• Revenue diversification planned: Ghost Hunter review management, 2-Step video outreach'
 106  )
 107  
 108  # Table 4: Business idea summary (5x2)
 109  t = doc.tables[4]
 110  set_cell(t, 0, 1, 'AI-powered website conversion rate optimisation (CRO) analysis and reporting for small local businesses worldwide. '
 111      'Automated pipeline: SERP scraping → screenshot capture → AI vision scoring → personalised proposal generation → multi-channel outreach.')
 112  set_cell(t, 1, 1, 'Small to medium-sized local service businesses (plumbers, electricians, lawyers, dentists, etc.) in top 25 GDP countries '
 113      'with poor website conversion rates (scoring B- or below, 0-82 out of 100). Businesses doing $500K-$5M annual revenue who '
 114      "can't afford traditional CRO agencies charging $5,000-$50,000/month.")
 115  set_cell(t, 2, 1, '1. AI-Powered Automation: Fully automated scoring using GPT-4o-mini vision + Claude AI proposals — no human bias, consistent evaluation\n'
 116      '2. Radical Affordability: $297 AUD per report vs $5,000+/month for traditional agencies (95% cheaper)\n'
 117      '3. Speed: Automated pipeline delivers reports in hours vs weeks for manual agencies\n'
 118      '4. Global Reach: 25 countries with localised currency, date formats, phone validation, cultural pricing')
 119  set_cell(t, 3, 1, 'Strong viability: 96%+ gross margins, proven technology stack operational, 662,000+ addressable prospects identified, '
 120      '55+ years of runway at 1,000 customers/month. Pipeline fully automated with 9 stages running on cron. '
 121      'Revenue diversification into Ghost Hunter and 2-Step models reuses same infrastructure.')
 122  set_cell(t, 4, 1, '$9,294 AUD (including $3,000 pre-launch API investment, $2,694 in 6-month API subscriptions, '
 123      '$600 Claude Max subscription, plus registration, hosting, and logo design)')
 124  
 125  # Table 5: Our Why (1x2)
 126  set_cell(doc.tables[5], 0, 1,
 127      "I'm passionate about building AI-powered tools that amplify human capabilities. Small businesses are the "
 128      "backbone of local economies, yet they're left behind when it comes to digital optimisation. Traditional "
 129      "CRO agencies charge $5,000-50,000/month — completely out of reach. I want to democratise access to "
 130      "sophisticated website analysis that was previously only available to large corporations.\n\n"
 131      "This business also provides a path to financial security while doing meaningful work — helping real "
 132      "businesses grow by making their websites more effective at converting visitors into customers.")
 133  
 134  # Table 6: Purpose/viability (1x1)
 135  fill_single_cell_table(doc.tables[6],
 136      'This plan validates the market opportunity and business model, supports the Self-Employment Assistance (SEA) '
 137      'application, documents operational processes and financial projections, identifies risks and mitigation strategies, '
 138      'and creates a roadmap for sustainable profitability.\n\n'
 139      'Viability demonstrated through:\n'
 140      '• Proven technology: Full 9-stage pipeline operational and tested (82% code coverage)\n'
 141      '• Market validation: 662,000+ potential customers identified through database analysis\n'
 142      '• Low barrier: Minimal startup costs ($9,294), scalable infrastructure\n'
 143      '• Compelling value: 95%+ cost savings vs traditional agencies\n'
 144      '• Multiple revenue streams: One-time reports, monitoring subscriptions, implementation services')
 145  
 146  # Table 7: Vision (1x2)
 147  set_cell(doc.tables[7], 0, 1,
 148      'To democratise world-class conversion rate optimisation globally, empowering every small business to compete '
 149      'online through AI-powered insights that were previously accessible only to enterprise companies.')
 150  
 151  # Table 8: Mission (1x2)
 152  set_cell(doc.tables[8], 0, 1,
 153      'Transform websites into conversion machines through automated AI analysis, delivering actionable insights '
 154      'at a price every business can afford.')
 155  
 156  # Table 9: Short-term goals (3x4)
 157  t = doc.tables[9]
 158  goals_st = [
 159      ('Generate first $10,000 in revenue', 'Launch cold outreach campaign targeting low-scoring sites\nProcess 35 customers at $297 each\nRefine proposal templates based on feedback', 'Q2 2026', 'Jason'),
 160      ('Achieve 50-site customer pipeline', 'Scale SERP scraping to 500 sites/month\nAutomate weekly rescoring\nBuild referral incentive program', 'Q3 2026', 'Jason'),
 161      ('Reach break-even', 'Generate $8,700/month revenue (28+ customers/month)\nOptimise API costs and outreach conversion\nEstablish repeatable sales process', 'Q4 2026', 'Jason'),
 162  ]
 163  for i, (goal, action, due, who) in enumerate(goals_st):
 164      set_cell(t, i, 0, goal)
 165      set_cell(t, i, 1, action)
 166      set_cell(t, i, 2, due)
 167      set_cell(t, i, 3, who)
 168  
 169  # Table 10: Long-term goals (3x4)
 170  t = doc.tables[10]
 171  goals_lt = [
 172      ('$15,000/month recurring revenue', 'Launch monthly monitoring subscription ($29/month)\nConvert 150 one-time customers to recurring\nExpand to second-page SERP results', 'Q2 2027', 'Jason'),
 173      ('Expand to implementation services', 'Partner with freelance web developers\nOffer "done-for-you" optimisation packages\n20% conversion of report customers to implementation', 'Q4 2027', 'Jason'),
 174      ('Achieve $180,000 annual revenue', 'Scale to 50 customers/month average\nLaunch affiliate/referral program\nExpand into lower GDP countries with adjusted pricing', 'Dec 2027', 'Jason'),
 175  ]
 176  for i, (goal, action, due, who) in enumerate(goals_lt):
 177      set_cell(t, i, 0, goal)
 178      set_cell(t, i, 1, action)
 179      set_cell(t, i, 2, due)
 180      set_cell(t, i, 3, who)
 181  
 182  # Table 11: Personal goals (3x4)
 183  t = doc.tables[11]
 184  goals_p = [
 185      ('Achieve financial independence', 'Build sustainable business generating $10,000+/month\nEliminate reliance on SEA and family support\nCreate emergency fund (6 months expenses)', 'Q4 2026', 'Jason'),
 186      ('Master AI-powered automation', 'Stay current with latest Claude/GPT capabilities\nOptimise pipeline efficiency continuously\nBuild reusable patterns for future projects', 'Ongoing', 'Jason'),
 187      ('Help 1,000+ small businesses', 'Deliver high-quality, actionable CRO reports\nTrack customer success metrics\nBuild case studies and testimonials', 'Q4 2027', 'Jason'),
 188  ]
 189  for i, (goal, action, due, who) in enumerate(goals_p):
 190      set_cell(t, i, 0, goal)
 191      set_cell(t, i, 1, action)
 192      set_cell(t, i, 2, due)
 193      set_cell(t, i, 3, who)
 194  
 195  # Table 12: Personal factors (5x3) - row 0 is header
 196  t = doc.tables[12]
 197  factors = [
 198      ('My Skills',
 199       '• Full-stack software development\n• AI/ML integration expertise\n• Database architecture\n• Process automation\n• Technical writing',
 200       'Enables solo operation of complex technical pipeline\nCan build and maintain all systems independently\nReduces need for contractors'),
 201      ('My commitments',
 202       '• Self-directed work ethic\n• 40+ hours/week commitment\n• Continuous learning\n• Code quality and testing discipline',
 203       'Ensures consistent progress\nMaintains high system reliability\nProactive problem prevention through testing'),
 204      ('My expectations',
 205       '• Achieve profitability within 9 months\n• Build sustainable business, not just a project\n• Create value for customers\n• Maintain work-life balance',
 206       'Drives ambitious but realistic goals\nFocuses on long-term sustainability\nCustomer-centric approach builds referrals'),
 207      ('My capabilities',
 208       '• Technical problem-solving\n• Self-motivation and discipline\n• Resourcefulness (building with constraints)\n• Analytical thinking\n• Written communication',
 209       'Can overcome technical obstacles independently\nWorks effectively without external management\nMaximises results with minimal budget'),
 210  ]
 211  for i, (label, details, impact) in enumerate(factors):
 212      set_cell(t, i + 1, 0, label)
 213      set_cell(t, i + 1, 1, details)
 214      set_cell(t, i + 1, 2, impact)
 215  
 216  # Table 13: Highlight strengths (1x1)
 217  fill_single_cell_table(doc.tables[13],
 218      '• Showcase technical sophistication through detailed, data-rich reports demonstrating AI analysis\n'
 219      '• Emphasise speed and affordability compared to traditional agencies\n'
 220      '• Build trust through transparency: open documentation, clear methodology, honest scoring\n'
 221      '• Leverage automation to provide 24/7 service and rapid turnaround\n'
 222      '• Create case studies showing real business impact from recommendations')
 223  
 224  # Table 14: Minimise weaknesses (1x1)
 225  fill_single_cell_table(doc.tables[14],
 226      '• Limited market reach: Expand to second-page SERP results, niche keywords, lower GDP countries\n'
 227      '• One-time revenue model: Develop recurring streams (monthly monitoring $29/mo, implementation partnerships)\n'
 228      '• Solo operation: Build robust automation to scale beyond personal capacity; strategic partnerships for implementation\n'
 229      '• No sales experience: Focus on cold outreach excellence using the tools we sell; let data and results speak\n'
 230      '• Market saturation risk: RESOLVED — 662K+ TAM, 55+ years runway')
 231  
 232  # Table 15: Impacts of personal factors (1x1)
 233  fill_single_cell_table(doc.tables[15],
 234      'As a solo technical founder, I bring deep AI automation and software engineering expertise, allowing me to '
 235      'build and maintain complex systems independently. This eliminates the need for co-founders or employees in '
 236      'early stages, reducing costs and preserving equity.\n\n'
 237      'Being a solo operator means I\'m the single point of failure. Mitigations:\n'
 238      '1. Extensive automated testing (82% code coverage)\n'
 239      '2. Comprehensive documentation (CLAUDE.md, README.md, detailed docs)\n'
 240      '3. Database-driven agent system for autonomous maintenance\n'
 241      '4. Weekly backups and disaster recovery procedures\n\n'
 242      'The need for $2,000/week living expenses creates pressure to reach profitability quickly. SEA provides '
 243      '$2,328/month personal income support (60 weeks, ending April 2027), and my father provides $1,000/week '
 244      '($4,333/month) until the business is profitable. Combined, this gives ~14 months to achieve break-even.')
 245  
 246  # ============================================================
 247  # THE MARKET
 248  # ============================================================
 249  
 250  # Table 16: Primary research (1x1)
 251  fill_single_cell_table(doc.tables[16],
 252      '• Analysed 23,990+ websites across 25 countries using the Audit&Fix pipeline\n'
 253      '• Scored conversion potential using GPT-4o-mini vision analysis (https://platform.openai.com/docs/models/gpt-4o-mini)\n'
 254      '• Scraped search engine results using ZenRows SERP API (https://www.zenrows.com/solutions/serp-api) across 25 Google domains\n'
 255      '• Identified common patterns in low-scoring websites (missing CTAs, poor trust signals, confusing navigation)\n'
 256      '• Tested multi-channel outreach: email via Resend (https://resend.com/), SMS via Twilio (https://www.twilio.com/), contact forms\n'
 257      '• Gathered initial feedback from prospects on pricing and value proposition')
 258  
 259  # Table 17: Secondary research (1x1)
 260  fill_single_cell_table(doc.tables[17],
 261      '• Competitive analysis of existing CRO tools: Unbounce (https://unbounce.com/pricing/), Hotjar (https://www.hotjar.com/pricing/), '
 262      'Crazy Egg (https://www.crazyegg.com/pricing), VWO (https://vwo.com/pricing/)\n'
 263      '• Traditional CRO agency pricing ($5,000-50,000/month): WebFX (https://www.webfx.com/cro/pricing/), '
 264      'Invesp (https://www.invespcro.com/blog/average-website-conversion-rate/)\n'
 265      '• Upwork freelancer rates ($50-200/hour): https://www.upwork.com/hire/conversion-rate-optimization-specialists/\n'
 266      '• DataForSEO search volume data (https://dataforseo.com/apis/serp-api) for local business keywords\n'
 267      '• World Bank GDP rankings (https://data.worldbank.org/indicator/NY.GDP.MKTP.CD)\n'
 268      '• Small business website quality trends in local service businesses')
 269  
 270  # Table 18: Research findings (1x1)
 271  fill_single_cell_table(doc.tables[18],
 272      'Through analysis of 23,990+ local business websites, clear patterns emerged:\n\n'
 273      '1. Widespread Website Quality Issues: 60-70% of local service businesses have poorly optimised websites '
 274      'scoring B- or below (0-82/100)\n'
 275      '2. Common Problems: Missing clear CTAs, poor mobile responsiveness, lack of trust signals, confusing navigation, slow load times\n'
 276      '3. Awareness Gap: Most small business owners blame "low traffic" instead of recognising conversion problems\n'
 277      '4. Cost Barrier: Traditional CRO agencies ($5,000-50,000/month) completely out of reach for $500K-2M revenue businesses\n'
 278      '5. DIY Challenges: Existing tools (Hotjar, Crazy Egg) provide data but not actionable insights\n\n'
 279      'Industry Trends:\n'
 280      '• Growing importance of online presence accelerated by COVID-19\n'
 281      '• Rise of AI making sophisticated analysis accessible at lower price points\n'
 282      '• Shift toward mobile-first design and Core Web Vitals')
 283  
 284  # Table 19: Expected demand (1x1)
 285  fill_single_cell_table(doc.tables[19],
 286      'The addressable market is substantial:\n\n'
 287      '• TAM: ~662,000 identified prospects (current keyword database, 29.8% scraped with 560,980 sites discovered) '
 288      '= $197M+ in one-time report revenue potential\n'
 289      '• SAM: English-speaking countries (US, UK, CA, AU, NZ, IE, SG) = ~40% of TAM = $79M\n'
 290      '• SOM: Year 1 target with volume-scaled approach = 300 customers = $89,100 revenue\n\n'
 291      'Database analysis: 49,595 of 166,384 keywords scraped (29.8%), discovering 560,980 sites. '
 292      'Average score 65.1/100 — majority need optimisation help.\n\n'
 293      'Market saturation is NOT a risk: 90+ years of runway at 1,000 acquisitions/month.')
 294  
 295  # Table 20: The problem (1x1)
 296  fill_single_cell_table(doc.tables[20],
 297      "Small local businesses face a critical challenge: their websites fail to convert visitors into customers, "
 298      "but they can't afford traditional solutions.\n\n"
 299      "Pain Points:\n"
 300      "1. Invisible Problem: Business owners don't realise their 3% conversion rate could be 10%+\n"
 301      "2. Unaffordable Solutions: CRO agencies charge $5,000-50,000/month\n"
 302      "3. Complex Tools Without Insights: Hotjar/Crazy Egg show heatmaps but don't explain how to fix issues\n"
 303      "4. Lack of Expertise: Upwork freelancers ($50-200/hr) are hit-or-miss\n"
 304      "5. Time Constraints: Owners too busy to learn CRO best practices\n\n"
 305      "Cost of Inaction: A plumber with a poorly optimised website getting 500 visitors/month at 3% conversion "
 306      "= 15 leads. Each job worth $500, close rate 50% = $3,750/month lost revenue ($45,000/year).")
 307  
 308  # Table 21: Our solution (1x1)
 309  fill_single_cell_table(doc.tables[21],
 310      'Audit&Fix solves these problems through:\n\n'
 311      '1. Automated AI Analysis: GPT-4o-mini vision analysis provides consistent, unbiased scoring — no expensive human analysts\n'
 312      '2. Radical Affordability: $297 AUD one-time vs $5,000+/month agencies or $2,000+ Upwork projects\n'
 313      '3. Actionable Insights: Specific recommendations prioritised by impact, not just data\n'
 314      '4. Speed: Automated pipeline delivers results in hours, not weeks\n'
 315      '5. Multi-Channel Delivery: Email, SMS, contact forms, LinkedIn, X/Twitter\n'
 316      '6. No Ongoing Commitment: One-time report with optional monthly monitoring ($29/mo)\n\n'
 317      'Unique Advantages:\n'
 318      '• Learning from 23,990+ analysed websites improves recommendation quality\n'
 319      '• Cultural pricing optimisation based on regional numerology and psychology\n'
 320      '• Multi-country support with proper localisation (currency, dates, phone formats)\n'
 321      '• Fully automated pipeline scales infinitely without hiring')
 322  
 323  # Table 22: Customer Avatar (6x3) - row 0 is header
 324  t = doc.tables[22]
 325  avatar = [
 326      ("Identify the customer's goals and values",
 327       '• Grow their local business\n• Compete against larger competitors\n• Get more value from existing website traffic\n• Professional online presence\n• Affordable solutions that work',
 328       'Focus messaging on ROI and competitive advantage\nEmphasise affordability and actionable insights\nHighlight quick wins and implementation ease'),
 329      ('Find their sources of information',
 330       '• Google search\n• Trade associations\n• Facebook business groups\n• Word of mouth referrals\n• Local business networks',
 331       'Target cold outreach via email and contact forms\nBuild referral incentive program\nCreate case studies for social proof'),
 332      ('What are their demographics?',
 333       '• Business Type: Local service businesses (plumbers, electricians, roofers, lawyers, dentists)\n• Revenue: $500K-$5M annually\n• Employees: 5-50\n• Location: Top 25 GDP countries\n• Website: Existing site scoring B- or below',
 334       'Tailor proposals to industry-specific examples\nPrice appropriately for business size\nLocalise currency and cultural elements'),
 335      ('Identify their challenges and pain points',
 336       "• Website not generating enough leads\n• Can't afford expensive CRO agencies\n• Don't know what's wrong with their website\n• Worried about ROI of website improvements\n• Sceptical of marketing \"magic bullets\"",
 337       'Lead with data-driven analysis (AI scoring)\nEmphasise affordability and clear ROI\nProvide specific, actionable recommendations\nBuild trust through transparency and case studies'),
 338      ('List out their objections and role in the purchase process',
 339       '• "Our website is fine, we just need more traffic"\n• "$297 is expensive for a report"\n• "How do I know this will actually help?"\n• Decision maker: Business owner or marketing manager\n• Purchase cycle: 1-4 weeks',
 340       'Address misconceptions about traffic vs conversion\nShow conversion rate improvement ROI calculator\nOffer money-back guarantee if score doesn\'t improve\nProvide case studies and before/after examples'),
 341  ]
 342  for i, (label, info, use) in enumerate(avatar):
 343      set_cell(t, i + 1, 0, label)
 344      set_cell(t, i + 1, 1, info)
 345      set_cell(t, i + 1, 2, use)
 346  
 347  # Table 23: Competitor analysis (9x4) - 3 competitors
 348  t = doc.tables[23]
 349  # Headers already set: Competitor name, [1.], 2., 3.
 350  comps = [
 351      # (row_label, comp1, comp2, comp3)
 352      ('', 'Traditional CRO Agencies', 'Hotjar', 'Upwork Freelancers'),
 353      ('What do they offer?',
 354       'Full-service CRO: analysis, A/B testing, implementation, ongoing optimisation',
 355       'Heatmaps, session recordings, surveys, user feedback',
 356       'Custom CRO analysis and implementation'),
 357      ('What Sales channels do they use?',
 358       'Direct sales, referrals, content marketing',
 359       'SaaS website, freemium model',
 360       'Upwork marketplace'),
 361      ('Their marketing activities',
 362       'Case studies, webinars, SEO, thought leadership',
 363       'Content marketing, SEO, product-led growth',
 364       'Freelancer profiles, reviews, portfolio'),
 365      ('Their pricing',
 366       '$5,000-50,000/month',
 367       'Free to $99+/month',
 368       '$50-200/hour'),
 369      ('Share of market',
 370       'Large (enterprise clients)',
 371       'Large (very popular)',
 372       'Fragmented'),
 373      ('Strengths',
 374       'Deep expertise, proven results, full service',
 375       'Visual data, easy setup, affordable',
 376       'Flexible, can be affordable, custom work'),
 377      ('Weaknesses',
 378       'Extremely expensive, long contracts, overkill for small business',
 379       "Shows what's happening but not why or how to fix; requires interpretation",
 380       'Inconsistent quality, time-consuming to manage'),
 381      ("What we'll do differently",
 382       'Automated AI analysis at 95% lower cost; one-time reports with no contracts',
 383       'AI interprets data and provides actionable recommendations; no subscription needed',
 384       'Consistent AI-powered analysis; fixed price; fast delivery; proven methodology'),
 385  ]
 386  for i, row_data in enumerate(comps):
 387      set_cell(t, i, 1, row_data[1])
 388      set_cell(t, i, 2, row_data[2])
 389      set_cell(t, i, 3, row_data[3])
 390  
 391  # Table 24: SWOT (4x3) — header row has Strengths / [blank] / [blank]
 392  # Actually it's 4 rows: Strengths, Weaknesses, Opportunities, Threats
 393  # But template shows it as 2x2 grid. Let me fill cols 1 and 2.
 394  t = doc.tables[24]
 395  set_cell(t, 0, 1,
 396      '1. Technical expertise: Deep AI/ML and automation capabilities\n'
 397      '2. Low cost structure: 96%+ gross margins (~$12/customer)\n'
 398      '3. Scalable technology: Pipeline handles unlimited volume without hiring\n'
 399      '4. Multi-country support: 25 countries with proper localisation\n'
 400      '5. Data advantage: Learning from 23,990+ analysed sites')
 401  set_cell(t, 0, 2,
 402      '1. Growing AI acceptance: Businesses increasingly trust AI tools\n'
 403      '2. Underserved market: Small businesses can\'t afford traditional CRO\n'
 404      '3. Global expansion: 200+ countries beyond current 25\n'
 405      '4. Recurring revenue: Monthly monitoring subscriptions\n'
 406      '5. Implementation partnerships: Connect customers with developers')
 407  set_cell(t, 1, 1,
 408      '1. 29.8% of keywords scraped (70% remaining)\n'
 409      '2. Solo operation: Single point of failure\n'
 410      '3. No brand recognition yet\n'
 411      '4. One-time revenue model (not recurring)\n'
 412      '5. No implementation service (diagnose only)')
 413  set_cell(t, 1, 2,
 414      '1. API dependencies: Reliant on OpenRouter, ZenRows, Resend, Twilio\n'
 415      '2. Competitor response: Established tools could add AI features\n'
 416      '3. AI commoditisation: Analysis could become commodity\n'
 417      '4. Economic downturn: Small businesses cut discretionary spend\n'
 418      '5. Regulatory changes: Privacy laws could restrict scraping')
 419  # Rows 2 and 3 (Opportunities, Threats) — template has them but they're captured above
 420  
 421  # ============================================================
 422  # LEGISLATION AND COMPLIANCE
 423  # ============================================================
 424  
 425  # Table 25: Laws (1x1)
 426  fill_single_cell_table(doc.tables[25],
 427      '• ABN registration ✓ and business name registration\n'
 428      '• GST registration if revenue exceeds $75,000\n'
 429      '• Income tax (sole trader reports business income on personal tax return)\n'
 430      '• ATO record-keeping requirements\n'
 431      '• Australian Consumer Law (ACL)\n'
 432      '• Australian Privacy Act 1988\n'
 433      '• GDPR compliance for EU customers\n'
 434      '• CCPA for US customers\n'
 435      '• CAN-SPAM Act 2003 (US) — unsubscribe links, sender identification\n'
 436      '• Spam Act 2003 (Australia) — consent requirements\n'
 437      '• TCPA (US) — SMS opt-in, business hours restrictions\n'
 438      '• Respect robots.txt files and API terms of service')
 439  
 440  # Table 26: Records (5x3) - row 0 is header
 441  t = doc.tables[26]
 442  records = [
 443      ('Financial Records', 'Track revenue, expenses, profitability; tax compliance', 'SQLite database + MYOB or Xero'),
 444      ('Tax Records', 'Income tax, GST (if applicable), business deductions', 'MYOB/Xero + ATO myGov portal'),
 445      ('Customer Data', 'Contact info, purchased reports, communications', 'SQLite database (sites, outreaches, conversations tables)'),
 446      ('Transaction Logs', 'Audit trail of pipeline operations, API calls, outreach', 'Daily log files with 7-day rotation (logs/ directory)'),
 447  ]
 448  for i, (name, purpose, system) in enumerate(records):
 449      set_cell(t, i + 1, 0, name)
 450      set_cell(t, i + 1, 1, purpose)
 451      set_cell(t, i + 1, 2, system)
 452  
 453  # Table 27: Bank (2x3) - row 0 is header
 454  t = doc.tables[27]
 455  set_cell(t, 1, 0, 'Audit&Fix Business Account')
 456  set_cell(t, 1, 1, 'Macquarie Bank')
 457  set_cell(t, 1, 2, 'Need to apply — separate business finances from personal')
 458  
 459  # Table 28: Policies (7x3) - row 0 is header
 460  t = doc.tables[28]
 461  policies = [
 462      ('Privacy Policy', 'Data collection, storage, usage disclosure; customer rights', 'Regular audits; data breach response plan; secure backups'),
 463      ('Refund Policy', 'Money-back guarantee if website score doesn\'t improve', 'Clear terms; documentation requirements; dispute resolution'),
 464      ('Unsubscribe Management', 'Automated unsubscribe link processing; Cloudflare Worker sync', 'Daily sync checks; manual unsubscribe option'),
 465      ('Data Backup & Recovery', 'Daily database backups to cloud; weekly full system backup', 'Test restores monthly; off-site backup storage'),
 466      ('Customer Support', 'Response time targets (24 hours); escalation procedures', 'Email ticketing system; FAQ documentation'),
 467      ('Cybersecurity', 'Password management; 2FA; malware protection; secure API keys', 'Security incident response plan; regular updates'),
 468  ]
 469  for i, (policy, procedures, contingency) in enumerate(policies):
 470      set_cell(t, i + 1, 0, policy)
 471      set_cell(t, i + 1, 1, procedures)
 472      set_cell(t, i + 1, 2, contingency)
 473  
 474  # ============================================================
 475  # MARKETING STRATEGY
 476  # ============================================================
 477  
 478  # Table 29: Marketing goals (1x1)
 479  fill_single_cell_table(doc.tables[29],
 480      'Our marketing goals are:\n\n'
 481      '1. Launch cold outreach campaign targeting sites scoring B- to E (0-82/100)\n'
 482      '2. Launch inbound "Free Website Score" funnel — paid ads drive traffic to free scanner\n'
 483      '3. Achieve 0.83% response rate from outreach (proven), improve to 2%+ with messaging fixes\n'
 484      '4. Convert responses to paid customers at 20% rate\n'
 485      '5. Generate first $3,000 in revenue (10 customers) in Q1 2026\n'
 486      '6. Build pipeline of 500 qualified prospects per month via outbound + inbound channels\n'
 487      '7. Develop referral incentive program (10% commission)')
 488  
 489  # Table 30: Pricing strategy (1x1)
 490  fill_single_cell_table(doc.tables[30],
 491      'Purchasing Power Parity (PPP) pricing with cultural adjustments:\n\n'
 492      'Base Price: USD $300 (reference country: United States)\n'
 493      'Formula: Local Price = $300 × (Local PPP / US PPP) × Cultural Pricing Factor\n\n'
 494      'Example pricing by country:\n'
 495      '• United States: $297 USD (charm pricing)\n'
 496      '• Australia: $337 AUD (PPP-adjusted + charm pricing)\n'
 497      '• United Kingdom: £159 GBP\n'
 498      '• Germany: €290 EUR (round number preference)\n'
 499      '• Japan: ¥39,800 JPY (lucky 8, avoids 4)\n\n'
 500      'Rationale: 95% cheaper than cheapest agency ($5,000/mo). Under $500 impulse threshold for small businesses. '
 501      '96%+ gross margin supports sustainable growth. One-time purchase reduces friction.\n\n'
 502      'Product Ladder:\n'
 503      '• Free: Instant Website Score ($0 — lead magnet)\n'
 504      '• Tripwire: Quick Fixes Report ($47 — credited toward full audit)\n'
 505      '• Core: Full CRO Audit ($297 PPP-adjusted)\n'
 506      '• Upsell: Follow-Up Benchmarking (50% of report price)\n'
 507      '• Recurring: Monthly Monitoring ($29/month)')
 508  
 509  # Table 31: Products/services (5x3) - row 0 is header
 510  t = doc.tables[31]
 511  products = [
 512      ('Free Website Score', 'Instant AI-powered website grading: overall score, letter grade, traffic-light factor summary, one "free peek" at weakest factor, email capture for lead nurturing', '$0 (lead magnet)'),
 513      ('Quick Fixes Report', 'Tripwire product: all 10 factor scores, top 3 quick wins with exact before/after copy, 3-5 page professional PDF, instant delivery. $47 credited toward Full Audit.', '$47'),
 514      ('CRO Analysis Report', 'Comprehensive AI vision analysis: annotated screenshots, conversion score (0-100), 10 detailed factor scores, prioritised action plan, competitor comparison', '$297-349 (PPP-adjusted)'),
 515      ('Monthly Monitoring', 'Ongoing score tracking: monthly re-score, email alerts on changes, quarterly trend report, priority support', '$29/month'),
 516  ]
 517  for i, (name, desc, price) in enumerate(products):
 518      set_cell(t, i + 1, 0, name)
 519      set_cell(t, i + 1, 1, desc)
 520      set_cell(t, i + 1, 2, price)
 521  
 522  # Table 32: Sales channels (5x3) - row 0 is header
 523  t = doc.tables[32]
 524  channels = [
 525      ('Email', 'Primary outbound customer acquisition', 'Automated email campaigns via Resend API, personalised AI-generated proposals, CAN-SPAM compliant, target: 2% response rate'),
 526      ('SMS', 'High-visibility outbound channel', 'Twilio API integration, TCPA compliant, business hours only (8am-9pm), mobile number prioritisation by country'),
 527      ('Website', 'Inbound conversions + free scanner', 'Professional landing page at auditandfix.com, self-service purchase via PayPal, free website scanner at /scan'),
 528      ('Paid Advertising', 'Drive traffic to free scanner', 'Google Ads (search intent), Facebook/Instagram (visual creative), LinkedIn (professional ROI angle). Target: $2/click, CAC under $50'),
 529  ]
 530  for i, (channel, used_for, details) in enumerate(channels):
 531      set_cell(t, i + 1, 0, channel)
 532      set_cell(t, i + 1, 1, used_for)
 533      set_cell(t, i + 1, 2, details)
 534  
 535  # Table 33: Promotion activities (5x5) - row 0 is header
 536  t = doc.tables[33]
 537  promos = [
 538      ('Cold Outreach Campaign', 'Email, SMS, Forms', 'Automated outreach scaling from 7k to 40-60k/month, personalised AI proposals', '$150/mo', 'Ongoing from Q1 2026'),
 539      ('Free Website Scanner', 'Website', 'Self-service lead gen: instant free score + email capture + nurture drip', '$0', 'Q1 2026'),
 540      ('Paid Advertising', 'Google, Facebook, LinkedIn', 'Drive traffic to free scanner. Target: $2/click, CAC under $50', '$600-900/mo', 'Q1 2026'),
 541      ('Case Study Development', 'Website, Email', 'Document 5 successful customer transformations with before/after screenshots', '$0', 'Q2 2026'),
 542  ]
 543  for i, (activity, channel, details, cost, target) in enumerate(promos):
 544      set_cell(t, i + 1, 0, activity)
 545      set_cell(t, i + 1, 1, channel)
 546      set_cell(t, i + 1, 2, details)
 547      set_cell(t, i + 1, 3, cost)
 548      set_cell(t, i + 1, 4, target)
 549  
 550  # Table 34: Marketing review (5x4) - row 0 is header
 551  t = doc.tables[34]
 552  reviews = [
 553      ('Cold Outreach Campaign', 'Weekly', 'Open rate, response rate, conversion rate, cost per customer', 'Response rate >2%, Conversion >0.4%, CPC <$100'),
 554      ('Free Website Scanner', 'Weekly', 'Scans/day, email capture rate, free-to-paid conversion', '50+ scans/day, email capture >40%, free-to-$47 >5%'),
 555      ('Paid Advertising', 'Weekly', 'CPC, CTR, cost per scan, CAC, ROAS', 'CPC <$2, CAC <$50, ROAS >5x'),
 556      ('Website Performance', 'Monthly', 'Unique visitors, bounce rate, time on page, conversion rate', 'Bounce <60%, time >2min, conversion >3%'),
 557  ]
 558  for i, (activity, date, measure, results) in enumerate(reviews):
 559      set_cell(t, i + 1, 0, activity)
 560      set_cell(t, i + 1, 1, date)
 561      set_cell(t, i + 1, 2, measure)
 562      set_cell(t, i + 1, 3, results)
 563  
 564  # Table 35: Marketing budget (6x3) - rows 0-1 are headers
 565  t = doc.tables[35]
 566  budget = [
 567      ('Outreach API Costs', '$150', 'Resend (email), Twilio (SMS), form submissions'),
 568      ('Paid Advertising', '$600-900', 'Google Ads + Facebook/IG driving traffic to free scanner'),
 569      ('Website Hosting', '$20', 'Domain, static hosting, SSL'),
 570      ('TOTAL COST:', '$770-$1,070/month', 'Year 1 total: $9,240-$12,840'),
 571  ]
 572  for i, (activity, bpm, comments) in enumerate(budget):
 573      set_cell(t, i + 2, 0, activity)
 574      set_cell(t, i + 2, 1, bpm)
 575      set_cell(t, i + 2, 2, comments)
 576  
 577  # Table 36: People/CRM (1x1)
 578  fill_single_cell_table(doc.tables[36],
 579      'Customer Relationship Management Strategy:\n\n'
 580      '1. Transparency and Education: Share methodology openly; educate about CRO best practices\n'
 581      '2. Proactive Communication: Follow up at 30, 60, 90 days; offer free rescore after implementation\n'
 582      '3. Exceptional Support: 24-hour response time; clear, jargon-free explanations; no-questions refund\n'
 583      '4. Continuous Value: Quarterly check-ins, industry trends, beta testing invites\n'
 584      '5. Referral Incentives: 10% commission on referred revenue; founding customer perks\n'
 585      '6. Feedback Loop: Post-delivery surveys, NPS tracking, implement suggested improvements\n\n'
 586      'CRM System: SQLite database tracking all interactions (current). Migrate to HubSpot/Pipedrive at 100+ customers.')
 587  
 588  # ============================================================
 589  # OPERATIONS
 590  # ============================================================
 591  
 592  # Table 37: Business processes (8x3) - rows 0-1 are headers
 593  t = doc.tables[37]
 594  processes = [
 595      ('1. Prospect Identification', 'Automated (Keywords cron)', 'Select active keywords, prioritise by search volume and low-scoring site count'),
 596      ('2. SERP Scraping', 'Automated (SERPs cron)', 'Scrape Google via ZenRows, extract top 10 organic results, filter directories/social media'),
 597      ('3. Asset Capture', 'Automated (Assets cron)', 'Capture 6 screenshots per site (mobile/tablet/desktop), capture HTML DOM'),
 598      ('4. AI Scoring', 'Automated (Scoring cron)', 'Send screenshots to GPT-4o-mini, analyse 15+ conversion factors, assign score 0-100'),
 599      ('5. Contact Enrichment', 'Automated (Enrich cron)', 'Browse About/Contact/Services pages, extract contact methods, prioritise channels'),
 600      ('6. Proposal Generation', 'Automated (Proposals cron)', 'Generate personalised proposals per contact method, localise by country'),
 601  ]
 602  for i, (step, role, actions) in enumerate(processes):
 603      set_cell(t, i + 2, 0, step)
 604      set_cell(t, i + 2, 1, role)
 605      set_cell(t, i + 2, 2, actions)
 606  
 607  # Table 38: Production/suppliers (1x1)
 608  fill_single_cell_table(doc.tables[38],
 609      'Audit&Fix is a fully automated AI-powered service with no physical production. Our "production" is software '
 610      'pipelines processing data through various APIs.\n\n'
 611      'Main Suppliers:\n'
 612      '• ZenRows ($70/mo) — SERP scraping API [Critical] — alternatives: ScrapingBee, SerpAPI\n'
 613      '• OpenRouter (~$15/mo) — LLM API for proposals/enrichment — alternatives: direct OpenAI/Anthropic\n'
 614      '• Anthropic (~$30/mo) — Claude API for proposal generation — alternatives: OpenRouter, GPT-4o\n'
 615      '• Resend ($20/mo) — Email delivery API — alternatives: SendGrid, Mailgun, AWS SES\n'
 616      '• Twilio (~$60/mo) — SMS delivery API — alternatives: Vonage, Plivo\n'
 617      '• ZeroBounce ($39/mo) — Email validation — alternatives: NeverBounce, Kickbox\n'
 618      '• Playwright ($0) — Browser automation (open source)')
 619  
 620  # Table 39: Labour (1x1)
 621  fill_single_cell_table(doc.tables[39],
 622      'Year 1: Solo Operation\n'
 623      '• Jason handles all development, operations, customer support, sales\n'
 624      '• Estimated workload: 40-50 hours/week\n'
 625      '  - Development/maintenance: 20 hrs/wk\n'
 626      '  - Customer support/sales: 10 hrs/wk\n'
 627      '  - Marketing/content: 10 hrs/wk\n'
 628      '  - Administration: 5 hrs/wk\n\n'
 629      'Year 2: Scaling\n'
 630      '• Customer Support VA: 10 hrs/wk @ $15/hr = $600/mo\n'
 631      '• Implementation Partner Network: Contract web developers (revenue share)\n'
 632      '• Content Writer: 4 posts/month @ $200 each = $800/mo\n\n'
 633      'Specialist Services:\n'
 634      '• Accountant: $1,200/year (tax prep and advice)\n'
 635      '• Lawyer: $1,500 one-time (terms of service, privacy policy review)\n'
 636      '• SEA Business Mentor: Free (provided through program)')
 637  
 638  # Table 40: Internal stakeholders (5x5) - row 0 is header
 639  t = doc.tables[40]
 640  staff = [
 641      ('Founder/Developer', '40-50', 'N/A (draws from profit)', 'Jason', 'Full-stack development, AI/ML integration, DevOps, technical writing, business strategy'),
 642      ('Virtual Assistant', '0 (Year 1)\n10 (Year 2)', '$15/hour', 'TBD', 'Customer service, email management, basic troubleshooting, CRM updates'),
 643      ('Freelance Developer', 'As needed (Year 2+)', '$50/hour', 'TBD', 'WordPress/web development, CRO implementation, client communication'),
 644  ]
 645  for i, (role, hours, rate, name, skills) in enumerate(staff):
 646      set_cell(t, i + 1, 0, role)
 647      set_cell(t, i + 1, 1, hours)
 648      set_cell(t, i + 1, 2, rate)
 649      set_cell(t, i + 1, 3, name)
 650      set_cell(t, i + 1, 4, skills)
 651  
 652  # Table 41: External stakeholders (6x4) - row 0 is header
 653  t = doc.tables[41]
 654  external = [
 655      ('Business Mentor', 'SEA Program Mentor', 'Business strategy, goal setting, accountability', 'Free (via SEA)'),
 656      ('Accountant', 'TBD (local NSW accountant)', 'Tax planning, financial advice, BAS/tax return', '$1,200/year'),
 657      ('Lawyer', 'TBD (startup/tech lawyer)', 'Legal compliance, terms of service, privacy policy', '$1,500 one-time'),
 658      ('Government Advisory', 'Small Business NSW', 'Free business advice, workshops, resources', 'Free'),
 659      ('Family Support', 'Father', 'Emotional support, business sounding board, financial safety net', 'Free (family)'),
 660  ]
 661  for i, (stype, name, skills, cost) in enumerate(external):
 662      set_cell(t, i + 1, 0, stype)
 663      set_cell(t, i + 1, 1, name)
 664      set_cell(t, i + 1, 2, skills)
 665      set_cell(t, i + 1, 3, cost)
 666  
 667  # Table 42: Payment methods (1x1)
 668  fill_single_cell_table(doc.tables[42],
 669      'Current (Automated):\n'
 670      '• PayPal Smart Buttons on auditandfix.com (2.6% + $0.30 domestic / ~3.6% + $0.30 international)\n'
 671      '• Supports all 25 target countries with local currency display\n'
 672      '• Prefilled order forms via short URLs for SMS/email conversions\n\n'
 673      'Future:\n'
 674      '• Stripe integration (alternative processor)\n\n'
 675      'Payment Terms:\n'
 676      '• Payment required before report delivery\n'
 677      '• 30-day money-back guarantee if score doesn\'t improve after implementation')
 678  
 679  # Table 43: Premises (1x1)
 680  fill_single_cell_table(doc.tables[43],
 681      'Home office setup in NSW, Australia:\n'
 682      '• Dedicated room for work (claim home office deduction)\n'
 683      '• High-speed internet (NBN)\n'
 684      '• Ergonomic desk and chair\n'
 685      '• No retail or commercial space needed (100% digital business)\n\n'
 686      'Benefits: Zero rent cost, tax deductions, flexibility, no commute')
 687  
 688  # Table 44: Stock (2x1)
 689  set_cell(doc.tables[44], 0, 0,
 690      'Not applicable — digital services with no physical inventory.\n'
 691      'Data storage: ~100KB per analysed site × 23,990 scored sites = ~2.4GB of screenshots and HTML.')
 692  set_cell(doc.tables[44], 1, 0,
 693      'Digital asset management: Daily automated database backups, git version control, '
 694      'organised file structure, 90-day screenshot retention policy.')
 695  
 696  # Table 45: Equipment (5x3) - row 0 is header
 697  t = doc.tables[45]
 698  equipment = [
 699      ('Laptop (Acer Nitro 5)', 'Existing', '$900'),
 700      ('External Monitor', 'Existing', '$400'),
 701      ('Desk', 'Existing', '$500'),
 702      ('Chair', 'Existing', '$400'),
 703  ]
 704  for i, (item, date, cost) in enumerate(equipment):
 705      set_cell(t, i + 1, 0, item)
 706      set_cell(t, i + 1, 1, date)
 707      set_cell(t, i + 1, 2, cost)
 708  
 709  # Table 46: IP (3x3) - row 0 is header
 710  t = doc.tables[46]
 711  ip = [
 712      ('CRO Analysis Report', 'AI vision analysis + annotated screenshots + conversion score + prioritised action plan + competitor comparison', '$297-349 (PPP-adjusted)'),
 713      ('Monthly Monitoring', 'Monthly re-score, email alerts on score changes, quarterly trend report', '$29/month'),
 714  ]
 715  for i, (product, desc, cost) in enumerate(ip):
 716      set_cell(t, i + 1, 0, product)
 717      set_cell(t, i + 1, 1, desc)
 718      set_cell(t, i + 1, 2, cost)
 719  
 720  # Table 47: Digital technology (1x1)
 721  fill_single_cell_table(doc.tables[47],
 722      'Core Application: JavaScript (Node.js v20+, ESM modules), NixOS environment, SQLite database\n'
 723      'Pipeline: ZenRows API (SERP scraping), Playwright (browser automation), GPT-4o-mini (scoring), Claude API (proposals)\n'
 724      'Outreach: Resend API (email), Twilio (SMS), Cloudflare Workers (webhooks)\n'
 725      'Infrastructure: Hetzner VPS ($16.50/mo), git + GitHub, custom logging with daily rotation\n'
 726      'Analytics: Streamlit dashboard (9 pages), SQLite queries for operational metrics\n'
 727      'Development: VSCode with Claude Code extension, Node.js test runner (82% coverage)')
 728  
 729  # Table 48: Environmental (1x1)
 730  fill_single_cell_table(doc.tables[48],
 731      'Digital-first business with minimal environmental impact:\n'
 732      '• No physical products, shipping, or retail space\n'
 733      '• Remote work — zero transportation emissions\n'
 734      '• Paperless operations: all records, reports, communications are digital\n'
 735      '• Efficient code: optimise prompts and API calls to reduce computational waste\n'
 736      '• Responsible data storage: 90-day screenshot retention to reduce storage needs\n'
 737      '• Green hosting: choose provider with renewable energy commitment when scaling')
 738  
 739  # ============================================================
 740  # THE FINANCES
 741  # ============================================================
 742  
 743  # Table 49: Establishment costs (1x1)
 744  fill_single_cell_table(doc.tables[49],
 745      'Total start-up costs: $9,294 AUD (excluding drawings)\n\n'
 746      'Breakdown:\n'
 747      '• Business name registration: $50\n'
 748      '• Domain registration: $30\n'
 749      '• Website hosting (initial year): $240\n'
 750      '• Pre-launch API/development costs: $3,000 (ZenRows, OpenRouter, Claude API, Twilio)\n'
 751      '• API subscriptions (6 months): $2,694\n'
 752      '• Claude Max subscription (6 months): $600\n'
 753      '• Logo design: $200\n'
 754      '• Internet/phone business portion (6 months): $200\n'
 755      '• Contingency buffer: $144\n'
 756      '• Website development: $0 (self-built)\n'
 757      '• Equipment: $0 (already owned)')
 758  
 759  # Table 50: Current finances (1x1)
 760  fill_single_cell_table(doc.tables[50],
 761      'Personal Financial Situation:\n'
 762      '• Savings available: Minimal personal savings allocated to business ($1,000 opening balance)\n'
 763      '• Cost of living: $2,000/week = $8,667/month\n'
 764      '• Current income from business: $0 (pre-launch)\n'
 765      '• SEA assistance: $2,328/month (personal income support, not business capital)\n'
 766      '• Father\'s support: $1,000/week ($4,333/month) until profitable')
 767  
 768  # Table 51: Finance needed (1x1)
 769  fill_single_cell_table(doc.tables[51],
 770      'Capital Requirements:\n\n'
 771      'Business startup capital: $9,294 (startup costs including pre-launch API investment)\n'
 772      '+ Ongoing family support ($1,000/week) until profitable\n\n'
 773      'Cost of Living Gap:\n'
 774      '• Monthly COL: $8,667 ($2,000/week)\n'
 775      '• SEA assistance: $2,328/month (personal income support — NOT business capital)\n'
 776      '• Father\'s support: $4,333/month ($1,000/week)\n'
 777      '• Monthly gap varies as business income grows')
 778  
 779  # Table 52: Sources of funding (4x5) - row 0 is header
 780  t = doc.tables[52]
 781  funding = [
 782      ('Father (weekly support)', '~$52,000 (Year 1 est)', '25% profit share', '$1,000/wk until profitable', '25% of net profit'),
 783      ('Personal Investment', '$1,000', 'N/A (equity)', 'N/A', 'N/A'),
 784      ('Total Business Capital', '~$53,000', '$0 interest', '-', '-'),
 785  ]
 786  for i, (source, total, cost, term, monthly) in enumerate(funding):
 787      set_cell(t, i + 1, 0, source)
 788      set_cell(t, i + 1, 1, total)
 789      set_cell(t, i + 1, 2, cost)
 790      set_cell(t, i + 1, 3, term)
 791      set_cell(t, i + 1, 4, monthly)
 792  
 793  # Table 53: Break-even (1x1)
 794  fill_single_cell_table(doc.tables[53],
 795      'The break-even point for the business is $449 AUD per month or 2 units per month '
 796      '(survival break-even — business costs only).\n\n'
 797      'Personal break-even (covering COL): $8,667/month = 28 customers/month @ $297 AUD avg.\n\n'
 798      'Break-Even Timeline: Month 6-8 (volume-scaled at 40k outreaches/month) or Month 12-14 (conservative at 7k/month).\n\n'
 799      'Gross Margin: 95.8%\n'
 800      '• Revenue per customer: $297\n'
 801      '• Variable cost per customer: $12.39 (API $1.69 + PayPal 3.5%+$0.30 = $10.70)\n'
 802      '• Gross profit per customer: $284.61')
 803  
 804  # Table 54: Managing financial performance (1x1)
 805  fill_single_cell_table(doc.tables[54],
 806      'Weekly: Track API costs per customer, monitor CAC, review cash position, check outreach conversion rates\n\n'
 807      'Monthly: P&L statement, compare actual vs projected, calculate MRR/CLV/CAC, reconcile bank statements\n\n'
 808      'Quarterly: BAS lodgment (if GST registered), strategic planning, review projections, meet accountant\n\n'
 809      'Annual: Tax return, full financial audit, year-over-year comparison, evaluate business structure\n\n'
 810      'Financial Controls: Separate business bank account, receipt tracking in Xero, automated expense '
 811      'categorisation, budget vs actual variance analysis, API cost circuit breakers')
 812  
 813  # Table 55: P&L note (already has text, leave it)
 814  
 815  # Table 56: P&L Year 1 (9x5) - quarterly
 816  t = doc.tables[56]
 817  # Using spreadsheet data: 300 units, monthly ramp [0,2,6,10,16,22,30,36,40,44,46,48]
 818  # Q1: 0+2+6=8, Q2: 10+16+22=48, Q3: 30+36+40=106, Q4: 44+46+48=138
 819  q_units = [8, 48, 106, 138]
 820  q_rev = [u * 297 for u in q_units]
 821  q_cogs = [u * 12 for u in q_units]
 822  q_gross = [r - c for r, c in zip(q_rev, q_cogs)]
 823  # OpEx ~$616/quarter (monthly: API $449 + some marketing)
 824  q_opex = [616, 616, 616, 616]  # rough estimate from $449/mo × 3 months ≈ simplify
 825  # Actually use the figures from the spreadsheet: fixed costs $388/mo × 3 = $1,164/quarter
 826  q_opex = [1164, 1164, 1164, 1164]
 827  q_total_opex = q_opex
 828  q_operating = [g - o for g, o in zip(q_gross, q_total_opex)]
 829  q_net = q_operating  # no other expenses in Year 1
 830  
 831  for qi in range(4):
 832      col = qi + 1
 833      set_cell(t, 1, col, f'${q_rev[qi]:,}')  # Income / Revenue
 834      set_cell(t, 2, col, f'${q_rev[qi]:,}')  # Total Sales income
 835      set_cell(t, 3, col, f'${q_cogs[qi]:,}')  # COGS
 836      set_cell(t, 4, col, f'${q_gross[qi]:,}')  # Gross profit
 837      set_cell(t, 5, col, f'${q_total_opex[qi]:,}')  # Operating Expenses
 838      set_cell(t, 6, col, f'${q_total_opex[qi]:,}')  # Total operating expenses
 839      set_cell(t, 7, col, f'${q_operating[qi]:,}')  # Operating income
 840      set_cell(t, 8, col, f'${q_net[qi]:,}')  # NET Profit
 841  
 842  # Table 57: P&L Year 2 (9x5) - quarterly (from BP)
 843  t = doc.tables[57]
 844  y2_data = [
 845      # Q1: 120 cust, Q2: 150, Q3: 165, Q4: 165
 846      (35640, 240, 1538),
 847      (44550, 300, 5838),
 848      (49005, 330, 5838),
 849      (49005, 330, 5838),
 850  ]
 851  for qi, (rev, cogs, opex) in enumerate(y2_data):
 852      col = qi + 1
 853      gross = rev - cogs
 854      operating = gross - opex
 855      set_cell(t, 1, col, f'${rev:,}')
 856      set_cell(t, 2, col, f'${rev:,}')
 857      set_cell(t, 3, col, f'${cogs:,}')
 858      set_cell(t, 4, col, f'${gross:,}')
 859      set_cell(t, 5, col, f'${opex:,}')
 860      set_cell(t, 6, col, f'${opex:,}')
 861      set_cell(t, 7, col, f'${operating:,}')
 862      set_cell(t, 8, col, f'${operating:,}')
 863  
 864  # ============================================================
 865  # RISK MANAGEMENT
 866  # ============================================================
 867  
 868  # Table 58: Risk assessment (7x3) - row 0 is header
 869  t = doc.tables[58]
 870  risks = [
 871      ('Untested Conversion Assumptions — 2% response rate and 20% conversion are industry averages, not validated. '
 872       'Actual data (12 days): 0.83% response, 0% conversion.',
 873       'High',
 874       'Priority 1: Run pipeline and track real metrics from Month 1. Track actual response rate, conversion, cost per customer. '
 875       'Run A/B test Month 3. Decision point: adjust strategy based on actual performance.'),
 876      ('API Dependency — ZenRows, OpenRouter, Anthropic could raise prices, change terms, or shut down.',
 877       'Medium',
 878       'Circuit breakers to prevent runaway costs. Monitor costs weekly with budget alerts. Maintain alternative suppliers. '
 879       'Build prompt caching. Negotiate volume discounts.'),
 880      ('Low Conversion Rates — Cold outreach fails to convert at profitable rates.',
 881       'Medium',
 882       'A/B test subject lines, proposal copy, pricing. Trust/proof/importance framework deployed (March 2026). '
 883       'If CRO audit model fails: pivot to Ghost Hunter or 2-Step (same infrastructure, stronger value propositions).'),
 884      ('Cold SMS TCPA liability — Commercial intent SMS is "telemarketing" under 47 CFR §64.1200. Statutory damages $500-$1,500/text.',
 885       'Medium',
 886       'US/CA SMS blocked via OUTREACH_BLOCKED_SMS_COUNTRIES=US,CA until legal counsel confirms Duguid defense applies.'),
 887      ('GDPR without documented Legitimate Interest Assessment — Art 6(1)(f) requires formal LIA.',
 888       'High',
 889       'GDPR+UK countries blocked via OUTREACH_BLOCKED_COUNTRIES until LIA completed using ICO template (free, 2-3 hours).'),
 890      ('Solo Operator Burnout — Working 50+ hour weeks unsustainably.',
 891       'Medium',
 892       'Automate repetitive tasks aggressively. Set work-life boundaries. Hire VA when revenue supports it. '
 893       'Build systems that run autonomously for weeks.'),
 894  ]
 895  for i, (risk, likelihood, mitigation) in enumerate(risks):
 896      set_cell(t, i + 1, 0, risk)
 897      set_cell(t, i + 1, 1, likelihood)
 898      set_cell(t, i + 1, 2, mitigation)
 899  
 900  # Table 59: Insurance (4x4) - row 0 is header
 901  t = doc.tables[59]
 902  insurance = [
 903      ('Professional Indemnity', 'TBD', 'Coverage for professional advice/recommendations in reports', 'No — need to obtain'),
 904      ('Public Liability', 'TBD', 'General liability coverage', 'No — assess need'),
 905      ('Cyber Liability', 'TBD', 'Data breach, cyber incident coverage', 'No — assess when handling customer payment data'),
 906  ]
 907  for i, (itype, provider, details, cert) in enumerate(insurance):
 908      set_cell(t, i + 1, 0, itype)
 909      set_cell(t, i + 1, 1, provider)
 910      set_cell(t, i + 1, 2, details)
 911      set_cell(t, i + 1, 3, cert)
 912  
 913  # Table 60: Backup strategy (7x4)
 914  t = doc.tables[60]
 915  # Row 1 is headers: Information type, How often, Who's responsible, Procedure
 916  backup_data = [
 917      ('SQLite Database', 'Daily (automated)', 'Jason', 'Automated backup script to cloud storage (Backblaze B2). 30-day retention.'),
 918      ('Source Code', 'Every commit', 'Jason', 'Git + GitHub. All code version controlled with comprehensive test suite.'),
 919      ('Customer Data', 'Daily (with DB backup)', 'Jason', 'Included in SQLite backup. Encrypted at rest. GDPR-compliant deletion on request.'),
 920  ]
 921  for i, (info_type, how_often, who, procedure) in enumerate(backup_data):
 922      set_cell(t, i + 2, 0, info_type)
 923      set_cell(t, i + 2, 1, how_often)
 924      set_cell(t, i + 2, 2, who)
 925      set_cell(t, i + 2, 3, procedure)
 926  
 927  # Table 61: Key contacts for emergencies (6x2) - row 0 is header
 928  t = doc.tables[61]
 929  contacts = [
 930      ('SEA Business Mentor', 'Email/Phone (via SEA program)'),
 931      ('Accountant', 'TBD'),
 932      ('Lawyer', 'TBD'),
 933      ('Father (financial support)', 'Phone/Email'),
 934      ('Hosting Provider (Hetzner)', 'https://www.hetzner.com/support'),
 935  ]
 936  for i, (name, contact) in enumerate(contacts):
 937      set_cell(t, i + 1, 0, name)
 938      set_cell(t, i + 1, 1, contact)
 939  
 940  # Table 62: Essential jobs (5x4)
 941  t = doc.tables[62]
 942  # Row 0 is merged header, rows 1-4 are: Task details, Training required, Current arrangements, Backup
 943  set_cell(t, 0, 0, 'Pipeline Operations')
 944  set_cell(t, 0, 1, 'Customer Support')
 945  set_cell(t, 0, 2, 'Sales & Outreach')
 946  set_cell(t, 0, 3, 'Development')
 947  set_cell(t, 1, 0, 'Monitor automated pipeline, handle errors, ensure uptime')
 948  set_cell(t, 1, 1, 'Respond to inquiries, deliver reports, handle refunds')
 949  set_cell(t, 1, 2, 'QA outreach messages, process inbound replies, close sales')
 950  set_cell(t, 1, 3, 'Bug fixes, feature development, testing')
 951  set_cell(t, 2, 0, 'Linux sysadmin, Node.js, SQLite')
 952  set_cell(t, 2, 1, 'Communication, empathy, product knowledge')
 953  set_cell(t, 2, 2, 'Sales, copywriting, CRM')
 954  set_cell(t, 2, 3, 'JavaScript, AI/ML, testing')
 955  set_cell(t, 3, 0, 'Jason (sole operator)')
 956  set_cell(t, 3, 1, 'Jason (VA in Year 2)')
 957  set_cell(t, 3, 2, 'Jason (automated QA workflow)')
 958  set_cell(t, 3, 3, 'Jason')
 959  set_cell(t, 4, 0, 'Automated monitoring + documented runbooks')
 960  set_cell(t, 4, 1, 'FAQ templates, canned responses')
 961  set_cell(t, 4, 2, 'Automated sending, Google Sheets QA backup')
 962  set_cell(t, 4, 3, 'Comprehensive docs, test suite, git history')
 963  
 964  # Table 63: Essential services/supplies (8x4)
 965  t = doc.tables[63]
 966  set_cell(t, 0, 0, 'ZenRows API')
 967  set_cell(t, 0, 1, 'Resend Email API')
 968  set_cell(t, 0, 2, 'Twilio SMS API')
 969  set_cell(t, 0, 3, 'Anthropic/OpenRouter API')
 970  set_cell(t, 1, 0, 'SERP scraping for prospect identification')
 971  set_cell(t, 1, 1, 'Email delivery for outreach and reports')
 972  set_cell(t, 1, 2, 'SMS delivery for outreach')
 973  set_cell(t, 1, 3, 'LLM for scoring and proposal generation')
 974  set_cell(t, 2, 0, 'Active subscription ($70/mo)')
 975  set_cell(t, 2, 1, 'Active subscription ($20/mo)')
 976  set_cell(t, 2, 2, 'Active subscription (~$60/mo)')
 977  set_cell(t, 2, 3, 'Active subscriptions (~$45/mo)')
 978  set_cell(t, 3, 0, 'ScrapingBee, SerpAPI, Apify')
 979  set_cell(t, 3, 1, 'SendGrid, Mailgun, AWS SES')
 980  set_cell(t, 3, 2, 'Vonage, Plivo, AWS SNS')
 981  set_cell(t, 3, 3, 'Direct OpenAI, direct Anthropic')
 982  # Essential equipment rows (4-7)
 983  set_cell(t, 4, 0, 'Laptop (Acer Nitro 5)')
 984  set_cell(t, 4, 1, 'Hetzner VPS')
 985  set_cell(t, 4, 2, 'Internet (NBN)')
 986  set_cell(t, 4, 3, 'External Monitor')
 987  set_cell(t, 5, 0, 'Development and pipeline execution')
 988  set_cell(t, 5, 1, 'Cloud hosting for pipeline ($16.50/mo)')
 989  set_cell(t, 5, 2, 'Internet connectivity for all operations')
 990  set_cell(t, 5, 3, 'Extended workspace for development')
 991  set_cell(t, 6, 0, 'Owned (existing)')
 992  set_cell(t, 6, 1, 'Active subscription')
 993  set_cell(t, 6, 2, 'Active subscription')
 994  set_cell(t, 6, 3, 'Owned (existing)')
 995  set_cell(t, 7, 0, 'Purchase replacement if needed')
 996  set_cell(t, 7, 1, 'DigitalOcean, Vultr, OVH')
 997  set_cell(t, 7, 2, 'Mobile hotspot backup')
 998  set_cell(t, 7, 3, 'Work without; purchase replacement')
 999  
1000  # Table 64: Cyber incident response (1x1)
1001  fill_single_cell_table(doc.tables[64],
1002      'CYBER INCIDENT RESPONSE PLAN\n\n'
1003      'Step 1: Identify and contain the incident\n'
1004      '• Monitor logs for unusual activity\n'
1005      '• Isolate affected systems\n'
1006      '• Rotate all API keys and credentials\n\n'
1007      'Step 2: Assess impact\n'
1008      '• Determine what data was affected\n'
1009      '• Check if customer data was compromised\n'
1010      '• Review audit logs for scope of breach\n\n'
1011      'Step 3: Remediate and notify\n'
1012      '• Fix vulnerability\n'
1013      '• Notify affected customers within 72 hours (GDPR requirement)\n'
1014      '• Report to Australian Information Commissioner if serious breach\n'
1015      '• Document incident and update security procedures')
1016  
1017  # Table 65: Incident response steps (3x2)
1018  t = doc.tables[65]
1019  set_cell(t, 0, 1, 'Identify and Contain: Stop the breach, isolate affected systems, rotate API keys and credentials immediately')
1020  set_cell(t, 1, 1, 'Assess and Investigate: Determine scope and impact, check if customer data compromised, review audit logs')
1021  set_cell(t, 2, 1, 'Remediate and Notify: Fix vulnerability, notify affected customers within 72 hours, report to OAIC if serious, document and improve')
1022  
1023  # Table 66: Appendix checklist (5x2) - row 0 is header
1024  t = doc.tables[66]
1025  set_cell(t, 0, 1, 'See separate attachments')
1026  set_cell(t, 1, 1, 'Standard business hours (flexible, home office). 40-50 hours/week.')
1027  set_cell(t, 2, 1, 'ABN registration, business name registration. Privacy Policy and Terms of Service published at auditandfix.com.')
1028  set_cell(t, 3, 1, 'Father: $1,000/week until profitable (~$52,000 Year 1 est). Personal savings: $1,000. SEA: personal income support only.')
1029  set_cell(t, 4, 1, 'N/A — no business-related travel planned.')
1030  
1031  # Table 67: Additional appendix (1x1)
1032  fill_single_cell_table(doc.tables[67],
1033      'Supporting Documents:\n'
1034      '• Financial Spreadsheets: AuditFix Financial Spreadsheets 2026.xlsx\n'
1035      '• Terms of Service: synced from auditandfix.com/terms.php\n'
1036      '• Privacy Policy: synced from auditandfix.com/privacy.php\n'
1037      '• Cookie Policy: live at auditandfix.com/cookies.php\n'
1038      '• ABN registration (on file)\n'
1039      '• SEA application and approval\n'
1040      '• Sample CRO Analysis Report (redacted)')
1041  
1042  # Table 68: Travel (1x1)
1043  fill_single_cell_table(doc.tables[68],
1044      'No business-related travel planned. Audit&Fix is a 100% digital/remote business '
1045      'operated from a home office in NSW, Australia.')
1046  
1047  # ============================================================
1048  # SAVE
1049  # ============================================================
1050  
1051  doc.save(DST)
1052  print(f'Created: {DST}')
1053  print(f'Tables populated: {len(doc.tables)}')
1054  
1055  # Verify
1056  doc2 = Document(DST)
1057  print(f'Total paragraphs: {len(doc2.paragraphs)}')
1058  # Show heading structure
1059  for p in doc2.paragraphs:
1060      if p.style.name == 'Heading 1':
1061          print(f'  H1: {p.text}')