Financials methodology

Every figure on the Financials pages traces back to SEC EDGAR XBRL company-facts filings (fetched per ticker by CIK), tagged with the us-gaap and dei taxonomies. The valuation page quotes no market data at all: the share price and the discount rate are inputs you supply, and the trailing ratios, EPV gap, and reverse-DCF outputs are computed in your browser from those two inputs plus the filing fundamentals. The discount-rate field is prefilled with a plain CAPM starting point — the 10-year Treasury yield (FRED DGS10) plus Damodaran's U.S. equity risk premium, both public-domain series — that you should override with your own required return.

On this page. Balance-sheet aggregates · Valuation metrics · Valuation ratios · Earning Power Value · Expectations scenario (reverse-DCF) · Special situations · Share counts · Earnings history · Financials page

Each entry states what the metric means, how it's computed, and which specific concepts feed it. When multiple concepts can stand in for the same figure, we list them in the priority order the page-level code uses them.

Balance-sheet aggregates

Net Worth
Also: book value, stockholders' equity, shareholders' equity, net assets, shareholders' funds. Accounting value of the equity: total assets − total liabilities as reported on the balance sheet — what the company would be worth if every asset sold at book value and every creditor were paid off. Sourced as us-gaap:StockholdersEquity, falling back to us-gaap:StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest.
Debt
Interest-bearing borrowings at carrying value, long-term and short-term combined, plus ASC 842 lease liabilities. Primary long-term rollup is us-gaap:LongTermDebt with fallbacks through us-gaap:LongTermDebtNoncurrent + us-gaap:LongTermDebtCurrent, us-gaap:LongTermDebtAndCapitalLeaseObligations, us-gaap:LongTermDebtAndCapitalLeaseObligationsIncludingCurrentMaturities, and us-gaap:DebtAndCapitalLeaseObligations. Short-term extras layered on when present: us-gaap:CommercialPaper, us-gaap:ShortTermBorrowings, us-gaap:NotesPayableCurrent. Convertible notes are folded in for filers that tag them only under the convertible concepts and never a generic long-term-debt rollup: us-gaap:ConvertibleDebt, us-gaap:ConvertibleNotesPayable, us-gaap:ConvertibleLongTermNotesPayable, us-gaap:ConvertibleSubordinatedDebt (each preferring an explicit total, else summing the Current + Noncurrent pieces). Lease extras (post-2019, ASC 842): us-gaap:OperatingLeaseLiability always added (or noncurrent + current pieces summed when the aggregate isn't tagged); us-gaap:FinanceLeaseLiability added only when the primary rollup doesn't already include a CapitalLease designation, to avoid double-counting filers who tag legacy ASC 840 capital leases inside the rollup.

Underfunded pension obligations are debt-equivalent (Damodaran-style) — at liquidation the firm owes plan participants the shortfall between the projected benefit obligation and plan assets. When tagged on the latest BS, we add us-gaap:PensionAndOtherPostretirementDefinedBenefitPlansLiabilitiesNoncurrent and the corresponding Current variant on top of the financial-debt rollup. Footnote-only concepts like us-gaap:DefinedBenefitPlanFundedStatusOfPlan are deliberately skipped because they're often FY-only and lag the latest balance sheet.
Noncontrolling interest
Book value of minority shareholders' claim on a consolidated subsidiary's equity. Reverse-DCF pages add NCI to the EV target (so the bisection solves for the operating-firm value distributable to all capital holders) and subtract it back out of the equity bridge so per-share fair value reflects the common-shareholder claim only. Without the symmetric treatment, filers with material partial-ownership subsidiaries (NEE 11.4B, XOM 7.2B, CVX 5.7B, DIS 5.5B, SO 2.8B) would either overstate per-share fair value (NCI omitted entirely) or print a systematic −NCI ÷ mktCap reconciliation gap (NCI subtracted from the bridge but missing from the EV target). Sourced as us-gaap:MinorityInterest for the regular bucket plus us-gaap:RedeemableNoncontrollingInterestEquityCarryingAmount for the mezzanine (puttable) bucket when both are tagged on the latest BS. Book NCI is used as a proxy for NCI's market value; the precision loss is small versus the alternative of ignoring NCI entirely.
Cash & equivalents
Cash and cash equivalents plus marketable / available-for-sale securities — the liquid, non-operating assets an acquirer would pocket at close. Base cash is sourced from us-gaap:CashAndShortTermInvestments when the filer tags the combined balance; otherwise us-gaap:CashAndCashEquivalentsAtCarryingValue (falling back through us-gaap:CashCashEquivalentsAndShortTermInvestments and us-gaap:Cash, with us-gaap:CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents as last resort because it includes restricted balances and overstates free cash for fintechs with material customer-deposit restrictions). On top of that we add both short-term marketable securities (us-gaap:MarketableSecuritiesCurrent, us-gaap:AvailableForSaleSecuritiesDebtSecuritiesCurrent, or us-gaap:ShortTermInvestments) and long-term marketable securities (us-gaap:MarketableSecuritiesNoncurrent, us-gaap:AvailableForSaleSecuritiesDebtSecuritiesNoncurrent) when tagged — the multi-year Treasury portfolios that tech firms hold as excess cash trade in deep secondary markets and aren't operating capital. The augmentation is skipped for insurers (filers that tag a top-level us-gaap:Investments balance) and REITs (real-estate investment property >50% of assets) because their AFS portfolios back policyholder or tenant liabilities, not corporate excess cash.
Operating-cash carve-out (reverse-DCF only)
On the reverse-DCF page the equity bridge nets only EXCESS cash, not the BS total. An operating business needs a working-cash floor for payroll, inventory funding, and float for clearing payments — that floor isn't distributable to shareholders, so subtracting it from debt would inflate per-share fair value. We approximate the floor at 2% × trailing revenue (Damodaran's heuristic; Koller/McKinsey settle in the 1–2% range), and route excess cash = max(0, total cash − floor) through the EV target, invested capital, and equity bridge. The rules-of-thumb cash & equivalents figure shown in the snapshot, ratios, and Facts grid stays as the BS total — the carve-out is specific to the DCF mechanics. Banks (NII + non-interest- income tagged together), insurers (top-level us-gaap:Investments balance), and REITs (real- estate property >50% of assets) are exempt because their cash backs deposits, regulatory reserves, or investment portfolios rather than working capital.
Fair-value hierarchy (display only)
ASC 820 classifies fair-value-measured assets into three buckets: Level 1 (active-market quotes — Treasury securities, listed equities), Level 2 (observable inputs — corporate paper, agency MBS, OTC quotes), Level 3 (unobservable inputs — private credit, strategic equity stakes, hard-to-mark derivatives). XBRL exposes the classification under FairValueByFairValueHierarchyLevelAxis; the SEC's companyfacts API flattens this axis away, so the L1/L2/L3 split only reaches us through the fetch-axis-facts pipeline that parses the latest 10-K/10-Q XBRL instance directly. We extract every fact tagged on the FVHL axis under us-gaap:MarketableSecurities*, AvailableForSaleSecurities*, or EquitySecuritiesFvNi*, summing across any inner dimension (e.g. FinancialInstrumentAxis's Treasury / Corporate / MBS sub-cuts) within each level. When a parent concept and its current/noncurrent children are both tagged at the same as-of, the parent is dropped to avoid double-counting. The Facts grid surfaces the resulting breakdown beneath the cash & investments line; the equity bridge above it still nets the full balance-sheet total at par. A reader who finds a large L3 share may mentally discount it before reading the per-share fair value, but the page does not bake a haircut into the math — Damodaran's reverse-DCF doesn't ask you to second-guess the filer's marks.

Valuation metrics

Market Cap
Also: market capitalization, equity market value, equity value. What the stock market values the equity at — shares outstanding × share price. Reflects what investors are willing to pay, not what the business owns or owes. On the valuation page the market cap behind the P/S, P/B, and EV/EBITDA cards is anchored on the share price you enter — the page quotes no market price of its own.
Enterprise Value
Also: firm value, total enterprise value, EV, TEV. The takeover price of the whole business free and clear — an acquirer pays off lenders (add debt) and pockets the cash on the balance sheet (subtract cash). Formula: Market Cap + Debt − Cash, with debt and cash drawn from the latest filed balance sheet so the EV bridge reconciles to a single filing. Preferred stock and minority interest aren't broken out separately, so capital-structure-heavy firms may see a small gap versus the price a sophisticated acquirer would pay. The reverse-DCF and EPV blocks on the valuation page use a stricter operating-firm EV — see conventions on the valuation page below.
Net Debt
Debt − Cash using the same concepts as above. Negative values mean the company holds more cash than debt.

Valuation ratios

These are the ratios surfaced on each ticker's /financials/{ticker}/valuation/ page. Each is computed on the spot from the share price you enter — the page quotes no market price — paired with the filing-sourced denominator documented below.

A note on conventions

The trailing-multiples cards on the valuation page and the reverse-DCF / EPV blocks below them use different market-cap and enterprise-value definitions. This is deliberate — each block uses the convention that's standard in its own context — but it means the same filer can show a $3.61B market cap on the cards and a $3.62B market cap in the DCF lead-in without any of the numbers being wrong. P/E, P/FCF, and FCF Yield are unaffected because they're per-share ratios (price ÷ per-share denominator) that never reach for a market cap; the cards that DO involve a market cap are P/S, P/B, and EV/EBITDA.

Cards (P/S, P/B, EV/EBITDA)
MktCap = price × point-in-time basic shares (chain: us-gaap:CommonStockSharesOutstanding, dei:EntityCommonStockSharesOutstanding, then weighted-average diluted / basic if neither point-in-time concept is tagged). This matches the standard P/E-style multiples convention on Bloomberg / S&P / press tear sheets. The EV/EBITDA card uses EV = MktCap + Debt − Total Cash with no NCI add-back — the headline enterprise-value number, not the operating-firm value.
Reverse-DCF + EPV
MktCap = price × TSM-scaled diluted shares (basic × WeightedAverageNumberOfDilutedSharesOutstanding ÷ WeightedAverageNumberOfSharesOutstandingBasic), and the EV target the DCF reconciles to is the operating-firm EV MktCap + Debt + NCI − Excess Cash — what a strategic acquirer would pay for the operating business once they've paid lenders, retained the working-capital cash floor inside the operating value, and accounted for the minority claim on operating subsidiaries. Excess cash uses the operating-cash carve-out (2% × TTM revenue floor on the operating side).

For a typical filer the two market caps differ by <0.5% (the diluted scaling factor); the two EVs can differ by a few percent because of the cash-floor split and NCI inclusion.

P/E (Trailing, Diluted)
Price-to-earnings on a trailing-twelve-month basis, using the diluted share count so stock-based compensation and convertibles dilute the denominator. A high P/E says investors pay more dollars today for each dollar of reported accounting profit — justified only if earnings are expected to grow fast enough to pull the ratio back down. TTM EPS is the sum of the latest four quarterly us-gaap:EarningsPerShareDiluted facts, falling back to us-gaap:IncomeLossFromContinuingOperationsPerDilutedShare for filers that route EPS through the continuing-operations branch of the taxonomy (see EPS for why); when the latest filing is a 10-K we use the FY value directly.
P/FCF
Price-to-free-cash-flow. Free cash flow = operating cash flow − capital expenditures, so it strips out non-cash accruals and forces you to account for the cash the business actually spent on plant and equipment. Unlike P/E it can't be inflated by aggressive revenue recognition or soft-dollar add-backs, which is why value investors often prefer it. Sourced from the latest fiscal year's derived:FCFPerShare (built from us-gaap:NetCashProvidedByUsedInOperatingActivities minus us-gaap:PaymentsToAcquirePropertyPlantAndEquipment); quarterly cash-flow facts are usually YTD-cumulative on 10-Qs, so summing four would double-count.
FCF Yield
The inverse of P/FCF, shown as a percentage: how much free cash flow each dollar of share price buys in a year. A 5% FCF yield on the whole market cap is the cash-return version of a 20× P/FCF.
EV/EBITDA
Enterprise value divided by earnings before interest, taxes, depreciation, and amortization. EV adjusts market cap for the capital structure (+debt, −cash), and EBITDA strips out how the business financed its assets, so the pair lets you compare firms with very different leverage and depreciation policies more cleanly than P/E. EBITDA is built per quarter as us-gaap:OperatingIncomeLoss + D&A and summed across four quarters for the TTM denominator. The D&A leg uses the same chain as the EPV adjusted variant; if none of the four concepts resolves on the latest quarters the card falls back to the latest fiscal-year value rather than stitching a stale window. As a defense-in-depth check we reject any 4-quarter window that fails either of two sanity bars: (1) start-to-end span exceeds 14 months — a real TTM has its endpoints 9 months apart, so a wider span signals a discontinuous tagging chain rather than a contiguous trailing year; (2) the window's end-date is more than 6 months older than the latest available quarterly period — i.e. the four hits are contiguous but stale, typical of filers whose tagging conventions changed mid-history. Either failure falls through to the latest-fiscal-year value rather than stitch a misleading number.
P/S
Price-to-sales, computed as market cap ÷ trailing-12-month revenue. Usable even when a business is unprofitable, since revenue almost always exists — which is also its weakness: two companies with identical revenue but different margins deserve wildly different multiples. Revenue uses us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax when present, falling back through Revenues, SalesRevenueNet, and the assessed-tax variant.
P/B
Price-to-book: market cap ÷ common book value, where common book value is stockholders' equity less preferred stock at carrying value (us-gaap:PreferredStockValue). For filers without preferred stock — the majority — the formula collapses to market cap ÷ stockholders' equity. The subtraction matters for banks, insurers, and Berkshire-style structures with material preferred capital, where leaving it in the denominator overstates book value relative to the common-stock market cap in the numerator. Anchored on accounting net worth rather than earnings, so P/B is most informative for asset-heavy businesses (banks, insurers, industrials) where book value tracks liquidation value. Less useful for asset-light software firms whose real value sits in intangibles.

Negative book value. Aggressive buybacks at prices well above book (MCD, MO, PM, AZO, SBUX, LOW, and others) eventually push stockholders' equity below zero. The mechanical P/B against negative equity is a negative number that has no useful interpretation — it doesn't mean the stock is "cheap to book", it means there is no positive book left to anchor against. We surface "N/M" (not meaningful) on the latest-filing card and omit the bar from the historical chart for periods where common equity is ≤ 0; the gap in the chart is intentional and the card's basis line spells out the underlying equity figure so the reader can see what happened.

Historical bars: per-row TTM construction

The historical bar charts behind P/E, EV/EBITDA, and P/S apply the same trailing-twelve-month rule on every row, but the practical outcome differs by row type — so you'll occasionally see two cosmetic artefacts that are intentional, not data quality issues:

  • FY rows use the fiscal-year value directly — a 10-K row labeled "FY 2023" carries the bare annual EPS / EBITDA / revenue, which is mathematically the TTM at the period end. The tooltip prose says "trailing-twelve-month" because that's still true; we don't substitute a row-specific phrase. The input row in the chart popover already calls out the actual basis used ("Annual Diluted EPS" on FY rows, "TTM Diluted EPS" on quarterly rows).
  • Early quarterly rows can be empty. The rolling 4-quarter sum only fires once four contiguous quarterly facts have been observed, so the first three quarters at the start of any ticker's available history (or the first three after a mid-fiscal-year IPO) carry no TTM-based ratio even if subsequent quarters do. We don't backfill from annual EPS proportionally — synthesising quarterly history from annual values would silently mix tagging conventions and produce a number that doesn't match the filer's own quarterly disclosures. The gap is the honest signal: there isn't enough quarterly data yet to compute TTM.
  • Negative-denominator FY rows are dropped. P/E, P/FCF, FCF Yield, and EV / EBITDA are all "price (or enterprise value) ÷ a flow that's supposed to be positive". A loss-making year, a year of negative free cash flow, or a year where EBITDA was negative produces a mathematically defined but interpretively meaningless ratio (a negative P/E doesn't tell you anything about how expensive the stock is — it just confirms the company lost money). For those rows the historical bar chart and table omit the period entirely. The "Today" callout that sits directly above each chart applies the live formula without that filter, so during a negative-flow year you'll see a card showing e.g. P/FCF -65.94× sitting above a chart that has no bar for the matching fiscal year. Both are correct: the live card tells you what the mechanical formula returns today; the chart tells you the rows where the ratio was interpretively meaningful. Each affected concept page surfaces a callout listing the omitted periods (e.g. "2 annual periods omitted from the chart and table: FY 2024, FY 2025") so the gap is never silent.
  • Basic EPS fallback when diluted EPS isn't tagged. P/E history prefers us-gaap:EarningsPerShareDiluted; for periods where the filer didn't tag it, the calculation falls back to us-gaap:EarningsPerShareBasic rather than dropping the row. This is rare on modern filers but common pre-2014 (older Berkshire 10-Ks for example never tagged diluted EPS) and crops up intermittently when a single recent filing omits the diluted tag. Diluted and basic typically agree within ~1% on filers that report both, and on a money-losing year they're identical (no dilution from converts when a loss is being divided), so swapping in basic is an honest stand-in rather than a methodology change. Each chart row's input popover names the concept that actually fed the value: the input label reads "Annual / TTM Diluted EPS" by default, "TTM Basic EPS (fallback)" when basic was used, or "TTM Diluted EPS (mixed)" on a quarterly TTM row whose 4-quarter rolling buffer straddles a basic→diluted transition. The concept hyperlink in the popover points at whichever EPS tag actually drove the number so you can drill into the underlying fact's own chart.
  • One-off-charge outliers are annotated, not smoothed. Periods where a ratio (or per-share concept like EPS) deviates more than 2σ from the trailing 3-year mean are flagged with an asterisk in the table cell and listed in a callout above the chart. Examples: AAPL FY 2018's tax-repatriation charge spiked P/E for one year; many travel and hospitality filers' 2020 quarterly EPS readings were dragged below trend by COVID shutdowns; LEN and AN's recent FY P/FCF readings broke from their mid-cycle range when working-capital swings dominated operating cash flow. The bar is rendered as-is — these are real numbers from the filer's own books, and "cleaning" them would silently rewrite the disclosed history. Annotation is the right policy: the reader sees the spike, sees why we flagged it (the σ deviation + direction is in the row's tooltip), and can read the underlying 10-K for the one-off cause. The detection uses a per-row trailing window (3 prior annual periods, 12 prior quarterly periods — both representing a 3-year history on each cadence), requires at least 3 finite prior values, and additionally gates on a 25% relative-deviation floor so smooth-growth concepts whose σ collapses to a tiny number don't get false-positive flags. Limited to ratio, percent, and per-share-EPS units — dollar totals like Revenue or Total Assets grow consistently, so the outlier framing isn't useful there.
  • Per-period share count: instant first, weighted-average fallback. EV / EBITDA, P/S, and P/B are the three valuation ratios whose formula reaches for a market cap, and historical market cap is period-end close × period-end shares outstanding. The "shares outstanding" lookup walks a fallback chain so a filer who didn't tag the cleanest concept still gets a row: us-gaap:CommonStockSharesOutstanding (instant, treasury-net) → us-gaap:CommonStockSharesIssued (instant, but reports issued shares — overstates by the treasury holding for filers that retain treasury stock) → dei:EntityCommonStockSharesOutstanding (instant, but dated to the cover-page filing date a few weeks past period-end) → us-gaap:WeightedAverageNumberOfDilutedSharesOutstandingus-gaap:WeightedAverageNumberOfSharesOutstandingBasic (both duration concepts: the period-average count, smoothed across the buybacks or share issuance that happened during the period). Each chart row's input popover names the concept that actually fed the value (the row label reads "Shares Outstanding" for the instant cases and "Avg Diluted Shares (period)" / "Avg Basic Shares (period)" when a duration concept was used); the concept hyperlink points at the underlying fact so the basis is traceable per row. When a row falls through to the duration concepts, the fact's description prose carries an inline note flagging the basis-asymmetry — same shape as the basic-EPS fallback on P/E. Practical impact: BRK-B never tags the per-period us-gaap shares concept and only tagged the cover-page dei variant in 2009-2010, so without the dei step in the chain BRK-B would have zero EV / EBITDA, P/S, and P/B history; CHTR / CMCSA / LEN tag only the duration weighted-average count, so their historical bars are reconstructed from a smoothed share count rather than a point-in-time one (drift <2% on a healthy filer, larger on actively buying-back filers).
  • Log y-axis when ratio range spans an order of magnitude. Ratio-typed concept charts (the six valuation derived metrics plus non-valuation ratios like Current Ratio and Debt/Equity) auto-switch the y-axis from linear to logarithmic when the populated value range — max ÷ min across the displayed periods — is 10× or more. Near-zero-EPS years produce mathematically valid but visually dominating spikes (CALM's FY 2023 P/E at ~872, ANF FY 2020 at ~546, PPC FY 2021 at ~212, THC's pre-2020 P/B near ~220, LAD and LEN's pinched-FCF FY rows at four-digit P/FCF): on a linear axis those bars flatten the rest of the history into a single horizontal line, hiding the ten- or fifteen-year context that makes the spike meaningful. The log transform is well-defined here because the backend gates each ratio with a strict-positive denominator filter (negative- denominator periods are surfaced separately via the negative-denominator callout), so every plotted point is greater than zero. Linear remains the default when the range is narrower than 10× — the bulk of the cohort sits at 2–5× compression, where linear is more legible. The chart heading badge prints "(LOG SCALE)" next to the unit label whenever the auto-switch fires; the underlying values (table cells, tooltips, the outlier asterisks) are unchanged.

Earning Power Value (Greenwald)

The "Earning Power Value" block on each /financials/{ticker}/valuation/ page sits between the multiples cards and the reverse-DCF. It implements Bruce Greenwald's no-growth fair-value floor (Value Investing: From Graham to Buffett and Beyond, 2001): capitalise after-tax operating earnings (NOPAT) at your discount rate, then bridge to common equity with the same balance-sheet adjustments the reverse-DCF uses.

EPV is not a forecast or a target price. It's an earnings-power floor: what equity is worth if today's normalized operating profitability persists indefinitely, with zero growth premium and zero terminal-value uplift. Compare EPV per share against the current price — and against the reverse-DCF fair value below — to see how much of today's price is paying for steady-state earnings versus expected future growth.

Why normalize, instead of using TTM NOPAT

The capitalisation step (NOPAT ÷ WACC) compounds any single-period distortion straight into EPV at 1/WACC: at a 7% WACC, a $100M one-time charge to TTM EBIT moves enterprise EPV by ~$1.4B before the equity bridge, and a cyclical filer at a peak or trough in margins can swing 20–30%+ on the floor figure alone. Greenwald's textbook recipe (Value Investing: From Graham to Buffett and Beyond, 2001, ch. 5) explicitly normalises both margin and revenue before capitalising — that's what makes the figure a floor rather than a moving target.

Normalized NOPAT recipe

Both variants on the page derive NOPAT from the same normalisation:

Normalized margin     = mean(latest 3 FY EBIT margins)
Normalisation revenue = median(latest 3 FY revenues)         [3 FY available]
                      = mean(latest 2 FY revenues)           [2 FY available]
                      = latest FY revenue                    [1 FY available]
                      = TTM revenue                          [no FY available]
                      = TTM revenue (forward override)       [TTM EBIT carries
                                                              a segment-
                                                              disposition gain]
                      = pro-forma substituted into median/mean
                                                             [an FY in the
                                                              sampled window
                                                              tagged
                                                              BusinessAcquisitions
                                                              ProFormaRevenue
                                                              ≥ reported × 1.05]
Normalized EBIT       = Normalized margin × Normalisation revenue
NOPAT                 = Normalized EBIT × (1 − tax rate)
      

Margin: averaging across three full fiscal years washes out cyclical peaks/troughs and one-time charges that aren't separately tagged in XBRL. The 3-year window is short enough that secular margin shifts (e.g. a software company expanding gross margin from 60% to 75%) still flow through within a couple of refresh cycles, but long enough to dampen single-quarter noise.

Normalisation revenue: capitalising on the most recent quarter's revenue exposes EPV to a single-period distortion (M&A close, divestiture, pandemic shock) the same way raw TTM EBIT would. The median of the latest three FY revenues rejects one outlier year cleanly while keeping the input strictly backward-looking, so EPV remains the independent backward-looking sanity check on the forward-looking reverse-DCF, not a one-year-forward DCF. The 3-yr window matches the margin window so both EPV inputs are smoothed over the same horizon. For a filer with fewer than three FY periods filed (recent IPO, restated history) the recipe degrades down a ladder: 2-yr FY mean → 1-yr FY → TTM fallback, surfaced as a label in the build-up ladder so readers can see which level fired.

Divestiture-window override. The "backward looking is more honest" argument flips when the trailing window contains a structural break the FY history can't see. When the TTM EBIT envelope flagged a material whole-segment disposition gain (XBRL GainLossOnSaleOfBusiness or the deprecated synonym GainLossOnDispositionOfBusiness, sized at ≥5% of TTM EBIT — same materiality gate the reverse DCF's ebitMargin0Adjusted uses), the latest 3 FY revenues were sampled from quarters that still included the divested business and overstate the go-forward run-rate. In that case the ladder is overridden once: TTM revenue — the only post-disposition run-rate the filings themselves carry — replaces the FY median. Build-up ladder labels the row "forward (divestiture-adjusted)" so readers see the override fired. The gate is intentionally narrow — it does not fire on GainLossOnDispositionOfAssets alone (PP&E sales typically don't shrink the revenue base) or on filers whose TTM gain came from non-divestiture sources (insurance proceeds, contract terminations, FX). Mirrors the v22 EBIT-margin adjustment one layer deeper into the revenue input so EPV and the reverse-DCF agree on a "underlying" baseline rather than a divestiture-flattered TTM.

Acquisition-window override. The symmetric case fires for partial-period acquisitions, where the reported FY revenue understates the run-rate because the acquired entity contributed only part of the year. When an FY in the 3-yr window carries a filer-disclosed BusinessAcquisitionsProFormaRevenue tag (the filer's "as if owned at start of period" disclosure required by ASC 805) materially higher than reported (≥5% uplift — same materiality gate the divestiture path uses), the pro-forma value substitutes for the reported value in the median / mean. Build-up ladder labels the row "3-yr FY median (acquisition-adjusted)" and the per-FY rows show both numbers ("FY2023 = $36.7B (pro-forma $36.7B ← reported $31.0B)") so the override is auditable. The gate is one-sided (proForma > reported only), so a divestiture captured as a lower pro-forma value never flows through this path. When both signals fire on the same filer, the divestiture override takes precedence (segment-disposition shrinkage is strictly more disruptive than partial-period acquisition uplift).

Post-FY-merger step-up override. The pro-forma path above only catches an acquisition that closed inside a sampled FY. A transformative merger that closes after the latest FY end (an all-stock combination or a large cash acquisition) is invisible to it — every FY in the 3-yr window is entirely pre-event, so the median predates the new scale. When a business-combination concept (BusinessCombinationConsiderationTransferred or PaymentsToAcquireBusinessesNetOfCashAcquired) is recorded in a period strictly after the latest FY end and TTM revenue has stepped up more than 30% versus the prior FY, the ladder is overridden to the TTM run-rate (the only combined-entity revenue the filings carry). Build-up ladder labels the row "forward (post-FY-merger step-up)". The gate requires an actual combination signal, not raw growth — an organic >30% grower's lower 3-yr median is a deliberately conservative floor, not a distortion to override.

Fallback: if the filer hasn't filed three full years of FY data (recent IPOs, restated history) the normalisation degrades to NOPAT = TTM_EBIT × (1 − tax rate) with a warning on the page. The capitalised number is still produced so EPV stays present, but readers are flagged that the floor is more sensitive to single-period distortion than the normalized form.

Two variants on the page

Normalized (default)
EnterpriseEPV = NOPAT ÷ WACC, with normalized NOPAT from the recipe above. This is what loads on first paint and what the headline EPV/share + premium-vs-price reflect.
Adjusted (less growth CapEx)
EnterpriseEPV = (NOPAT − growthCapEx) ÷ WACC, where growthCapEx = max(0, TTM_CapEx − TTM_D&A). Treats the portion of CapEx in excess of D&A as growth investment that doesn't contribute to current earnings power, and floors the deduction at zero so a filer shrinking its asset base (CapEx < D&A) doesn't get a "negative growth CapEx" bonus added back to NOPAT. The toggle is hidden when no TTM D&A is available.

When the two variants diverge — and how to read the gap

For a steady-state filer where CapEx ≈ D&A (asset-light software, consumer staples in maintenance mode, late-stage tobacco), basic and adjusted converge — growth CapEx floors at zero and the two formulas agree. The variant toggle is mostly cosmetic. For a filer mid-investment-cycle where CapEx runs well above D&A (cable / telecom rolling out fiber + mobile, semis ramping fab capacity, oil & gas in a drilling phase, freight & rail in a fleet-renewal cycle), the two diverge sharply — and the *direction* is worth pausing on:

  • Basic is the optimistic read. It capitalises NOPAT as though every dollar of CapEx in the latest TTM merely replaces wear. For a filer mid-cycle that implicitly assumes today's elevated CapEx will normalise back to D&A — i.e. the cycle ends and the growth investment lapses, leaving steady-state earnings power untouched.
  • Adjusted is the pessimistic read. It subtracts the CapEx-above-D&A wedge from NOPAT and capitalises the remainder. That implicitly assumes today's growth CapEx is permanent — and produces zero offsetting NOPAT growth ever (no future subscribers, no fab ramp payoff, no fleet-renewal earnings uplift).

The truth typically sits between the two. Some of the elevated spend is genuinely growth and will lapse when the cycle ends; some is catch-up maintenance the bare D&A line under-states; and most of it eventually shows up in higher future NOPAT — captured by the reverse-DCF below, not by EPV (which is by construction zero-growth and backward-looking). The variant toggle is the lever a reader uses to put a bear/bull range around the floor.

Why the per-share gap can be enormous for leveraged filers. Growth CapEx is subtracted from NOPAT pre-tax (the tax shield on CapEx flows through future D&A, which is already inside NOPAT — tax-affecting the subtraction would double-count the shield). For a capital-intensive leveraged filer the wedge is small in enterprise terms but devastating at the equity stub. CHTR is the textbook case (Q1 2026 numbers, all rounded): normalised NOPAT $9.93B; growth CapEx ($12.12B − $8.74B) = $3.37B; earnings power $6.56B. Capitalising at a 6.47% discount rate: enterprise EPV drops from $153B (basic) to $101B (adjusted) — a 33% reduction. But the equity bridge subtracts $95.2B of debt and $4.7B of NCI on both sides, so equity EPV drops from $53.6B to $1.5B — a 97% reduction. Per share: $422 (basic) vs $11.69 (adjusted), a ~36× ratio on the same filer. The market price ($165 at review) sits between the two, implicitly pricing partial growth-CapEx productivity. Don't take either extreme as a fair value; treat them as the brackets the cycle has to land between.

Equity bridge

+ Excess cash
From the operating-cash carve-out — total balance-sheet cash + short-term marketable securities, less the 2%-TTM-revenue working-capital floor. Banks, insurers, and REITs are exempt (operating cash floor not applied). The summary equity-bridge table on the page renders both numbers inline when the floor fires (total $X − operating $Y), so a reader can verify by inspection that the bridge reconciles to the equity value without re-deriving the carve-out.
− Total debt
Same debt rollup as the reverse-DCF (long-term debt and capital lease obligations + commercial paper + short-term borrowings + operating-lease liabilities + finance-lease liabilities). See balance-sheet aggregates for the full concept chain.
− Minority interest
MinorityInterest + RedeemableNoncontrollingInterestEquityCarryingAmount, using book value as a proxy for market value (Damodaran's standard approximation). For most filers book and market NCI are within single-digit percentages and the proxy is harmless. Filers where the divergence matters: parent-with-minority structures where the minority units are exchangeable into the parent's listed common (CHTR's Charter Holdings common units, GOOG/L dual-class with public Class C, BRK.A/B share-class conversion, certain MLPs and partnership-converted REITs). Book NCI on those filers builds with the subsidiary's retained earnings even as the underlying units' market value moves with the parent's stock; the two can diverge 30%+ in either direction. The page reports book — readers who care about the look-through claim should compare the NCI line to units_outstanding × parent_share_price from the latest 10-K's capital-structure note. A pending merger that absorbs the NCI (e.g. Liberty Broadband ↔ Charter close mid-2027) collapses the divergence on close.
÷ Diluted shares
Same diluted-share count the reverse-DCF uses. See share counts for how multi-class filers are handled.

Rate sensitivity

EPV is the most rate-sensitive number on the page — a 1pp swing in the discount rate at 7% moves enterprise EPV by ~14%. The rate is yours to supply, so re-run the page at a couple of rates to bracket the floor rather than anchoring on a single capitalisation.

XBRL concepts (variants beyond what's elsewhere)

EPV reuses every concept the reverse-DCF reads (EBIT, operating cash, debt, NCI, shares). The adjusted variant additionally needs TTM Depreciation & Amortisation, chained in this priority order:

  • us-gaap:DepreciationDepletionAndAmortization
  • us-gaap:DepreciationAndAmortization
  • us-gaap:DepreciationAmortizationAndAccretionNet
  • us-gaap:Depreciation

DepreciationAmortizationAndAccretionNet covers cable, telecom, utility, oil-and-gas, and mining filers (CHTR, T, VZ, NOC, RTX-class) that fold asset-retirement-obligation accretion into the same line. It outranks the bare Depreciation fallback because the latter excludes amortization of intangibles entirely — when both exist, the bare-Depreciation tag understates true D&A by ~5–10% on the affected cohort, which propagates into derived:EBITDA, the EV/EBITDA card, and the EPV-adjusted growth-CapEx subtraction.

Expectations scenario (reverse-DCF)

The "expectations investing" block on each /financials/{ticker}/valuation/ page is a Rappaport-style reverse-DCF: we take the enterprise value implied by the share price you enter as given and construct the operating path that reconciles with it. The scenario's levers (Y1 growth, Y2 growth, plateau length, long-run EBIT margin, ROIC fade) are not predictions; each is built from rules stated below, and the solver flexes the margin lever until the discounted cash flows match today's EV. The "fair value per share" line is just a reconciliation check — ≈ 0 by construction whenever the normal solver bracket clears.

Base numbers (year zero)

Anchor & TTM
The base revenue, EBIT, OCF, and CapEx feeding the DCF are read off the most recent filing of any form. When the anchor is a 10-K the numbers are taken as-is. When it's a 10-Q, income-statement items (Revenue, OperatingIncomeLoss) are reconstructed as the sum of the last four per-quarter facts; cash-flow items (OCF, CapEx), which are usually YTD-cumulative on 10-Qs, use the identity TTM = prior-FY + anchor-YTD − prior-year-same-quarter-YTD. Anchor period and window are surfaced on the page under "Fundamentals from the filings".
Starting EBIT margin
Base margin is the anchor TTM margin (OperatingIncomeLoss ÷ Revenue). When the latest FY margin deviates from the 3-year mean FY margin we blend the two on a continuous ramp so the run-rate margin isn't anchored on a single anomalous year (cyclical filers like CALM or TSLA pull strongly toward the mean; quiet filers stay on the latest FY):
  • Gap ≤ 4pp: 100% latest FY margin — recent and trailing margins agree; no smoothing needed.
  • 4pp < gap < 6pp: linear blend between latest FY and 3-year mean. At a 5pp gap the starting margin is a 50/50 mix; at 4.5pp it's 25%-mean/75%-current; at 5.5pp it's 75%-mean/25%-current. The audit text under the Facts grid surfaces the exact mix per ticker so the blend is auditable.
  • Gap ≥ 6pp: 100% 3-year mean — the latest FY is far enough from the trailing run rate that we treat it as anomalous and ignore it for the anchor.
The 4pp / 6pp transition band is centred on the 5pp threshold the page used historically; it replaces the binary switch (which made the DCF discontinuous around 5pp — a ticker at 4.99pp got 100% latest, one at 5.01pp got 100% mean) with a smooth ramp so a single basis-point wiggle in reported margin no longer flips the scenario.
Tax rate
Year 0: 3-year median of derived:EffectiveTaxRate when three sane annual values (0 < rate < 60%) are available; otherwise the latest FY's effective rate when it's sane; otherwise the 21% US statutory default. REITs are pinned to 0% because the pass-through structure makes corporate-level tax structurally near zero.

Year-by-year fade. When the year-0 rate is below the US federal statutory rate (21%) — typically because the most recent FY ran an NOL, captured outsized R&D credits, or carried a foreign-mix tilt — the explicit forecast linearly fades the effective rate from the year-0 reading to a terminal 21% by year {horizon}. Holding the NOL-year rate as the perpetuity rate would compound a one-off benefit across the whole DCF (PINS FY2025's 6.5% rate would inflate NOPAT by ~18% across the horizon if held flat). Filers already at or above 21% see no fade. EPV's perpetuity likewise capitalises at the terminal rate so a one-year tax credit doesn't propagate forever.
Discount rate (your input)
The valuation page no longer computes a per-filer WACC — the beta, capital-structure weights, and credit-spread machinery a market-data WACC needs are exactly the licensed inputs the public site doesn't carry. Instead, you supply the discount rate on the page itself, and every figure that reads "WACC" in the formulas below uses your rate unchanged (no clamping, no terminal fade — the fade only existed to converge a measured legacy-debt yield to a marginal rate, which doesn't apply to a rate you chose).

The prefilled suggestion is a plain CAPM cost of equity at β = 1 built from two public-domain series: the latest 10-year Treasury yield (FRED DGS10, refreshed every weekday by the treasury-yields pipeline) plus Damodaran's latest U.S. total equity risk premium (mature-market ERP + U.S. country risk premium, the same dataset behind the country risk premiums page). It deliberately ignores leverage and per-company risk: treat it as a starting point, not an answer.

Building a firmer rate. The cost-of-equity calculator lets you add a beta and your own ERP; the WACC calculator blends in an after-tax cost of debt at your capital-structure weights. Paste the result into the discount-rate field. The form bounds the rate to 3–30%: the model's 2.5% terminal growth makes the Gordon terminal value meaningless at or below the growth rate.

A practical range for large-cap U.S. equities is roughly 7–12%: the suggestion lands mid-band when Treasuries are near their long-run average, and EPV in particular is rate-sensitive (at a 7% rate, a 1pp swing moves enterprise EPV ~14%), so it's worth re-running the page at a couple of rates to see the sensitivity rather than anchoring on one number.
Discounting
Mid-year convention: explicit-period FCFs are discounted by 1 ÷ (1 + WACC)t − 0.5, since cash flows arrive across the year rather than landing on December 31. The terminal value uses the same convention (1 ÷ (1 + WACC)N − 0.5) so the explicit window and the perpetuity share a discount basis. Versus end-of-year discounting this lifts NPV by roughly (1 + WACC)0.5 − 1 ≈ 4.4% at WACC = 9%.

Capital efficiency (ROIC)

Starting ROIC
Raw ROIC₀ = NOPAT ÷ Invested Capital, where Invested Capital = Total Debt + Book Equity − Excess Cash − Net Deferred Tax (excess = total cash minus the operating-cash floor; see operating-cash carve-out above). Capped at 40% for the DCF path. The cap exists because aggressive buybacks shrink book equity (and thus IC); filers like AAPL would otherwise show a raw ROIC above 100%, which the DCF would then treat as an infinitely repeatable rate of return. 40% is still generous versus the highest sustained real-world ROICs (LVMH, Mastercard territory). The uncapped raw value is displayed for honesty, and the ROIC override is threaded into the calculator so the hub and calculator show the same starting rate.

Net deferred-tax adjustment. DTAs (NOL carryforwards and credit carryforwards, post valuation allowance) and DTLs (timing differences from accelerated depreciation, etc.) are tax-accounting artifacts, not capital deployed in operations. Per the BS identity Equity = Assets − Liabilities — with DTA inside Assets and DTL inside Liabilities — an equity-based IC inadvertently absorbs them, so we strip the net position back out (subtract net DTA, equivalently add back net DTL). Material for NOL-rich filers like Pinterest (a 1.6B DTA on a 4.7B equity base would otherwise crush ROIC₀ to ~10% and have the DCF model NOPAT growth as requiring more reinvestment than it generates, printing negative early-year FCF that has no relationship to the firm's actual cash generation).

Post-ASC-842 lease treatment. Total debt here includes the operating-lease liability (along with the underfunded pension obligation when present), so a reader familiar with pre-ASC-842 conventions might wonder whether the corresponding ROU asset is captured. It is — the ROU sits inside total assets on the post-ASC-842 balance sheet, and book equity (Assets − Liabilities) absorbs it, so D + E − Excess Cash reflects the full operating-capital base without an explicit add-back. The imputed-interest portion of operating-lease expense remains inside GAAP OperatingIncomeLoss (rather than being moved below the line into interest expense), so NOPAT and ROIC are marginally understated for leasing-heavy filers versus a fully Damodaran-adjusted treatment; we accept the small inconsistency rather than introduce a per-period imputed-interest add-back that would compound awkwardly through the projection.
Terminal ROIC & fade
Terminal ROIC = WACC (floored at 5% to keep the formula well-defined for low-WACC filers). This is the no-economic- moat-at-infinity null hypothesis — at terminal, a typical filer earns exactly its cost of capital, so growth past the horizon neither creates nor destroys value (NOPAT × (WACC − g) ÷ (WACC × (WACC − g)) = NOPAT ÷ WACC, the no-growth perpetuity). Genuine compounders that earn excess returns into perpetuity exist, but assuming them by default would build permanent value creation into every ticker. By default the ROIC path fades linearly from ROIC₀ to terminal across the 10-year horizon, which prevents capital-light filers from generating negative early-year FCF through spurious reinvestment sizing.
Reinvestment cap (FCF ≥ 0)
Per-year reinvestment is capped at NOPAT, so explicit-window FCF can't go negative. The accounting formula Reinvestment = ΔNOPAT ÷ ROIC answers "how much capital, at the firm's blended ROIC, is needed to grow NOPAT by ΔN" — but for filers whose price implies aggressive growth the always-solving solver can drive Y1 growth bumps high enough that the implied reinvestment exceeds NOPAT for years in a row. That isn't wrong arithmetically (it's saying the firm would have to raise external capital to fund growth at this pace), but it prints negative model FCF that looks unrelated to the firm's actual cash generation. Clamping to NOPAT enforces "the explicit-window scenario is self-funded" — when the cap binds, the table shows Reinvestment = NOPAT, FCF = 0, signalling that the price requires growth fast enough to absorb every dollar NOPAT generates. Terminal-year reinvestment isn't capped (terminal growth is 2.5% and a perpetuity reinvestment rate of g ÷ ROIC ≈ 28% never approaches NOPAT).
Reinvestment formula (3-tier ladder)
The standard Damodaran growth-firm closure Reinvestment_t = ΔRevenue_t ÷ salesToCapital (where salesToCapital = ΔRev_3y ÷ netReinvest_3y) collapses to noise whenever EITHER side of the historical ratio is small relative to the revenue base. Two failure modes show up most often:
  • Mode A — leveraged-cohort flat revenue. When ΔRev is essentially zero on a large base (cable / telecom / utility / freight in their build-out years), the ratio collapses toward zero and implies "every dollar of revenue growth costs $13+ of capital" — mathematically true, but only because the numerator is rounding noise.
  • Mode B — harvest-window high revenue growth on tiny CapEx. When a filer is pruning capacity and re-pricing into a brand revival (post-restructuring retail, asset-light services), the ratio explodes upward and implies "12.5¢ of capital funds $1 of revenue growth" — again mathematically true, but only because the denominator is harvest-window noise.
The model picks the most-honest formula via a 3-tier ladder:
  1. Tier 1 — Standard salesToCapital. Fires only when all three checks pass: |ΔRev_3y| ÷ avgRev_3y > 1% (numerator carries signal), netReinvest_3y ÷ avgRev_3y > 1.5% (denominator carries signal), and the resulting s2c sits inside the typical Damodaran-sector band 0.5 ≤ s2c ≤ 8. AAPL/MSFT/COST-class healthy compounders cluster at s2c 1–3 and clear all three.
  2. Tier 2 — CapEx-of-revenue heuristic. When any tier-1 check fails AND the TTM signal is computable, the model substitutes capexOfRevenueRatio = (CapEx_TTM − D&A_TTM) ÷ Revenue_TTM and applies it to each year's revenue in the projection (not its delta). Floored at 0% — a filer whose D&A exceeds CapEx is harvesting installed capital, not earning negative reinvestment. Captures ANF's actual ~1.6% per-year reinvestment vs the artifact 0.3% the standard formula would imply, and CHTR's actual ~6% per-year vs the artifact ~zero in years where ΔRev is small.
  3. Tier 3 — ΔNOPAT ÷ ROIC fallback. When neither tier-1 nor tier-2 inputs are usable (no clean 3-year CapEx + D&A history AND no TTM signal — typically a freshly-IPO'd filer or one with materially missing XBRL tags), reinvestment is backed out from the year's NOPAT change and the year's modelled ROIC.
The NOPAT cap still binds on top of every tier (FCF ≥ 0 in every explicit year). The year-by-year table on each ticker's valuation page shows the resulting reinvestment column, which reconciles to either a $-per-year, a %-of-revenue, or the ΔNOPAT/ROIC closure.
Elevated-CapEx harvest window
When latest-period CapEx is more than 1.4× the 3-year mean and CapEx is at least 5% of revenue, we treat the filer as mid-investment in a capital-intensive build-out (AI infra, hyperscalers, logistics). In that case the scenario holds ROIC flat at ROIC₀ for five years (the "harvest window") and only then fades to terminal over the remaining five. Both gates must clear — the 5%-of-revenue gate screens out fabless / capital-light filers whose year-to-year CapEx swings would otherwise trigger the heuristic. Terminal ROIC is unchanged either way so the Gordon-growth TV stays honest; the relief is entirely inside the explicit forecast window.

Growth inputs

Growth source priority
Both sources are filings-only — analyst forecasts no longer feed the public page (migration-plan.md Task 4):
  1. Trailing 3-year revenue CAGR (from the most recent four FY revenue points), when four full FYs exist in the filings.
  2. Observed YoY growth (TTM revenue vs prior-year TTM), as a last resort.

The Y1 rate is clamped to the range [−30%, +60%] — the floor lets observed declines through honestly (CALM's egg-cycle reversion, sector downturns) instead of pinning them at terminal growth; the ceiling caps one-off 80%+ spikes from rare low-base periods.

Growth path construction

Plateau-holding rate
Year 1 uses the Y1 rate from the source, and the scenario holds that rate from year 2 through the end of the plateau. (The filings-only growth sources carry no separate Y2 forecast.)
Plateau length (tier rule)
Length is tiered by the plateau-holding rate (Y2 when present, otherwise Y1): rate < 15% → 3 years, rate < 25% → 5 years, rate ≥ 25% → 7 years. Fast-growers realistically keep their rate longer before fading, so the tier prevents the solver from compressing all the growth into three years and then piling margin expansion on top.
Compound-growth cap
The plateau's total compound growth is capped at 10× base revenue: (1 + Y1) × (1 + plateau_rate)^(n − 1) ≤ 10. If the tier length violates the cap, the plateau is shortened one year at a time until it fits. Without the cap a 60% Y1 compounded for seven years alone is 27×, which is beyond the realm of realistic revenue scales.
Fade window
After the plateau, growth fades linearly from the plateau-end rate to terminal growth (2.5%) over the remaining years of the 10-year horizon.

Margin path & solver

Margin path
Linear interpolation from the starting margin (year 0) to the solver's target margin (year 10): margin_t = start + (target − start) × (t ÷ 10). The target is what the solver finds; the starting point is fixed by the filings.
Solver ladder
The solver bisects the target margin to match the DCF's PV to today's enterprise value, stepping through this ladder until a feasible solution is reached:
  1. Normal margin bracket, no growth bump, tier plateau. Upper bracket = max(3-yr max EBIT margin × 1.15, starting margin × 1.20), capped at an absolute 55%. Lower bracket = max(−5%, starting margin − 15pp). The 3-yr max anchor prevents the solver from silently landing on an ahistorical margin when the price is easy to reconcile.
  2. Growth bumps (+2pp, +4pp, …, +20pp). Y1 and Y2 are nudged upward in 2pp steps, re-clamped to 60%, and the normal bracket is retried at each step. The bump is applied to both years so the plateau doesn't become an abrupt step-up.
  3. Extended plateau (+2 years). If the full bump ladder fails, the plateau is extended by two years (capped at 7) and the full bump ladder is retried at the longer plateau.
  4. Widened margin band. Final fallback: reset growth to the source (no bumps), widen the margin bracket to [−10%, 80%], and solve once. The scenario's margin may land below the 3-yr minimum (when the EV is low enough that compression clears it) or above the 3-yr maximum (when the EV demands unseen expansion).

The "lands on" levers and their flag colours on the valuation page summarise where the accepted attempt ended up relative to the source data.

Path stretch flag
The solver's stretch label measures whether the scenario deviates from the source data at year 1 (growth bump) and year 10 (terminal margin band). It does not measure whether the projection's intermediate years (Y1–Y9) sit at margin levels the filer has produced before. Path stretch closes that gap — it compares the per-year operating margin path against the filer's own historical FY EBIT-margin distribution and trips a "Path stretch" badge when any of three sub-flags fire.
  1. Margin history. We walk every available FY in the filings and compute p25 / p50 / p75 on a 10–90 trimmed distribution (drop the top + bottom 10% before the percentile calc — preserves trend filers while suppressing single-year shocks like COVID, tax- repatriation hits, or re-opening bounces). The min and max stay untrimmed: we want the filer's actual extremes for the "above max-ever" trigger. When fewer than 8 FY are available the percentiles are too noisy to be meaningful — the flag is suppressed entirely and the existing near-consensus label stands.
  2. Sub-flag 1: extended above-typical. extendedRevivalCount = number of projection years where margin_y > filer_p75. Trips when 4+ years sit above the filer's 75th percentile — calibrated against revival-cycle filers (post- restructuring retail, consumer-brand revivals) without false-routing healthy growth filers whose margins fade below p75 by Y3.
  3. Sub-flag 2: above-max-ever. unprecedentedYearCount = number of projection years where margin_y > filer_max_ever. Trips on a single year above the filer's all-time high — the most surprising failure mode (the projection is asking for a margin level the filer has never produced).
  4. Sub-flag 3: severe fade. severeCompressionRatio = terminal_margin / starting_margin. Trips below 0.5 — the existing margin-compression branch fires only when terminal − start < −10pp absolute, which misses proportional fades (a 13% start fading to 5% is severe in ratio terms but only −8pp absolute).

Precedence. Path-stretch slots into the existing stretchKind chain after the stress / margin-compression / margin-expansion / growth-stretched / both-stretched branches and before near-consensus. So the existing checks keep their precedence and path-stretch only refines the false-comfort case. When more than one sub-flag fires, the badge label names the most surprising binding trigger: unprecedented-margin > extended-revival > severe-compression. The audit-block readout shows all three counts so the reader can see the full picture.

Why filer-own history, not sector medians. Sector medians smooth out exactly the cyclicality the flag is designed to surface — a revival-retail filer's historical p75 is far below the sector's, and that gap is the signal. Sector context belongs in the discount rate you bring, where the input is a credit-cycle judgement, not a per-filer operating-history fact.

Flag colours

Each lever the scenario lands on is coloured by where its level sits vs a reference (tier default, 3-yr historical band, source growth): green when the scenario's level is at or below the reference, amber when it sits above, and red when the solver had to step outside the historical band entirely. The colour describes the scenario's own choice, not an under/overvalued call; the model doesn't know whether the filings' history will persist, only where the reconciliation sits relative to it.

Special situations

The Earning Power Value and reverse-DCF models above both lean on operating continuity — EPV normalises against a multi-year EBIT-margin window, and the reverse-DCF anchors the forward-margin envelope on the same history. When a filer's recent history no longer represents the entity going forward, both models produce headline numbers anchored on the pre-transformation economics, and the green/red premium chips end up describing a company that no longer exists. The page suppresses those headline conclusions and surfaces a red banner whenever any of the detectors below fires, while keeping the computed build-ups visible because the underlying math is still useful diagnostically.

Six categories the models can't handle

  1. Material divestitures or spin-offs within TTM. The freshly-divested parent has a TTM window that mixes pre- and post-disposition periods; the long-history normalisation treats the discontinued segment's margins as the filer's ongoing economics. Examples in recent history: GE / Vernova / Aerospace, IBM / Kyndryl, JNJ / Kenvue, AT&T / WBD, CommScope / Amphenol (renamed Vistance Networks).
  2. Net-cash deep-value plays. When the cash hoard is the asset rather than operating earnings power, EPV's "capitalise NOPAT at WACC" lens systematically understates value relative to the balance-sheet liquidation floor.
  3. Recent IPOs or re-listings. Without enough FY history (less than ~5 years) the trimmed margin envelope is too narrow to be meaningful and the reverse-DCF's history-anchored target margin band is unstable.
  4. Asset-rich, earnings-poor entities. REIT conversions mid-transition, miners pre-production, biotechs post-approval — book and cash matter more than earnings power for the next few years; the EPV/DCF lens fits poorly.
  5. Liquidation or runoff candidates. When the going-concern assumption no longer holds, NPV of asset sales matters more than NOPAT capitalisation. The page's models assume perpetual operations.
  6. Pending M&A targets. Awaiting close, the announced deal price is the better anchor than DCF; the trailing history doesn't help reconcile the implied path to the take-out price.

Detection signals

Detection runs on the slim object's pre-computed fields — no additional XBRL fact pulls. When any signal below fires, derived.val.specialSituation.flagged = true on the per-ticker slim, and the valuation page replaces the EPV / DCF premium chips with the red banner.

Divestiture (EBIT one-time gain)
When any us-gaap:GainLossOnSaleOfBusiness, us-gaap:GainLossOnDispositionOfAssets, or us-gaap:GainLossOnDispositionOfBusiness appears on the TTM EBIT adjustments and the absolute value reaches ≥ 30% of TTM revenue, fire divestiture-ebit-adjustment. Captures whole-segment dispositions whose gain still sits inside the TTM window the DCF anchors on.
Divestiture (revenue divergence)
When TTM revenue diverges from prior FY revenue by more than ± 30%, fire revenue-divergence. Catches both forward-divestiture-shrinking (CommScope post-Amphenol close) and acquisition-inflating cases the EBIT-adjustment signal misses because the disposition gain falls outside the standard concept set.
Forward-divestiture override
When the DCF's normalisation revenue ladder already substituted a forward-divestiture-adjusted base (normalizationRevenueSource === "forward-divestiture-adjusted"), fire forward-divestiture-override. This is the backend's own "FY median is unrepresentative" finding — surfacing it on the banner avoids reader confusion about why two different EPV revenue anchors show up across runs.
Net cash > 50% of market cap
When (cash − totalDebt) ÷ marketCap > 0.5, fire net-cash-deep-value. The cash and debt come from the per-filer balance block already on the slim; market cap is the share price you entered × shares outstanding, so this detector re-evaluates on every recompute.

Detection is additive — when none of the signals above fire, the page renders exactly as before (green/red premium chips, no red banner). The cards section (P/E, P/FCF, FCF Yield, EV/EBITDA, P/S, P/B) stays useful in either state, and is especially diagnostic on net-cash deep-value cases where P/B and EV/EBITDA carry information that EPV / reverse-DCF cannot.

Share counts

Diluted shares (reverse-DCF)
The reverse-DCF page uses a scaled point-in-time diluted count, not the snapshot share count above. Two pieces SEC filings tag separately are combined:
  1. CSO — point-in-time basic from us-gaap:CommonStockSharesOutstanding on the cover page (or dei:EntityCommonStockSharesOutstanding), walking back up to 18 months if the latest period drops the tag. The freshest basic anchor available.
  2. Filer's TSM dilution multiplierus-gaap:WeightedAverageNumberOfDilutedSharesOutstanding ÷ us-gaap:WeightedAverageNumberOfSharesOutstandingBasic from the most recent income statement that tags both. This is how much the filer's options + RSUs + converts dilute the basic count, expressed as a multiplier (e.g. 1.0042× for AAPL, 1.0194× for PINS).
Diluted shares = CSO × (DilWA ÷ BasicWA). The construction rebases the filer's most recently disclosed dilution premium onto the freshest basic anchor, beating two alternatives in common use:
  • Raw basic CSO (what most snapshot ratios show) misses dilution entirely — fair value per share is overstated by the missing TSM premium.
  • Raw filing DilWA (what most external data providers serve as "diluted") is the period-average count, weighted across the prior reporting window — stale for any period older than the latest 10-Q.
What it doesn't capture: the filer's TSM multiplier was computed at the period's average share price, not today's. For stocks that have rallied materially since the last filing, today's true TSM dilution is slightly higher (more options deeper in the money) — typically a few tenths of a percent of residual error. Computing true current-price TSM would require strike-distribution data the company-facts API hides behind XBRL axes; we accept the residual rather than fabricate it from absent data.
Fallback ladder
  • CSO + DilWA + BasicWA all available within 18 months → scaled (preferred path; ~99% of filers in our universe).
  • Only CSO available → raw CSO (no TSM scale; same as today's bucket-A behavior).
  • Only DilWA + BasicWA pair available, no CSO within 18 months → raw DilWA (same as today's bucket-B behavior; affects ~PINS-type filers whose 10-K drops the cover-page CSO tag and whose 10-Q cache hasn't been rebuilt).
  • Axis-only multi-class issuers (V, STZ, ERIE in the S&P 500): cover-page share counts live only under XBRL StatementClassOfStockAxis members (Common Class A / Common Class B / Common Class C). The SEC's company-facts API flattens away the dimensional context, so the chain above returns nothing. For these filers the backend's fetch-axis-facts command parses the latest 10-K's XBRL instance directly (using the filing's index.json to locate the .xml instance, then walking dei:EntityCommonStockSharesOutstanding elements with their context-segment dimensions) and caches the per-class breakdown under data/store/sec/axis_facts/. The reverse-DCF then sums Class A + Class B + Class C as the diluted denominator. No TSM dilution scale is applied — the filer's weighted-average diluted/basic pair isn't exposed in the API either.
  • All concepts absent (genuine fetch failure or filer that doesn't tag share counts at all in any form): reverse-DCF section is skipped entirely. The financials and earnings pages still render.
  • Shares sanity override: after the ladder above picks a value, we cross-check it against an independently selected share count (the freshest cover-page count from the filings, filtered for junk below-1M values). When the picked value disagrees with that count by more than 5× in either direction — typical cause: the income-statement share concept tagged with an implicit "thousands" scale, which would otherwise propagate a ~1000× per-share-math error to EPV / DCF / cards — we substitute the cross-check count and tag the methodology note on the valuation page so the reader can see the fallback fired.
An implied-shares-outstanding figure from external quote feeds is intentionally not used as a fallback — it aggregates basic shares across classes for multi-class issuers but doesn't include TSM dilution, so substituting it would silently degrade the DCF's per-share denominator without telling the reader.

Earnings history

EPS (Basic & Diluted)
Reported directly by the filer as us-gaap:EarningsPerShareBasic and us-gaap:EarningsPerShareDiluted (unit USD/shares). The earnings page shows a per-card toggle between the two; the diluted view is the default because it reflects the impact of options, RSUs, and convertibles outstanding.

Continuing-operations fallback. Some filers (e.g. ABNB) tag earnings-per-share through the continuing-operations branch of the taxonomy rather than the headline concept. When the headline EPS facts aren't present we fall back to us-gaap:IncomeLossFromContinuingOperationsPerDilutedShare and us-gaap:IncomeLossFromContinuingOperationsPerBasicShare so the chart, table, and the P/E ratio on the valuation page all populate. For filers without discontinued operations the two concepts are identical; for filers that do report discontinued operations the fallback excludes that line, so the per-share figure can sit a few cents below the headline EPS the filer would print on a press-release cover.

FCF per share
Derived from the cash-flow statement, not directly tagged by most filers. Formula: (Operating Cash Flow − Capital Expenditures) ÷ Diluted Shares Outstanding. Operating cash flow comes from us-gaap:NetCashProvidedByUsedInOperatingActivities; capex from us-gaap:PaymentsToAcquirePropertyPlantAndEquipment (sign-normalised to a positive outflow); shares from us-gaap:WeightedAverageNumberOfDilutedSharesOutstanding for the same period.
Q4 derivation
XBRL tags 10-K filings with full-year flows only — Q4 isn't a separately-reported period. So for flow facts (EPS, revenue, cash flow, etc.) we derive Q4 as FY − Q1 − Q2 − Q3 (equivalently full-year minus nine-month YTD when that's what the filer tagged). Per-share Q4 values are approximate to within a cent or two when the weighted-share count drifts across the year (buybacks or issuances); we're subtracting two per-share figures whose weighted-average denominators differ slightly. Instant facts (balance-sheet snapshots) at the fiscal-year end are taken directly from the 10-K CY{Y}Q4I instant and aren't derived.
Split adjustment
Per-share values on the earnings chart are presented in today's share class. Historical values are multiplied by the product of split ratios that occurred after each period end; for example, a pre-split $39.75 EPS reported before a 7-for-1 and then a 4-for-1 split becomes $39.75 ÷ 28 ≈ $1.42 in today's class. The conversion factor per period is surfaced in the per-row tooltip so readers can cross-check.

Financials page

Statement grouping
Every tagged fact from the filing is rendered on the main ticker page, grouped by the statement it belongs to: Income Statement, Comprehensive Income, Balance Sheet, Cash Flow Statement, Stockholders' Equity, Notes. Grouping uses FASB's base us-gaap presentation taxonomy (the linkbase we fetch via python -m backend.cli fetch-gaap-taxonomy and parse into a concept→statement map). Filers may re-parent individual concepts onto different statements in their own extension taxonomy, so for a small number of concepts the section shown on our page can differ from where the line item appears on the company's actual 10-K / 10-Q.
"Other"
Holds filer-specific custom concepts (their own namespace, not us-gaap or dei) plus the handful of standard concepts we couldn't map to a statement via the base taxonomy — typically deprecated or newly-introduced tags not yet in the linkbase we parse.
Derived Metrics
A dedicated group for figures the filer doesn't tag directly but that are computable from tagged flows. Each derived row carries its formula and audit trail (the specific facts and values that fed it) in its hover tooltip, so readers can verify the math against the primary facts.
Fact tooltips
Every fact cell has a hover tooltip showing the fully-qualified concept (e.g. us-gaap:EarningsPerShareDiluted) plus the filer's description of the concept when one is provided. Derived rows show the formula and the audit inputs instead.