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}')