<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rasha Salim</title>
    <description>The latest articles on DEV Community by Rasha Salim (@rasha_salim_1d56f8fe85479).</description>
    <link>https://dev.to/rasha_salim_1d56f8fe85479</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3878361%2Fcc2593e9-3b3a-4193-90a1-f82f7875b64a.jpg</url>
      <title>DEV Community: Rasha Salim</title>
      <link>https://dev.to/rasha_salim_1d56f8fe85479</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rasha_salim_1d56f8fe85479"/>
    <language>en</language>
    <item>
      <title>Monte Carlo simulations for startup ideas: how I built a go-to-market stress test</title>
      <dc:creator>Rasha Salim</dc:creator>
      <pubDate>Wed, 28 Oct 2026 20:42:21 +0000</pubDate>
      <link>https://dev.to/rasha_salim_1d56f8fe85479/monte-carlo-simulations-for-startup-ideas-how-i-built-a-go-to-market-stress-test-4fba</link>
      <guid>https://dev.to/rasha_salim_1d56f8fe85479/monte-carlo-simulations-for-startup-ideas-how-i-built-a-go-to-market-stress-test-4fba</guid>
      <description>&lt;p&gt;When I and my Co-Founder -who as you will see have an experience in marketing and sales that sums up to zero, used to evaluate a new product idea, we did it the way almost everyone does: we get excited, read a few blog posts, ask three friends, then settle on one number that &lt;em&gt;felt&lt;/em&gt; right and call it a plan.&lt;/p&gt;

&lt;p&gt;"We'll get 50 customers in three months."&lt;/p&gt;

&lt;p&gt;That number is the problem. It isn't a plan — it's a wish rooted in feelings we got after a good development run. A single point estimate hides all the uncertainty underneath it, and it gives you nothing to actually work with when reality doesn't cooperate.&lt;/p&gt;

&lt;p&gt;We had a reality check after trying to sell our first product, and we stopped trusting idea evaluation because most of it produces one confident answer and no error bars. So in the middle of the frustration, when you are trying to sell something that you think is valuable and everyone- that matters- disagrees, in addition to other personal events that led me to the one comfortable place I always run into, I built the opposite: a stress test. Here's how it works, and what I learned about what it can — and can't — tell you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaways up front:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A range is more honest than a point estimate.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;relative&lt;/em&gt; answer (which channel is cheaper) survives uncertain inputs far better than the absolute numbers do.&lt;/li&gt;
&lt;li&gt;The most useful output isn't the forecast — it's finding out which assumption your decision actually hinges on, and most importantly making an informed one.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Stress-testing isn't forecasting
&lt;/h2&gt;

&lt;p&gt;A forecast says: &lt;em&gt;this will happen.&lt;/em&gt; It gets judged by whether it was right.&lt;/p&gt;

&lt;p&gt;A stress test says: &lt;em&gt;if these assumptions hold, outcomes land in this range, and here's what moves them.&lt;/em&gt; It gets judged by whether it helped you decide.&lt;/p&gt;

&lt;p&gt;Those are different jobs. The second one is honest about the fact that you don't know your conversion rates in advance — and it's designed to be useful &lt;em&gt;despite&lt;/em&gt; that.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the simulation works
&lt;/h2&gt;

&lt;p&gt;The inputs split into two groups:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt; (from the founder): budget, team size, hours per week, the planning horizon, price, and the customer target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uncertain&lt;/strong&gt; (rolled fresh every trial): reply rates, conversion rates at each funnel stage, cost per click, cost per contact, monthly churn, and sales-cycle delay. Each one is a &lt;em&gt;range&lt;/em&gt; with a most-likely middle — a triangular distribution — not a single made-up number.&lt;/p&gt;

&lt;p&gt;Then we run three go-to-market approaches (founder-led outreach, content &amp;amp; community, paid ads) across a few market conditions, and simulate each one thousands of times. The whole thing reduces to a loop like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;oneTrial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Assumptions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// roll each uncertain input from its range&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;replyRate&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;triangular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replyRate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// e.g. 4%–12%, peak 8%&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;closeRate&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;triangular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closeRate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// e.g. 15%–35%, peak 25%&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;churnWeekly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;triangular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;churnWeekly&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// e.g. 0.3%–1.5%, peak 0.7%&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;week&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;week&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;horizonWeeks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;week&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contacts&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;capacityPerWeek&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;               &lt;span class="c1"&gt;// fixed, from team size&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newCustomers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;contacts&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;replyRate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;closeRate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// one week's funnel&lt;/span&gt;
    &lt;span class="nx"&gt;customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;customers&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;churnWeekly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;newCustomers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// run a thousand times, sort, read the range&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;oneTrial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;median&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;   &lt;span class="c1"&gt;// middle result&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;low&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;   &lt;span class="c1"&gt;// P10&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;high&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;   &lt;span class="c1"&gt;// P90&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(This is a simplified sketch of the idea, not the actual engine.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A thousand trials give you a distribution, not a guess. The middle is the median; the middle 80% — between the 10th and 90th percentile — is the honest range. The line on the chart is the median week by week, and the shaded band around it is the range.&lt;/p&gt;

&lt;p&gt;A real run for a $250k-funded, two-person startup over a 12-week horizon looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach (baseline)&lt;/th&gt;
&lt;th&gt;Median customers&lt;/th&gt;
&lt;th&gt;80% range&lt;/th&gt;
&lt;th&gt;Cost per customer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Founder-led outreach&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;4–18&lt;/td&gt;
&lt;td&gt;$320&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content &amp;amp; community&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;12–69&lt;/td&gt;
&lt;td&gt;$113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid ads&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;19–81&lt;/td&gt;
&lt;td&gt;$915&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Paid ads reach the most people — at $915 per customer instead of $113. That trade-off is exactly the kind of thing a single point estimate hides.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can and can't tell you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It's good at:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The relative answer.&lt;/strong&gt; Even if the absolute numbers are off, "paid is ~8x more expensive per customer than content" tends to survive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The range.&lt;/strong&gt; "Somewhere between 12 and 69" is more useful than "32" because it forces you to plan for the downside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The hinge.&lt;/strong&gt; Sensitivity analysis tells you &lt;em&gt;which&lt;/em&gt; assumption your answer is most sensitive to — so you know the one thing worth going out and validating.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It can't:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predict the future. If your conversion assumption is wrong, the range moves. That's not a bug; it's the whole point of showing the range instead of a point.&lt;/li&gt;
&lt;li&gt;Fix bad inputs. The output is only as good as the assumptions it's built on — so being honest about where those assumptions come from matters more than the math.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I turned this into &lt;a href="https://crashtest.app" rel="noopener noreferrer"&gt;CrashTest&lt;/a&gt;: you type in an idea plus a few facts, and it runs the market research and the simulations, then hands you one recommended approach with the numbers behind it. The first report is free. &lt;br&gt;
I have to add here that the Monte Carlo simulation is only one part of the analysis -as you probably will be able to guess- and my goal is to make this the starting point to make better decisions and help builders do a quick reality check that will help them either continue, pivot, or even stop in some cases.&lt;/p&gt;

&lt;p&gt;But the reason I'm writing this isn't to sell you anything. It's the realization that sat underneath the whole build: &lt;strong&gt;I don't trust a single confident number about the future, from anyone — including myself.&lt;/strong&gt; A range, with the assumptions laid bare, is the most honest thing a founder can hold when they're deciding where to point their time and money.&lt;/p&gt;




&lt;h2&gt;
  
  
  To recap
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A range beats a point estimate.&lt;/strong&gt; It doesn't pretend to know what it can't know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The relative answer is the durable one.&lt;/strong&gt; Which channel is cheaper survives sloppy inputs; the exact customer count doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The best output is the hinge.&lt;/strong&gt; Knowing which assumption to go validate is more valuable than any forecast.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you've built or used something similar — or if you think simulation is overkill for a two-person startup — I'd genuinely like to hear it in the comments.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>typescript</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
