Company facts methodology

Every figure on the company-facts pages traces back to SEC EDGAR XBRL company-facts filings (fetched per ticker by CIK), tagged with the us-gaap and dei taxonomies. The only exception is the live market cap tile on a ticker's capitalization page, which uses the current share price × shares outstanding from a market quote. Historical share prices come from our total-returns daily history (split-adjusted).

On this page. Balance-sheet aggregates · Valuation metrics · Valuation ratios · Expectations scenario (reverse-DCF) · Shares & historical market cap · 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. 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.
Cash & equivalents
Cash plus short-term marketable securities — the liquid assets an acquirer would pocket at close. Preferred source is 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) plus us-gaap:MarketableSecuritiesCurrent (or us-gaap:ShortTermInvestments) when present.

Valuation metrics

Market Cap
Also: market capitalization, equity market value, equity value. What the stock market currently values the equity at — shares outstanding × share price. Reflects what investors are willing to pay today, not what the business owns or owes. Snapshot tiles use a live quote; historical rows use the period-end close × that period's shares outstanding (see Historical market cap below for the calibration).
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. The snapshot combines the live market cap with the latest-filed debt and cash; each historical row combines that period's computed market cap with that period's filed debt and cash. 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.
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 /company-facts/{ticker}/valuation/ page. Each deep-links to its derived-concept chart and period history on the main facts page so you can see how the ratio evolved over time, not just today's value.

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; 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.
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 ÷ stockholders' equity from the latest balance sheet. Anchored on accounting net worth rather than earnings, so it's 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.

Expectations scenario (reverse-DCF)

The "expectations investing" block on each /company-facts/{ticker}/valuation/ page is a Rappaport-style reverse-DCF: we take the current enterprise value 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, method, and contributing-fact audit trail are surfaced on the page under "Facts" and in the audit block (section 1).
Starting EBIT margin
Base margin is the anchor TTM margin (OperatingIncomeLoss ÷ Revenue). When the latest FY deviates from the 3-year mean FY margin by more than 5pp (cyclical filers like CALM or TSLA), we swap in the 3-year mean as the starting margin instead, so a single anomalous year doesn't anchor the fade path.
Tax rate
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.
WACC & terminal growth
WACC is held at 9%, terminal growth at 2.5%, horizon at 10 years — fixed across all tickers. Per-ticker WACC estimation is out of scope for this page; if you want to stress-test the discount rate, the "Open this scenario in the calculator" link pre-fills every input into /calculators/expectations/, where you can override WACC and re-solve.

Capital efficiency (ROIC)

Starting ROIC
Raw ROIC₀ = NOPAT ÷ Invested Capital, where Invested Capital = Total Debt + Book Equity − Cash. 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.
Terminal ROIC & fade
Terminal ROIC = max(WACC + 2pp, 10%). 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.
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
  1. Analyst consensus (absolute forecast). When analyst current-FY revenue in dollars is available, Y1 growth is (analyst currentFY ÷ TTM base) − 1 and Y2 growth is (analyst nextFY ÷ analyst currentFY) − 1. Using absolute forecasts avoids double-counting: if our base is TTM but the analyst growth % is FY-over-FY, applying the %-growth directly would stack 12 months of forecast growth on top of a base that already contains some of those months.
  2. Analyst consensus (growth %). When only the % is available, use it directly and accept the TTM-vs-FY mismatch.
  3. Trailing 3-year revenue CAGR (from the most recent four FY revenue points), when four full FYs exist in the filings.
  4. Observed YoY growth (TTM revenue vs prior-year TTM), as a last resort.

Both Y1 and Y2 rates are clamped to the range [−30%, +60%] — the floor lets analyst-forecast 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. From year 2 through the end of the plateau the scenario holds the Y2 rate when analysts provide one; when no Y2 forecast is available it holds the Y1 rate across the plateau. Y2 is treated as the run-rate after the first-year comp effect rolls off, not a one-year step-down that reverts to Y1.
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).

Every attempt — plateau, bump, solved margin, resulting EV, feasibility — is surfaced in section 7 of the audit block on the valuation page.

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.

Shares and historical market cap

Shares outstanding
For snapshot tiles, the most recent instant share count from filings, walking back a period if the latest one's value is obviously junk (our Q4-from-FY-minus-9M derivation occasionally produces near-zero weighted counts). For historical rows, per-period, preferring us-gaap:CommonStockSharesOutstanding at fiscal-year endpoints and us-gaap:WeightedAverageNumberOfDilutedSharesOutstanding for interim quarters (the weighted count shares filing-scale with us-gaap:NetIncomeLoss and is more consistent than the instant count), falling back to dei:EntityCommonStockSharesOutstanding and us-gaap:WeightedAverageNumberOfSharesOutstandingBasic where needed.
Historical market cap
Split-adjusted closing price on the period-end date × that period's shares outstanding, forward-adjusted for any splits after the period. SEC retroactively bakes certain splits into previously-filed share counts (partially or in full), so a naïve forward-adjustment over-counts. We calibrate each period against today's share count and peel back the oldest pending split whenever the candidate lands more than 3× too high. Periods we still can't calibrate into a sane range are dropped rather than shown.

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.
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.