Phase Space AI

Financial Model Notes

Doximity [DOCS]

Doximity [DOCS] — Financial Model Notes & Data Provenance

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.

1. Source hierarchy actually used, and why

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.

2. Q4 synthesis — the §9.2 guard, and its verification

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.

3. The quarterly series underwriting the memo (USD m, EDGAR, period ends)

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

4. Reverse-DCF inputs, reproducible

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.

5. Own-multiple history construction

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.

6. Checks run