Methods

Every dataset goes through the same steps:

  1. Read the price columns you mapped.
  2. Aggregate responses at each price.
  3. Fit the demand model to that aggregated curve.
  4. Calculate the indices below (most come from the fit; AUC comes straight from the data).
  5. Flag anything that should be read with caution, like a fit that failed or an index that falls outside the prices you actually tested.

The sections below follow that same order, so you can trace any number on the results page back to the step that produced it.

Data & aggregation

The analyzer accepts wide-format survey data: one row per respondent, one column per price point. Depending on the response format you select, it aggregates each price column into a single demand value:

A couple of things help the upload go smoothly:

If a grouping column is selected, the same aggregation runs separately for each group in addition to the full sample ("All"), and each series gets its own fitted curve.

The demand model

Once your data is aggregated, the analyzer fits a curve through it: a mathematical description of how demand falls as price rises. It uses a well-established model from behavioral economics research (Koffarnus, Franck, Stein & Bickel, 2015). You don't need to follow the equation to use the results below; it's shown here for reference.

Q = Q0 · 10k(eαQ0P − 1)

Model parameters

Q0
How much people want the product when it's free or nearly free.
α (alpha)
How fast demand drops off as price increases. A bigger α means people stop buying much sooner as price rises; a smaller α means demand holds up longer before falling away.
k
There's a limit to how far the fitted curve can fall at the very highest prices, controlled by k. With the default setting, the curve never quite reaches zero: it levels off at about 1% of Q0. k is set to the same value for every curve in your analysis, rather than letting the software pick a different value per group, so that if two groups look different, it's because their actual buying behavior differs, not because the math found two different-looking ways to draw a similar curve. Most people won't need to change this.

Derived indices

AUC
A single number summarizing overall demand across every price you tested, calculated straight from your data rather than the curve above. It ranges from 0 to 1: closer to 1 means demand stayed strong across the whole price range tested; closer to 0 means it dropped off quickly. Because it doesn't depend on the curve fitting well, it's a useful second opinion, especially if a fit looks shaky.
P50
The price at which half your respondents would still buy. For quantity data, this is the price where predicted demand has dropped to half its starting level; for yes/no data, it's the price where the fitted curve predicts exactly 50% would still buy, regardless of how high or low the starting level was. If the curve never reaches that point within the prices you actually tested, the analyzer says so rather than guessing beyond your data.
Pmax
The exact price at which the revenue chart (further down the page) reaches its peak. Push the price higher past this point and the drop in how many people still say yes outweighs the higher price, so the total per person starts to fall. Below Pmax, the opposite is true: raising the price still increases the total, even though fewer people say yes. Treat it as what the model predicts, not a guarantee of what would actually happen if you charged that price.
Omax
How much money would be made per person at that peak price. For yes/no data, that's the price multiplied by the share of people who'd still buy at it. For quantity data, it's the price multiplied by how much they'd buy.

For yes/no data, percentage demand is converted to a proportion before revenue is calculated. For example, 40% is treated as 0.40 before multiplying by price, so reported revenue is expressed per respondent rather than for an unstated sample size. The analyzer performs this conversion automatically.

Pmax and Omax only mean something when price in your study is a real payment, fee, or cost. If price instead stands for something else, like how strongly someone prefers an option with no real money involved, these two numbers don't correspond to a decision anyone would act on, and can be ignored.

A revenue chart is available below the main chart whenever Pmax is reported, collapsed by default. It plots predicted demand at each price, multiplied by that price. Because this model approaches zero demand without reaching it exactly, revenue can appear to rise again if the curve is plotted far beyond the observed price range. That apparent rise is not a meaningful pricing result; it occurs when a very large price is multiplied by tiny-but-nonzero predicted demand. To avoid a misleading display, the chart stops once predicted demand drops below 3% of its starting level, and never goes past the highest price you actually tested.

Fit diagnostic

A score from 0 to 1 for how well the curve matches your data. Values closer to 1 indicate a tighter fit. Most published demand-curve studies see values above 0.9 for aggregated data. A lower value isn't automatically wrong, but it's worth a closer look: check the raw points for anything unusual before deciding whether the fitted curve is a fair summary of what's going on.

Fitting procedure

Curves are fitted by bounded nonlinear least squares on the aggregated points at positive prices, replicating nls(..., algorithm = "port") in R with the same constraints. For percentage data, α is constrained to [0, 0.1] and Q0 to [0, 100]. The implementation uses Levenberg–Marquardt with analytic gradients and multiple starting values, so it does not depend on a lucky initial guess.

If the survey includes a free (price-0) condition, its aggregated value is always shown in the table and plotted at an arbitrary position on the log-scaled price axis (marked “0”). How it enters the model is a setting: excluded from fitting (the default), included as an ordinary data point, or used to fix Q0 at the observed price-0 demand, in which case only α is estimated.

Individual breakpoints (yes/no data)

For yes/no data, the analyzer also works out a breakpoint for each respondent: the price where they switch from “yes, I'd buy this” to “no, I wouldn't.”

Real respondents do not always answer monotonically (i.e., in a one-direction pattern where demand stays the same or decreases as price rises). Someone might say yes at a low price, no at a slightly higher one, then yes again, sometimes just from a lapse in attention. So before calculating anyone's breakpoint, the analyzer checks how consistent their answers were: if someone flips from “no” back to “yes” more than twice as price increases, their pattern is treated as too inconsistent to give a meaningful breakpoint, and they're set aside (adapted from Stein et al., 2015).

For everyone else, the breakpoint is calculated as the geometric mean of the last price endorsed and the first higher price rejected. This matters because HPT prices are usually spaced multiplicatively rather than in equal steps: a list might go from ₦5 to ₦25 to ₦65, say, rather than in even jumps like ₦5, ₦15, ₦25, so a geometric mean keeps the midpoint from getting pulled up toward the higher price the way a plain average would. Respondents who said yes at every price, or no at every price, don't have a breakpoint and are counted separately.

Privacy

All parsing, aggregation, and fitting run in your browser. Nothing you upload is transmitted or stored on any server; sessions are saved only to your browser's local storage on your device.

References

Borges, A. M., Kuang, J., Milhorn, H., & Yi, R. (2016). An alternative approach to calculating area-under-the-curve (AUC) in delay discounting research. Journal of the Experimental Analysis of Behavior, 1–11. https://doi.org/10.1002/jeab.219

Gilroy, S. P., Kaplan, B. A., Reed, D. D., Hantula, D. A., & Hursh, S. R. (2019). An exact solution for unit elasticity in the exponential model of operant demand. Experimental and Clinical Psychopharmacology, 27(6), 588–597. https://doi.org/10.1037/pha0000268

Jacobs, E. A., & Bickel, W. K. (1999). Modeling drug consumption in the clinic using simulation procedures: Demand for heroin and cigarettes in opioid-dependent outpatients. Experimental and Clinical Psychopharmacology, 7(4), 412–426. https://doi.org/10.1037/1064-1297.7.4.412

Koffarnus, M. N., Franck, C. T., Stein, J. S., & Bickel, W. K. (2015). A modified exponential behavioral economic demand model to better describe consumption data. Experimental and Clinical Psychopharmacology, 23(6), 504–512. https://doi.org/10.1037/pha0000045

Myerson, J., Green, L., & Warusawitharana, M. (2001). Area under the curve as a measure of discounting. Journal of the Experimental Analysis of Behavior, 76(2), 235–243. https://doi.org/10.1901/jeab.2001.76-235

Stein, J. S., Koffarnus, M. N., Snider, S. E., Quisenberry, A. J., & Bickel, W. K. (2015). Identification and management of nonsystematic purchase task data: Toward best practice. Experimental and Clinical Psychopharmacology, 23(5), 377–386. https://doi.org/10.1037/pha0000020