Skip to content
G·01
← All guides
valuationmultiplesDCFmethodology

How we value companies at scale

Misano

“NACE comparables don’t really work” — and yet we build on them. It comes down to the question you’re asking: are you valuing one company you already know, or do you want to sweep the whole market and pick the ten worth going deep on? For the second job, NACE is the only layer that exists for every company — and its multiples aren’t pulled from thin air. We curate them from:

  • Dealsuite — transaction multiples from CEE / DACH / Benelux M&A reports
  • Damodaran Europe — industry data, forward P/E by sector
  • BDO Europe — listed P/E by sector
  • Forvis Mazars — CEE / European sector studies
  • MarktoMarket — observed UK SME transaction P/E (median 5.4–8.0×)
  • VŠE Prague — European study of private-company multiples

NACE is the first layer, not the last — five more follow, each fixing the blind spot of the one before it. And Misano runs this whole sequence across 100, 500 or 10,000 companies at once, customized for each of them — see the logic below. Here’s the full methodology. State as of 2026-07-04.

Principles

Deterministic computation, no AI in the math. Same inputs → same result. AI is used only to extract data from financial statements; the valuation itself is clean, tested arithmetic with an audit trail — every result carries a provenance, i.e. the list of steps from baseline through adjustments to the final number.

Three layers, one headline. The headline valuation comes from the multiples engine (EV/EBITDA → P/E → EV/Revenue cascade). A Damodaran-style DCF is an independent cross-check. NAV (book equity) is the anchor the income value reconciles against. All methods meet in one chart — the “football field”.

We value fair market value for a financial buyer — the 100% (controlling) value of the company at the market median. We don’t model the synergies of a specific strategic buyer, nor the maximum price achievable in a competitive auction.

1. Input data

We pull financial statements from filed accounts in the Collection of Deeds (justice.cz). From the P&L and balance sheet we extract, year by year: revenue, EBITDA, EBITDA margin, net profit, equity, total assets, headcount.

Every series passes an integrity gate — a deterministic consistency check. A year where EBITDA > revenue (a strong signal of a data error — typically a misread decimal comma, “24.45” → “244.5”, or a units mismatch, “in thousands CZK”; rarely a legitimate one-off income item, which we don’t verify) is excluded from the calculation, not silently corrected. Excluded years are reported as a “provisional data” signal.

Everything is converted to CZK before it enters the engine. The valuation is then driven by the latest filed year (latest-year rule). If EBITDA is missing in that year, the company is valued on EV/Revenue from current revenue with an explanatory label — we never carry EBITDA forward from an older year. That would silently value today’s company on years-old profitability.

The NACE code from the register is mapped to a 2-digit NACE Rev. 2.1 division (sections A–V). The division is the key into the multiples benchmark table.

2. Multiples engine (headline)

2.1 Choosing the multiple source — custom → niche → NACE

Exactly one source values each metric family (EV/EBITDA, EV/Revenue, P/E). No weighted blending — we killed that in June 2026: it was mathematically fine but impossible to explain to a human. The rule:

  1. 01Custom override — manually entered levels for a specific company. The override is final: no adjustments are added on top.
  2. 02Niche — multiples from the niche layer (see 2.3), where they exist for the company. A family the niche doesn’t have falls back to NACE — the method doesn’t silently switch off.
  3. 03NACE baseline — the default for everything else. Fallback chain: NACE division → legacy sector table → generic default.

2.2 NACE baseline — where the numbers come from

For every market NACE division (~80 divisions) we hold a curated low / mid / high triple of levels for three different valuation approaches:

ApproachWhat it multipliesLevel
EV/EBITDAlast-year EBITDA (normalized where needed)enterprise value
EV/Revenuelast-year revenueenterprise value
P/Enet profit (normalized)equity value

Benchmarks are documented per division — each division stores its source and caveat — and mix the sources listed in the intro. A few concrete anchors for a sense of scale: CEE Software Development EV/EBITDA 6.7×, CEE Construction 3.9×, CEE Wholesale 4.7× (Dealsuite); Healthcare & Pharma EV/EBITDA 12.3× (Forvis Mazars).

For the P/E levels we apply a 45–65% listed→private discount (by division), calibrated against observed SME transactions. Each division carries an evidence quality tag (High … Low) reflecting the strength of the underlying data.

We curate the table ourselves. It lives as a versioned CSV in the repo and is tuned manually roughly monthly alongside the engine constants — every change is a code review, not config magic. The CEE context is baked directly into the level of the anchors, which is why there’s no separate “CEE discount” coefficient.

Example levels (EV/EBITDA low/mid/high · EV/Revenue · P/E):

  • division 62 (programming, SaaS): 8 / 15 / 25 · 2.5 / 4.7 / 8.2 · 5.5 / 9 / 13 — evidence High
  • division 59 (film/video/TV production): 4 / 7 / 12 · 0.5 / 1.5 / 3 · 4 / 6.5 / 9.5 — evidence Low
  • division 46 (wholesale): 3.5 / 5 / 7 · 0.4 / 0.8 / 1.4 · 3.5 / 5.5 / 7.5 — evidence High

2.3 Niches — finer granularity than NACE

A NACE division is too coarse for a lot of businesses (“wholesale” ≠ C2C marketplace). The niche layer fixes this with two mechanisms:

  1. 01Niche catalog — a curated list of niches (e.g. “MSP/IT services”, “gyms/fitness studios chain”), each with seed multiples (a curated low/mid/high estimate + evidence quality) and a link to a NACE division.
  2. 02Transaction database (comps) — real deals tagged by niche, with EV/EBITDA, EV/Revenue, P/E multiples, an announcement date and a verified flag.

Rule (no coefficients): a deal either counts or it doesn’t. It counts when (a) the announcement date is at most 5 years back, (b) the deal actually discloses that metric, (c) it’s verified. Then, per metric family:

  • ≥ 3 counting deals → multiple = plain median of the deals; low/high = min/max, from 5 deals onward p25/p75;
  • < 3 deals → the curated seed applies, explicitly labeled in the UI as “curated estimate (N transactions)” vs. “from N transactions · median”.

Alongside the verified pool (the only one allowed to drive valuations), the same rule computes a community pool across all deals including unverified ones — “how users value it”, purely informational. Sanity check: the implied EBITDA margin (EV/Revenue ÷ EV/EBITDA) must fall within 2–55%, otherwise the niche is flagged for review.

2.4 Method cascade — EV/EBITDA → P/E → EV/Revenue

The engine picks the primary method top to bottom:

  1. 01EV/EBITDA — the default, when levels exist and EBITDA (after normalization) > 0 and isn’t hard-stale.
  2. 02P/E on net profit — only when EBITDA is unusable, net profit > 0 and a P/E benchmark exists. It values equity directly — a small Czech company often doesn’t disclose EBITDA in its statements, but does disclose profit.
  3. 03EV/Revenue — last resort (loss-making company / no EBITDA filed), with a label saying why (“no EBITDA filed for 2024 — valued on revenue”).
  4. 04When nothing works → NAV-only (headline = book equity), or an honest null.

2.5 Earnings normalization — growth is not volatility

One cyclical peak × multiple = a lottery. Hence trend-conditional normalization:

We fit an OLS trend through the EBITDA (or net profit) series and compute the coefficient of variation of the residuals (RMSE of residuals ÷ |mean|). A steadily growing company has residuals near zero — growth is a trend, not volatility. Above a threshold of 0.30 the latest year is untrustworthy → the median of available years goes into the multiple (the label says so: “normalised (median)”). And a sign-flip rule: a profit↔loss switch in the last 2 reported years → automatic median. Older losses (startup history) don’t brand the company forever.

2.6 Staleness gate — old data must not make today’s headline

Age of a metric relative to the reference year: > 2 years = soft-stale (used, but flagged), > 4 years = hard-stale (the metric is unusable for the headline, the cascade drops down; when a whole series is hard-stale, only the NAV anchor remains). A two-year lag is the normal cadence of Czech reporting, which is why ≤ 2 years is “fresh”.

2.7 Heuristic adjustments (NACE/niche baseline only, never for an override)

Qualitative shifts are added onto the EV/EBITDA levels. All constants live in a single file and change only by code review:

AdjustmentConditionΔ low / base / high
high_marginEBITDA margin > 25%+0.5 / +0.5 / +0.5
high_efficiencyrevenue per employee > 5M CZK+0.5 / +0.5 / +0.5
high_scoreinternal score ≥ 70+0.5 / +1.0 / +1.0
low_scorescore < 40−0.5 / −0.5 / −0.5
small_sizerevenue < 75M CZK−0.5 / −0.5 / −0.5

After adjustments, floors apply: EV/EBITDA never below 2.0 / 2.5 / 3.0×, EV/Revenue below 0.10 / 0.15 / 0.20×. Each adjustment is a separate step in the provenance — the user sees the waterfall: baseline 7.0× → high_margin +0.5 → 7.5×.

2.8 Output

Low / base / high = metric × levels; headline = base. The user can switch the headline to another cell (low/high, P/E, revenue, NAV) — the engine just validates it. The method label is a sentence, not a code: “EV/EBITDA 7.5× (NACE 59)” or “EV/EBITDA 12× (manual override; normalised (median))”.

3. NAV anchor and reconciliation

The income value is always compared against last year’s book equity:

  • Band 0.7–1.5× book equity = OK, headline unchanged. The band is deliberately wide — we’re comparing an EV-basis income value against equity with no net-debt bridge.
  • Income value below the band + ROE ≥ 5% → “anchor pull” (the capital is actually earning, widen the range toward NAV); ROE < 5% → “interval” (headline = the NAV↔income range; the capital isn’t working, book value leads).
  • Asset-heavy archetype: NACE division 68 (real estate), 93 (sport/recreation) or group 64.2 (holdings) and at the same time assets/revenue ≥ 3× (cap 20×, so a holding with zero revenue doesn’t blow up) → NAV is primary, income secondary.

The result is a structured recommendation (state + reason) that flows into the UI — deterministically, no AI.

4. DCF the Damodaran way

The DCF is an independent cross-check, not the headline — in the UI it lives as its own tab with a delta card against the multiples valuation. Every assumption has a provenance label (source + vintage) and can be overridden manually; when a source can’t be documented, the label honestly says “[source unknown]”.

Construction: FCFF discounted at WACC (not FCFE/Ke), where FCFF = NOPAT + D&A − Capex − ΔNWC, NOPAT = EBIT × (1 − t), EBIT = EBITDA − D&A. WACC via CAPM: Ke = Rf + β·ERP + size premium + CRP; Kd after tax; weights D/(D+E). Terminal value via Gordon with a hard cap g ≤ Rf — terminal growth above the risk-free rate is unsustainable long-term, and the cap prevents the TV from exploding.

Parameters and their sources:

ParameterDefaultSource
Rf4.77%CNB, 10Y government bond, 2026-Q1
ERP5.25%Damodaran, mature-market ERP, Jan 2026
CRP (CZ)~0.5 ppDamodaran Jan 2026
β (unlevered)per industryDamodaran Europe industry dataset
Size premium3.0% (< 100M revenue), else 1.5%internal heuristic
Kd (pre-tax)6.0%CZ SME bank rates (estimate)
D/(D+E)10%CZ SME capital structure (heuristic)
Tax21%CZ, 2024 consolidation package
Terminal g2.5%proxy for long-run nominal GDP (below Rf)

We hold Damodaran data as a seed (vintage Jan 2026; aggregate use for valuations is explicitly permitted by the author, we don’t republish the full datasets): ~35 European industry groups (unlevered beta, total beta, ERP, CRP, EBITDA margin, capex/sales, NWC/sales) + 17 global as a fallback. Our own NACE → Damodaran industry mapping table covers ~80 divisions, each mapping carrying a confidence (high/medium/low — low is flagged for manual review).

Projection (5 years): revenue growth fades from the last observed average (cap 25% / floor −5%) linearly to a terminal 3%; EBITDA margin mean-reverts from the historical average by −2 pp (floor 10%); D&A 3% of revenue, capex 2–5% by sector (steady state ≈ D&A), NWC from the balance sheet, else 4%. Margins > 100% from faulty extraction are dropped by a central guard, not clamped.

Sanity checks: TV % of EV > 85% → warning (too much value in the terminal = heroic assumptions); implied exit multiple (TV / terminal EBITDA) as a cross-check against the multiples table; capex ≈ D&A ± 20% in the terminal year; sensitivity matrix of EV across WACC × g.

5. Football field — where everything meets

One CZK axis, each method a horizontal bar: NACE EV/EBITDA · niche EV/EBITDA · custom EV/EBITDA · EV/Revenue · P/E · DCF · NAV. Plus an EV vs. equity flag per bar (the multiples bars are enterprise value; P/E and NAV value equity; we don’t have a net-debt bridge yet, so the chart admits the difference in bases visually instead of faking a single axis), a consensus band (CZK ranges where ≥ 2 EV methods agree) and a marker = the engine’s recommendation, which always tracks the cell that actually made the headline.

6. What the model deliberately doesn’t do (yet / by design)

  • Net-debt bridge EV → equity — tracked follow-up; the football field flags the basis per bar for now.
  • Synergies and strategic premia — we model the market median, not the price of a specific strategic buyer.
  • Control vs. minority discount in the headline — the headline is always the 100% value; minority is a display layer.
  • Silent fixes — faulty data (EBITDA > revenue, margin > 100%) is dropped and reported, never silently corrected.

And back to the opening objection. NACE comparables on their own really “don’t work that well” — a C2C marketplace lands in wholesale and a studio with an IP library lands in ordinary media production. But as the first screening layer, followed by niche, override, normalization, NAV and DCF, they do exactly what they should: they give every company on the market a defensible starting point from which you can pick where it pays to go deep. NACE isn’t the answer. It’s where the question begins.