Doximity [DOCS]
No .xlsx is produced for this name. Per §1–§3 of known-silent-failures.md, a workbook built by openpyxl and
never opened by Excel contains formula strings, not numbers, and "the model ties" is unverifiable for it; and
named ranges matching ^[A-Za-z]{1,3}\d{1,7}$ silently resolve as cell addresses. The build below is therefore
stated as reproducible arithmetic in text, which can be verified line by line.
| Quantity | Source used | Why not the alternative |
|---|---|---|
| Quarterly revenue, COGS, opex, EBIT, SBC | EDGAR companyfacts (us-gaap, newest-filed-wins per shared period end) |
Alpha Vantage INCOME_STATEMENT and BALANCE_SHEET were unavailable for DOCS — four attempts returned {"Information": "Burst pattern detected…"} at HTTP 200. |
| FY2026 statement detail (gross profit, R&D, S&M, G&A) | Filed 10-K text, docs-20260331.htm |
Ties to companyfacts; used as the independent check AV could not provide. |
| Q4 FY2026 actuals | 8-K Ex-99.1, doximity-2026331xex991.htm |
Independent of both — used to validate the Q4 synthesis. |
| Net cash | Filed balance sheet | companyfacts standard tags understated it by $529.4m (see Defects). |
| Share count | Filed balance sheet, 183,060 thousand | DOCS is multi-class; dei:EntityCommonStockSharesOutstanding is unreliable (§5). |
| Prices, realised vol | Alpaca daily bars, adjustment=split, explicit start= (§4) |
— |
| Consensus + revision history | Alpha Vantage EARNINGS_ESTIMATES (this endpoint worked) |
— |
| Transcripts | Alpha Vantage EARNINGS_CALL_TRANSCRIPT with speaker/title |
Required for the prepared-remarks vs Q&A split. |
DOCS files no discrete Q4 (the 10-K reports the full year), so summing "the last four quarterly periods" would sum Q1–Q3 of FY2026 plus a year-old Q1. Q4 was synthesised as FY − (Q1+Q2+Q3) and then verified against a source that did not produce it:
| Q4 FY2026 | synthesised from XBRL | 8-K reported | agree? |
|---|---|---|---|
| Revenue | $145.37m | $145.4m | yes |
| Net income | $19.16m | $19.1m | yes |
| FY revenue | $644.86m | $644.9m | yes |
The synthesis is sound. The same operation applied to share counts and EPS is invalid and produced nonsense (−402.08m shares) — a stock is not additive across periods. Flow-vs-stock must be typed per tag; this defect was in my own extraction script, is logged, and did not enter any figure used.
| Q end | Revenue | COGS | Gross | R&D | S&M | G&A | EBIT | Net inc | SBC | AR | DSO |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2024-06-30 | 126.68 | 13.55 | 113.13 | 22.57 | 35.24 | 9.26 | 46.05 | 41.38 | 17.09 | 120.91 | 85.9 |
| 2024-09-30 | 136.83 | 13.68 | 123.16 | 23.24 | 34.37 | 10.10 | 53.14 | 44.15 | 17.87 | 124.79 | 83.0 |
| 2024-12-31 | 168.60 | 14.18 | 154.42 | 22.42 | 38.49 | 13.59 | 79.92 | 75.20 | 19.37 | 137.50 | 74.2 |
| 2025-03-31 (syn) | 138.29 | 14.47 | 123.82 | 24.80 | 37.61 | 12.73 | 48.68 | 62.47 | 18.06 | 128.35 | 83.5 |
| 2025-06-30 | 145.91 | 15.79 | 130.12 | 26.80 | 36.37 | 12.44 | 54.52 | 53.32 | 21.86 | 141.66 | 87.4 |
| 2025-09-30 | 168.53 | 16.43 | 152.10 | 30.20 | 39.17 | 19.05 | 63.68 | 62.06 | 29.47 | 129.31 | 69.8 |
| 2025-12-31 | 185.05 | 18.70 | 166.35 | 34.59 | 42.20 | 17.66 | 71.90 | 61.56 | 33.55 | 156.59 | 77.0 |
| 2026-03-31 (syn) | 145.37 | 19.41 | 125.97 | 39.11 | 45.91 | 16.12 | 24.83 | 19.16 | 36.74 | 144.78 | 89.6 |
Fiscal-year aggregates: FY2026 revenue $644.86m, EBIT $214.93m (33.3%), SBC $121.62m (18.9%); FY2025 revenue $570.40m, EBIT $227.79m (39.9%), SBC $72.39m (12.7%).
The Q4 FY2026 column is the memo. Revenue +5.1% YoY, EBIT −49.0% YoY, EBIT margin 17.1% against 35.2% a year earlier, R&D +57.7%, SBC +103%.
spot 21.62
shares 183.060 m (filed BS 31-Mar-2026)
net cash +748.60 m (cash 219.178 + marketable securities 529.423 − debt 0)
revenue (TTM) 644.90 m
years 5
wacc 0.09
terminal margin 0.34 (own 5y mean 34.1%, trailing 33.3%; bridge in Valuation §2)
exit multiple 12.18 x EV/EBIT (DERIVED: (1-.21)(1-.03/.40)/(.09-.03))
basis ebit
=> required revenue CAGR 13.1%
Command:
python3 ~/.claude/skills/investment-memo/assets/reverse_dcf.py --spot 21.62 --shares 183.06 --net-cash 748.6
--revenue 644.9 --years 5 --wacc 0.09 --terminal-margin 0.34 --exit-multiple 12.18 --basis ebit
Note on the script's JSON contract: the solved value is returned as implied_value, not required_cagr. A
consumer keying on required_cagr gets None and, if it does not check, silently reports "no solution" for
every name — the §8 schema-rename failure shape. Encountered and worked around during this run.
work/docs_irtc/mult_hist.py. Daily EV/Sales from Alpaca closes against TTM revenue as known at that date,
lagged 45 days from each period end to an assumed filing date so the series is never forward-looking. Share count
and net cash are held at current verified values deliberately — the series is used only for a multiple
percentile, which is what the anchor requires. n = 1,277 trading days, 2021-06-24 → 2026-07-29.
Result: EV/S 4.98x = 3.3rd percentile; but declared UNIDENTIFIED as an anchor because the series is non-stationary in level (annual medians 49.0 → 17.2 → 12.2 → 9.9 → 18.3 → 5.8) and the underlying business changed regime (NRR 157%→109%, growth 66%→3.9% guided). Percentile stable across windows (3.3rd / 4.7th / 10.7th) while the median is not (13.98 / 12.16 / 16.05) — the signature of non-stationarity.
net income ÷ shares ≈ filed EPS: FY2026 $196.1m ÷ ~200m WA diluted = $0.98 = filed $0.98 ✓. Known to be
blind to split-basis errors (§9.3) — separately confirmed no split in the price series window.gross profit + cost of revenue = revenue: 574.537 + 70.326 = 644.863 ✓ (arithmetic identity — passes by
construction and therefore carries no information, per the brief's warning).ebitda field: not used anywhere (signed-D&A defect). Adjusted EBITDA figures are the company's own
from the 8-K, and are explicitly not underwritten — GAAP EBIT is.