From 2a07fa9027c51661fb76d74eafba436cc018aee2 Mon Sep 17 00:00:00 2001 From: Anthony Date: Sun, 9 Aug 2026 16:50:14 +0200 Subject: [PATCH 1/3] Add Inventory Modelling: Three Methods Percent of COGS, days inventory outstanding and unit build computed side by side on the same business, with a single switch driving which one feeds working capital, cash flow and the balance sheet. The three methods agree within 0.4% in year 1 and are EUR 865k apart by year 5. The P&L is identical on all three, so the whole difference lands in closing cash. Balance check verified at 0 on all five periods and on all three methods. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 1 + README.md | 1 + models/inventory-methods/README.md | 138 +++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 models/inventory-methods/README.md diff --git a/CLAUDE.md b/CLAUDE.md index ceb9774..bf1f3e0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -46,6 +46,7 @@ To publish or refresh a model page: | professional-services | `d0e3688b-eceb-4341-ada1-e8a45957b3d8` | | ecommerce-retail | `d5e899c7-a710-4f2a-9b05-cc3e88690af1` | | holdco-spv | `9548419c-9659-4da0-af74-14d58e61a220` | +| inventory-methods | `4dd73ff7-3ce6-4e87-b823-6699f4985255` | ## Monthly models β€” read the right period diff --git a/README.md b/README.md index ce30e35..42259dd 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Most financial models are disposable: every deal, every budget starts from a bla | [β˜€οΈ HoldCo / SPV Portfolio (Rooftop Solar)](models/holdco-spv/) | 3 project companies under one holding 2026-2045: debt and DSCR per SPV, full cash sweep, investor IRR & MOIC | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) | | [πŸ“Š Monthly Close (Actuals vs Budget)](models/monthly-close/) | Monthly management P&L with a budget base and an actuals branch: native variance and EBITDA budget-to-actual bridge, no second spreadsheet | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) | | [βš–οΈ Valuation (DCF & Multiples)](models/valuation/) | Company valuation 2025-2030: 5-year unlevered DCF + trading comps (EV/EBITDA, EV/Revenue, P/E) resolved into a football field per share | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) | +| [πŸ“¦ Inventory Modelling: Three Methods](models/inventory-methods/) | Percent of COGS, days inventory outstanding and unit build computed side by side 2025-2029: one switch drives the balance sheet, and the three answers are €865k apart by year 5 | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/4dd73ff7-3ce6-4e87-b823-6699f4985255) | Two LBOs on purpose: **Returns** is the sponsor view (sources & uses, cash sweep, IRR and MOIC), **Deal & Valuation** is the advisory view (capital structure you can restructure in one move, price range, actuals cutover). diff --git a/models/inventory-methods/README.md b/models/inventory-methods/README.md new file mode 100644 index 0000000..8e99942 --- /dev/null +++ b/models/inventory-methods/README.md @@ -0,0 +1,138 @@ +# πŸ“¦ Inventory Modelling: Three Methods + +> Percent of COGS, days inventory outstanding, unit build. The same business modelled three ways at once, with one switch deciding which one drives the balance sheet. + +

+ + Inventory Modelling Three Methods, Layerz model card + +

+ +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/4dd73ff7-3ce6-4e87-b823-6699f4985255) +![Currency](https://img.shields.io/badge/currency-EUR-555) +![Period](https://img.shields.io/badge/period-2025--2029-555) +![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) + +A teaching model and a fork-and-adapt base for **any inventory-carrying business**. The worked example is a products company going from €40.0M to €64.6M of revenue over five years. Its real subject is not the business, it is the method you use to forecast the inventory line. + +--- + +## The three methods, side by side + +| | Formula | The assumption you own | +|---|---|---| +| **A. Percent of COGS** | `ABS(COGS) Γ— ratio` | One ratio. Simple, and structurally blind to any efficiency gain. | +| **B. Days inventory outstanding** | `ABS(COGS) Γ— DIO / 365` | A number of days. Benchmarkable, negotiable, improvable. The standard 3-statement choice. | +| **C. Unit build** | `units / 12 Γ— months of cover Γ— unit cost` | Cover and unit cost. The only one that survives a change in mix or supplier lead time. | + +All three compute on every period, permanently. `Inventory method switch` (1 / 2 / 3) decides which result flows into working capital, and `Inventory (selected method)` is the single line every downstream statement reads. + +## Year 1 they agree. Year 5 they don't. + +Each method is anchored on the same starting position, which is exactly what you do when you set a model up. + +| Method | Inventory 2025 | Inventory 2029 | Implied days 2029 | +|---|--:|--:|--:| +| A. Percent of COGS (18.6%) | 4,315,200 | 6,849,537 | 68 | +| B. Inventory days (68 β†’ 62) | 4,322,192 | 6,255,285 | 62 | +| C. Unit build (2.24 β†’ 1.95 months) | 4,330,667 | 5,984,138 | 59 | + +**€865,398 of spread on the same business.** Method A's implied days never move: a fixed ratio has no way to express an efficiency gain, so it silently assumes the business never improves. + +## The P&L is identical on all three + +Inventory is a balance sheet stock. It never touches the income statement, so the method is invisible to anyone reviewing the P&L. + +| Line | 2025 | 2026 | 2027 | 2028 | 2029 | +|---|--:|--:|--:|--:|--:| +| Revenue | 40,000,000 | 46,000,000 | 52,440,000 | 58,732,800 | 64,606,080 | +| COGS | (23,200,000) | (26,680,000) | (30,153,000) | (33,477,696) | (36,825,466) | +| **Gross profit** | **16,800,000** | **19,320,000** | **22,287,000** | **25,255,104** | **27,780,614** | +| Opex | (12,000,000) | (13,800,000) | (15,732,000) | (17,619,840) | (19,381,824) | +| **EBITDA** | **4,800,000** | **5,520,000** | **6,555,000** | **7,635,264** | **8,398,790** | +| D&A | (1,200,000) | (1,300,000) | (1,400,000) | (1,500,000) | (1,600,000) | +| Interest | (300,000) | (300,000) | (300,000) | (300,000) | (300,000) | +| Income tax | (825,000) | (980,000) | (1,213,750) | (1,458,816) | (1,624,698) | +| **Net income** | **2,475,000** | **2,940,000** | **3,641,250** | **4,376,448** | **4,874,093** | + +The entire difference lands in cash instead: + +| Method | Closing cash 2029 | Cash conversion cycle 2029 | +|---|--:|--:| +| A. Percent of COGS | 14,312,217 | 78 days | +| B. Inventory days | 14,906,469 | 72 days | +| C. Unit build | 15,177,616 | 69 days | + +Nothing else in the model changes between the three runs, so the cash gap **is** the inventory gap. Every euro parked in the warehouse is a euro that does not reach the bank account. + +--- + +## Structure + +```mermaid +flowchart TD + REV["Revenue
growth off base"] --> COGS["COGS
= Revenue Γ— (1 βˆ’ gross margin)"] + COGS --> MA["A. Percent of COGS"] + COGS --> MB["B. DIO / 365 Γ— COGS"] + U["Units sold Γ— months of cover"] --> MC["C. Unit build"] + COGS --> MC + SW["Inventory method switch
1 / 2 / 3"] --> SEL["Inventory (selected method)"] + MA --> SEL + MB --> SEL + MC --> SEL + SEL --> NWC["Net working capital
= AR + Inventory βˆ’ AP"] + REV --> AR["Receivables: DSO 55"] + COGS --> AP["Payables: DPO 45"] + AR --> NWC + AP --> NWC + NWC --> DNWC["Change in working capital"] + DNWC --> OCF["Operating cash flow"] + NI["Net income"] --> OCF + OCF --> CASH["Cash (rolling balance)"] + CASH --> BS["Balance sheet
check = 0"] + NI --> RE["Retained earnings"] + RE --> BS +``` + +Only one line in the whole model references a method: the switch. Everything downstream reads `Inventory (selected method)`, which is why flipping between methods recomputes the statements without breaking a single link. + +## Balance sheet + +Shown on method B, the default. + +| | 2025 | 2026 | 2027 | 2028 | 2029 | +|---|--:|--:|--:|--:|--:| +| Cash | 3,835,685 | 5,452,288 | 7,869,502 | 11,089,875 | 14,906,469 | +| Receivables | 6,027,397 | 6,931,507 | 7,901,918 | 8,850,148 | 9,735,163 | +| Inventory | 4,322,192 | 4,970,521 | 5,452,323 | 5,870,062 | 6,255,285 | +| PP&E | 9,200,000 | 9,400,000 | 9,600,000 | 9,800,000 | 10,000,000 | +| **Total assets** | **23,385,274** | **26,754,315** | **30,823,743** | **35,610,085** | **40,896,917** | +| **Total liabilities and equity** | **23,385,274** | **26,754,315** | **30,823,743** | **35,610,085** | **40,896,917** | +| **Balance check** | **0** | **0** | **0** | **0** | **0** | + +The check holds on all five periods **and on all three methods**, verified by re-running the model with the switch on 1 and on 3. + +## Conventions + +- **Currency**: EUR, whole euros, yearly grain only. +- **Sign**: costs and outflows negative, so every subtotal is a plain sum. +- **Opening working capital** is an explicit assumption (€6,550,000), so year 1 does not absorb the entire working capital build as a phantom cash outflow. This is the mistake that makes a first forecast year look far worse than it is. +- P&L β†’ balance sheet: net income is a callup child of retained earnings, never entered by hand. Cash flow β†’ balance sheet: net change in cash is the only flow into the cash balance. + +## Known simplifications + +One inventory pool, no SKU and no seasonality. No returns, discounts or obsolescence provision. Depreciation is an input schedule, not a fixed-asset register. Debt and share capital are static: there is no financing logic on purpose. Tax is a flat rate on positive profit before tax, with no loss carry-forward. If channel economics are your question rather than method choice, pair this with the [E-commerce & Retail](../ecommerce-retail/) model. + +## How to use it + +1. **[Open it in Layerz](https://layerz.cc/models/4dd73ff7-3ce6-4e87-b823-6699f4985255)** (free account) and **fork** it. +2. Replace base revenue, growth and gross margin with yours. +3. **Anchor all three methods on your last closed year** so they start from the same inventory balance. This is the step that makes the comparison honest. +4. Flip `Inventory method switch` between 1, 2 and 3 and read the closing cash line each time. +5. If the three answers land within a rounding error, your inventory is immaterial and you can stop thinking about it. If they don't, you have found a number worth defending. + +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/4dd73ff7-3ce6-4e87-b823-6699f4985255) + +--- + +*Part of [Finance Models](../../README.md). Built with [Layerz](https://layerz.cc). We share the recipe, not the black box.* From 16f16f34f11cdd9433392741f5856dca4d14cc09 Mon Sep 17 00:00:00 2001 From: Anthony Date: Sun, 9 Aug 2026 18:08:24 +0200 Subject: [PATCH 2/3] Point every model link at the apex domain layerz.cc became the canonical origin on 2026-08-06; app.layerz.cc now 308s to it. Every Open in Layerz button, OG card and workflow URL in this repo still pointed at app., so each one took a redirect hop. The check-links workflow was about to break on it: it asserts a bare 200 and app.layerz.cc/models/ answers 308. Its last green run was 2026-08-03, three days before the migration, so the next scheduled run would have failed on all 12 models. Replayed locally after the sweep: 13 models, 26 URLs, all 200. The id-collection grep now accepts both forms, so a stray app. link in a future page still gets checked rather than silently dropped. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/check-links.yml | 6 +++--- CLAUDE.md | 2 +- README.md | 24 ++++++++++++------------ models/coffee-shop-nyc/README.md | 10 +++++----- models/ecommerce-retail/README.md | 10 +++++----- models/holdco-spv/README.md | 10 +++++----- models/lbo/README.md | 10 +++++----- models/monthly-close/README.md | 10 +++++----- models/professional-services/README.md | 10 +++++----- models/project-finance/README.md | 10 +++++----- models/saas-cohort/README.md | 10 +++++----- models/saas-reporting-forecast/README.md | 10 +++++----- models/saas-series-a/README.md | 10 +++++----- models/tech-ma-lbo/README.md | 10 +++++----- models/valuation/README.md | 10 +++++----- 15 files changed, 76 insertions(+), 76 deletions(-) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 31dea68..f19881c 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -24,7 +24,7 @@ jobs: - name: Collect model ids from the model pages id: collect run: | - grep -rhoE 'app\.layerz\.cc/models/[0-9a-f-]{36}' models README.md \ + grep -rhoE '(app\.)?layerz\.cc/models/[0-9a-f-]{36}' models README.md \ | sed 's|.*/||' | sort -u > ids.txt echo "Found $(wc -l < ids.txt) model id(s):" cat ids.txt @@ -35,8 +35,8 @@ jobs: fail=0 while read -r id; do for url in \ - "https://app.layerz.cc/models/$id" \ - "https://app.layerz.cc/models/$id/opengraph-image"; do + "https://layerz.cc/models/$id" \ + "https://layerz.cc/models/$id/opengraph-image"; do code=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 30 --retry 2 "$url" || echo 000) if [ "$code" = "200" ]; then echo "ok $code $url" diff --git a/CLAUDE.md b/CLAUDE.md index bf1f3e0..01347a1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,7 +26,7 @@ To publish or refresh a model page: - **Published models are frozen.** Every model listed below is a live model backing a public page. Do not edit or delete one for a demo, a test or a quick fix: the page here would keep describing a model that no longer exists. Fork it and work on the fork. The weekly `check-links` workflow catches a dead model or OG card, but only after the fact. - Page copy is **English** (public-facing). The underlying model may stay in another language when the structure is jurisdiction-specific (e.g. the HoldCo/SPV template is French: PPA tariffs, rΓ©gime mΓ¨re-fille). In that case the page says so in a badge and a short note, rather than translating the model and breaking its accuracy. - **This catalog and the Layerz system templates are two different lists.** A model can be a system template without a page here, and vice versa. Reconcile deliberately (`layerz_list_templates({ scope: "system" })`), never assume they match. -- **Open in Layerz** button β†’ `https://app.layerz.cc/models/` (same URL used for sharing). +- **Open in Layerz** button β†’ `https://layerz.cc/models/` (same URL used for sharing). - Voice: *"we share the recipe, not the black box."* Personal repo, not corporate Layerz Labs. - Dashboard screenshots are real Layerz exports dropped in `.github/assets/` (concierge step, not auto-generated). diff --git a/README.md b/README.md index 42259dd..3af1dde 100644 --- a/README.md +++ b/README.md @@ -12,18 +12,18 @@ Most financial models are disposable: every deal, every budget starts from a bla | Model | What it is | | |---|---|---| -| [β˜• Coffee Shop NYC](models/coffee-shop-nyc/) | 3-year cafΓ© business plan: P&L, Cash Flow, Balance Sheet that tie out, plus a CFO dashboard | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545) | -| [πŸ“ˆ SaaS Reporting & Forecast](models/saas-reporting-forecast/) | B2B SaaS operating model 2024-2028: ARR & unit economics, actuals & variance, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff) | -| [πŸ—οΈ Infrastructure Project Finance](models/project-finance/) | Reusable project-finance template (worked example: 500 MW offshore wind, 2026-2046): sized senior debt, DSCR, equity IRR, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) | -| [πŸš€ SaaS Scale-up (Series A)](models/saas-series-a/) | B2B SaaS Series A plan 2026-2030: ARR build, unit economics, path to profit and runway, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) | -| [πŸ’° LBO Β· Returns (Mid-Market Buyout)](models/lbo/) | Leveraged buyout 2025-2030: sources & uses, sized debt with cash sweep, IRR & MOIC, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) | -| [🏦 LBO Β· Deal & Valuation (Tech M&A)](models/tech-ma-lbo/) | $43M software buyout 2024-2028: debt tranches as an editable list, actuals/forecast cutover, live checks, football field | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) | -| [πŸ‘₯ SaaS Cohort Revenue Projection](models/saas-cohort/) | Monthly cohort engine 2026-2028: churn by tenure (M0-M35), customer base as a stock, MRR bridge that ties out, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) | -| [πŸ’Ό Professional Services (Consulting)](models/professional-services/) | Grade pyramid 2026-2028: headcount Γ— capacity Γ— utilisation Γ— rate, WIP and DSO, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) | -| [πŸ›’ E-commerce & Retail (Channel Mix)](models/ecommerce-retail/) | DTC, marketplace, own retail and wholesale 2026-2028: contribution margin per channel, 40-day cash cycle, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) | -| [β˜€οΈ HoldCo / SPV Portfolio (Rooftop Solar)](models/holdco-spv/) | 3 project companies under one holding 2026-2045: debt and DSCR per SPV, full cash sweep, investor IRR & MOIC | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) | -| [πŸ“Š Monthly Close (Actuals vs Budget)](models/monthly-close/) | Monthly management P&L with a budget base and an actuals branch: native variance and EBITDA budget-to-actual bridge, no second spreadsheet | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) | -| [βš–οΈ Valuation (DCF & Multiples)](models/valuation/) | Company valuation 2025-2030: 5-year unlevered DCF + trading comps (EV/EBITDA, EV/Revenue, P/E) resolved into a football field per share | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) | +| [β˜• Coffee Shop NYC](models/coffee-shop-nyc/) | 3-year cafΓ© business plan: P&L, Cash Flow, Balance Sheet that tie out, plus a CFO dashboard | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545) | +| [πŸ“ˆ SaaS Reporting & Forecast](models/saas-reporting-forecast/) | B2B SaaS operating model 2024-2028: ARR & unit economics, actuals & variance, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff) | +| [πŸ—οΈ Infrastructure Project Finance](models/project-finance/) | Reusable project-finance template (worked example: 500 MW offshore wind, 2026-2046): sized senior debt, DSCR, equity IRR, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) | +| [πŸš€ SaaS Scale-up (Series A)](models/saas-series-a/) | B2B SaaS Series A plan 2026-2030: ARR build, unit economics, path to profit and runway, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) | +| [πŸ’° LBO Β· Returns (Mid-Market Buyout)](models/lbo/) | Leveraged buyout 2025-2030: sources & uses, sized debt with cash sweep, IRR & MOIC, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) | +| [🏦 LBO Β· Deal & Valuation (Tech M&A)](models/tech-ma-lbo/) | $43M software buyout 2024-2028: debt tranches as an editable list, actuals/forecast cutover, live checks, football field | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) | +| [πŸ‘₯ SaaS Cohort Revenue Projection](models/saas-cohort/) | Monthly cohort engine 2026-2028: churn by tenure (M0-M35), customer base as a stock, MRR bridge that ties out, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) | +| [πŸ’Ό Professional Services (Consulting)](models/professional-services/) | Grade pyramid 2026-2028: headcount Γ— capacity Γ— utilisation Γ— rate, WIP and DSO, 3 statements that tie out | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) | +| [πŸ›’ E-commerce & Retail (Channel Mix)](models/ecommerce-retail/) | DTC, marketplace, own retail and wholesale 2026-2028: contribution margin per channel, 40-day cash cycle, 3 statements | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) | +| [β˜€οΈ HoldCo / SPV Portfolio (Rooftop Solar)](models/holdco-spv/) | 3 project companies under one holding 2026-2045: debt and DSCR per SPV, full cash sweep, investor IRR & MOIC | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) | +| [πŸ“Š Monthly Close (Actuals vs Budget)](models/monthly-close/) | Monthly management P&L with a budget base and an actuals branch: native variance and EBITDA budget-to-actual bridge, no second spreadsheet | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) | +| [βš–οΈ Valuation (DCF & Multiples)](models/valuation/) | Company valuation 2025-2030: 5-year unlevered DCF + trading comps (EV/EBITDA, EV/Revenue, P/E) resolved into a football field per share | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) | | [πŸ“¦ Inventory Modelling: Three Methods](models/inventory-methods/) | Percent of COGS, days inventory outstanding and unit build computed side by side 2025-2029: one switch drives the balance sheet, and the three answers are €865k apart by year 5 | [![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/4dd73ff7-3ce6-4e87-b823-6699f4985255) | Two LBOs on purpose: **Returns** is the sponsor view (sources & uses, cash sweep, IRR and MOIC), **Deal & Valuation** is the advisory view (capital structure you can restructure in one move, price range, actuals cutover). diff --git a/models/coffee-shop-nyc/README.md b/models/coffee-shop-nyc/README.md index 66d06ae..1399cdf 100644 --- a/models/coffee-shop-nyc/README.md +++ b/models/coffee-shop-nyc/README.md @@ -3,12 +3,12 @@ > A 3-year business plan for an independent specialty cafΓ© in Manhattan. Funds a build-out with owner equity + a bank loan, then ramps traffic and ticket. P&L, Cash Flow and Balance Sheet that tie out, plus a CFO-style dashboard.

- - Coffee Shop NYC, Layerz model card + + Coffee Shop NYC, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://app.layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545)   ![Currency](https://img.shields.io/badge/currency-USD-333) ![Horizon](https://img.shields.io/badge/horizon-2026–2028-333) @@ -107,7 +107,7 @@ flowchart TD ## How to use it -1. **[Open in Layerz](https://app.layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545)** and fork it (free account). +1. **[Open in Layerz](https://layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545)** and fork it (free account). 2. Edit the drivers in **Assumptions** β€” customers/day, avg ticket, rent, loan terms. 3. Watch every statement recompute, and confirm **Balance Check == 0**. @@ -115,6 +115,6 @@ flowchart TD --- -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://app.layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://layerz.cc/models/d161c3c4-ade6-48e4-b162-48fa2f81c545) *Shared by [@anthomakr](https://github.com/anthomakr) Β· built with [Layerz](https://layerz.cc) Β· we share the recipe, not the black box.* diff --git a/models/ecommerce-retail/README.md b/models/ecommerce-retail/README.md index 0b29c38..60b556f 100644 --- a/models/ecommerce-retail/README.md +++ b/models/ecommerce-retail/README.md @@ -3,12 +3,12 @@ > Four channels, four different economics. A blended gross margin hides which one actually pays, and hides what growth costs you in cash.

- - E-commerce and Retail Channel Mix, Layerz model card + + E-commerce and Retail Channel Mix, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) ![Currency](https://img.shields.io/badge/currency-EUR-555) ![Period](https://img.shields.io/badge/period-2026--2028-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -123,12 +123,12 @@ Retail store costs sit inside `Channel Cost %` rather than being driven by a sto ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1)** (free account) and **fork** it. +1. **[Open it in Layerz](https://layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1)** (free account) and **fork** it. 2. Replace the `Channels` list with your own, then fill orders, AOV, product margin and channel cost. 3. Re-base days inventory, DSO and DPO on your real terms. They drive the cash line far more than the P&L does. 4. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d5e899c7-a710-4f2a-9b05-cc3e88690af1) --- diff --git a/models/holdco-spv/README.md b/models/holdco-spv/README.md index da57696..18feb3e 100644 --- a/models/holdco-spv/README.md +++ b/models/holdco-spv/README.md @@ -3,12 +3,12 @@ > A portfolio of project companies under one holding, driven entirely by a list. Adding a fourth SPV is three keystrokes: a list element, a capacity, a commissioning year. No formula is touched.

- - HoldCo SPV rooftop solar portfolio, Layerz model card + + HoldCo SPV rooftop solar portfolio, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Period](https://img.shields.io/badge/period-2026--2045-555) ![Balanced](https://img.shields.io/badge/HoldCo_balance-checked-2E9E5B) @@ -81,12 +81,12 @@ No loss carry-forward on tax, since the SPVs are profitable from year one. No pe ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220)** (free account) and **fork** it. +1. **[Open it in Layerz](https://layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220)** (free account) and **fork** it. 2. Replace the `SPV` list with your own assets, one element each, with capacity and commissioning year. 3. Re-base the technical and tariff assumptions, then the debt terms. Check DSCR per SPV and at portfolio level. 4. Confirm the HoldCo balance check holds at 0, then export to Excel. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/9548419c-9659-4da0-af74-14d58e61a220) --- diff --git a/models/lbo/README.md b/models/lbo/README.md index 7e8bdc0..562fe5a 100644 --- a/models/lbo/README.md +++ b/models/lbo/README.md @@ -3,12 +3,12 @@ > A leveraged buyout of a €25m-EBITDA business: sources and uses, senior debt sized off EBITDA with a cash sweep, sponsor IRR and MOIC, and three statements that tie out every year. Returns come from growth and deleveraging, not multiple expansion.

- - LBO Mid-Market Buyout, Layerz model card + + LBO Mid-Market Buyout, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Horizon](https://img.shields.io/badge/horizon-2025--2030-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -105,11 +105,11 @@ Full conventions live in the model's `FINANCE.md`. ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6)** (free account) and **fork** it: you get a model you own. 2. Change the drivers in `Assumptions` (entry EBITDA, multiples, leverage, growth, rate, sweep). The debt schedule, the statements, the IRR and the MOIC all recompute, and the balance check stays at 0. 3. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/57af5678-5e56-44bc-9d46-379b8eb961b6) --- diff --git a/models/monthly-close/README.md b/models/monthly-close/README.md index 7fdbde7..e555997 100644 --- a/models/monthly-close/README.md +++ b/models/monthly-close/README.md @@ -3,12 +3,12 @@ > A monthly management P&L where the budget and the actuals are the same model, not two spreadsheets. Overlay the closed months on an Actuals branch and the variance, plus the EBITDA budget-to-actual bridge, fall out on their own.

- - Monthly Close, Actuals vs Budget, Layerz model card + + Monthly Close, Actuals vs Budget, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Period](https://img.shields.io/badge/period-FY2026_monthly-555) ![Close](https://img.shields.io/badge/budget_vs-actuals-2E9E5B) @@ -76,11 +76,11 @@ Full conventions live in the model's `FINANCE.md`. ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d)** (free account) and **fork** it: you get a model you own. 2. Each month, add that month's actuals to the Actuals branch (type them or import a file). The variance, the bridge and the reforecast update on their own. 3. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/ccea856a-6ee5-4f79-b891-e1c321daac4d) --- diff --git a/models/professional-services/README.md b/models/professional-services/README.md index e4af455..87667ba 100644 --- a/models/professional-services/README.md +++ b/models/professional-services/README.md @@ -3,12 +3,12 @@ > Revenue is not a growth rate. It is headcount Γ— capacity Γ— utilisation Γ— bill rate, resolved grade by grade. Change one utilisation cell and the whole firm moves.

- - Professional Services Firm, Layerz model card + + Professional Services Firm, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) ![Currency](https://img.shields.io/badge/currency-EUR-555) ![Period](https://img.shields.io/badge/period-2026--2028-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -120,12 +120,12 @@ One blended bill rate per grade: no client, country or engagement-type mix, and ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8)** (free account) and **fork** it. +1. **[Open it in Layerz](https://layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8)** (free account) and **fork** it. 2. Replace the `Grades` list with your own titles, then fill headcount, utilisation, rates and loaded cost. 3. Re-base capacity, days WIP and DSO on your own invoicing reality. They drive the cash line more than the P&L does. 4. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/d0e3688b-eceb-4341-ada1-e8a45957b3d8) --- diff --git a/models/project-finance/README.md b/models/project-finance/README.md index c0f2f08..37ce2c0 100644 --- a/models/project-finance/README.md +++ b/models/project-finance/README.md @@ -3,12 +3,12 @@ > A reusable project-finance template for a capex-heavy asset on a long-term contract: sized senior debt, DSCR and equity IRR, and three statements that tie out every year. Worked example here: a 500 MW offshore wind farm on a 20-year PPA.

- - Infrastructure Project Finance, Layerz model card + + Infrastructure Project Finance, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Horizon](https://img.shields.io/badge/horizon-2026--2046-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -126,11 +126,11 @@ Full conventions live in the model's `FINANCE.md`. ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224)** (free account) and **fork** it: you get a model you own. 2. Change the drivers in `Assumptions` (capacity, PPA price, capex per MW, gearing, rate, tenor). Every statement, the DSCR and the equity IRR recompute, and the balance check stays at 0. 3. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/5e54258d-e4b6-48a0-91b0-32d4271fe224) --- diff --git a/models/saas-cohort/README.md b/models/saas-cohort/README.md index 1b5a8f8..ed5d2fe 100644 --- a/models/saas-cohort/README.md +++ b/models/saas-cohort/README.md @@ -3,12 +3,12 @@ > Recurring revenue projected by acquisition cohort, with churn structured by tenure rather than a flat rate. The customer count is a stock, not a formula, and the MRR bridge ties out to the cent every month.

- - SaaS Cohort Revenue Projection, Layerz model card + + SaaS Cohort Revenue Projection, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) ![Currency](https://img.shields.io/badge/currency-EUR-555) ![Period](https://img.shields.io/badge/period-2026--01_β†’_2028--12_monthly-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -117,13 +117,13 @@ Cash bottoms at €279k just before the Series A, recovers to €3.2M, then fall ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2)** (free account) and **fork** it: you get a model you own. 2. Edit three levers: the **churn curve** by tenure, the **new customers** ramp, and **ARPA**. The customer stock, the revenue and all three statements recompute. 3. Re-base **`SnM CAC`** and **`Steady Churn (LTV)`** on your own data before quoting any unit economics. 4. Confirm `MRR Bridge Check == 0` and `Balance Check == 0`. If a change breaks either, the monitor turns red before the number reaches a slide. 5. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/0cf40614-eb52-48b9-8d72-cbecc84860b2) --- diff --git a/models/saas-reporting-forecast/README.md b/models/saas-reporting-forecast/README.md index 510553b..f5be867 100644 --- a/models/saas-reporting-forecast/README.md +++ b/models/saas-reporting-forecast/README.md @@ -3,12 +3,12 @@ > A B2B mid-market SaaS operating model, 2024–2028. Customer base β†’ ARR β†’ full three statements, with unit economics, a CFO dashboard, and a Budget-vs-Actuals close. Growth funded by a $3M Series A in 2025.

- - SaaS Reporting & Forecast, Layerz model card + + SaaS Reporting & Forecast, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://app.layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff)   ![Currency](https://img.shields.io/badge/currency-USD-333) ![Horizon](https://img.shields.io/badge/horizon-2024–2028-333) @@ -113,7 +113,7 @@ Sections: Assumptions Β· Operating Drivers Β· RH (list-driven roster) Β· P&L Β· ## How to use it -1. **[Open in Layerz](https://app.layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff)** and fork it (free account). +1. **[Open in Layerz](https://layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff)** and fork it (free account). 2. Edit the drivers β€” new customers/year, churn, CARR, expansion, headcount by department. 3. Watch ARR, the P&L and the unit economics recompute, and confirm **Balance Check == 0**. @@ -121,6 +121,6 @@ Sections: Assumptions Β· Operating Drivers Β· RH (list-driven roster) Β· P&L Β· --- -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://app.layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork_this_model-2D6BFF?style=for-the-badge)](https://layerz.cc/models/39550987-f253-4a36-b067-6daddcb1e3ff) *Shared by [@anthomakr](https://github.com/anthomakr) Β· built with [Layerz](https://layerz.cc) Β· we share the recipe, not the black box.* diff --git a/models/saas-series-a/README.md b/models/saas-series-a/README.md index 5e5316c..8998364 100644 --- a/models/saas-series-a/README.md +++ b/models/saas-series-a/README.md @@ -3,12 +3,12 @@ > A B2B SaaS company raising an €8m Series A: the ARR build, the unit economics, the path to profitability and the cash runway, with three statements that tie out every year.

- - SaaS Scale-up Series A, Layerz model card + + SaaS Scale-up Series A, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Horizon](https://img.shields.io/badge/horizon-2026--2030-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -109,11 +109,11 @@ Full conventions live in the model's `FINANCE.md`. ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095)** (free account) and **fork** it: you get a model you own. 2. Change the drivers in `Assumptions` (bookings, churn, expansion, opex ratios, the raise). The ARR build, the statements, the unit economics and the runway all recompute, and the balance check stays at 0. 3. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3f9737d9-e7c8-4f56-b962-6bb9963d6095) --- diff --git a/models/tech-ma-lbo/README.md b/models/tech-ma-lbo/README.md index 667fc5b..0cf0252 100644 --- a/models/tech-ma-lbo/README.md +++ b/models/tech-ma-lbo/README.md @@ -3,12 +3,12 @@ > A mid-market software buyout in one file: the operating case, the capital structure and the price conversation. Fork it, drop a target's real actuals into the historical years, and let the rest run off the drivers.

- - Tech M&A LBO Deal Model, Layerz model card + + Tech M&A LBO Deal Model, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) ![Currency](https://img.shields.io/badge/currency-USD-555) ![Period](https://img.shields.io/badge/period-FY2024--2028-555) ![Balanced](https://img.shields.io/badge/3--statement-balanced-2E9E5B) @@ -121,12 +121,12 @@ Interest on the **opening balance**, no cash sweep: amortisation is a scheduled ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff)** (free account) and **fork** it: you get a model you own. 2. Replace the historical years with the target's real numbers from the data room, and move `actuals_through` to your cutover. 3. Rebuild the capital structure by editing the `Debt Tranches` list. Add or remove a tranche, the schedule and the three statements follow. 4. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/3657668b-4684-4010-bd9b-c83845db1dff) --- diff --git a/models/valuation/README.md b/models/valuation/README.md index 5d1f370..8c48186 100644 --- a/models/valuation/README.md +++ b/models/valuation/README.md @@ -3,12 +3,12 @@ > A company valuation done two ways and laid side by side: a 5-year unlevered DCF and trading comps (EV/EBITDA, EV/Revenue, P/E), resolved into a football field per share. Change a driver and the whole football field moves.

- - Valuation DCF and Multiples, Layerz model card + + Valuation DCF and Multiples, Layerz model card

-[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) ![Currency](https://img.shields.io/badge/currency-EUR_(k€)-555) ![Base](https://img.shields.io/badge/base-2025_LTM-555) ![Forecast](https://img.shields.io/badge/forecast-2026--2030-555) @@ -90,11 +90,11 @@ Full conventions live in the model's `FINANCE.md`. ## How to use it -1. **[Open it in Layerz](https://app.layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042)** (free account) and **fork** it: you get a model you own. +1. **[Open it in Layerz](https://layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042)** (free account) and **fork** it: you get a model you own. 2. Change the drivers in `Assumptions` (WACC, terminal growth, margins, the comp multiples low/mid/high, net debt, shares). The DCF, every multiple and the football field recompute at once. 3. Export to Excel any time. The export is clean and auditable. -[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://app.layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) +[![Open in Layerz](https://img.shields.io/badge/Open_in_Layerz-Fork-2D6BFF)](https://layerz.cc/models/29f9cebe-cfc3-403b-82c4-bd50e1f8e042) --- From 8f5db7021821d54357486166474c9fb90e3134d5 Mon Sep 17 00:00:00 2001 From: Anthony Date: Sun, 9 Aug 2026 18:10:36 +0200 Subject: [PATCH 3/3] Run the link check on pull requests too A page that ships a dead or mistyped model link was only caught by the Monday cron, after merge and after the page was already public. Adding pull_request to the triggers moves that check before merge. On a pull_request event the checkout is the merge result, so what gets verified is the repo as it would look on main. The job only curls public URLs and needs no secrets, so it works on fork PRs under the read-only token as well. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/check-links.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index f19881c..5c5347e 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -3,6 +3,11 @@ name: Check model links # The pages in this repo are frozen snapshots of live Layerz models. # If a model is edited away, unshared or deleted, the public page keeps # claiming it exists. This job catches that within a week. +# +# It also runs on pull requests, so a page that ships a dead or mistyped +# model link is caught before merge rather than by the next Monday cron. +# On a PR the checkout is the merge result, so what gets verified is the +# repo as it would look on main. on: schedule: @@ -13,6 +18,11 @@ on: - 'models/**' - 'README.md' - '.github/workflows/check-links.yml' + pull_request: + paths: + - 'models/**' + - 'README.md' + - '.github/workflows/check-links.yml' workflow_dispatch: jobs: