ExlService Holdings [EXLS]
companyfacts for FY2021–FY2025 and against the Q2 2026 10-Q filed 2026-07-28.ebitda and ebit fields were not used at all.| FY2025 | |
|---|---|
AV sellingGeneralAndAdministrative |
$255,308,000 |
Filed GeneralAndAdministrativeExpense |
$255,308,000 — byte-identical |
Filed SellingAndMarketingExpense |
$172,934,000 — absent from AV |
| True SG&A | $428,242,000 |
| AV error | 1.68x light · 8.28pp of revenue |
Result: DEFECTIVE on EXLS.
| Name | AV SG&A | True SG&A | Error | pp of revenue |
|---|---|---|---|---|
| PRGS | $108,215,000 | $319,228,000 | 2.95x | 21.58pp |
| PTC | $226,058,000 | $792,574,000 | 3.51x | 20.68pp |
| EXLS | $255,308,000 | $428,242,000 | 1.68x | 8.28pp |
All three defective. All three by a different factor. The mechanism is identical every time — AV
returns the filed GeneralAndAdministrativeExpense byte-for-byte and drops SellingAndMarketingExpense
entirely — so the ratio is simply each company's (S&M + G&A) ÷ G&A. It is not a constant and cannot
be corrected by a constant. DATA_DEFECTS.md records instances at 4.72x (NOW), 4.77x (INTU) and 6.15x
(ORCL); this cluster adds 1.68x, 2.95x and 3.51x, and the clean cases (INSM, NVDA) remain clean.
The prior "always ~4.7x light" would have over-corrected all three of these names.
| Field | Result |
|---|---|
commonStockSharesOutstanding = 152,783,000 vs a filed 152,782,931 |
CLEAN, 0.00005% |
researchAndDevelopment |
"None" (the string) for FY2024 and FY2025, populated FY2018–FY2023. The underlying absence is real — EXLS stopped reporting a separate R&D line — but AV returns a string, not a null, which crashes a naive float() mid-series. The documented INCOME_STATEMENT string-"None" defect, observed here. |
EARNINGS_ESTIMATES |
41 records returned. PRGS also returned 41 in the same run while PTC returned {"estimates": []} — so the empty-response defect is not an account-level throttle. |
OVERVIEW.MarketCapitalization = $5,498.658m vs $5,303.1m verified |
+3.7% stale |
Cash and short-term investments were read as separate line items and summed explicitly:
| At 30 June 2026 | $m |
|---|---|
| Cash and cash equivalents | 126.722 |
| Short-term investments | 157.102 |
| Total liquid | 283.824 |
| Restricted cash (current $12.964m + non-current $7.086m) | EXCLUDED |
| Total borrowings (all classified current) | 381.155 |
| Net debt | 97.331 |
Short-term investments are 55% of the liquid balance. Trusting cashAndShortTermInvestments — the
INSM failure mode, where $641.3m went missing and flipped net cash to net debt — would have given net
debt of $254.4m against an actual $97.3m, a 161% error.
The longTermDebtNoncurrent = 0 reading at 30 June 2026 was checked rather than assumed missing.
Per DATA_DEFECTS.md, 0 was correct for WDC and treating it as missing invents a liability. Here
it is also correct: EXLS's borrowings are drawn on a revolving facility and are classified current.
Total debt of $381.155m is used, not $0.
| Check | Result |
|---|---|
| Gross profit + cost of revenue = revenue (FY2025) | $801.076m + $1,286.603m = $2,087.679m ✓ |
| Gross profit − total opex = operating income | $801.076m − $487.326m = $313.750m ✓ |
| Opex bridge | 255.308 + 172.934 + 59.248 − 0.164 = $487.326m ✓ |
| Sum of Q2 2026 service-type split | $362.558m + $232.205m = $594.763m ✓ (ties to the 10-Q income statement) |
| Sum of Q2 2026 segment revenue | 197.8 + 158.0 + 133.9 + 105.1 = $594.8m ✓ |
| Q2 2026 operating income | $87.295m ÷ $594.763m = 14.68%, ties to the disclosed 14.7% ✓ |
Rolling four quarters to 30 June 2026: 2026-06-30, 2026-03-31, 2025-12-31, 2025-09-30 =
$594.763 + $570.351 + $542.615 + $529.585 = $2,237.314m. Q4 is included. Cross-check against
FY2025 − (Q1+Q2+Q3): $2,087.679m − ($501.019 + $514.460 + $529.585) = $542.615m — matches the AV
Q4 figure to the dollar.
SPLITS queried explicitly. Result: 5-for-1 on 2023-08-02. Nothing since.
This is the one name in the cluster where the split matters: any price series crossing 2023-08-02 on
an unadjusted basis is 5x wrong, which is the KLAC failure mode ($89% market-cap understatement,
37pp of required CAGR). The Alpaca bar series used for the multiple history was requested with
adjustment=split and the resulting EV/Sales series is continuous across the split date, confirming
the adjustment applied.
av_vs_edgar.py was not run on EXLS within the time-box. Every line used was instead checked by
hand against companyfacts and the filed documents. Reported as a method substitution, not as a
completed run of that tool.field_collapse_check.py and validator_selftest.py were not run on this cluster's output.