Price elasticity of demand is the percentage change in the quantity people buy divided by the percentage change in price, so an elasticity of −2 means a 1 percent price rise cuts unit sales by about 2 percent. When the number is below −1, demand is “elastic” and a price rise loses more volume than it gains in price; between −1 and 0 it’s “inelastic” and a price rise increases revenue. For marketers the useful part is what comes next: combined with your unit cost, the elasticity tells you the price that maximizes contribution, and it’s one of the levers a marketing mix model has to account for before it can credit advertising fairly.
Price is the lever marketers most often leave to someone else, which is a shame, because it usually moves profit faster than any media reallocation. The early Vexpower simulator course “What price maximizes profit?” started from the observation that most businesses guess at pricing and move on. This page takes the marketing mix angle, from estimating own-price elasticity with a log-log model to the reasons most naive estimates come out wrong.
The price elasticity of demand formula
The definition is a ratio of percentage changes:
With only two observations (say price went from £20 to £22 and weekly units from 1,500 to 1,300) you can use the midpoint, or “arc”, version, which divides each change by the average of the two values so the answer doesn’t depend on which direction you went. Here that’s −200 ÷ 1,400 = −14.3 percent of quantity against +2 ÷ 21 = +9.5 percent of price, an elasticity of about −1.5. It’s a fine back-of-the-envelope number, but it treats everything else that changed between those two weeks (a holiday, a competitor’s sale, a burst of advertising) as if it were the price effect.
This page is about own-price elasticity (how a product’s demand responds to its own price). Cross-price elasticity, how your demand responds to a competitor’s price, matters too, and in practice it’s the main reason to include competitor prices as controls. As a rough anchor for what “normal” looks like, Gerard Tellis’s 1988 meta-analysis of 367 brand-level estimates found an average price elasticity of −1.76, though individual products range from near zero to well below −3, so it’s no substitute for estimating your own.
Estimating elasticity with a log-log model
The standard way to estimate elasticity from many weeks of data is a log-log model: regress the natural log of quantity on the natural log of price.
The slope is the elasticity directly, because a small change in a log is approximately a percentage change. That’s the whole appeal: no conversion step, and the model assumes a constant elasticity, meaning a 1 percent price rise costs the same percentage of volume whether you start at £18 or £28. Undoing the logs gives the demand curve , which bends the way real demand curves do. (If you log only the outcome and keep price in levels, you get a log-linear model, where the elasticity changes with the price level instead.)
The tool below fits exactly this regression on whatever price and quantity pairs you give it. The default data is 26 synthetic weeks generated from a curve with a known elasticity plus noise, which is a useful way to see how much a clean-looking dataset can still leave uncertain.
On the default data the estimate is about −2.67, with a 95 percent confidence interval of roughly −2.97 to −2.37. That’s fairly tight, because the price varied a lot (from £17.50 to £29.50) and nothing else was moving in the synthetic data. In real data both conditions are rare. Switch the chart to log-log axes and the curve becomes a straight line, which is a quick visual check that the constant-elasticity form fits: if your points bend away from the line at one end, a single elasticity is hiding a change in behavior.
From elasticity to the profit-maximizing price
Once you have an elasticity and a unit cost, finding the best price is a short derivation. Contribution is , where MC is the marginal (variable) cost of one more unit. Setting its derivative to zero and using the definition of elasticity gives the markup rule:
The second form is the Lerner rule from economics: at the profit-maximizing price, your percentage margin equals minus one over the elasticity. It only works when . To check it with numbers, take e = −2: the formula gives P* = MC × (−2 ÷ −1) = 2 × MC, and the margin (2MC − MC) ÷ 2MC = 50 percent, which matches −1 ÷ −2. The more elastic the demand, the thinner the optimal margin:
| Elasticity e | Optimal price as a multiple of unit cost | Optimal margin (P − MC) / P |
|---|---|---|
| −1.5 | 3.0 × | 67% |
| −2 | 2.0 × | 50% |
| −3 | 1.5 × | 33% |
| −4 | 1.33 × | 25% |
| −5 | 1.25 × | 20% |
In the widget’s default case, with a unit cost of £14 and e = −2.67, the optimum is about £22.40, so the current £24 is slightly too high. However, look at the contribution curve: it’s very flat at the top, and moving from £24 to £22.40 improves contribution by only about 1 percent on the fitted curve. Across the confidence interval the optimal price runs from roughly £21.10 to £24.25, which includes the current price. That’s the most common honest answer from an elasticity analysis: the data says you’re in the right neighborhood, and the next step is a controlled price test rather than a price change.
If your estimate comes out between −1 and 0, the formula has no answer, and the constant-elasticity model is telling you to keep raising price forever. That can’t be true outside the range you observed. Inelastic demand at current prices is a good reason to test a higher price, and the curve will eventually bend (customers switch, trade down or stop buying), but your historical data can’t tell you where.
Price and promotion in a marketing mix model
In a marketing mix model, price is not a nuisance variable to tidy away. It is often the single biggest driver of week-to-week sales after seasonality, and it’s frequently correlated with advertising, because brands tend to advertise their promotions. If you leave price out, the model has no choice but to credit the promotional weeks’ sales to whatever media ran alongside them, which inflates those channels’ returns (the media mix modeling page has a widget that shows this bias directly). Google’s Meridian documentation, for instance, treats price changes and promotions as “non-media treatments”, with their own estimated causal effects, rather than as controls whose coefficients you ignore.
The usual way to include price in an MMM is to put the log of price (or a price index relative to a reference) into the model, so its coefficient reads as an elasticity even when the media terms use adstock and saturation transforms. Where your outcome is units rather than revenue this works directly. Where the outcome is revenue, remember that revenue already contains price, so the “elasticity” on log price in a log-revenue model is one plus the unit elasticity. That’s an easy mistake to make when moving between the two, and it’s another reason the measurement plan should define the outcome in full.
Promotional elasticity is not base price elasticity
A single price variable mixes two different customer responses. A permanent change in the regular price is what the profit-maximizing price calculation needs. A temporary discount triggers extra behavior on top: customers stock up, switch from competitors for the week, bring purchases forward, and then buy less in the weeks after (the post-promotion dip). In my experience the short-term response to a discount is usually much larger in magnitude than the response to the same percentage change in the regular price, so a model that estimates one elasticity from both will overstate how much volume a permanent price cut would win.
The practical fix is to split price into two variables: the base (regular) price, and the promotional depth (the percentage discount off base, or a dummy for promotion weeks). Add a lag of the promotion variable to catch the post-promotion dip, and check the baseline isn’t absorbing promotions that weren’t coded. The base price coefficient is the one to feed into the optimal-price formula, while the promotional coefficient (net of the dip) tells you whether promotions pay for their discount.
Why most price elasticity estimates are wrong
The deepest problem with estimating elasticity from historical data is that prices aren’t set at random. They’re set by people who are watching demand. If a business cuts prices when sales are weak and raises them when demand is strong, high prices coincide with high sales, and the regression slope is pulled towards zero or even turns positive. Economists call this endogenous pricing, and it’s a textbook case of the confounding problem: the thing driving both price and sales (demand) isn’t in the model. If the widget gives you a positive or near-zero elasticity on your own data, this is the first explanation to check, before concluding customers don’t care about price.
The other common problems are close cousins. Promotions often coincide with advertising, features and in-store displays, so the price coefficient picks up their effect. Seasonality moves both price and demand (retailers discount after peak season), so without seasonal controls the slope mixes the two. Stock-outs cap sales in exactly the weeks demand was highest, censoring the data. Competitor prices shift your demand curve without changing your price. Aggregating many products with different prices into one series can create a relationship that no single product has. And any price outside the range you observed is an extrapolation of the functional form, not evidence.
There are three main ways to get a more trustworthy number, and they’re worth trying in this order. First, control for what you can (seasonality, promotions, advertising, competitor prices, distribution), which is what a well-specified MMM or econometric model does anyway. Second, use variation in price that wasn’t caused by demand, such as cost-driven price changes (a supplier price rise passed on to customers) used as an instrument, which is a standard technique in causal inference. Third, and best, run a price experiment: randomize prices across regions, stores or customer cohorts and compare, ideally with a difference-in-differences read to account for pre-existing gaps. An experiment answers the question directly, at the price points you actually care about, which is exactly what the flat-topped profit curve says you need.
A price elasticity calculator to take away
The workbook does the same fit as the widget with live Excel formulas, so you can paste in a few years of weekly data and keep it as a reusable calculator: ln transforms on the Data sheet, SLOPE, INTERCEPT and STEYX on the Model sheet for the elasticity and its standard error, a t-based 95 percent interval, the optimal price at the central estimate and at each end of the interval, and a contribution curve chart. It controls for nothing, so treat it as a first look and a way to sanity-check a model’s price coefficient, not as a replacement for the model. If you want to see price handled inside a full model alongside media, the Vexpower marketing mix modeling course builds one step by step, and the incrementality testing guide covers how to design the experiment that settles what the regression can’t.
