Worked theses
Ulta Beauty: the margin that slipped
A worked example on Ulta Beauty. Gross margin held near 39 percent for five filed years while operating margin fell 3.68 points from its FY2022 peak.
By Javier SanzPublished
Founder of ValueScreener. Built Ninety Nine, a securities services provider, and sold it to a tier-one global bank; ran operations and internationalization at Alpaca, the brokerage API.
Who writes thisEditorial processLinkedIn (opens in a new tab)X (opens in a new tab)
A worked example. One company, the accounts it filed, and the method run on them in the open. The figures are the company’s own and each one names the filing it came from. The reading and the conditions are written as a reader might write them, and are not a view on the security, a valuation, or a suggestion to do anything.
One company, its own filed accounts, and the method run on them in the open. What the statements say, what a reader might conclude, the numeric conditions that conclusion depends on, and what would prove it wrong.
Nothing here is a view on Ulta Beauty. The guardrails in the third section belong to a hypothetical reader, not to ValueScreener, and the thresholds are lines chosen so the retro-test has something to answer rather than standards anybody published.
The filed figures
Fourteen fiscal years of Ulta Beauty 10-K filings are on record here, FY2011 to FY2025. FY2014 is not among them: it is absent from the archive, and it is shown as absent rather than filled in. The last ten are below.
| Fiscal year and filing date | Gross margin | Operating margin | Net margin | Current ratio | Revenue growth |
|---|---|---|---|---|---|
| FY2016, filed 2017-03-28 | 35.99 | 13.49 | 8.44 | 2.90 | 23.72 |
| FY2017, filed 2018-04-03 | 35.63 | 13.35 | 9.44 | 2.64 | 21.21 |
| FY2018, filed 2019-04-02 | 35.87 | 12.72 | 9.80 | 2.32 | 14.14 |
| FY2019, filed 2020-03-27 | 36.24 | 12.18 | 9.54 | 1.81 | 10.15 |
| FY2020, filed 2021-03-26 | 31.68 | 3.85 | 2.86 | 1.87 | -16.84 |
| FY2021, filed 2022-03-25 | 39.03 | 15.03 | 11.42 | 1.46 | 40.30 |
| FY2022, filed 2023-03-24 | 39.62 | 16.05 | 12.17 | 1.61 | 18.28 |
| FY2023, filed 2024-03-26 | 39.09 | 14.97 | 11.52 | 1.71 | 9.78 |
| FY2024, filed 2025-03-27 | 38.84 | 13.85 | 10.63 | 1.70 | 0.79 |
| FY2025, filed 2026-03-26 | 39.10 | 12.37 | 9.31 | 1.41 | 9.71 |
Margins and growth in percent, current ratio as a ratio, each rebuilt from the
statements in the filing named on its own row and rounded to two decimals.
Read from GET /api/public/retrotest on 2026-09-16.
The two figures the rest of this page turns on, as filed in the most recent 10-K: gross margin 39.10 percent (FY2025 10-K, filed 2026-03-26 (opens in a new tab)) and operating margin 12.37 percent (FY2025 10-K, filed 2026-03-26 (opens in a new tab)).
What they say
Two lines moved in opposite directions, and because both are filed, the distance between them is filed too.
Gross margin stepped up after FY2020 and stayed there. Four of the five years before it sat between 35.63 and 36.24; the five years since sit between 38.84 and 39.62. That is a step of about three points that has now held through five consecutive filings, which is long enough to stop reading it as a recovery.
Operating margin did not hold. It peaked at 16.05 in FY2022 and has fallen in each of the three filings since: 14.97, then 13.85, then 12.37.
Subtract one from the other and the mechanism is visible without needing a single line item:
| Fiscal year | Gross margin | Operating margin | Spread |
|---|---|---|---|
| FY2022 | 39.62 | 16.05 | 23.57 |
| FY2023 | 39.09 | 14.97 | 24.12 |
| FY2024 | 38.84 | 13.85 | 24.99 |
| FY2025 | 39.10 | 12.37 | 26.73 |
The share of revenue consumed between the gross line and the operating line rose 3.16 points in three years while the gross margin was flat. Whatever is happening is happening below the gross line, not at it.
One observation rules out the easiest explanation. In FY2025 revenue grew 9.71 percent and the operating margin still fell 1.48 points, so this is not a fixed cost base being spread over a shrinking top line. That was the FY2020 story, when revenue fell 16.84 percent and operating margin fell to 3.85; it is not this one.
Placed against the companies it is filed alongside, the FY2025 operating
margin of 12.37 sits between the 75th percentile of Consumer Cyclical, 10.06,
and the 90th, 18.57, across 445 companies. The FY2022 figure of 16.05 sat near
the top of that range. The current ratio of 1.41 is just under the sector
median of 1.47 across 478 companies. Both cohorts come from
GET /api/public/distribution with an as-of of 2026-09-15, read on 2026-09-16.
So the reading a reader might arrive at: the pricing and mix gain taken after FY2020 is intact, and the cost of running the business behind it has been rising for three filed years.
The guardrails a reader would write
That reading depends on two things staying true, and the numeric conditions for both can be typed into a thesis and checked every night. Written the way the product stores them, an indicator key, a condition and a threshold, with the filed record behind each one.
gross_margin gte 35. The step up is the load-bearing part of the
reading, and 35 is roughly where the line sat before it. Run backwards over
the 14 filed years, this was false in 2 of them: FY2011 at 34.73 and FY2020 at
31.68. Headroom at FY2025 is 4.10 points.
operating_margin gte 12. False in 2 of 14 filed years, the same two,
FY2011 at 11.05 and FY2020 at 3.85. Headroom at FY2025 is 0.37 points, and the
figure has moved toward the line in each of the last three filings. This is
the rail doing the work: it is one poor year from breaking, and it would break
on the thing the second section says is happening.
current_ratio gte 1.25. False in 0 of 14 filed years. The lowest current
ratio Ulta Beauty has filed in the record is the most recent one, 1.41.
The third rail is worth being honest about. A condition that has never been false in fourteen years of filings will not tell a reader much, and writing it down does not make a thesis more rigorous. It is not useless: it is the rail that fires if the working capital position does something it has not done since FY2011, which is exactly the kind of event a reader will otherwise learn about late. What it is not is a third test. Counting it as one turns two tests into three on paper and leaves the reasoning resting where it already rested.
The mirror-image mistake is easier to make. operating_margin gte 14 looks
like a stricter version of the second rail, and it was false in 11 of the 14
filed years, including the two most recent. A rule that is already broken
fires once and then goes quiet forever, which is indistinguishable from a rule
that is working.
One rail a reader would want here cannot be had. Asked for a filed history of debt to equity, this product answers that it "can be measured in 1 of the 14 filed fiscal years we test against, FY2011 to FY2025. The other 13 carry no value and count in neither total: they are shown blank, never as zero." The one year it can measure, FY2025, is 0.78. A leverage rail can be watched going forward; it cannot be tested against this company's past, and a page that implied otherwise would be inventing thirteen years of history.
What would falsify this
The reading is that the gross margin gain is structural and the cost below it is rising. Three filed outcomes would show it to be wrong, and they are not the same as the guardrails firing.
A filed year with gross margin under 35 would say the step up was a price and mix effect that reversed. The second section treats about 39 as the level, and if the level was temporary then the framing was wrong from the start, not just early.
A filed year in which operating margin recovers while the spread keeps widening would say the spread was never the mechanism. Two lines can move together without one explaining the other, and the only test of the causal claim made above is whether they keep moving together.
A filed year in which operating margin falls under 12 while gross margin holds near 39 and the spread widens again is the opposite case, and it deserves saying plainly because it is the one most often confused with falsification: that is the reading being confirmed, not refuted. The rail fires, the reader is told, and what they have learned is that the thing they identified is still happening. A guardrail breaking is news about the company. Only the section above is news about the reasoning.
What this leaves out
One company, fourteen filed fiscal years, and a method. Not a sample of anything, not a view on Ulta Beauty, and not a recommendation to do anything at all.
FY2014 is absent from the filed archive here, so the fourteen years run FY2011 to FY2025 with one gap. Accounts filed before a company began tagging its statements in XBRL are not machine readable and are outside every figure on this page.
Debt to equity can be measured in one of those fourteen years. Return on invested capital has no honest test against the filings at all, because it is assembled from inputs that cannot be rebuilt year by year with the same formula. Neither is shown as zero anywhere on this page.
The three thresholds are lines chosen so the retro-test has something to answer. None of them is a standard anybody published, and none is recommended.
Past filings do not indicate future results. A condition that held for fourteen years is not a prediction that it holds for a fifteenth.