Skip to content

Price elasticity in CPG: measure it, then use it

What price elasticity measures

Price elasticity is the percentage change in units sold divided by the percentage change in price. If Verde Fresca drops its 16 oz fermented salsa from $6.49 to $5.99 and weekly units per store go from 3.2 to 4.1, price fell 7.7% and units rose 28.1%, so the elasticity is 28.1 / -7.7, or -3.65. The number is negative because the two move in opposite directions, and its size is the part that matters: anything past -1.0 means the category is buying volume with margin.

That is the whole formula. The hard part is not the arithmetic, it is that a single elasticity number is almost always answering a different question than the one the brand manager asked. This page covers the calculation, the two elasticities people confuse, the price thresholds that make the curve stop being a curve, and what to check in your own POS data before you trust any of it.

How to calculate price elasticity from POS data

The formula everyone writes down is the arc, or midpoint, version. It uses the average of the two prices and the two quantities as the base, so you get the same answer whether you read the change as a cut or as an increase:

E = ((Q2 - Q1) / ((Q2 + Q1) / 2))  /  ((P2 - P1) / ((P2 + P1) / 2))

Run the Verde Fresca numbers through it and the midpoint method gives -3.08 rather than the -3.65 the simple percentage method gave. Neither is wrong. They answer slightly different questions, and the gap between them grows as the price move gets bigger, which is the first sign that elasticity is a local measurement and not a property of the product.

Four things have to be true of the inputs before the output means anything:

  • Price is the retail price the shopper saw, not your list price and not your net price after trade. In SPINS and Circana that is average retail price per unit, which already blends promoted and non-promoted weeks. Blending is fine as long as you know you are doing it.
  • Units are equivalized if the pack sizes moved. A 16 oz to 12 oz downsize reads as a price cut per unit and a price increase per ounce. See equivalized volume for which one your report is using.
  • Distribution is flat across the window. This is the one that quietly ruins most elasticity work. If Verde Fresca went from 412 to 486 Sprouts doors in the same period it took the price down, some of that 28% lift is new doors, not price response. Measure velocity per store per week, not total units, and check TDP at both ends of the window.
  • The competitive set held still. If the mainstream fresh salsa next to you ran $3.99 for two of your four weeks, you measured their promotion, not your price.

Base elasticity and promoted elasticity are not the same number

This is the distinction that makes most published elasticity figures unusable without a label attached.

Base price elasticity is the response to a sustained shelf-price level. It is what you want when the question is "should this SKU list at $5.99 or $6.49." It is measured across quarters, not weeks, and in food CPG it usually lands somewhere between -1.0 and -2.5.

Promoted elasticity is the response to a temporary price reduction. It captures three behaviors the base number does not: shoppers switching brands for one trip, shoppers pulling forward a purchase they would have made next month, and shoppers buying two instead of one. It routinely runs -3 to -6 in the same category where base elasticity is -1.5.

The two published meta-analyses people cite most illustrate the spread. Gerard Tellis, reviewing 367 elasticity estimates in the Journal of Marketing Research in 1988, found a mean of -1.76. Bijmolt, van Heerde and Pieters, running a larger meta-analysis in the same journal in 2005, found a mean of -2.62. Both are correct; they weight promoted and non-promoted measurement differently. If someone hands you a category elasticity with no note on which kind it is, the number is decoration.

The practical consequence: a -3.65 measured on a four-week TPR tells you what the promotion did. It does not tell you what happens if you take the everyday price to $5.99 and leave it there. Teams that use the promoted number to justify a permanent price cut are the reason "we cut price and volume never came" is a familiar sentence.

MeasurementTypical rangeWhat it answersWhat it cannot answer
Base price elasticity-1.0 to -2.5Where to set the everyday shelf priceHow a promotion will perform
Promoted elasticity-3.0 to -6.0Depth and frequency of a TPRWhether a permanent cut works
Cross-price elasticity+0.1 to +1.5Which competitor you steal fromCategory expansion

Elastic, inelastic, and the scale in between

The scale is read on absolute value, ignoring the minus sign:

  • |E| greater than 1: elastic. Units move proportionally more than price. Revenue rises when you cut and falls when you raise. Most branded center-store food sits here, and so does anything with a close substitute one facing away.
  • |E| less than 1: inelastic. Units move proportionally less than price. Revenue rises when you raise price. Staples with no substitute, small-basket impulse items, and genuinely differentiated products sit here.
  • |E| equal to 1: unitary elastic. Revenue is unchanged by the price move. It is a textbook boundary more than an observed state, useful mainly as the line where the revenue effect flips sign.

Examples from a real center-store set, in rough order of price sensitivity: private-label paper goods and bottled water are the classic elastic goods, since one brand substitutes cleanly for another and the shopper has no loyalty to defend. Mainstream carbonated soft drinks are elastic and heavily promoted. Refrigerated fermented and probiotic items, where the buyer picked the product for a specific functional reason, tend toward inelastic. Baby formula, pet prescription diets, and single-source specialty ingredients are strongly inelastic. Salt is the economics-textbook example and also a real one.

What moves a specific SKU along that scale is not the category label. It is how many acceptable substitutes sit within arm's reach on that fixture, which is why the same product can be elastic at a conventional grocer with a nine-item set and inelastic at a natural retailer where it is one of two options.

Can price elasticity be negative? Almost always, and that is the point

Yes, and for normal goods it essentially always is. Demand curves slope down, so a price increase produces a unit decrease, and dividing a negative by a positive gives a negative.

Two conventions cause most of the confusion. Many practitioners and most software report the absolute value, so "elasticity of 2.4" means -2.4. And a handful of goods genuinely show positive elasticity: Veblen goods, where price is the status signal, and cases where price is read as a quality proxy in an unfamiliar category. In CPG the second one shows up occasionally in premium tiers of new functional categories, where a $3.99 item can underperform the $6.49 item next to it because shoppers read cheap as ineffective. Confirm which convention a report uses before you compare two numbers.

Price thresholds: where the curve stops being a curve

Elasticity assumes a smooth response. Real shopper behavior has steps in it.

A price threshold is a price point where demand changes disproportionately for a move that is arithmetically trivial. The move from $4.99 to $5.09 is 2%, but it crosses a psychological boundary, and units can fall far more than 2% because the item stopped reading as "four dollars something." Threshold pricing is the practice of setting price deliberately against those boundaries rather than against a margin target.

Three kinds show up on a shelf:

  • Round-number thresholds. $5, $10, $20. Crossing one costs more volume than the percentage suggests.
  • Charm-price endings. The 9-ending effect is one of the few pricing findings with clean field-experiment support. Eric Anderson and Duncan Simester, in Quantitative Marketing and Economics in 2003, ran catalog experiments where a $39 price outsold both $34 and $44 for the same item. Price went up, demand went up, purely on the ending.
  • Competitive-gap thresholds. The point where your price relative to the item next to you crosses what the shopper treats as "meaningfully more expensive." This one is category-specific and is best found in your own data, not borrowed.

Thresholds are why a linear elasticity model recommends prices that lose money. The model interpolates smoothly through $4.99 and reports that $5.09 costs you 2% of units. Test the point, do not model through it.

Price image is the version of this the shopper carries around

Price image is a shopper's overall belief about how expensive a store or a brand is. It is formed from a small number of items they happen to track, not from the average of the basket, which is why a retailer can raise price on 400 slow-movers and lose nothing, then raise it on milk and eggs and get punished.

For a brand, price image is why the key value item in your lineup deserves different treatment than the rest. If your 16 oz is the size shoppers price-check and your 32 oz is not, the 16 oz is carrying your brand's price image and should be priced against perception; the 32 oz can be priced against margin. Getting that backwards is common and expensive, and it does not show up in an elasticity regression at all, because the effect lands on the whole lineup rather than on the item you moved.

Worked example: reading one price move honestly

Verde Fresca, 16 oz fermented salsa, Sprouts, 412 stores, four weeks at $5.99 against a $6.49 base. Here is what the raw read said and what survived checking.

MetricPre (4 wk)Promo (4 wk)Change
Average retail price$6.49$5.99-7.7%
Units per store per week3.24.1+28.1%
Stores selling412419+1.7%
Total units5,2746,872+30.3%
Gross revenue$34,228$41,163+20.3%
Gross margin rate42.0%37.2%-4.8pt
Contribution (margin $)$14,376$15,296+6.4%

The headline elasticity of -3.65 is real and it is also the wrong number to plan with. Three corrections:

  1. Seven stores were added mid-window. Using total units gives +30.3% and an elasticity of -3.94. Velocity per store gives +28.1% and -3.65. The second is the price effect; the first includes distribution.
  2. Two of the four weeks overlapped a competing brand's $3.99 endcap. Those two weeks ran 4.6 units per store per week against 3.6 in the other two. The endcap pulled traffic into the whole set and lifted us with it, so those are the contaminated weeks, not the good ones. Strip them and the price-only elasticity is closer to -1.6, which is a base-like number and a far better input to a shelf-price decision.
  3. The margin rate falls less than it looks, and the arithmetic is easy to get backwards. Cost of goods is fixed at $3.76 (58% of the $6.49 base), so at $5.99 the gross margin rate is (5.99 - 3.76) / 5.99 = 37.2%, not 34%. The 34% figure comes from dividing the new margin dollars by the old price, which is the most common error in this calculation. At $2.23 of margin per unit against $2.73 before, volume has to rise 2.73 / 2.23 - 1 = 22.5% to hold contribution flat.

So the promotion cleared break-even: 28.1% against a 22.5% hurdle, and contribution rose 6.4%. That is the part the raw read got right.

What it got wrong is why. At the corrected price-only elasticity of -1.6, a 7.7% cut buys about 12.5% more volume, which is well under the 22.5% hurdle. Most of the measured lift came from the competitor's endcap traffic, not from the price move. So this promotion made money on a tailwind that will not repeat, and the same $5.99 as a permanent shelf price would lose money on every unit. Those are different decisions, and only the corrected numbers tell them apart.

For the mechanics of separating promoted weeks from the underlying trend, see post-promo lift versus baseline. For where a price sits relative to its competitive set rather than to its own history, see retail price index.

Where Scout fits

Scout computes base and promoted elasticity separately off your own POS and syndicated feeds, holding distribution constant so a door count change never reads as price response. It flags the competitor promotions overlapping your window, because that single correction moved the Verde Fresca number from -3.65 to -1.6, and it carries the deduction cost of a promotion into the contribution line through billback_uplift so the margin math reflects what the retailer actually takes.

Scout models and recommends the price and promotion decision. It does not hold your price file or transmit a price change to a retailer; that stays in your system of record.

Common ways this goes wrong

  • Reporting one elasticity per brand. Elasticity is per SKU, per retailer, per price zone. A brand-level average blends an inelastic hero item with an elastic secondary size and describes neither.
  • Measuring across a pack-size change. Equivalize first or the number is arithmetic noise.
  • Using promoted elasticity for an everyday-price decision. Covered above, and worth repeating because it is the most expensive version of this mistake.
  • Reading elasticity off a window with a distribution change. Velocity per store per week, always.
  • Modeling smoothly through a threshold. Test $4.99 against $5.09; do not interpolate.
  • Ignoring the cross-price term. An elastic SKU that steals entirely from your own second item has grown nothing. Cross-price elasticity against your own lineup is the cannibalization check.

Want this as a Google Sheet?

Drop your email and we'll send the worked example.

Book a demo with your data