The elasticity question has a finding before it has a number: this business has never run the experiment. Across 121 SKUs, 3,236 lines and 23.7 months, list prices within every quantity tier were checked for change events — there are zero. Every SKU has sold at exactly one price per tier for two years. Classical elasticity (observed volume response to observed price change) is therefore not estimable from this data, and any report claiming otherwise from this dataset would be manufacturing numbers.
What the data does support — and what this study delivers — is a behavioral price-sensitivity model built from how customers demonstrably respond to the price structure that does exist: the five-tier quantity-break schedule. Customers who repeatedly land orders exactly on tier thresholds (5, 10, 15, 20 units) are provably price-aware — they engineer order sizes to capture breaks. Customers who buy odd quantities at list are price-takers. Combined with breakeven volume-loss tolerance (how much volume each repriced SKU can afford to lose before the increase backfires — computable exactly from margin structure), this bounds each action's true risk without pretending to a regression the data cannot support.
The headline results: price increases are most likely to be absorbed at retail (zero bunching, list-price takers, low ticket sizes) and on low-margin SKUs where breakeven tolerance is enormous (Estes Park Chair can lose 92% of volume and still profit from a +31% increase). They are most likely to cost orders in the high-bunching wholesale accounts (Pineapple Republic 96%, Panaderia 92%, Davis Supplies 92% threshold-bunching) — where buyers demonstrably manage to price structure. The ranked 14-action plan yields $24.8K/yr if no volume is lost, $22.2K/yr at −5%, $19.7K/yr at −10% — the plan is profitable under every plausible demand response.
Two years of frozen prices through a period when supplier costs rose up to 100% means this business has been running a one-sided experiment: cost discovery without price discovery. The recommended Wave 1 actions double as instrumented price tests — executed with 90-day volume checkpoints, they generate the first real elasticity observations this account has ever produced, making every subsequent pricing decision better-informed.
Elasticity estimation requires price variation. The test: for every SKU × quantity-tier cell, count distinct realized unit prices (rounded to cents). If list prices ever moved, cells would show ≥2 distinct prices with a date boundary between them.
| Test | Cells Tested | Cells with a Price Change | Implication |
|---|---|---|---|
| Distinct unit prices per SKU × tier | ~480 | 0 | No SKU's price ever changed within a tier |
| Monthly realized % of list (prior study) | 24 months | 0 trend breaks | 96.4–97.9% every month; no schedule drift |
| Discount/markup line items | — | 0 rows | No promotional price variation either |
What we use instead — three honest instruments:
① Threshold-bunching rate — share of wholesale lines (qty ≥5) landing on exact multiples of 5. Under price-indifference, order quantities would scatter; a buyer whose orders land on {5,10,15,20…} 90%+ of the time is engineering quantities to capture 1%-per-tier breaks — revealed price-awareness at the margin. ② Breakeven volume-loss tolerance — for each proposed increase, the exact volume loss at which the action stops adding gross profit: v* = 1 − GP₀ ÷ (R(1+p) − C). This is arithmetic, not estimation — it bounds how much elasticity the action can survive. ③ Cross-price-point margin dispersion — SKUs already selling successfully at 46–52% category margins prove the customer base tolerates those price levels for comparable goods; the 14 outliers are priced below what the same buyers demonstrably pay elsewhere in the catalog.
| Account / Segment | Rep | Revenue (2yr) | Threshold-Bunching | Active Months / 24 | Price-Sensitivity Read |
|---|---|---|---|---|---|
| Pineapple Republic | M. Fisher | $203,434 | 96% | 21 | Extreme — orders engineered to tiers |
| Panaderia Co. | M. Fisher | $224,003 | 92% | 23 | Extreme |
| Davis Supplies | T. Dietrich | $194,680 | 92% | 23 | Extreme |
| Recreational Outfitters | M. Fisher | $131,606 | 84% | 23 | High |
| Entenmanns LLC | T. Dietrich | $60,376 | 81% | 14 | High, intermittent buyer |
| Realpoint inc. | M. Fisher | $158,750 | 78% | 22 | High |
| Design Excellence Ltd. | T. Dietrich | $238,487 | 76% | 24 | High, most consistent buyer |
| Jones Manufacturing | T. Dietrich | $316,493 | 74% | 23 | High — largest account |
| Hugo Limited | T. Dietrich | $77,964 | 73% | 24 | High |
| Karmabit | T. Dietrich | $64,433 | 69% | 20 | Moderate-high |
| Marshall Industries | J. Williams | $121,567 | 62% | 13 | Moderate, intermittent |
| Blockster Inc. | T. Dietrich | $52,750 | 0% | 2 | Project buyer — one-off large orders |
| (Retail walk-in — 66 customers) | — | $254,616 | ~0% | 24 | Price-takers — absorption likely |
① Retail walk-in (both stores, $255K/2yr) — zero bunching, 1–4 unit tickets, no account relationship to renegotiate. A list increase on the 14 underpriced SKUs passes through ~66 anonymous small buyers. ② Ultra-low-margin SKUs with huge breakeven tolerance — Estes Park Chair (+31% price, survives 92% volume loss), Bindel Jacket (+25%, survives 70%), Black Leather Belt (+20%, survives 52%). The math is lopsided: when margin is 2.6%, almost any price is better than the current one, even if most buyers walk. ③ SKUs where the same buyers already pay category-median margins on comparable items — the increase moves the outlier to the price level its own customers already accept elsewhere in the basket.
① The extreme-bunching trio — Pineapple Republic, Panaderia, Davis Supplies ($622K/2yr combined). These buyers audit price structure order-by-order; increases here need rep-led communication, not silent price-file edits. ② Single-account-dependent SKUs — Basil Lemon Hand Wash (62% of revenue from one account, 97% bunching), The Gentleman (62% top-account share): one defection erases the SKU's uplift. ③ Anything touching Jones Manufacturing ($316K, largest account, 74% bunching) without a conversation first.
Each action scored 0–100 (higher = riskier), 20 points per factor, all computed from account data — no judgment weights hidden in prose:
| Factor (0–20) | Measures | Computation |
|---|---|---|
| Buying consistency | Is demand steady enough to detect a response? | 20 × (1 − active months ÷ 24) |
| Purchase frequency | Will we get feedback quickly? | 20 × (1 − min(lines/mo, 2) ÷ 2) |
| Customer dependency | Can one defection kill the SKU? | 20 × top-customer revenue share |
| Margin headroom | How defensible is the move? | 20 × (1 − margin gap ÷ 46pts) — bigger gap = more defensible = lower risk |
| Observed elasticity proxy | Do this SKU's buyers demonstrably optimize on price? | 20 × (0.7 × bunching rate + 0.3 × wholesale revenue share) |
| SKU | Consist. | Freq. | Depend. | Headroom | Elast. | Risk | Profile |
|---|---|---|---|---|---|---|---|
| Black Leather Jacket | 2.5 | 2.3 | 8.0 | 12.4 | 10.4 | 36 | |
| The Bindel Jacket | 4.2 | 4.4 | 7.8 | 4.5 | 16.2 | 37 | |
| The Gentleman | 0.8 | 0.2 | 12.3 | 9.5 | 15.5 | 38 | |
| Rhinestone Blouse | 6.7 | 7.3 | 8.6 | 11.3 | 11.3 | 45 | |
| Scarlet Shimmer | 5.8 | 9.5 | 9.9 | 10.4 | 10.1 | 46 | |
| Pro Essentials Brush Set | 6.7 | 7.3 | 8.6 | 8.5 | 16.0 | 47 | |
| Brown Leather Satchel | 6.7 | 8.2 | 8.2 | 9.8 | 16.1 | 49 | |
| Basil Lemon Hand Wash | 0.8 | 5.2 | 12.4 | 11.3 | 19.5 | 49 | |
| Estes Park Chair | 8.3 | 11.6 | 11.1 | 0.0 | 19.2 | 50 | |
| Salida Backpack BU | 6.7 | 9.5 | 9.5 | 7.3 | 16.7 | 50 | |
| Salida Backpack GR | 8.3 | 11.1 | 9.7 | 7.3 | 13.1 | 50 | |
| Aqua True Cream | 4.2 | 4.4 | 9.5 | 12.3 | 19.2 | 50 | |
| Black Leather Belt | 5.8 | 9.9 | 9.2 | 8.0 | 17.5 | 50 | |
| 3-Tone Eye Shadow w/ Mirror | 6.7 | 8.6 | 8.7 | 12.3 | 19.5 | 56 |
Ranking = conservative annualized GP uplift (at −5% volume) ÷ risk score. Every action shown with its expected effect under three demand responses; v* = breakeven volume-loss tolerance (the action destroys value only beyond this).
| # | Wave | SKU | Price Δ | Risk | ΔGP @ 0% vol | ΔGP @ −5% | ΔGP @ −10% | ΔRev @ −5% | v* (breakeven) |
|---|---|---|---|---|---|---|---|---|---|
| 1 | W1 | The Bindel Jacket | +24.9% | 37 | $4,079 | $3,789 | $3,499 | +$3,056 | 70% |
| 2 | W1 | The Gentleman | +20.0% | 38 | $3,653 | $3,218 | $2,782 | +$2,557 | 42% |
| 3 | W2 | Estes Park Chair | +31.0% | 50 | $4,020 | $3,802 | $3,585 | +$3,171 | 92% |
| 4 | W2 | Brown Leather Satchel | +17.9% | 49 | $3,489 | $3,094 | $2,698 | +$2,340 | 44% |
| 5 | W1 | Black Leather Jacket | +14.0% | 36 | $2,610 | $2,212 | $1,814 | +$1,547 | 33% |
| 6 | W2 | Salida Backpack BU | +21.3% | 50 | $1,220 | $1,110 | $1,000 | +$873 | 55% |
| 7 | W3† | Basil Lemon Hand Wash | +17.1% | 49 | $1,273 | $1,090 | $908 | +$837 | 35% |
| 8 | W2 | Salida Backpack GR | +21.2% | 50 | $1,132 | $1,029 | $927 | +$808 | 55% |
| 9 | W3 | Pro Essentials Brush Set | +21.6% | 47 | $661 | $589 | $517 | +$475 | 46% |
| 10 | W3 | Rhinestone Blouse | +15.7% | 45 | $598 | $519 | $439 | +$378 | 38% |
| 11 | W3 | Aqua True Cream | +15.5% | 50 | $622 | $522 | $422 | +$390 | 31% |
| 12 | W3 | Scarlet Shimmer | +18.7% | 46 | $514 | $447 | $380 | +$351 | 38% |
| 13 | W3 | Black Leather Belt | +20.4% | 50 | $479 | $434 | $388 | +$338 | 52% |
| 14 | W3 | 3-Tone Eye Shadow w/ Mirror | +15.7% | 56 | $458 | $386 | $313 | +$290 | 32% |
| Total — annualized | $24,808 | $22,241 | $19,672 | +$17,411 | |||||
Universe identical to the prior study (CustInvc + CashSale product lines, elimination sub excluded, ≥5-line SKUs, delivery service excluded; 3,236 lines / $2.105M / 23.7 months; annualization ×0.507). Price-change scan: distinct realized unit prices per SKU × quantity-tier (0 change events found). Bunching: share of qty≥5 lines with qty ≡ 0 (mod 5). Dependency: top-customer share of SKU revenue. Consistency/frequency: active months of 24, lines per month. Headroom: gap to category-median margin (Apparel 46.2%, Beauty 51.9%, Home & Decor 48.6%). Scenario math: ΔGP(p, v) = (1−v)·(R(1+p) − C) − (R − C); v* solves ΔGP = 0.
(1) No true elasticity is claimed. All sensitivity reads are behavioral proxies (bunching, breakeven bounds, cross-price-point evidence); they bound but do not measure demand response. (2) Cost held constant in scenarios; costestimate is the cost of record. (3) Volume-loss scenarios (0/−5/−10%) applied uniformly per SKU; concentrated defection is addressed via the dependency factor and wave sequencing, not the scenario math. (4) Cross-SKU contagion (a defecting account dropping other SKUs) is managed procedurally (waves, rep conversations), not modeled. (5) The 5-unit bunching baseline under random ordering ≈ 20%; observed 62–96% is treated as deliberate optimization. (6) Half-gap price increases from the prior study carried over unchanged.
With zero historic price events, this report's sensitivity model cannot be validated in-sample — it is falsifiable only by running Wave 1. That is by design: the plan's first wave doubles as its own validation experiment, and the 90-day checkpoints convert this report from estimate to measurement.
-- Distinct realized unit prices per SKU x quantity-tier; dp > 1 = a price change happened SELECT s2.itm, i.itemid AS sku, s2.tier, s2.dp AS distinct_prices, s2.minp, s2.maxp FROM ( SELECT tl.item AS itm, CASE WHEN ABS(tl.quantity) >= 20 THEN 'T5' WHEN ABS(tl.quantity) >= 15 THEN 'T4' WHEN ABS(tl.quantity) >= 10 THEN 'T3' WHEN ABS(tl.quantity) >= 5 THEN 'T2' ELSE 'T1' END AS tier, COUNT(DISTINCT ROUND(ABS(tl.netamount / tl.quantity), 2)) AS dp, ROUND(MIN(ABS(tl.netamount / tl.quantity)), 2) AS minp, ROUND(MAX(ABS(tl.netamount / tl.quantity)), 2) AS maxp FROM transaction t JOIN transactionline tl ON tl.transaction = t.id JOIN item i2 ON i2.id = tl.item WHERE t.type IN ('CustInvc','CashSale') AND tl.mainline = 'F' AND tl.taxline = 'F' AND tl.subsidiary <> 4 AND tl.quantity <> 0 AND tl.netamount <> 0 AND i2.itemtype IN ('InvtPart','Kit','Assembly','NonInvtPart') AND i2.id <> 284 GROUP BY tl.item, CASE WHEN ABS(tl.quantity) >= 20 THEN 'T5' WHEN ABS(tl.quantity) >= 15 THEN 'T4' WHEN ABS(tl.quantity) >= 10 THEN 'T3' WHEN ABS(tl.quantity) >= 5 THEN 'T2' ELSE 'T1' END ) s2 JOIN item i ON i.id = s2.itm WHERE s2.dp > 1 ORDER BY s2.dp DESC -- Result in this account: ZERO ROWS. No SKU's price ever changed within a tier.
SELECT i.itemid AS sku, COUNT(*) AS ln, COUNT(DISTINCT t.entity) AS custs,
COUNT(DISTINCT TO_CHAR(t.trandate,'YYYY-MM')) AS active_months,
SUM(CASE WHEN ABS(tl.quantity) >= 5 THEN 1 ELSE 0 END) AS wholesale_lines,
SUM(CASE WHEN ABS(tl.quantity) >= 5 AND MOD(ABS(tl.quantity),5) = 0
THEN 1 ELSE 0 END) AS threshold_lines, -- bunching numerator
ROUND(SUM(ABS(tl.netamount)), 0) AS rev
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
JOIN item i ON i.id = tl.item
WHERE /* standard universe filters */
GROUP BY i.itemid HAVING COUNT(*) >= 5
ORDER BY rev DESC
SELECT sub.sku, ROUND(MAX(sub.crev) / SUM(sub.crev), 3) AS top1_share, COUNT(*) AS cust_count
FROM (
SELECT i.itemid AS sku, t.entity AS cust, SUM(ABS(tl.netamount)) AS crev
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
JOIN item i ON i.id = tl.item
WHERE /* standard universe filters */
GROUP BY i.itemid, t.entity
) sub
GROUP BY sub.sku HAVING SUM(sub.crev) > 0
SELECT CASE WHEN c.salesrep IS NULL THEN '(RETAIL WALK-IN)' ELSE c.entityid END AS account,
MAX(COALESCE(e.entityid,'-')) AS rep,
COUNT(DISTINCT t.id) AS trx, COUNT(DISTINCT tl.item) AS skus,
COUNT(DISTINCT TO_CHAR(t.trandate,'YYYY-MM')) AS active_months,
SUM(CASE WHEN ABS(tl.quantity) >= 5 THEN 1 ELSE 0 END) AS ws_lines,
SUM(CASE WHEN ABS(tl.quantity) >= 5 AND MOD(ABS(tl.quantity),5) = 0
THEN 1 ELSE 0 END) AS threshold_lines,
ROUND(SUM(ABS(tl.netamount)), 0) AS rev
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
JOIN customer c ON c.id = t.entity
LEFT JOIN employee e ON e.id = c.salesrep
JOIN item i ON i.id = tl.item
WHERE /* standard universe filters */
GROUP BY CASE WHEN c.salesrep IS NULL THEN '(RETAIL WALK-IN)' ELSE c.entityid END
ORDER BY rev DESC
-- Run monthly after each wave; compare units/account to the pre-change baseline SELECT TO_CHAR(t.trandate,'YYYY-MM') AS mo, i.itemid AS sku, CASE WHEN c.salesrep IS NULL THEN '(RETAIL)' ELSE c.entityid END AS account, SUM(ABS(tl.quantity)) AS units, COUNT(DISTINCT t.id) AS orders, ROUND(SUM(ABS(tl.netamount)), 2) AS rev FROM transaction t JOIN transactionline tl ON tl.transaction = t.id JOIN customer c ON c.id = t.entity JOIN item i ON i.id = tl.item WHERE /* standard universe filters */ AND i.itemid IN ( /* repriced SKU list for the active wave */ ) AND t.trandate >= TO_DATE(/* wave go-live minus 6 months */, 'YYYY-MM-DD') GROUP BY TO_CHAR(t.trandate,'YYYY-MM'), i.itemid, CASE WHEN c.salesrep IS NULL THEN '(RETAIL)' ELSE c.entityid END ORDER BY 2, 3, 1
// Per SKU: R = annualized revenue, C = annualized cost, p = price increase, v = volume loss
deltaGP(p, v) = (1 - v) * (R*(1+p) - C) - (R - C)
vStar = 1 - (R - C) / (R*(1+p) - C) // breakeven volume-loss tolerance
risk (0-100) = 20*(1 - activeMonths/24) // buying consistency
+ 20*(1 - min(linesPerMonth, 2)/2) // purchase frequency
+ 20*(top1CustomerShare) // customer dependency
+ 20*(1 - marginGapPts/46) // margin headroom (defensibility)
+ 20*(0.7*bunchingRate + 0.3*wholesaleRevShare) // elasticity proxy
rank score = deltaGP(p, 0.05) / risk // conservative uplift per risk point