---
name: "price_sensitivity_analysis"
description: "Measure what buyers will pay with the Van Westendorp Price Sensitivity Meter: run the four price questions on real survey answers, build the cumulative curves, find the acceptable price range plus the optimal and indifference points, and add the Newton-Miller-Smith purchase intent extension when reach or revenue estimates are needed. Use when pricing a new product or tier, checking whether a planned price sits inside what buyers accept, or analysing an existing Van Westendorp data set. Ships a tested calculator that works from a survey CSV."
---

# Price Sensitivity Analysis

## Purpose

Find the range of prices buyers see as acceptable for one product, from their own answers rather than from a guess. The method is the Van Westendorp Price Sensitivity Meter, presented by Peter van Westendorp at the ESOMAR Congress in 1976. Four open questions turn into four cumulative curves, and the crossings of those curves give a floor, a ceiling, and two reference points inside the range.

It measures price perception. It does not measure demand, units, or revenue, and its best known point, the optimal price point, means lowest price resistance. It does not mean most profit. Use it early, for a product with no settled price, as one input to a pricing decision alongside costs, margin, and competitor prices.

## Workflow

1. **Fix the product description and the unit first.** Write the exact description respondents will read: what the product is, what is included, and the unit every price refers to (one-time, per month, per seat per month). Every respondent prices the same thing or the answers cannot be pooled. Do not mention a current or planned price anywhere in the survey.

2. **Recruit real prospective buyers.** Respondents must be people who could plausibly buy, sampled per segment you plan to report. Counts are per segment: under 50 valid rows is directional only, 100 or more valid rows per segment is the working floor, and 200 to 400 is the published guidance for a price that will actually ship. There is no sample size formula for this method, so state the valid n next to every result.

3. **Ask the four questions with exact wording, open numeric answers.** Too expensive: at what price so expensive you would not consider buying it. Too cheap: at what price so low you would feel the quality could not be very good. Expensive: at what price starting to get expensive, not out of the question, but you would have to give some thought to buying it. Cheap: at what price a bargain, a great buy for the money. Show no price ladder and no list of candidate prices. If a scale is shown, record its range in the report because it anchors answers.

4. **Add the Newton-Miller-Smith questions only if reach or revenue estimates are wanted.** At the price each respondent just called cheap, ask how likely they are to buy on a 5 point scale from definitely would buy to definitely would not buy. Ask the same at their expensive price. Skip the extension when only the acceptable range is needed.

5. **Clean before any curve is drawn.** A valid row reads too cheap, then cheap, then expensive, then too expensive, in strict rising order, all present and positive. Drop rows that fail, count them by reason, and report the drop rate. A drop rate above about a fifth of rows points to an unclear description or unit, or to a category so new that respondents hold no stable ordering. Say which, and do not hide the rate.

6. **Build the four curves.** At each price p: the too cheap curve is the share of valid respondents whose too cheap answer is at or above p, and the cheap curve is the share whose cheap answer is at or above p. Both fall as price rises. The expensive curve is the share whose expensive answer is at or below p, and the too expensive curve is the share whose too expensive answer is at or below p. Both rise. Draw straight segments between observed prices. Never smooth.

7. **Run the calculator.** Use the bundled CLI (`bin/psm.py`) on the answers CSV with columns too_cheap, cheap, expensive, too_expensive, plus optional pi_cheap and pi_expensive and a segment column passed with --segment:

   `python3 bin/psm.py answers.csv --segment segment --curves-out curves.csv`

   It cleans the rows, builds the curves, finds every crossing by linear interpolation between observed prices, and prints warnings for small samples and high drop rates. Check the printed medians and drop counts against the raw file before reading any point.

8. **Read the crossings, and name the range definition.** OPP is where the too cheap and too expensive curves cross. IPP is where the cheap and expensive curves cross. The acceptable range runs from PMC to PME, and two definitions circulate. The original definition crosses too cheap with the not cheap curve for PMC, and too expensive with the not expensive curve for PME. The narrower definition crosses too cheap with expensive for PMC, and cheap with too expensive for PME. The calculator reports both, labelled. Any chart or report that shows one range must say which definition produced it.

9. **Read the shape, not only the points.** A wide range means low price sensitivity in this sample. A narrow range means buyers agree tightly and small price moves cross lines. Note steep stretches of any curve inside the range: those are price steps where perception changes fast. Check that OPP and IPP sit inside the range. When they do not, report that plainly instead of reordering the points to look tidy.

10. **If the extension ran, read reach and revenue as estimates.** Per respondent, purchase probability is 0 at their too cheap and too expensive prices, the calibrated intent value at their cheap and expensive prices, and linear interpolation between those corners. The average across respondents is the reach curve; reach times price is the revenue index curve. The calculator uses the published calibration 0.70, 0.50, 0.30, 0.10, 0.00 for scale points 5 down to 1 and prints it. Name the calibration in the report. A different calibration moves the tops of both curves.

11. **Decide the price inside the range with evidence the survey does not contain.** Bring unit costs, target margin, competitor prices, and channel fees to the choice. The survey rules out prices below the floor, where quality doubts grow, and above the ceiling, where rejection grows. It does not pick the profit best price between them.

12. **Keep real and simulated answers apart.** Curves may only be built from answers real respondents gave. A practice run on invented or simulated rows is allowed for testing the pipeline, and every output from it must be labelled simulated in the title. Never pool simulated rows with real rows, and never present a simulated crossing as a finding.

## Output Contract

A finished analysis contains:

- The product description and unit exactly as respondents saw them, the field dates, who was sampled, and how.
- The cleaning report: rows received, rows valid, rows dropped by reason, the drop rate, and the ordering rule used.
- The points table with valid n per segment: PMC, PME, and the acceptable range under the definition used (the other definition listed too when space allows), plus OPP and IPP.
- The curve table or chart built from the same cleaned rows, with the crossing convention stated when a crossing sits on a flat plateau (the calculator reports the lowest price of a plateau).
- Segment results side by side when segments were collected, each with its own n.
- When the extension ran: the calibration used, the reach top and revenue top prices with their curve values.
- A limits paragraph: stated perception not observed buying, no competitor context, sample and date, and what other evidence informed the final price choice.
- The decision: the price chosen, where it sits in the range, and the reason in one or two sentences.

## Operating Rules

- **Real answers or a labelled simulation.** Invented answer sets presented as survey results are fabrication. If no survey exists yet, deliver the survey design and the analysis plan, not numbers.
- **OPP is not a profit claim.** Never write that the optimal price point maximises revenue or profit. The revenue top comes only from the Newton-Miller-Smith extension, and it is an estimate built on discounted stated intent.
- **IPP is a survey reading.** Van Westendorp read the indifference point as a median market price or a market leader price. Report it as the point where cheap and expensive readings balance in this sample.
- **No crossing, no point.** If two curves never cross inside the answer range, say so and widen the sample or the price span. Never extend a line by eye past the data to force an intersection.
- **Small samples move.** One respondent moves a curve by 100 divided by n percentage points. Below 50 valid rows, call every point directional. For a shipping price, rerun on a random half of the rows and check the two ranges overlap before trusting the full sample.
- **Segments are separate studies.** Pooling segments with different ranges hides the difference that matters. Report pooled results only alongside the segment results, never instead of them.
- **Stated intent is discounted, always.** Raw definitely would buy answers never enter a reach or revenue figure at face value.
- **Pick the right tool for the real question.** A specific candidate price calls for Gabor-Granger. Trading features against price calls for conjoint. Observed checkout or price test data outranks any survey result, including this one.
- **Date and source every result.** Price perception shifts. A range without field dates, a sample description, and a valid n is not usable later.

Full curve definitions, both range definitions with their sources, calibration variants, sample size guidance, and the limits discussion live in `references/method-notes.md`. A worked example data set with deliberate invalid rows and a segment split is in `examples/sample-survey.csv`.
