Solar and battery re-priced from Thai market data (October 2026)
Deploy test site / deploy (push) Successful in 46s

- Rooftop PV, 300 kWp (size still illustrative): 20 to 26 THB/W installed
  with the Deye hybrid inverters, 6.0M to 7.8M THB (was 25 to 35 THB/W,
  7.5M to 10.5M). Sources in the utilities CSV: DEDE Thailand PV Status
  report (Mahidol survey: 22 to 25 THB/W for factory systems of 10 kW to
  1 MW, 2023), CapSolar 2026 (20 to 25 under 1 MWp), Saimai Solar's list
  (300 kW for 5.4M THB), Deye hybrid inverter retail (160,500 THB per
  50 kW).
- Battery 271 kWh, now installed: 2.0M to 3.5M THB (was the bare Gobel
  list price, 1.4M to 2.0M, which matches DEDE's 5,000 to 7,000 THB/kWh
  for LiFePO4); adds enclosure, fire protection, controls and installation,
  below CapSolar's 12,000 to 15,000 THB/kWh for a fully installed factory
  BESS because the hybrid inverters do the conversion (estimate).
- Utilities baseline 27.57M to 47.50M THB; launch plant ~160M / 222M /
  283M THB with contingency; Plan B ~208M (~149M to 266M), ~31M more than
  Plan A; Plan A's total unchanged, its solar lever ~9.7M. PV payback
  ~3.8 to 5.4 years (sustainability.md). Calculator, README, roadmap,
  revenue model and both business plan versions (renders included)
  updated.
This commit is contained in:
grabowski committed 2026-10-17 16:41:14 +07:00
1 parent 3f33babdaa
commit ab303618d8
25 files changed
+116 -111

No files matched your search

+17 -17
View File
@@ -33,7 +33,7 @@ def blocks():
"version, Plan B (~210M THB), builds the same plant and takes none of the levers. ",
"This version is Plan B: the launch plant with the whole chain, cutting and galvanics "
"included, three presses, with everything in and none of the cost levers taken, at ~210M "
"THB (~209M). A second version, Plan A (~180M THB), builds the same plant with six cost "
"THB (~208M). A second version, Plan A (~180M THB), builds the same plant with six cost "
"levers. ")
+ "The plan price includes the ramp-up reserve and carries no contingency. Cover picture: the "
"plant as the plant and business plan calculator draws this plan (schematic, Payap scenario "
@@ -111,7 +111,7 @@ def blocks():
"right first; " + pick("the launch plant", "the whole chain at launch")
+ " was decided anyway, and that advice is carried as a risk (sections 11.2 and 13).",
pick(
"**Six cost levers bring the plant to ~180M THB**, from ~194M to ~162M THB at the midpoint "
"**Six cost levers bring the plant to ~180M THB**, from ~193M to ~162M THB at the midpoint "
"before the ramp-up reserve (estimates, section 8): rooftop solar and battery through a solar "
"PPA (the installer owns and finances the array, the plant buys the power); metrology in two "
"steps (XRF, inline vision and the audio station at launch, the laser confocal and the "
@@ -120,8 +120,8 @@ def blocks():
"with frame, runway and machine door kept crane-ready; boilers and compressor through the "
"Chinese route. Every press, the cutting room, the galvanics line and the stamper-prep line "
"stay in.",
"**Everything in, none of the cost levers: ~210M THB**, ~194M THB at the midpoint before the "
"ramp-up reserve and ~32M THB more than Plan A (estimates, section 8): owned rooftop solar and "
"**Everything in, none of the cost levers: ~210M THB**, ~193M THB at the midpoint before the "
"ramp-up reserve and ~31M THB more than Plan A (estimates, section 8): owned rooftop solar and "
"battery (and with them the BOI solar measure); the full metrology stack from launch (XRF, "
"laser confocal, wide-area profiler, inline vision, audio station); the visitor corridor and "
"accessible entrance, so public tours and the Payap student programmes are possible from the "
@@ -190,10 +190,10 @@ def blocks():
"(staff and overheads before volume covers them). From the low to the high end of every "
"block: ~THB 127M to 226M. Estimates: no quote yet for the Classic, the galvanics line "
"(priced at OMS's reference plus 20 %) or the building",
"**~THB 209M (~USD 6.33M), rounded to ~210M THB**: the plan investment, ~THB 193.8M (~USD "
"5.87M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
"**~THB 208M (~USD 6.30M), rounded to ~210M THB**: the plan investment, ~THB 192.8M (~USD "
"5.84M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
"and overheads before volume covers them); at the midpoint within the investor's 180M THB "
"plus 20 %. From the low to the high end of every block: ~THB 150M to 268M. Estimates: no "
"plus 20 %. From the low to the high end of every block: ~THB 149M to 266M. Estimates: no "
"quote yet for the Classic, the galvanics line (priced at OMS's reference plus 20 %) or the "
"building")],
["Not in the plan price", "**No contingency** (at the 15 % used in the cost documents, ~THB "
@@ -222,7 +222,7 @@ def blocks():
"~3.1 years on the plan price in the central case (2.2 to 4.0 from the low to the high end of "
"the price); ~1.0 year in the favourable case, ~30 years in the adverse case (EBITDA, mature "
"year, ramp-up reserve included; estimates)",
"~3.7 years on the plan price in the central case (2.6 to 4.7 from the low to the high end of "
"~3.6 years on the plan price in the central case (2.6 to 4.7 from the low to the high end of "
"the price); ~1.2 years in the favourable case, ~35 years in the adverse case (EBITDA, mature "
"year, ramp-up reserve included; estimates)")],
["First paying release", "**Open.** The August 2026 calendar gives Q4 2028 to mid-2029 (27 to 33 "
@@ -239,7 +239,7 @@ def blocks():
"~THB 177M (~USD 5.35M), the ~180M THB plan, released in tranches against milestones "
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
"at least a quarter is equity: ~THB 44M (arithmetic, before financing costs)",
"~THB 209M (~USD 6.33M), the ~210M THB plan, released in tranches against milestones "
"~THB 208M (~USD 6.30M), the ~210M THB plan, released in tranches against milestones "
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
"at least a quarter is equity: ~THB 52M (arithmetic, before financing costs)")],
]),
@@ -251,7 +251,7 @@ def blocks():
"presses (one Duplex system and the Classic) and takes six cost levers. ")
+ "Both carry the ramp-up reserve and neither carries a contingency, and in both the second Duplex "
"system is a growth step from revenue. What decides between them is no longer demand, because both "
"make the same records: it is whether the investor funds ~THB 32M (~18 %) more at launch for what "
"make the same records: it is whether the investor funds ~THB 31M (~18 %) more at launch for what "
"Plan A leases or buys from revenue. Plan B keeps the BOI solar measure (only an owned array "
"qualifies), measures every stamper fully from the first release, makes tours and the Payap "
"programmes possible from the start, sells cassette and CD-R from launch, owns its crane and buys "
@@ -262,19 +262,19 @@ def blocks():
"Section 8 sets the two side by side."),
T(["", "Plan A", "Plan B"], [
["Plan price (ramp-up reserve in, no contingency)", "~THB 177M (~USD 5.35M); ~127M to 226M from "
"the low to the high end", "~THB 209M (~USD 6.33M); ~150M to 268M from the low to the high end"],
"the low to the high end", "~THB 208M (~USD 6.30M); ~149M to 266M from the low to the high end"],
["Presses", "3: one Duplex system (2 semi-automatic) and one Classic", "The same 3"],
["Records a year at 60 % specials", "~0.58M to 0.90M (central 0.74M)", "The same"],
["EBITDA, central case", "~USD 1.73M (~THB 57M)", "~USD 1.73M (~THB 57M); cassette and CD-R "
"not modelled"],
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 1.26M (~THB 42M)"],
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.7 years (2.6 to 4.7)"],
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.6 years (2.6 to 4.7)"],
["Adverse case", "Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.39M",
"Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.52M"],
["What Plan A gives up, what Plan B buys", "At launch: solar through a PPA (very likely without "
"the BOI solar measure), no confocal or profiler, no visitor corridor or tours, no cassette or "
"CD-R, a rented crane; Chinese-made boilers and compressor",
"~THB 32M more at launch: owned solar and battery with the BOI solar measure, the full "
"~THB 31M more at launch: owned solar and battery with the BOI solar measure, the full "
"metrology stack, the visitor corridor and tours, cassette and CD-R, a bought crane; "
"Thai-supplied boilers and compressor"],
], widths_mm=[42, 64, 64], font_pt=8.5,
@@ -317,18 +317,18 @@ def blocks():
"boiler and chiller modules), building contract, fit-out, commissioning in sequence "
"(section 8). From the low to the high end of every block the plan runs from ~THB 127M to "
"226M; quotes that land high are funded outside the plan or by scope steps.",
"**Then the Plan B round, ~THB 209M (~USD 6.33M), rounded to ~210M THB**, including the "
"**Then the Plan B round, ~THB 208M (~USD 6.30M), rounded to ~210M THB**, including the "
"ramp-up reserve and without contingency, within the investor's 180M THB plus 20 % at the "
"midpoint, released in tranches against milestones: BOI certificate and lease signed, "
"long-lead orders (lathe, galvanics, stamper prep, presses, boiler and chiller modules), "
"building contract, fit-out, commissioning in sequence (section 8). From the low to the high "
"end of every block the plan runs from ~THB 150M to 268M; quotes that land high are funded "
"end of every block the plan runs from ~THB 149M to 266M; quotes that land high are funded "
"outside the plan or by scope steps."),
"**Decisions needed from the investor:** which version to fund, Plan A or Plan B (both make the "
"same records, so the choice is ~THB 32M more at launch for what Plan A leases or defers; the "
"same records, so the choice is ~THB 31M more at launch for what Plan A leases or defers; the "
"Classic, Pheenix and EX 35 quotes, the solar PPA offer and the building quote settle the "
"numbers); the equity/debt mix (BOI requires debt-to-equity of at most 3:1, so at "
"least ~THB " + pick("44M of Plan A's ~177M", "52M of Plan B's ~209M") + " is equity); CD "
"least ~THB " + pick("44M of Plan A's ~177M", "52M of Plan B's ~208M") + " is equity); CD "
"replication, yes or no (it must be in the BOI application from the start); and the steam fuel, "
"electric or biomass.",
"**Co-investment:** Ploy Printing, the Chiang Mai print and packaging house that will produce "
+11 -9
View File
@@ -367,13 +367,14 @@ def blocks():
"Taken through a solar PPA (below): the plant pays the PPA price for this "
"power instead of buying the array, so its saving is the gap between that "
"price and the ~3.7 THB/kWh of grid power it displaces",
"Saves ~1.2M to 1.3M THB a year and pays back in ~4.5 to 7 years at 25,000 "
"to 35,000 THB/kWp (estimates)")],
"Saves ~1.2M to 1.3M THB a year and pays back in ~3.8 to 5.4 years at 20,000 "
"to 26,000 THB/kWp installed (estimates)")],
["Canopies and the second building", "~40 kWp on the parking canopies (construction RFQ; ~54 "
"kWp if fully covered). A phase 2 building's roof adds "
"~251 kWp, ~498 kWp across both roofs"],
["Battery", "271 kWh Gobel Power LiFePO4 rack (15 stacked 18 kWh packs, 8,000+ cycles), USD "
"39,900 to 58,000 listed, 50 to 60 day lead. Roughly an hour of the chiller bank's "
"39,900 to 58,000 listed (battery only; ~2.0M to 3.5M THB installed with enclosure, fire protection and "
"controls, estimate), 50 to 60 day lead. Roughly an hour of the chiller bank's "
"peak draw: ride-through, not off-grid autonomy"],
["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), Thai distribution via Solar "
"Nicolo; Deye is a supported protocol on the Gobel battery management"],
@@ -387,17 +388,18 @@ def blocks():
"terms", "")],
pick(["Solar PPA (this plan)", "An installer owns and finances the PV and the battery, and the "
"plant buys the power at a price still to quote (the calculator carries 3.0 THB/kWh, an "
"estimate, ~0.03M USD a year on the energy line). That keeps the PV EPC (USD 227k to "
"318k) and the battery (USD 42k to 62k) out of the capital round: ~10.7M THB less at the "
"estimate, ~0.03M USD a year on the energy line). That keeps the PV EPC (USD 182k to "
"236k) and the battery (USD 61k to 106k) out of the capital round: ~9.7M THB less at the "
"midpoint, one of the six levers in section 8. The BOI solar measure (section 7) rewards "
"the plant's own solar investment, so its tax value very likely goes with the array (to "
"confirm with the BOI consultant). The PPA offer is asked against the specification "
"above"],
["Owned (this plan)", "The plant buys the array and the battery: rooftop PV EPC USD 227k "
"to 318k (7.5M to 10.5M THB) and the battery USD 42k to 62k (1.4M to 2.0M THB), "
["Owned (this plan)", "The plant buys the array and the battery: rooftop PV EPC USD 182k "
"to 236k (6.0M to 7.8M THB, 20 to 26 THB/W at Thai 2026 market prices) and the battery, installed, "
"USD 61k to 106k (2.0M to 3.5M THB), "
"estimates, section 8. Owning them is what the BOI solar measure rewards (section 7). A "
"solar PPA (an installer owns and finances them, the plant buys the power at a price "
"still to quote) would take ~10.7M THB out of the capital round at the midpoint, but "
"still to quote) would take ~9.7M THB out of the capital round at the midpoint, but "
"very likely gives up that measure"]),
]),
H3("Steam: the open engineering choice"),
@@ -965,7 +967,7 @@ def blocks():
P("**Process:** file via the e-Investment system and present at an analyst meeting. BOI quotes "
"about 40 working days to a decision for projects under THB 200M and 60 to 90 working days for "
"larger tiers; at " + pick("~127M to 226M THB with the ramp-up reserve (~177M at the midpoint)",
"~150M to 268M THB with the ramp-up reserve (~209M at the midpoint)") +
"~149M to 266M THB with the ramp-up reserve (~208M at the midpoint)") +
" the plan sits around that line, so the consultant "
"confirms which applies. In practice it is roughly 4 to 6 months end to end to the certificate; "
"the company is incorporated under it; machinery is imported within a window commonly 30 months "
+52 -52
View File
@@ -62,7 +62,7 @@ def _block_rows():
"racking", "297k to 627k", "9.8M to 20.7M", "Researched: utilities rows"],
]
if not a:
rows.append(["Rooftop PV (EPC) and the 271 kWh Gobel battery, owned", "269k to 380k", "8.9M to 12.5M",
rows.append(["Rooftop PV (EPC) and the 271 kWh Gobel battery, owned", "243k to 342k", "8.0M to 11.3M",
"Researched: utilities rows; owned, so the BOI solar measure applies"])
rows += [
["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.3M", "Estimate at "
@@ -97,14 +97,14 @@ def _block_rows():
rows += [
pick(["**Subtotal, plan investment**", "**~3.56M to 6.25M**", "**~117.4M to 206.1M**",
"**Midpoint ~161.7M THB (~4.90M USD)**"],
["**Subtotal, plan investment**", "**~4.24M to 7.50M**", "**~140.0M to 247.6M**",
"**Midpoint ~193.8M THB (~5.87M USD)**"]),
["**Subtotal, plan investment**", "**~4.22M to 7.47M**", "**~139.1M to 246.4M**",
"**Midpoint ~192.8M THB (~5.84M USD)**"]),
["Ramp-up reserve: staff hired before first revenue, overheads until volume covers them",
"~0.30M to 0.61M", "10M to 20M", "Estimate; cash the investor puts in, so it is in the plan price"],
pick(["**Plan A price**", "**~3.86M to 6.85M**", "**~127M to 226M**",
"**Midpoint ~177M THB (~5.35M USD): ~180M THB**"],
["**Plan B price**", "**~4.55M to 8.11M**", "**~150M to 268M**",
"**Midpoint ~209M THB (~6.33M USD): ~210M THB**"]),
["**Plan B price**", "**~4.52M to 8.07M**", "**~149M to 266M**",
"**Midpoint ~208M THB (~6.30M USD): ~210M THB**"]),
["Contingency: not in the plan price", "", "", pick(
"For information: at 15 %, ~24M THB at the midpoint",
"For information: at 15 %, ~29M THB at the midpoint")],
@@ -115,9 +115,9 @@ def _block_rows():
def _levers_table():
"""Plan A: the six levers from the launch plant with every block, midpoints, no contingency."""
return T(["Step", "Saves", "Subtotal after it", "What it gives up"], [
["Launch plant, every block, no contingency", "", "~193.8M THB (~5.87M USD)", ""],
["Launch plant, every block, no contingency", "", "~192.8M THB (~5.84M USD)", ""],
["1. Rooftop solar and battery through a solar PPA (the installer owns and finances the array; the "
"plant buys the power)", "~10.7M", "~183.1M", "Owned solar and very likely the BOI solar measure with "
"plant buys the power)", "~9.7M", "~183.1M", "Owned solar and very likely the BOI solar measure with "
"its tax benefit (our reading, for the BOI consultant); "
"adds the PPA power price to the energy bill, ~0.03M USD a "
"year in the calculator at 3.0 THB/kWh (estimate, to "
@@ -148,7 +148,7 @@ def _keeps_table():
"""Plan B: what it keeps that Plan A's six levers move off the launch budget, midpoints, no contingency."""
return T(["In at launch in Plan B", "What it gives the plant", "THB, midpoint (Plan A's lever)"], [
["Rooftop PV and the 271 kWh battery, owned (EPC and Gobel battery)", "The BOI solar measure (only an "
"owned array qualifies; our reading, for the BOI consultant) and no PPA power bill", "~10.7M"],
"owned array qualifies; our reading, for the BOI consultant) and no PPA power bill", "~9.7M"],
["Metrology, full stack: XRF, laser confocal, wide-area profiler, inline vision, audio station",
"Every stamper measured fully from the first release, the core of the traceability pitch", "~8.8M"],
["Visitor corridor and accessible entrance", "Public tours and the Payap programmes possible from the "
@@ -159,14 +159,14 @@ def _keeps_table():
"the installations", "~3.2M"],
["Boilers and compressor from Thai suppliers", "Local service; no import route for the boilers",
"~1.9M"],
["**Together**", "", "**~32M (193.8M minus Plan A's 161.7M)**"],
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~193.8M (~5.87M USD)"],
["**Together**", "", "**~31M (192.8M minus Plan A's 161.7M)**"],
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~192.8M (~5.84M USD)"],
["Ramp-up reserve", "", "+10M to 20M"],
["**Plan B**", "", "**~209M THB (~6.33M USD)**; ~150M to 268M from the low to the high end"],
["**Plan B**", "", "**~208M THB (~6.30M USD)**; ~149M to 266M from the low to the high end"],
], widths_mm=[62, 70, 38], font_pt=8.5,
caption="Midpoint values without contingency, estimates; docs/finance/total-investment.md 'Two plans'. "
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~32.2M, and the "
"two subtotals differ by ~32.1M.")
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~31.2M, and the "
"two subtotals differ by ~31.1M.")
def _tranches():
@@ -183,7 +183,7 @@ def _tranches():
["2", "Building permit; vendor build dates confirmed in writing",
"Construction, water-treatment building, utility yard, utilities, balance payments as machines are "
"built",
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~68M to 87M)")],
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~67M to 87M)")],
["3", "Building watertight; first machinery shipped",
pick("Fit-out, HVAC and clean zones, ZLD and DI water, the rented crane for the installations, the "
"metrology launch tier, factory software and ERPNext, the launch team",
@@ -193,11 +193,11 @@ def _tranches():
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~29M to 39M)")],
["4", "Cutting room and galvanics commissioned; first stampers made", "Working capital, PVC stock, "
"spares, first-year rent; the ramp-up reserve (10M to 20M THB, in the plan price) is drawn from here "
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~16M to 23M), plus the reserve")],
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~15M to 23M), plus the reserve")],
], widths_mm=[14, 46, 78, 32], font_pt=8.5,
caption=pick("Shares of Plan A's investment before the reserve (~161.7M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates).",
"Shares of Plan B's investment before the reserve (~193.8M THB at the midpoint); the THB "
"Shares of Plan B's investment before the reserve (~192.8M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates)."))
@@ -234,8 +234,8 @@ def _operating_table():
["Depreciation", "0.75M", "0.47M", "0.28M"],
["**Operating profit**", "**-0.52M**", "**1.26M**", "**3.51M**"],
["Revenue", "2.28M (~75M THB)", "3.65M (~120M THB)", "5.41M (~179M THB)"],
["Payback on the plan price (EBITDA, mature year)", "~35 yr", "~3.7 yr (2.6 to 4.7 on 4.55M to "
"8.11M)", "~1.2 yr"],
["Payback on the plan price (EBITDA, mature year)", "~35 yr", "~3.6 yr (2.6 to 4.7 on 4.52M to "
"8.07M)", "~1.2 yr"],
]
return T(["USD per year, mature", "Adverse", "Central", "Favourable"], rows, widths_mm=[50, 36, 48, 36],
caption="Estimates, docs/finance/revenue-model.md 'Operating pictures of Plan A and Plan B (October "
@@ -256,7 +256,7 @@ def _risk_rows():
"Quotes landing high are not covered: at 15 % a contingency would be ~24M THB at the midpoint, "
"and the high end of every block comes to ~226M with the reserve",
"Quotes landing high are not covered: at 15 % a contingency would be ~29M THB at the midpoint, "
"and the high end of every block comes to ~268M with the reserve"),
"and the high end of every block comes to ~266M with the reserve"),
"The requests that settle most of the band come before commitment (section 8.4); tranche release; "
"how overruns are funded (outside the plan price or by scope steps) agreed with the investor up "
"front"],
@@ -299,9 +299,9 @@ def _risk_rows():
"and PPA offers next to the purchase quote in phase 0; buying the array, as Plan B does, "
"stays the alternative"])
else:
rows.append(["Medium", "The extra ~32M THB earns nothing in the model", "Plan B's operating picture is "
"Plan A's (same presses, records, revenue and EBITDA): the ~32M THB more at launch adds "
"depreciation, so central operating profit is 1.26M against 1.34M USD, payback ~3.7 against "
rows.append(["Medium", "The extra ~31M THB earns nothing in the model", "Plan B's operating picture is "
"Plan A's (same presses, records, revenue and EBITDA): the ~31M THB more at launch adds "
"depreciation, so central operating profit is 1.26M against 1.34M USD, payback ~3.6 against "
"~3.1 years and the adverse corner deeper; its case rests on what the table leaves out (the "
"BOI solar measure, cassette and CD-R sales, tours and the Payap programmes, full stamper "
"metrology for the traceability pitch)", "Phase 0 prices each item against its lever (PPA "
@@ -430,8 +430,8 @@ def blocks():
"This document is " + label() + ". How the two differ (estimates):"),
T(["Midpoints, estimates", "Plan A" + pick(" (this plan)", ""), "Plan B" + pick("", " (this plan)")], [
["Plan price: ramp-up reserve in, no contingency", "~177M THB (~5.35M USD): ~180M",
"~209M THB (~6.33M USD): ~210M"],
["Low to high end of every block", "~127M to 226M THB", "~150M to 268M THB"],
"~208M THB (~6.30M USD): ~210M"],
["Low to high end of every block", "~127M to 226M THB", "~149M to 266M THB"],
["Presses", "3: Duplex system 1 (two HRP 12) and one Classic", "The same 3"],
["Records a year at 60 % specials", "~0.58 to 0.90M, central 0.74M (Duplex-limited)", "The same"],
["Revenue, central", "3.65M USD (~120M THB)", "The same (cassette and CD-R not modelled)"],
@@ -440,11 +440,11 @@ def blocks():
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.52M USD: loses more (more "
"depreciation on the same EBITDA)"],
["Payback on the plan price, central (EBITDA, mature year)", "~3.1 yr (2.2 to 4.0)",
"~3.7 yr (2.6 to 4.7; calculator: 2.8 yr against Plan A's 2.4)"],
"~3.6 yr (2.6 to 4.7; calculator: 2.8 yr against Plan A's 2.4)"],
["What it gives up or takes on", "Six levers: solar through a PPA (very likely without the BOI "
"solar measure), confocal and profiler from revenue, no tours at first, cassette and CD-R later, a "
"rented crane, Chinese boilers and compressor; the second Duplex waits for revenue", "No levers: "
"buys at launch what Plan A leases or defers, ~32M THB more (owned solar and battery with the BOI "
"buys at launch what Plan A leases or defers, ~31M THB more (owned solar and battery with the BOI "
"solar measure, the full metrology stack, the visitor corridor, cassette and CD-R, a bought crane, "
"Thai boilers and compressor); the second Duplex waits for revenue"],
], widths_mm=[46, 62, 62], font_pt=8.5,
@@ -454,8 +454,8 @@ def blocks():
[P("**Plan A: six levers, every machine kept.** From the launch plant with every block, no "
"contingency, midpoint values:"),
_levers_table(),
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~32M THB more "
"at the midpoint, so ~193.8M THB before the reserve and ~209M (~210M THB) with it.")]
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~31M THB more "
"at the midpoint, so ~192.8M THB before the reserve and ~208M (~210M THB) with it.")]
if a else
[P("**Plan B: the launch plant with everything in, no levers.** What Plan B keeps that Plan A's six "
"cost levers lease, defer or source abroad, midpoint values:"),
@@ -467,12 +467,12 @@ def blocks():
CALL("What decides between Plan A and Plan B", [
"**No longer demand.** Both plans are the same three presses making the same ~0.58 to 0.90 million "
"records a year (central 0.74 million); market validation (section 14.1, item 1) gates both alike.",
"**~32M THB more at launch, for what Plan A leases or buys from revenue.** Plan B keeps the BOI "
"**~31M THB more at launch, for what Plan A leases or buys from revenue.** Plan B keeps the BOI "
"solar measure (only an owned array qualifies), measures every stamper fully from the first release "
"(the traceability pitch), opens tours and the Payap programmes from day one, sells cassette and "
"CD-R from the start, owns its crane and buys utilities with local service.",
"**On the modelled numbers the extra earns nothing.** The same EBITDA, more depreciation, a longer "
"payback (~3.7 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
"payback (~3.6 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
"return, Plan B the more complete plant. Most of Plan B's items can be added to Plan A later from "
"revenue; the BOI solar measure and the corridor are cheaper to have from the start.",
"**The quotes.** The Newbilt re-quote for the Classic and the EX 35, the Pheenix quote against the "
@@ -488,8 +488,8 @@ def blocks():
"Figure 11. Budget card of the plant and business plan calculator, " + pick(
"Plan A preset: 161.7M THB at the midpoint without contingency, 171.7M to 181.7M with the "
"ramp-up reserve of 10M to 20M, inside 180M at the midpoint",
"Plan B preset: 193.8M THB at the midpoint without contingency, 203.8M to 213.8M with the "
"ramp-up reserve of 10M to 20M, 16.2M to spare under the 225M mark (180M plus 25 %)") +
"Plan B preset: 192.8M THB at the midpoint without contingency, 202.8M to 212.8M with the "
"ramp-up reserve of 10M to 20M, 17.2M to spare under the 225M mark (180M plus 25 %)") +
". Bars: the investment at the low end, the midpoint and the high end of every block, the reserve "
"hatched, against 180M and 225M THB. Calculator figures (docs/fleet-calculator.html), estimates."),
@@ -506,8 +506,8 @@ def blocks():
"**No contingency in the price.** " + pick(
"Plan A's ~177M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~24M THB, and the high end of every block comes to ~226M. ",
"Plan B's ~209M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~29M THB, and the high end of every block comes to ~268M. ") +
"Plan B's ~208M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~29M THB, and the high end of every block comes to ~266M. ") +
"Quotes landing above the midpoint are funded outside the plan price or by scope steps; how they are "
"funded is a decision for the investor before commitment (section 14.2).",
"**The quotes that decide it.** The Classic has no Newbilt price (its band is a placeholder "
@@ -538,11 +538,11 @@ def blocks():
"**Chinese suppliers: ~1 %.** Plan B prices Thai-supplied utilities. The Chinese route for the "
"boiler modules and the compressor would take ~1.9M THB off at the midpoint (Plan A takes "
"it); chillers and HVAC, the larger blocks, are not checked yet."),
pick("**Solar PPA.** The largest single lever (~10.7M THB at the midpoint) moves the array off the "
pick("**Solar PPA.** The largest single lever (~9.7M THB at the midpoint) moves the array off the "
"capital budget and adds a power price to the energy line instead (~0.03M USD a year in the "
"calculator at 3.0 THB/kWh, an estimate to quote).",
"**Solar bought, not leased.** Plan B owns the array and the battery (8.9M to 12.5M THB). A "
"solar PPA would take ~10.7M THB off the price at the midpoint and add a power price to the "
"**Solar bought, not leased.** Plan B owns the array and the battery (8.0M to 11.3M THB). A "
"solar PPA would take ~9.7M THB off the price at the midpoint and add a power price to the "
"energy line instead, very likely without the BOI solar measure."),
"**Every band narrows only with quotes.** The supplier map in the planning repository lists who to "
"ask, and the re-quotes are phase 0 work (section 14).",
@@ -696,9 +696,9 @@ def blocks():
"(central) and the low end (3.56M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (3.86M / 5.35M / 6.85M USD from the low to the "
"high end).",
"the high end (7.50M USD) over 10 years (adverse), the midpoint (5.87M USD) over 12.5 years "
"(central) and the low end (4.24M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.55M / 6.33M / 8.11M USD from the low to the "
"the high end (7.47M USD) over 10 years (adverse), the midpoint (5.84M USD) over 12.5 years "
"(central) and the low end (4.22M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.52M / 6.30M / 8.07M USD from the low to the "
"high end).")),
_operating_table(),
CALL("Reading this table honestly", pick([
@@ -727,7 +727,7 @@ def blocks():
"supply to other plants, dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
"early-year profits where there are any.",
], [
"**The central case works on ~209M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.26M "
"**The central case works on ~208M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.26M "
"USD (~42M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
"**0.23 million records a year, about a third of its central output**. Against the earlier ~20 % "
"specials share (0.84M records, EBITDA 1.63M) more specials earn a higher price on fewer records.",
@@ -737,9 +737,9 @@ def blocks():
"cost and volume the price that covers depreciation is ~2.8 USD (~91 THB) a record (arithmetic on "
"the table), below the low price assumed: price realisation and utilisation decide solvency, not "
"upside.",
"**What the extra ~32M THB buys is not in this table.** Plan B is Plan A's plant with the six levers "
"**What the extra ~31M THB buys is not in this table.** Plan B is Plan A's plant with the six levers "
"not taken, so revenue, direct cost and EBITDA are Plan A's; only the depreciation (0.47M against "
"Plan A's 0.39M USD at the centre) and the payback (~3.7 against ~3.1 years) move. Not modelled: "
"Plan A's 0.39M USD at the centre) and the payback (~3.6 against ~3.1 years) move. Not modelled: "
"cassette and CD-R revenue, tour and Payap revenue, stamper supply to other plants, and the tax "
"benefit of the BOI solar measure.",
"**The central margin is too good to trust yet.** A central EBITDA margin of ~47 % is far above "
@@ -751,7 +751,7 @@ def blocks():
"with its own cost build-up (it adds electric steam heat and the cutting engineer, which this "
"table leaves out) and the team's faster Duplex planning rate, at which the three presses are not "
"Duplex-limited, gives at 850k records and 60 % specials: revenue ~4.14M, EBITDA 2.07M USD, "
"payback 2.8 years on the 193.8M THB investment in a mature year; with a ramp of 35, 70 and 90 % in "
"payback 2.8 years on the 192.8M THB investment in a mature year; with a ramp of 35, 70 and 90 % in "
"the first three years and the reserve in year 0, cash payback in year ~4.3, ~21 % IRR and an NPV "
"of ~4.1M USD over ten years, pre-tax and pre-financing (estimates). Its EBITDA is 0.03M above "
"Plan A's 2.04M because the owned array carries no PPA power price. Not modelled here: cassette "
@@ -983,7 +983,7 @@ def blocks():
"room.", pick("**More capital up front.** ~127M to 226M THB in one round (~177M at the "
"midpoint), against ~57M to 95M THB for the superseded phased entry; more of it is "
"committed before the market has validated the price.",
"**More capital up front.** ~150M to 268M THB in one round (~209M at the midpoint), "
"**More capital up front.** ~149M to 266M THB in one round (~208M at the midpoint), "
"against ~57M to 95M THB for the superseded phased entry; more of it is committed "
"before the market has validated the price.")],
pick(["**Six levers, no machine dropped.** The levers bring the whole chain to ~180M THB, and the "
@@ -995,8 +995,8 @@ def blocks():
"from the first release, tours and the Payap programmes from day one, cassette and CD-R, its "
"own crane and locally serviced utilities; the second Duplex waits for demand and revenue on a "
"reserved floor.",
"**~32M THB more that the model does not repay.** The same EBITDA as Plan A with more "
"depreciation and a longer payback (~3.7 against ~3.1 years); the adverse case still loses "
"**~31M THB more that the model does not repay.** The same EBITDA as Plan A with more "
"depreciation and a longer payback (~3.6 against ~3.1 years); the adverse case still loses "
"money."]),
], widths_mm=[85, 85], font_pt=8.5),
P("**How the plan answers the risks:** commission the metal path first and measure it before the "
@@ -1049,7 +1049,7 @@ def blocks():
"whose incentives are aligned with the plant's schedule and quality, within the same province.",
"**Debt-to-equity no higher than 3:1**, maintained for the life of the BOI privileges, which sets "
"the floor on equity in the financing mix: at least a quarter of the funding, " + pick(
"~44M THB of Plan A's ~177M", "~52M THB of Plan B's ~209M") +
"~44M THB of Plan A's ~177M", "~52M THB of Plan B's ~208M") +
" (arithmetic, before financing costs).",
"**A shareholders' agreement** covering board composition, reserved matters (capital calls and "
"tranche releases, the growth options such as a second Duplex, CD replication), pre-emption and transfer, information rights, and the founders' roles and "
@@ -1148,12 +1148,12 @@ def blocks():
"the midpoint), and from the low to the high end of every block the plan comes to ~127M to "
"226M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"the metrology quotes and the solar PPA offer decide where in that range it lands.",
"A commitment in principle to **Plan B at ~210M THB** (~209M at the midpoint, the ramp-up "
"A commitment in principle to **Plan B at ~210M THB** (~208M at the midpoint, the ramp-up "
"reserve of 10M to 20M included, no contingency), released in the tranches of section 8.3, "
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~52M "
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~29M THB more at "
"the midpoint), and from the low to the high end of every block the plan comes to ~150M to "
"268M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"the midpoint), and from the low to the high end of every block the plan comes to ~149M to "
"266M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"the metrology quotes and the solar and battery purchase quotes decide where in that range it "
"lands.")],
["Decisions", pick(
@@ -1161,7 +1161,7 @@ def blocks():
"levers, the solar PPA first (it very likely gives up the BOI solar measure); CD replication, "
"yes or no, before the BOI application is finalised; the steam fuel (electric or biomass); "
"the shareholder structure with Ploy Printing and the founders; hedging of the EUR orders.",
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~32M "
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~31M "
"THB of items Plan A leases or defers (owned solar with the BOI solar measure, the full "
"metrology stack, the visitor corridor, cassette and CD-R, the bought crane, Thai boilers and "
"compressor), each weighed against its lever; CD replication, yes or no, before the BOI "