{"id":94,"date":"2025-12-20T07:24:55","date_gmt":"2025-12-20T07:24:55","guid":{"rendered":"https:\/\/steadyrabbit.in\/blogs\/?p=94"},"modified":"2025-12-20T07:24:55","modified_gmt":"2025-12-20T07:24:55","slug":"runway-or-run-away-forecast-burn-vs-roadmap-in-10-minutes","status":"publish","type":"post","link":"https:\/\/steadyrabbit.in\/blogs\/runway-or-run-away-forecast-burn-vs-roadmap-in-10-minutes\/","title":{"rendered":"Runway or Run Away? Forecast Burn vs. Roadmap in 10 Minutes"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">TL;DR (\u2248 95 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Founders run out of cash for only one reason\u2014<strong>the roadmap is longer than the runway<\/strong>.<br>Below is a 10-minute Google-Sheet + Python workflow that:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Imports your Stripe, QuickBooks, or Excel ledger.<br><\/li>\n\n\n\n<li>Buckets cost into <strong>Headcount, Cloud, GTM, Misc.<\/strong><strong><br><\/strong><\/li>\n\n\n\n<li>Calculates <em>runway under three burn scenarios<\/em> (base, stretch, worst).<br><\/li>\n\n\n\n<li>Maps the burn curve to your sprint roadmap and flags the \u201cred zone\u201d 90 days early.<br><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The sheet is pre-wired to <strong>SteadCAST<\/strong> so your Micro-GCC squad\u2019s velocity updates the forecast every Friday\u2014no CFO needed.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why \u201cCash \/ Monthly Burn\u201d Lies to You (\u2248 160 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Classic runway formula:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ini<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Runway = Cash on hand \u00f7 Average monthly burn<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Burn isn\u2019t flat.<\/strong> New hires, AWS credits expiry, marketing pushes.<br><\/li>\n\n\n\n<li><strong>Roadmap is lumpy.<\/strong> Some sprints need Flex DevOps or paid APIs.<br><\/li>\n\n\n\n<li><strong>DCA<\/strong> (days cash ahead) means nothing if <em>Sprint 7 demo<\/em> slips a week past investor meetings.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">What you need is a <strong>time-phased burn model<\/strong> with <em>scenario bands<\/em> and a <strong>roadmap overlay<\/strong> so you can answer:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u201cCan we hit the Day 90 MVP AND still have $250 k buffer for the next fundraise?\u201d<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The 4-Bucket Burn Model (\u2248 180 words)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Bucket<\/strong><\/td><td><strong>Formula<\/strong><\/td><td><strong>Notes \/ Benchmarks<\/strong><\/td><\/tr><tr><td><strong>Headcount<\/strong><\/td><td>\u03a3 Dev + PM + Ops salary * 1.25 (tax\/benefits)<\/td><td>55 \u2013 70 % of burn for early tech startups<\/td><\/tr><tr><td><strong>Cloud &amp; Tools<\/strong><\/td><td>AWS\/Azure + SaaS seats<\/td><td>Aim \u2264 20 % burn; watch AWS credits expiry<\/td><\/tr><tr><td><strong>GTM (Go-to-Market)<\/strong><\/td><td>Ads + events + SDR salary<\/td><td>Often spikes after MVP<\/td><\/tr><tr><td><strong>Misc. &amp; Buffer<\/strong><\/td><td>Legal, Fi-Ops, one-off fees<\/td><td>Keep 5\u201310 % for surprises<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rule of thumb:<\/strong> if <em>Headcount + Cloud<\/em> &gt; 85 % you have no flex for GTM.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">2.1 Sheet Template<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">\/resources\/runway_forecast_template.xlsx (linked in CTA) has:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inputs tab: current bank, ARR, churn, planned raises.<br><\/li>\n\n\n\n<li>Cost tab: enter or paste ledger with tags (HEAD, CLOUD, \u2026).<br><\/li>\n\n\n\n<li>Scenarios tab: Base (expected), Stretch (hiring boost), Worst (0.8\u00d7 ARR, +20 % cloud).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">10-Minute Workflow (\u2248 300 words)<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1 \u00b7 Pipe Ledger \u2192 Sheet (3 min)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install pandas gspread<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python ledger_to_sheet.py &#8211;file ledger.csv &#8211;sheet RUNWAY<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ledger_to_sheet.py parses &#8220;Category&#8221; column and posts rows via Google API.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2 \u00b7 Pull Velocity from SteadCAST (2 min)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">import requests, datetime, gspread<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">v = requests.get(&#8220;https:\/\/api.steadcast.ai\/velocity\/projectA&#8221;).json()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sprint_end = datetime.date.today() + datetime.timedelta(days=90)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sheet.update(&#8216;B5&#8217;, v[&#8216;avg_velocity&#8217;])<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sheet.update(&#8216;B6&#8217;, sprint_end.strftime(&#8216;%Y-%m-%d&#8217;))<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Velocity auto-translates to <em>Story-points \/ week<\/em> \u2192 <em>Dev hours<\/em> \u2192 <em>Headcount cost<\/em> over the next six sprints.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3 \u00b7 Generate Scenario Chart (5 min)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">import matplotlib.pyplot as plt, pandas as pd<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">df = pd.read_excel(&#8216;runway.xlsx&#8217;, sheet_name=&#8217;Scenarios&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.plot(df[&#8216;Month&#8217;], df[&#8216;Base&#8217;], label=&#8217;Base&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.plot(df[&#8216;Month&#8217;], df[&#8216;Stretch&#8217;], linestyle=&#8217;&#8211;&#8216;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.plot(df[&#8216;Month&#8217;], df[&#8216;Worst&#8217;], linestyle=&#8217;:&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.axvline(x=&#8217;MVP Launch&#8217;, color=&#8217;k&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.legend(); plt.title(&#8216;Burn Curve vs. MVP&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">plt.savefig(&#8216;burn_curve.png&#8217;)<br>Embed burn_curve.png in your investor deck.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reading the \u201cRunway Radar\u201d (\u2248 150 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Sheet auto-highlights:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Red zone<\/strong> \u2013 &lt; 90 days cash.<br><\/li>\n\n\n\n<li><strong>Amber<\/strong> \u2013 90\u2013180 days.<br><\/li>\n\n\n\n<li><strong>Green<\/strong> \u2013 > 180 days.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The roadmap overlay (imported from Jira via API) colors each sprint bar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Blue<\/strong> \u2013 on-track.<br><\/li>\n\n\n\n<li><strong>Grey<\/strong> \u2013 slip risk (\u2265 15 % tasks in \u201cDev-Doing\u201d).<br><\/li>\n\n\n\n<li><strong>Black<\/strong> \u2013 unscheduled backlog.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If <em>any<\/em> sprint in Amber\/Red zone is <em>Grey\/Black<\/em>, SteadCAST pings Slack:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sql<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f&nbsp; Sprint 6 slip pushes MVP day beyond cash buffer (59 days left).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Options: cut scope by 2 SP or raise bridge.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Real-World Example (B2B SaaS) (\u2248 140 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Inputs<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cash on hand: $1.3 M<br><\/li>\n\n\n\n<li>Burn last month: $96 k<br><\/li>\n\n\n\n<li>Hiring plan: +2 devs next month.<br><\/li>\n\n\n\n<li>Cloud credits expire in 60 days.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sheet output<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Base scenario:<\/strong> Runway 14.2 months; MVP at Month 3 safe.<br><\/li>\n\n\n\n<li><strong>Stretch (hire + credit expiry):<\/strong> Red zone at Month 8.<br><\/li>\n\n\n\n<li><strong>Worst (10 % churn):<\/strong> Red zone Month 6; gap $220 k.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Decision<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cut AWS RDS upgrade (\u2013$6 k\/mo) and postpone 2nd dev hire \u2192 red zone extends to Month 10, enough buffer to raise Seed+.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Top 5 Pitfalls &amp; How to Dodge Them (\u2248 170 words)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Pitfall<\/strong><\/td><td><strong>Fix<\/strong><\/td><\/tr><tr><td><strong>Treating ARR as cash<\/strong><\/td><td>Input <em>cash<\/em> not bookings; SaaS prepaid can mask burn.<\/td><\/tr><tr><td>Ignoring rev-share\/payment fees<\/td><td>Model payment gateway fees as 2.9 % of GMV in Cloud bucket.<\/td><\/tr><tr><td>Forgetting renewals (IAAS, SaaS)<\/td><td>Tag contracts with \u201cRenew Date\u201d; template auto-adds spike.<\/td><\/tr><tr><td>Headcount loaded at 1.0 \u00d7 salary<\/td><td>Use <strong>1.25 \u00d7<\/strong> for tax\/benefits; 1.4 \u00d7 in Europe.<\/td><\/tr><tr><td>No buffer for \u201cunknown-unknowns\u201d<\/td><td>Add 5 % Misc. every month; SteadCAST treats as contingency.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Hooking Investors with Burn Multiple (\u2248 120 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Burn multiple = Net burn \u00f7 Net new ARR<\/strong><strong><br><\/strong> <em>Early Seed target:<\/em> 1.5\u20132.5\u00d7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sheet calculates this automatically. In the B2B SaaS case:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pre-MVP burn multiple: N\/A (zero ARR).<br><\/li>\n\n\n\n<li>Post-MVP Month 6: $510 k burn \u00f7 $230 k ARR = <strong>2.2\u00d7<\/strong> \u2192 attractive.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Add this to your deck footnotes\u2014VCs check it.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">10-Minute Checklist (\u2248 60 words)<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copy template to Google Drive.<br><\/li>\n\n\n\n<li>Run ledger_to_sheet.py with last 12-month CSV.<br><\/li>\n\n\n\n<li>Plug hiring &amp; credit expiry dates.<br><\/li>\n\n\n\n<li>Pull SteadCAST velocity into Sheet.<br><\/li>\n\n\n\n<li>Review red-zone warning; cut scope or cost if needed.<br><\/li>\n\n\n\n<li>Export chart \u2192 investor deck.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR (\u2248 95 words) Founders run out of cash for only one reason\u2014the roadmap is longer than the runway.Below is a 10-minute Google-Sheet + Python workflow that: The sheet is pre-wired to SteadCAST so your Micro-GCC squad\u2019s velocity updates the forecast every Friday\u2014no CFO needed. Why \u201cCash \/ Monthly Burn\u201d Lies to You (\u2248 160 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":15,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-94","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-product-ops-startups"],"_links":{"self":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":1,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":95,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/94\/revisions\/95"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media\/15"}],"wp:attachment":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}