Overview
Opportunity Sizing answers the question people actually ask about a metric, which is not “where does this number vary?” but “how do I improve it, and by how much?” It lives in the World Model Graph, reached through the Globe icon in the icon rail (a surface distinct from both the Context Graph and the Metric Tree). When you open a measure on the graph, Oxygen scans your data for segments that underperform a benchmark, puts a dollar figure on each gap, and then lets you drill that gap into its underlying drivers until you reach something specific enough to act on. The result is a ranked list of addressable upside, such as “mobile orders run$218.50/order below in-store, and closing that gap is worth
+$264.6k,” in which every number is backed by a statistical test and every
child in the breakdown provably sums back to its parent.
Opportunity Sizing operates on the semantic model, reading your existing
measures,
dimensions, and the relationships
between views, so you never define
opportunities anywhere yourself. The quality of the sizing depends directly on
how well your model is defined (see What your model needs).
The core idea: size on rates, not totals
An opportunity has two ingredients, a gap and a volume:revenue-per-check instead of
revenue makes the comparison about performance, so that “smaller” never
reads as “worse,” and multiplying the per-unit gap back by the segment’s real
volume then turns it into an honest, addressable dollar figure.
Picking the benchmark
The benchmark is the bar every segment is measured against, and Oxygen picks it from the data automatically:
Crucially, the benchmark is defined as a population filter (
dim = best_peer or dim IN (segments at or above p75)) rather than as a bare
number, which is what lets the drill query the benchmark population later
instead of merely comparing against a fixed scalar.
Three sizing modes
How a segment is weighted into a dollar figure depends on what the measure supports:
Only
rows responses carry a directly addressable upside and get ranked in
the Opportunities list, although the other bases still power the drill
breakdown.
Trustworthy numbers: the evidence gate
Any tool can find a “top lever” in any dataset, including one in which the dimension is provably unrelated to the measure. Opportunity Sizing is deliberately rigged against itself and corrects for the two ways a naive scan fools itself.Selection bias within a dimension
Selection bias within a dimension
The benchmark is the maximum (or P75) of the same segments being tested
against it. If you draw a handful of values from pure noise, the largest
one naturally sits well above the mean, so a fixed threshold would
“discover” a leader in literally any dimension. Oxygen raises the bar by
exactly that expected amount, so that noise does not clear it.
Multiple comparisons across the scan
Multiple comparisons across the scan
A full scan makes on the order of a hundred comparisons once related
entities are followed, and at a naive 5% per test, five spurious levers
per scan is the expected yield. Oxygen therefore applies a Šidák
correction across the whole scan family, so that 20 dimensions × 5
segments requires a much higher bar of evidence than any single dimension
would imply on its own.
Three outcomes, kept distinct
Oxygen never blurs “proven” with “plausible”:
The third row is the honest one.
gated: false does not mean the gap is
fake; it means nobody could prove it real, and the panel never presents it as
proven upside. The skip reason also distinguishes “everything I found was
noise” from “everything already matches the benchmark,” because those are
different answers and you are entitled to know which one you got.
Drill: decomposing the gap into drivers
Finding a gap is only half the job. Drill decomposes that gap recursively, alternating between two kinds of split, until it reaches a driver specific enough to act on:- Component splits come from the measure’s own formula (
revenue→entrée revenue+add-on revenue). - Dimension splits cut by an attribute (
add-on revenue→ by category).
Two rules make the math honest
1
The denominator never changes
When the numerator is split by a dimension, the denominator is not
filtered along with it, so
sides/order means sides revenue divided by
all of that segment’s orders rather than by the sides count. If the
denominator changed, the children would stop summing to the parent.2
The benchmark is inherited, never re-picked
Every level compares the same two populations chosen at the root. If each
child picked its own best peer, the children would stop summing to the
parent and every percentage would be fiction.
Why those rules matter
Given both rules, the decomposition becomes an arithmetic identity rather than a fresh comparison at each level:What a drill looks like
sides/order = attach_rate × price_per_side) answers whether
the gap comes from fewer sides or cheaper sides, which is the classic
volume-versus-value question, and it does so inside the decomposition
without any extra machinery.
At each level, the drill:
- Enumerates candidates, meaning the component edges from the measure’s formula plus every dimension not already consumed higher up.
- Computes each child’s gap and its share of the parent gap.
- Ranks by concentration, identifying which child holds the most of the gap.
- Shows all children with their shares rather than just the winner, so siblings stay visible and “follow the max” remains a reading aid rather than a hidden selection.
- Recurses into the largest child.
- Stops when the next split fails the evidence gate, cannot be evidenced, has no candidates left, or reaches the maximum depth.
How to use it
1
Open the World Model Graph
Click the Globe icon in the icon rail to open the graph of your
semantic model.
2
Select a measure
Click a measure node. Oxygen scans its segments when the node opens and,
if it finds addressable upside, reveals an Opportunities section
labeled addressable upside · and where it comes from.
3
Read the ranked segments
Each row shows the segment, its per-unit rate against the benchmark
(
543.9 → 762.4 per order), the dollar upside, and a proportion bar. You
can use the copy button on a row to drop a ready-made investigation
question into chat.4
Drill into a gap
Expand a segment to decompose its gap. The drill runs only on expand,
never when the node first opens, because it issues recursive queries
against your warehouse. Follow the highlighted child downward until the
stop reason tells you there is nothing left to prove.
What your model needs
Opportunity Sizing is only as good as the semantic model underneath it, so to get the most out of it:- Declare a
countmeasure on the view. Without a count denominator, asummeasure cannot be put on a per-unit basis, and Oxygen will refuse to size it rather than compare totals. - Model your metrics compositionally. A measure defined as a sum or
difference of same-view measures (
net_revenue = entrée_revenue + add_on_revenue) gives the drill component edges to follow. Mirror trees work too, so agross_profittree that parallelsrevenuelets you drill margin the same way you drill revenue. - Keep dimensions meaningful to benchmark across. A dimension in which being “higher” is a matter of arithmetic rather than performance (party size, for example, since a 6-top spends more than a 2-top by definition) will dominate the ranking without telling you anything, so prefer dimensions where a gap reflects something you can change.
- Point it at measures where higher is better. Both benchmark bases are
top-end rates, so a segment below the benchmark is always read as upside.
That reading is right for revenue, margin, or conversion but backwards for
a cost, since a cost sum with a
counton its view would rank the cheapest segment as the biggest opportunity. Size the revenue or profit side instead, and let the drill walk into the cost components rather than rooting a scan on a cost measure.
Current scope
Opportunity Sizing is honest about what it can and cannot do, and about why it cannot. What it refuses, it refuses by design, because sizing those shapes would break the arithmetic identity the drill depends on. There is no “not yet” bucket: a shape either sizes today or marks a permanent boundary, and is never a quietly deferred promise. Works todaysumroots with acounton their view- Additive same-view composites (
a + b − c), including nested ones, where a composite whose child is itself a same-view composite flattens transitively - Homogeneous
+/−and×/÷expressions - Dimension splits and cross-grain numerators
Comparing a revenue drill against a margin drill side by side already works
today, since it is simply two drills read together. Ranking add-on leaves by
profit rather than revenue changes which leaf wins, so a true single-pass
co-ranking (“big revenue gap, thin margin”) would be a presentation
improvement rather than an engine limitation, given that the engine already
sizes each measure on its own.
In one paragraph
Oxygen sizes an opportunity as (per-unit rate gap against a benchmark segment) × volume, working per unit rather than on raw totals so that “smaller” never reads as “worse.” The drill then decomposes that gap recursively, alternating splits from the measure’s own formula with splits by dimension, while holding the denominator and the benchmark fixed all the way down. Those two constraints turn the decomposition into an arithmetic identity, which is what lets a child legitimately claim “91% of the parent gap” and guarantees that children sum back to the parent. The drill stops when the evidence gate can no longer prove the next split, and it always tells you why it stopped.Related documentation
Measures
Define the measures and composite metrics that Opportunity Sizing decomposes
Dimensions
The attributes the drill splits a gap by
The Metric Tree
How measures compose, and the driver edges the drill follows
World Model
How the semantic model, metric tree, and entity graph fit together