<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Break-Even on ENKR's Blog | Jing Hui PANG</title><link>https://blog.enkr1.com/tags/break-even/</link><description>Recent content in Break-Even on ENKR's Blog | Jing Hui PANG</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>ENKR</copyright><lastBuildDate>Tue, 30 Jun 2026 15:53:13 +0800</lastBuildDate><atom:link href="https://blog.enkr1.com/tags/break-even/index.xml" rel="self" type="application/rss+xml"/><item><title>Build or Buy: the Crossover Hiding Under a Business-School Checklist</title><link>https://blog.enkr1.com/build-vs-buy/</link><pubDate>Mon, 29 Jun 2026 12:59:49 +0800</pubDate><guid>https://blog.enkr1.com/build-vs-buy/</guid><description>&lt;blockquote&gt;
&lt;p&gt;i learnt the build-versus-buy framework in my NUS information systems module (&lt;a class="link" href="https://blog.enkr1.com/nus-progress/" &gt;TCX2005, on the progress page&lt;/a&gt;). the business-school version is a checklist of considerations, which is useful but feels like a lot of words. underneath it is a much smaller idea: one cost line crossing another. i had my AI help me turn the checklist back into that picture and draw the crossover. the personal note at the bottom is mine to write after.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-question"&gt;the question
&lt;/h2&gt;&lt;p&gt;you need a piece of software (or a kitchen, or a skill, or a website). do you &lt;strong&gt;build&lt;/strong&gt; it yourself, or &lt;strong&gt;buy&lt;/strong&gt; something that already exists?&lt;/p&gt;
&lt;p&gt;the textbook answer is a checklist: strategic value, resources, market solutions, risk, compliance, time. all real. but a checklist hides the one number that actually moves first, so let us find that number, then put the checklist back on top.&lt;/p&gt;
&lt;h2 id="it-is-two-cost-shapes-and-they-cross"&gt;it is two cost shapes, and they cross
&lt;/h2&gt;&lt;p&gt;the two options have different cost &lt;em&gt;shapes&lt;/em&gt;, not just different totals.&lt;/p&gt;
&lt;p&gt;a quick key:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;symbol&lt;/th&gt;
&lt;th&gt;what it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$F$&lt;/td&gt;
&lt;td&gt;the fixed cost of building: the big one-off to develop it yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$m$&lt;/td&gt;
&lt;td&gt;build&amp;rsquo;s running cost per period (maintenance, hosting, the one engineer who knows how it works)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$s$&lt;/td&gt;
&lt;td&gt;buy&amp;rsquo;s running cost per period (the subscription, the per-seat licence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$t$&lt;/td&gt;
&lt;td&gt;time, in periods you keep using the thing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;build&lt;/strong&gt; is a large lump now, then a small trickle: $F + m,t$. &lt;strong&gt;buy&lt;/strong&gt; is nothing now, then a steady meter running: $s,t$. one starts high and barely rises; the other starts at zero and climbs forever. so they cross. set them equal and solve for the moment they do:&lt;/p&gt;
&lt;p&gt;$$ F + m,t = s,t \quad\Rightarrow\quad t^{\ast} = \frac{F}{s - m} $$&lt;/p&gt;
&lt;p&gt;that $t^{\ast}$ is the whole decision in one symbol: the &lt;strong&gt;break-even horizon&lt;/strong&gt;. plan to use the thing for less time than that and buying is cheaper; plan to keep it longer and building wins. with a 100k build, 10k a year to keep it alive, and a 35k a year subscription, the lines cross at four years:&lt;/p&gt;
&lt;figure style="margin:1.6rem 0"&gt;
&lt;svg viewBox="0 0 620 360" role="img" aria-label="Build versus buy: where the two cost lines cross" style="width:100%;max-width:620px;height:auto;font-family:inherit;display:block;margin:0 auto"&gt;
&lt;text x="310" y="20" text-anchor="middle" font-size="14" font-weight="600" fill="currentColor"&gt;Build versus buy: where the two cost lines cross&lt;/text&gt;
&lt;line x1="60" y1="312.0" x2="596" y2="312.0" stroke="currentColor" stroke-opacity="0.10"/&gt;
&lt;text x="52" y="316.0" text-anchor="end" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;0&lt;/text&gt;
&lt;line x1="60" y1="242.5" x2="596" y2="242.5" stroke="currentColor" stroke-opacity="0.10"/&gt;
&lt;text x="52" y="246.5" text-anchor="end" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;70&lt;/text&gt;
&lt;line x1="60" y1="173.0" x2="596" y2="173.0" stroke="currentColor" stroke-opacity="0.10"/&gt;
&lt;text x="52" y="177.0" text-anchor="end" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;140&lt;/text&gt;
&lt;line x1="60" y1="103.5" x2="596" y2="103.5" stroke="currentColor" stroke-opacity="0.10"/&gt;
&lt;text x="52" y="107.5" text-anchor="end" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;210&lt;/text&gt;
&lt;line x1="60" y1="34.0" x2="596" y2="34.0" stroke="currentColor" stroke-opacity="0.10"/&gt;
&lt;text x="52" y="38.0" text-anchor="end" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;280&lt;/text&gt;
&lt;line x1="60.0" y1="312" x2="60.0" y2="316" stroke="currentColor" stroke-opacity="0.45"/&gt;
&lt;text x="60.0" y="330.0" text-anchor="middle" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;0&lt;/text&gt;
&lt;line x1="194.0" y1="312" x2="194.0" y2="316" stroke="currentColor" stroke-opacity="0.45"/&gt;
&lt;text x="194.0" y="330.0" text-anchor="middle" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;2&lt;/text&gt;
&lt;line x1="328.0" y1="312" x2="328.0" y2="316" stroke="currentColor" stroke-opacity="0.45"/&gt;
&lt;text x="328.0" y="330.0" text-anchor="middle" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;4&lt;/text&gt;
&lt;line x1="462.0" y1="312" x2="462.0" y2="316" stroke="currentColor" stroke-opacity="0.45"/&gt;
&lt;text x="462.0" y="330.0" text-anchor="middle" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;6&lt;/text&gt;
&lt;line x1="596.0" y1="312" x2="596.0" y2="316" stroke="currentColor" stroke-opacity="0.45"/&gt;
&lt;text x="596.0" y="330.0" text-anchor="middle" font-size="11" fill="currentColor" fill-opacity="0.7"&gt;8&lt;/text&gt;
&lt;line x1="60" y1="34" x2="60" y2="312" stroke="currentColor" stroke-opacity="0.45" stroke-width="1.2"/&gt;
&lt;line x1="60" y1="312" x2="596" y2="312" stroke="currentColor" stroke-opacity="0.45" stroke-width="1.2"/&gt;
&lt;text x="328" y="354" text-anchor="middle" font-size="12" fill="currentColor" fill-opacity="0.85"&gt;years you keep using it&lt;/text&gt;
&lt;text x="14" y="173" text-anchor="middle" font-size="12" fill="currentColor" fill-opacity="0.85" transform="rotate(-90 14 173)"&gt;cumulative cost (thousands)&lt;/text&gt;
&lt;line x1="328.0" y1="40" x2="328.0" y2="312" stroke="currentColor" stroke-width="1.4" stroke-opacity="0.5" stroke-dasharray="5 4"/&gt;
&lt;path d="M 60.0 212.7 L 596.0 133.3" fill="none" stroke="#3b82f6" stroke-width="2.8" stroke-linecap="round"/&gt;
&lt;path d="M 60.0 312.0 L 596.0 34.0" fill="none" stroke="#f97316" stroke-width="2.8" stroke-linecap="round"/&gt;
&lt;circle cx="328.0" cy="173.0" r="4" fill="currentColor"/&gt;
&lt;text x="320.0" y="163.0" text-anchor="end" font-size="11.5" fill="currentColor" fill-opacity="0.85"&gt;break-even: 4 years&lt;/text&gt;
&lt;text x="147.1" y="108.5" text-anchor="start" font-size="11.5" fill="#f97316"&gt;buy is cheaper&lt;/text&gt;
&lt;text x="488.8" y="192.9" text-anchor="start" font-size="11.5" fill="#3b82f6"&gt;build is cheaper&lt;/text&gt;
&lt;line x1="95" y1="250" x2="117" y2="250" stroke="#3b82f6" stroke-width="2.8"/&gt;
&lt;text x="123" y="254" font-size="12" fill="currentColor" fill-opacity="0.9"&gt;build: 100 upfront + 10/yr&lt;/text&gt;
&lt;line x1="95" y1="268" x2="117" y2="268" stroke="#f97316" stroke-width="2.8"/&gt;
&lt;text x="123" y="272" font-size="12" fill="currentColor" fill-opacity="0.9"&gt;buy: 35/yr subscription&lt;/text&gt;
&lt;/svg&gt;
&lt;figcaption style="text-align:center;font-size:0.85rem;opacity:0.7;margin-top:0.5rem"&gt;Build is a lump now and a trickle after; buy is a meter that never stops. Before the break-even horizon, the meter is cheaper. After it, the lump was. The only inputs are how big the lump is and how fast the meter runs.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;notice this is the same machinery as the &lt;a class="link" href="https://blog.enkr1.com/marginal-cost-and-sunk-cost/" &gt;marginal-cost note&lt;/a&gt;: a fixed cost is only ever expensive &lt;em&gt;per unit of use&lt;/em&gt; when you do not use it much. stretch $F$ over a long enough horizon and it stops mattering, which is exactly why long-lived, heavily-used systems drift towards build, and short-lived or lightly-used ones stay bought.&lt;/p&gt;
&lt;h2 id="the-sticker-price-is-the-smallest-number"&gt;the sticker price is the smallest number
&lt;/h2&gt;&lt;p&gt;all of that assumes you actually know $F$, $m$, and $s$. the most common way this decision goes wrong is not the maths, it is the inputs: people weigh the price tag on one option against the &lt;em&gt;full&lt;/em&gt; cost of the other.&lt;/p&gt;
&lt;p&gt;and the price tag is the smallest part of what you pay. the licence fee, or the developer&amp;rsquo;s quote to build it, is the tip. under the waterline sits everything that never reaches the invoice: integration, data migration, training, the support contract, the security and compliance work, the downtime when it breaks, and one day the cost of ripping it out again. add up that whole iceberg over the years you will really use the thing and you get its &lt;strong&gt;total cost of ownership&lt;/strong&gt;. that, not the sticker, is what $m$ and $s$ were always supposed to be.&lt;/p&gt;
&lt;p&gt;the trap even has a direction. a build&amp;rsquo;s iceberg is bigger and better hidden: the one engineer who knows how it works is a salary that never stops, and maintenance compounds quietly for as long as the thing lives. a vendor&amp;rsquo;s iceberg is mostly the vendor&amp;rsquo;s problem, already priced into $s$. so setting a one-off build quote against a subscription almost always flatters building, because you are putting a tip next to an iceberg. the honest fix is small: compare iceberg to iceberg, lifetime to lifetime, and only then read the crossover.&lt;/p&gt;
&lt;h2 id="cost-is-the-first-word-not-the-last"&gt;cost is the first word, not the last
&lt;/h2&gt;&lt;p&gt;the crossover tells you &lt;em&gt;when&lt;/em&gt; the money flips. it does not tell you whether money should decide. three things can override it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;strategic value.&lt;/strong&gt; if the thing is your actual edge, the part competitors cannot copy, you build it even when buying is cheaper, because the point was never to save money. if it is plumbing everyone has (email, payroll, an office suite), you buy it even when building looks close, because owning plumbing wins you nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;risk and compliance.&lt;/strong&gt; a mature vendor has already paid for the reliability, the security, and the regulatory box-ticking (PDPA, GDPR, and friends). building means buying all of that yourself, in time and in liability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;time.&lt;/strong&gt; the crossover assumes you &lt;em&gt;can&lt;/em&gt; build. if the market window closes before your version ships, the cheaper line on the chart is irrelevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;a clean way to hold all of this at once is to sort the task: is it &lt;strong&gt;strategic&lt;/strong&gt; (your edge, lean build), &lt;strong&gt;critical&lt;/strong&gt; (must not fail, but standard, lean buy the proven thing), or &lt;strong&gt;routine&lt;/strong&gt; (commodity, buy the cheapest that works)? the cost crossover then decides the close calls &lt;em&gt;within&lt;/em&gt; a bucket, not across them.&lt;/p&gt;
&lt;h2 id="a-real-one-how-nus-stopped-building-its-own"&gt;a real one: how NUS stopped building its own
&lt;/h2&gt;&lt;p&gt;the cleanest case is one i am literally sitting inside. NUS ran its own learning platform for two decades: IVLE from 1999, then a second in-house build, LumiNUS. both were built. in 2022 it gave up and moved everyone to Canvas, a SaaS product the rest of the world already uses.&lt;/p&gt;
&lt;p&gt;nothing about the maths changed; what changed was the &lt;em&gt;answer to the checklist&lt;/em&gt;. a learning-management system stopped being a place NUS could out-compete anyone, so its strategic value fell to zero. once it was plumbing, the only question left was the crossover, and an off-the-shelf subscription beat paying engineers to maintain a bespoke platform forever. build to buy, exactly when the thing stopped being your edge.&lt;/p&gt;
&lt;h2 id="why-this-is-not-really-about-software"&gt;why this is not really about software
&lt;/h2&gt;&lt;p&gt;the shape is everywhere you spend. cooking versus eating out: the kitchen is $F$, each restaurant meal is $s$. learning a skill versus hiring it out. owning a car versus grabbing one. self-hosting versus paying for the service. the question is always the same two-parter: &lt;strong&gt;how long will i lean on this, and is doing it myself actually my edge?&lt;/strong&gt; if the honest answers are &amp;ldquo;not long&amp;rdquo; and &amp;ldquo;no&amp;rdquo;, buy it and feel nothing. if they are &amp;ldquo;for years&amp;rdquo; and &amp;ldquo;yes&amp;rdquo;, that is the rare case worth building, and the upfront cost was never the real number.&lt;/p&gt;
&lt;p&gt;there is one exception that swallows the whole chart: if the thing you would be building is a network, the cost lines stop mattering. &lt;a class="link" href="https://blog.enkr1.com/network-effects/" &gt;an existing network&amp;rsquo;s head start is its own kind of moat&lt;/a&gt;, and rebuilding it from zero means dragging a cold network all the way to critical mass while the incumbent sits comfortably past it. that is the most expensive build there is, which is why you almost always buy into the network rather than recreate it.&lt;/p&gt;
&lt;h2 id="a-personal-note"&gt;a personal note
&lt;/h2&gt;&lt;p&gt;wip &amp;hellip;&lt;/p&gt;
&lt;h2 id="sources-and-further-reading"&gt;sources and further reading
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;raymond mcleod &amp;amp; george schell, &lt;em&gt;management information systems&lt;/em&gt;, and laudon &amp;amp; laudon, &lt;em&gt;managing the digital firm&lt;/em&gt;: the textbook framing of make-versus-buy and the acquisition process (RFP and all).&lt;/li&gt;
&lt;li&gt;my &lt;a class="link" href="https://blog.enkr1.com/marginal-cost-and-sunk-cost/" &gt;marginal cost and sunk cost note&lt;/a&gt;: where the fixed-versus-variable cost machinery under this crossover comes from.&lt;/li&gt;
&lt;li&gt;my &lt;a class="link" href="https://blog.enkr1.com/network-effects/" &gt;network effects note&lt;/a&gt;: the one case where the crossover stops mattering, because an existing network is the most expensive thing to rebuild.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.enkr1.com/nus-progress/" &gt;my NUS progress page&lt;/a&gt;: the module (TCX2005) this came out of.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>