A line-item analysis of 6,942 priced order lines (Sep 2024 – Aug 2026) estimates price elasticity for each customer segment and converts it into quote-by-quote guidance for sales reps. The headline is not over-discounting. It is the opposite.
Order history contains enough natural price variation to estimate demand response in the B2C and Retail-wholesale segments. It also contains a systematic pricing error: on multi-unit wholesale lines, reps have been quoting above the quantity-break prices customers are entitled to — under-discounting, not over-discounting — with measurable churn risk attached.
What to do: (1) enforce quantity-break entitlement on every wholesale quote immediately — it is a discipline fix, not a price cut; (2) run controlled markdown tests on 53 over-priced B2C items where estimated elasticity says lower prices earn more profit; (3) inject deliberate price variation into Manufacturing-segment quotes, where two years of flat pricing has made demand response unmeasurable.
The item price book defines quantity breaks at 2, 3, 4, and 5+ units. On wholesale sales-order lines of two or more units, 1,261 of 1,544 lines (81.7%) were billed above the applicable break-tier price — $28,118 of excess in Manufacturing (cat. 4) and $18,788 in Retail (cat. 7) over 24 months. Example: 5-unit mattress lines billed at $485 against a qty-5 book price of $470.
Two of the accounts carrying this overcharge have gone quiet: Entenmanns LLC ($1,321 excess; no order since Jun 3) and Karmabit ($547; silent since Apr 21). Correlation is not proof of causation, but these are the two obvious churn candidates in the book.
The estimate pipeline is thin (10 quotes), but its pattern is one-directional: every lost/expired quote (EST11–EST15) carried a price ratio of 0.97–1.00 versus list, and the wholesale quotes to Blockster Inc. (EST16–EST20) sit at exactly 1.00 — no use of the quantity-break book despite 6–48-unit lines. The one converted quote (EST17 → SO4310) was also at full list, on the smallest order. Reps are not buying wins with margin; they are losing quotes without ever deploying the discount structure that already exists.
Pooled within-item estimation across 87 items and 1,029 item-months yields ε = −2.95 (95% CI −3.13 to −2.78, R² = 0.54). At that elasticity the profit-maximizing (Lerner) gross margin is ≈ 34%, yet most B2C items are listed at 45–65% margins. After shrinking noisy item-level estimates toward the pool, 53 items price above their profit-maximizing point; modeled repricing on trailing-12-month volumes projects +$19.5K profit per year (+24.6%) on this basket.
Across 668 Manufacturing-segment lines, the pooled within-item price variance is ≈ 0.03 in log terms — reps quote the same price every time (monthly average ratio to list stays inside 1.00–1.03 for 24 straight months). No estimator can recover demand response from data with no price movement. This is itself the finding: the segment has never been experimented on, and Finding 01 shows the one consistent deviation is in the customer-unfriendly direction.
Elasticity (ε) is the % change in units sold per 1% change in price. Estimates use only within-item price variation (each item is its own control), which removes item-mix bias. Whiskers show 95% confidence intervals.
B2C (ε ≈ −3): a 10% price cut adds ~30% units. With margins above the Lerner optimum, cuts on most items increase profit. Retail wholesale (ε ≈ −0.9): demand barely responds inside the observed ±5% band — these 8 accounts buy on relationship and assortment. Price moves here transfer margin without moving volume, which cuts both ways: broad discounts are wasteful, but overcharging is pocketed silently until the account quietly leaves. Manufacturing: see Experiment 3.
For every wholesale line of 2+ units, the billed rate was compared against the quantity-break tier price the line qualified for (price level 1, tier = min(qty, 5)). The excess is concentrated in the largest accounts — the ones with the most leverage to defect.
| Account | Segment | Orders (24 mo) | Revenue | Overcharge vs. break | Last order | Status |
|---|---|---|---|---|---|---|
| Jones Manufacturing | Manufacturing | 27 | $322,022 | $8,571 | Aug 22 | Active |
| Design Excellence Ltd. | Retail | 43 | $265,318 | $8,570 | Aug 29 | Active |
| Panaderia Co. | Manufacturing | 23 | $224,003 | $7,068 | Aug 13 | Active |
| Davis Supplies | Retail | 25 | $207,660 | $6,729 | Aug 16 | Active |
| Pineapple Republic | Manufacturing | 21 | $203,434 | $4,473 | Aug 4 | Active |
| Realpoint inc. | Manufacturing | 24 | $162,749 | $3,620 | Aug 31 | Active |
| Marshall Industries | Manufacturing | 15 | $122,417 | $3,177 | Aug 19 | Active |
| Entenmanns LLC | Retail | 14 | $60,376 | $1,321 | Jun 3 | CHURN RISK |
| Recreational Outfitters | Manufacturing | 23 | $131,606 | $1,208 | Aug 1 | Active |
| Blockster Inc. | Retail | 5 | $64,180 | $1,051 | Aug 31 | New — watch |
| Hugo Limited | Retail | 27 | $83,516 | $568 | Aug 31 | Active |
| Karmabit | Retail | 20 | $64,433 | $547 | Apr 21 | CHURN RISK |
| Quote | Customer | Value | Price vs. list | Outcome |
|---|---|---|---|---|
| EST11–EST14 | B2C walk-ins / Blockster | $52–$187 | 0.97 | Expired — no follow-up discount offered |
| EST15 | Design Excellence Ltd. | $531 | 1.00 | Expired at full list |
| EST16, 18–20 | Blockster Inc. | $748–$3,337 | 1.00 | Open — quoted at list despite 24–48-unit lines |
| EST17 | Blockster Inc. | $971 | 1.00 | Won → SO4310 — the smallest wholesale quote |
Ten quotes is too few for statistical treatment — this is presented as forensic corroboration, not inference. The open Blockster quotes (EST16, 18–20, $6.5K combined) are immediate candidates for re-issue at entitled break prices.
For each item with sufficient history (≥ 8 months of sales, ≥ 3 distinct price points), the raw item elasticity is shrunk toward the segment pool (ε̄ = −2.95) in proportion to its data weight, then the profit-maximizing price is computed from unit cost via the Lerner rule: p* = c · ε / (1 + ε). Items marked * are LOT-tracked cosmetics.
| Item | Months | ε raw | ε shrunk | List | Cost | p* | Δ | Action |
|---|---|---|---|---|---|---|---|---|
| MaxCover Foundation* | 9 | −3.79 | −3.35 | $40.00 | $15.00 | $21.39 | −46.5% | CUT |
| Plush High Volume Mascara* | 8 | −2.20 | −2.62 | $14.00 | $5.00 | $8.09 | −42.2% | CUT |
| Crew Neck T-Shirt TE | 16 | −2.18 | −2.48 | $29.99 | $10.99 | $18.43 | −38.6% | CUT |
| Crew Neck T-Shirt CM | 18 | −2.21 | −2.47 | $29.99 | $10.99 | $18.45 | −38.5% | CUT |
| Pink Plaid | 9 | −2.11 | −2.56 | $52.00 | $20.00 | $32.86 | −36.8% | CUT |
| Black Leather Valise | 10 | −1.56 | −2.26 | $359.99 | $129.00 | $231.75 | −35.6% | CUT |
| In-Shower Lotion | 10 | −2.60 | −2.78 | $12.00 | $5.00 | $7.82 | −34.9% | CUT |
| Patriarch Luxury Firm T M | 16 | −3.15 | −3.07 | $900.00 | $400.00 | $592.98 | −34.1% | CUT |
| Cable Knit Hat | 15 | −2.17 | −2.49 | $30.00 | $12.00 | $20.07 | −33.1% | CUT |
| Cleansing Shower Gel | 11 | −3.23 | −3.10 | $22.00 | $10.00 | $14.77 | −32.9% | CUT |
| Patriarch Luxury Firm T B | 16 | −2.94 | −2.94 | $900.00 | $400.00 | $605.94 | −32.7% | CUT |
| Attraction Velour Lashes* | 9 | −1.35 | −2.19 | $32.00 | $12.00 | $22.06 | −31.1% | CUT |
| Patriarch Luxury Firm F B | 16 | −2.70 | −2.80 | $900.00 | $400.00 | $622.74 | −30.8% | CUT |
| Dark Straight Leg | 16 | −3.85 | −3.50 | $40.00 | $20.00 | $27.99 | −30.0% | CUT |
| Luminizing Shield* | 14 | −2.86 | −2.90 | $24.00 | $11.00 | $16.80 | −30.0% | CUT |
| Canvas Backpack | 13 | −3.51 | −3.27 | $249.99 | $122.00 | $175.79 | −29.7% | CUT |
| Patriarch Luxury Firm F M | 14 | −2.50 | −2.69 | $900.00 | $400.00 | $636.88 | −29.2% | CUT |
| Indigo Relaxed Fit | 16 | −3.53 | −3.31 | $140.00 | $70.00 | $100.30 | −28.4% | CUT |
| Olive Utility Pack | 14 | −3.35 | −3.18 | $200.00 | $100.00 | $145.78 | −27.1% | CUT |
| Scalp Therapy Shampoo | 16 | −4.63 | −3.99 | $45.00 | $25.00 | $33.37 | −25.9% | CUT |
| Striped Scarf | 8 | −4.79 | −3.77 | $22.00 | $12.00 | $16.33 | −25.8% | CUT |
| Leather Square Pillow | 9 | −2.69 | −2.83 | $39.99 | $19.50 | $30.17 | −24.5% | CUT |
| Summer Hat | 10 | −2.68 | −2.82 | $39.00 | $19.00 | $29.45 | −24.5% | CUT |
| Ghost Whisperer Jacket BU M | 14 | −3.31 | −3.16 | $125.00 | $65.00 | $95.10 | −23.9% | CUT |
| Skinny Tinted | 20 | −3.51 | −3.33 | $150.00 | $80.00 | $114.39 | −23.7% | CUT |
| Ghost Whisperer Jacket GR S | 13 | −3.12 | −3.05 | $125.00 | $65.00 | $96.74 | −22.6% | CUT |
| Graceful Body Emulsion* | 10 | −1.02 | −1.99 | $52.00 | $20.00 | $40.28 | −22.5% | CUT |
| Salida Backpack II-RD | 10 | −4.65 | −3.80 | $110.00 | $62.95 | $85.43 | −22.3% | CUT |
| TLC Night Serum* | 15 | −5.23 | −4.32 | $50.00 | $30.00 | $39.03 | −21.9% | CUT |
| Salida Backpack II-GR | 10 | −4.51 | −3.73 | $110.00 | $62.95 | $85.97 | −21.8% | CUT |
| Ghost Whisperer Jacket GN S | 13 | −2.98 | −2.97 | $125.00 | $65.00 | $98.00 | −21.6% | CUT |
| Knapsack GN | 9 | −3.24 | −3.09 | $65.00 | $35.00 | $51.76 | −20.4% | CUT |
| Daily Nourishing Skin Supplement | 12 | −3.90 | −3.47 | $35.00 | $20.00 | $28.11 | −19.7% | CUT |
| Signature Eyeliner* | 8 | −1.33 | −2.23 | $22.00 | $10.00 | $18.13 | −17.6% | CUT |
| Aqua True Cream* | 16 | −4.78 | −4.08 | $40.00 | $25.00 | $33.12 | −17.2% | CUT |
| Leather Glove | 18 | −4.58 | −4.00 | $79.99 | $49.99 | $66.68 | −16.6% | CUT |
| Silver Watch w/ Leather Strap | 11 | −4.36 | −3.69 | $325.99 | $200.00 | $274.28 | −15.9% | CUT |
| Glamorous Attraction Eye Shadow* | 12 | −3.50 | −3.25 | $48.00 | $28.00 | $40.42 | −15.8% | CUT |
| White Blouse | 8 | −2.69 | −2.84 | $44.00 | $24.00 | $37.05 | −15.8% | CUT |
| 3-Tone Eye Shadow w/ Mirror* | 14 | −4.40 | −3.80 | $24.00 | $15.00 | $20.36 | −15.2% | CUT |
| Brown Leather Valise | 10 | −4.33 | −3.64 | $259.99 | $160.00 | $220.59 | −15.2% | CUT |
| Grey Fedora | 14 | −5.69 | −4.55 | $29.99 | $19.99 | $25.62 | −14.6% | CUT |
| Knapsack AQ | 10 | −2.39 | −2.67 | $65.00 | $35.00 | $55.93 | −13.9% | CUT |
| Sparkle and Glow* | 8 | −6.55 | −4.55 | $22.00 | $15.00 | $19.22 | −12.6% | CUT |
| The Gentleman | 12 | −5.82 | −4.52 | $80.00 | $55.00 | $70.64 | −11.7% | CUT |
| Black Leather Jacket | 20 | −5.26 | −4.49 | $289.00 | $200.00 | $257.32 | −11.0% | CUT |
| Rhinestone Blouse | 13 | −5.94 | −4.64 | $70.00 | $50.00 | $63.73 | −9.0% | CUT |
| Straight Leg Dark Grey | 16 | −1.72 | −2.20 | $66.00 | $33.00 | $60.60 | −8.2% | CUT |
| Pro Essentials Brush Set | 14 | −5.47 | −4.42 | $42.00 | $30.00 | $38.77 | −7.7% | CUT |
| Black Leather Belt | 13 | −8.17 | −5.90 | $46.99 | $37.00 | $44.54 | −5.2% | CUT |
| Salida Backpack BU | 12 | −8.05 | −5.73 | $100.00 | $80.00 | $96.90 | −3.1% | CUT |
| Glossy Balm* | 9 | −0.69 | −1.88 | $11.00 | $5.00 | $10.66 | −3.1% | CUT |
| Brown Leather Satchel | 11 | −5.53 | −4.30 | $399.99 | $299.99 | $390.82 | −2.3% | HOLD |
| Estes Park Upholstered Couch | 8 | −0.85 | −2.02 | $376.00 | $188.00 | $372.27 | −1.0% | HOLD |
| The Bindel Jacket | 17 | −11.41 | −8.28 | $319.00 | $280.00 | $318.46 | −0.2% | HOLD |
| Grey Cotton Hoodie | 15 | −2.11 | −2.45 | $49.99 | $30.55 | $51.68 | +3.4% | RAISE |
| Ghost Whisperer Jacket GR M | 17 | −1.13 | −1.80 | $125.00 | $65.00 | $145.94 | +16.8% | RAISE |
Applying each p* under constant-elasticity demand to trailing-12-month volumes: revenue on this basket rises from $160K to a projected $303K (volume more than offsets lower prices) and gross profit rises from $79.3K to $98.9K (+$19.5K, +24.6%). Projections carry the model's assumptions (below); the experiment plan exists to validate them before committing the book.
averagecost — stale standards for some items would move p* materially (p* scales linearly with cost).Three prices per line: floor (never below — escalate), target (open here), stretch (acceptable ceiling). All three are computable from data already on the quote: item, quantity, customer segment, unit cost.
Hard rule: never quote above the entitled quantity-break tier. The current +2% average markup nets ≈ $23K/yr but is invisible to the customer only until it isn't — two accounts with the pattern have already gone quiet. In a ~unit-elastic segment, honoring the break costs little margin and removes the churn trigger. Re-issue open Blockster quotes EST16/18/19/20 at break prices this week.
B2C pricing is a merchandising decision, not a negotiation. Rep discretion at POS should be zero; the elasticity work belongs in the price book itself.
Quote at list, discount only against commitment (volume agreements, multi-order contracts). Every early price becomes the anchor for the next negotiation; keep anchors high while the segment builds history.
The estimates above come from natural (mostly promotional) variation. These three controlled experiments convert them into causal, defensible numbers within one to two quarters.
custcol discount-reason field) so future elasticity work can separate experiment variation from noise.NetSuite production account TD3016323. Window: Sep 2024 – Aug 2026 (24 months). Universe: SalesOrd + CashSale lines (mainline='F', taxline='F', item lines, qty ≠ 0, rate > 0), joined to the pricing table (price level 1 — Base Price) at the quantity-break tier min(max(|qty|,1),5). 6,942 of 7,555 lines matched a book price; the unmatched remainder is mostly configurator/decoration items (WS-CFG-*) with no list price. Segments = customer.category: 4 Manufacturing, 7 Retail, 9 B2C, 3 IT. Estimate outcomes from nexttransactionlink (10 estimates, 1 conversion). Costs = item.averagecost.
Log-log demand: ln(q) = α_item + ε·ln(p/p_list). B2C: item-month aggregates (monthly unit-weighted avg. realized price vs. monthly units) per item, pooled across 87 items with ≥ 6 months and ≥ 2 price points; ε̂ = −2.954, SE 0.089 (pooled within-item OLS, 941 df). Retail/Mfg: line-level within-item pooling. Item-level estimates shrunk toward the segment pool: ε_item = w·ε̂_item + (1−w)·ε̄, w = months/(months+10). Optimal price by Lerner rule: p* = c·ε/(1+ε), defined only for ε < −1. Profit projections apply constant-elasticity volume response q₁ = q₀·(p*/p₀)^ε to trailing-12-month units.
SELECT
t.id AS tran_id,
t.tranid AS doc_number,
t.type AS tran_type,
t.trandate,
COALESCE(c.category, 0) AS segment,
tl.item AS item_id,
ABS(tl.quantity) AS qty,
tl.rate AS realized_rate,
p.unitprice AS list_price_at_break,
ROUND(tl.rate / p.unitprice, 4) AS price_ratio
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
AND tl.mainline = 'F' AND tl.taxline = 'F'
AND tl.item IS NOT NULL
LEFT JOIN customer c ON c.id = t.entity
JOIN pricing p ON p.item = tl.item
AND p.pricelevel = 1
AND p.quantity = LEAST(GREATEST(ABS(tl.quantity), 1), 5)
WHERE t.type IN ('SalesOrd', 'CashSale')
AND tl.quantity <> 0 AND tl.rate > 0 AND p.unitprice > 0
ORDER BY t.trandate, t.id, tl.item
SELECT COUNT(*) AS cells, SUM(n) AS obs,
SUM(sxy - sx*sy/n) AS wsxy, -- pooled Σ(x-x̄)(y-ȳ)
SUM(sxx - sx*sx/n) AS wsxx, -- pooled Σ(x-x̄)² → ε = wsxy / wsxx
SUM(syy - sy*sy/n) AS wsyy
FROM (
SELECT itm, COUNT(*) AS n, SUM(lx) AS sx, SUM(ly) AS sy,
SUM(lx*ly) AS sxy, SUM(lx*lx) AS sxx, SUM(ly*ly) AS syy
FROM (
SELECT tl.item AS itm, TO_CHAR(t.trandate,'YYYY-MM') AS mth,
LN(SUM(ABS(tl.quantity)*tl.rate)/SUM(ABS(tl.quantity))
/ MAX(p.unitprice)) AS lx, -- ln monthly avg price ratio
LN(SUM(ABS(tl.quantity))) AS ly -- ln monthly units
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
AND tl.mainline='F' AND tl.taxline='F' AND tl.item IS NOT NULL
JOIN customer c ON c.id = t.entity
JOIN pricing p ON p.item = tl.item AND p.pricelevel = 1 AND p.quantity = 1
WHERE t.type IN ('CashSale','SalesOrd') AND c.category = 9
AND tl.quantity <> 0 AND tl.rate > 0 AND p.unitprice > 0
GROUP BY tl.item, TO_CHAR(t.trandate,'YYYY-MM')
)
GROUP BY itm
HAVING COUNT(*) >= 6 AND COUNT(DISTINCT ROUND(lx,4)) >= 2
)
SELECT seg, COUNT(*) AS cells, SUM(n) AS lines,
SUM(sxy - sx*sy/n) AS pooled_sxy,
SUM(sxx - sx*sx/n) AS pooled_sxx,
SUM(syy - sy*sy/n) AS pooled_syy
FROM (
SELECT COALESCE(c.category,0) AS seg, tl.item AS itm, COUNT(*) AS n,
SUM(LN(tl.rate/p.unitprice)) AS sx,
SUM(LN(ABS(tl.quantity))) AS sy,
SUM(LN(tl.rate/p.unitprice)*LN(ABS(tl.quantity))) AS sxy,
SUM(LN(tl.rate/p.unitprice)*LN(tl.rate/p.unitprice)) AS sxx,
SUM(LN(ABS(tl.quantity))*LN(ABS(tl.quantity))) AS syy
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
AND tl.mainline='F' AND tl.taxline='F' AND tl.item IS NOT NULL
LEFT JOIN customer c ON c.id = t.entity
JOIN pricing p ON p.item = tl.item AND p.pricelevel = 1
AND p.quantity = LEAST(GREATEST(ABS(tl.quantity),1),5)
WHERE t.type IN ('SalesOrd','CashSale')
AND tl.quantity <> 0 AND tl.rate > 0 AND p.unitprice > 0
GROUP BY COALESCE(c.category,0), tl.item
HAVING COUNT(DISTINCT ROUND(tl.rate/p.unitprice,4)) >= 2 AND COUNT(*) >= 3
)
GROUP BY seg ORDER BY SUM(n) DESC
SELECT c.entityid AS customer, c.category,
MAX(t.trandate) AS last_order,
COUNT(DISTINCT t.id) AS orders_24m,
ROUND(SUM(CASE WHEN tl.rate > p.unitprice + 0.005 AND ABS(tl.quantity) >= 2
THEN (tl.rate - p.unitprice) * ABS(tl.quantity) ELSE 0 END), 2)
AS overcharge_vs_break,
ROUND(SUM(ABS(tl.netamount)), 2) AS revenue
FROM transaction t
JOIN customer c ON c.id = t.entity
JOIN transactionline tl ON tl.transaction = t.id
AND tl.mainline='F' AND tl.taxline='F' AND tl.item IS NOT NULL
JOIN pricing p ON p.item = tl.item AND p.pricelevel = 1
AND p.quantity = LEAST(GREATEST(ABS(tl.quantity),1),5)
WHERE t.type = 'SalesOrd' AND c.category IN (4,7) AND tl.rate > 0
GROUP BY c.entityid, c.category
ORDER BY overcharge_vs_break DESC
SELECT e.tranid AS estimate, e.status AS est_status,
so.tranid AS next_doc, so.type AS next_type, so.status AS next_status
FROM transaction e
LEFT JOIN nexttransactionlink ntl ON ntl.previousdoc = e.id
LEFT JOIN transaction so ON so.id = ntl.nextdoc
WHERE e.type = 'Estimate'
ORDER BY e.tranid
-- Estimate status codes: A = Open, B = Processed, X = Expired
SELECT s.itm AS item_id, i.itemid AS item_name, s.n AS months,
ROUND((s.n*s.sxy - s.sx*s.sy) / NULLIF(s.n*s.sxx - s.sx*s.sx, 0), 3) AS elasticity,
ROUND(POWER(s.n*s.sxy - s.sx*s.sy, 2)
/ NULLIF((s.n*s.sxx - s.sx*s.sx)*(s.n*s.syy - s.sy*s.sy), 0), 3) AS r2,
p.unitprice AS list_price, i.averagecost AS unit_cost
FROM ( /* item-month sums — inner query of Q2, HAVING n >= 8 and >= 3 price points */ ) s
JOIN item i ON i.id = s.itm
JOIN pricing p ON p.item = s.itm AND p.pricelevel = 1 AND p.quantity = 1
ORDER BY elasticitycustomer.category (9 B2C, 7 Retail, 4 Manufacturing, 3 IT). 18 uncategorized customers (~0.4% of lines) excluded from segment estimates.ABS(). transaction.subsidiary is not exposed to SuiteQL in this account; no subsidiary filter was needed because entity-level segmentation excludes the elimination subsidiary by construction.