sapien
← All articlesJournal9 min read

Gabor-Granger: follow the price response into the economics

Follow fictional Gabor-Granger response paths, check inconsistent answers, and compare stated-demand, revenue and contribution indexes at concrete prices.

Solid and outlined people considering two ivory multipacks with tea-leaf and sun reliefs on connected sculptural terrain.

Gabor-Granger asks about purchase at specific prices, using a defined price ladder and routing rule. Keep every shown amount and accepted/rejected bracket, then summarize stated response at feasible prices. Combine that response with costs and the business objective. A repeated hypothetical ladder supplies neither observed demand nor an exact threshold between unshown amounts.

Gabor-Granger and Van Westendorp answer different questions

Choose Gabor-Granger when feasible prices are known and the next question is how stated buying response changes across them. Choose Van Westendorp when you first need buyers’ perceptions of a plausible price range. Its cheapness and expensiveness questions do not answer the same question as purchase at each displayed amount.

Write the route as part of the instrument

Imagine you are choosing a price to pilot for Harbor, an example sparkling tea sold to grocery shoppers. In this illustrative design, the offer is six 250 ml cans at a total tax-inclusive pack price. Keep it separate from the Lumen price-cell offer in our pricing research guide. Ask:

At a price of $[displayed amount] for this six-pack, would you choose to buy it on your next relevant shopping occasion?

Offer yes, no and insufficient information. An adaptive design can move toward higher prices after a yes and lower prices after a no. Predefine the tested amounts, start-price treatment, stopping rule and how you record the last accepted price. Asking every price in ascending order is a different exposure design and can introduce its own anchoring.

Choose a routing implementation before collecting answers; the one below is not a universal Gabor-Granger rule. Use a ladder of $8, $10, $12, $15, $18, $20 and $25. Start at $15: after yes, try $18 and then $20; after no, try $12 and then $10. Continue toward an adjacent accepted/rejected pair, or a ladder endpoint; stop insufficient-information answers separately. Record the bracket rather than implying you know a threshold between unshown prices.

Path, starting at $15

Details

R1

Shown amounts and answers: $15 yes → $18 yes → $20 no

Stop and recorded result: $18 accepted / $20 rejected; last accepted $18

R2

Shown amounts and answers: $15 no → $12 no → $10 yes

Stop and recorded result: $10 accepted / $12 rejected; last accepted $10

R3

Shown amounts and answers: $15 insufficient information

Stop and recorded result: Stop; no threshold assigned

R4, quality check

Shown amounts and answers: $15 no → $12 yes; recheck $15 yes, then $12 no

Stop and recorded result: Inconsistent recheck; flag for review rather than force a threshold

R4 adds a recheck to demonstrate a quality flag; the ordinary route records the bracket reached.

A ladder is a set of implementable offers, not merely a list of numbers. Keep the tea quantity, buying occasion, channel and price unit fixed. If a different amount changes delivery or pack size, record that as an offer change.

The route determines which information is observed. R1 reaches an accepted $18 and rejected $20; R2 reaches an accepted $10 and rejected $12. Starting elsewhere could expose a different history. Plan the start treatment and task order before collection, and preserve them in the data rather than storing only a final number.

Record the bracket, including endpoint cases

Endpoint state

Details

Accepted then rejected at an adjacent step

What can be recorded: Accepted/rejected bracket

What remains unknown: Response to unshown intermediate amounts

Yes at the highest ladder amount

What can be recorded: Acceptance at that endpoint

What remains unknown: Whether higher prices would also be accepted

No at the lowest amount

What can be recorded: Rejection at that endpoint

What remains unknown: Whether a lower amount would change the answer

Insufficient information

What can be recorded: No threshold assigned

What remains unknown: Response after the offer is clarified

R1 does not reveal whether $19 would be accepted. R2 does not reveal whether $11 would be accepted. “Last accepted price” is a useful summary of shown prices, with a limitation: the underlying threshold may lie between the bracket endpoints.

A yes at $25 is an endpoint observation. It cannot tell you how much higher the person might accept. A no at $8 likewise cannot establish whether every lower amount fails. Keep endpoint states in the report, especially when many answers fall there; the proposed ladder may be too narrow for the question.

Insufficient information is another stop state. It leaves the price response unresolved until the offer can be understood. Coding it as a rejection threshold would let an explanation problem masquerade as price sensitivity.

For analysis, choose a rule appropriate to the intended design and preserve the brackets. A conservative last-accepted summary can be described as such. It should not silently become an exact willingness-to-pay estimate at an unshown amount.

Understand what the separate threshold worksheet computes

The separate worksheet uses ten example maximum accepted prices: 8, 10, 10, 12, 12, 15, 15, 18, 20 and 25. It demonstrates a threshold summary after a hypothetical study; it is not a record of an actual adaptive survey.

The analysis script below computes the share of thresholds at or above each tested price and the index price × share. Copy it with the complete CSV to reproduce the calculation.

Tested price

Details

$10

Values at or above price: 9 of 10: 90%

Revenue index: $9.00

$12

Values at or above price: 7 of 10: 70%

Revenue index: $8.40

$15

Values at or above price: 5 of 10: 50%

Revenue index: $7.50

$18

Values at or above price: 3 of 10: 30%

Revenue index: $5.40

$20

Values at or above price: 2 of 10: 20%

Revenue index: $4.00

$10 has the highest index among these tested prices. The index follows from the supplied thresholds; it does not measure money received.

The ten values are a simplified worksheet supplied after a hypothetical study. They do not reconstruct R1–R4 or any participant’s adaptive route. At $12, seven of ten values remain at or above the amount; at $15, five remain. The script multiplies the price by that share to produce a revenue index.

This threshold rule assumes that accepting a higher amount implies accepting lower amounts. It makes the calculation traceable, but an actual instrument should retain any contradictions that challenge it. A smooth summary should not make those records disappear.

The summarized relationship is conditional on the tested offer and this rule. It omits substitution, shopping friction, awareness and availability. Labeling the output an index keeps the calculation separate from a forecast of dollars actually received.

Inspect anchoring and comprehension before aggregating

Store the complete path: starting price, each display, answer, reason and stop. In a real study, compare patterns under planned start/order treatments while respecting which answers came from the same person. If starting-price differences would change the recommendation, report them beside the aggregate curve.

Probe what “would buy” means in the purchase situation. A respondent may mean “would consider,” may assume a promotion, or may evaluate one can instead of a pack. Fix a verified stimulus or unit problem consistently, then reassess whether the relevant price question was actually answered.

A record-level review is most valuable where the summary changes. If several high-price acceptors later reject lower prices, investigate the reasons and determine the declared treatment. Do not force a monotonic curve simply because the expected chart is easier to present.

Separate an inconsistent answer from an impossible person

R4 is a declared quality-check illustration: $15 no, $12 yes, then a recheck gives $15 yes and $12 no. It demonstrates why the record needs a flag. It does not establish that the person is fraudulent or that one of the answers is necessarily correct.

Ask whether the inclusion changed in the person’s mind, whether “buy” was reinterpreted, or whether the preference was unstable. A reason can turn a suspicious-looking route into a fixable wording issue. Apply any exclusion under a predeclared rule and retain the original path.

Show a sensitivity summary when the treatment changes the candidate ranking. The purpose is to explain how dependent the recommendation is on those records, rather than select whichever rule produces the desired price. For generated responses, use the same principle to inspect construction sensitivity; row count does not establish independent human precision.

Choose the objective before choosing the peak

At $10, the worksheet’s share is 0.9 and the revenue index is $9. At $15, the share is 0.5 and the revenue index is $7.50. On that objective alone, $10 leads among the tested amounts. Now apply the illustrative $7 variable cost: $10 yields (10−7)×.9=$2.70, while $15 yields (15−7)×.5=$4.00. The preferred tested price changes.

The revenue and contribution peaks differ

Arithmetic index ($ per opportunity)

  • Price × stated share
  • Contribution, $7 cost

Tested price ($)

Details

10

Price × stated share: 9

Contribution, $7 cost: 2.7

12

Price × stated share: 8.4

Contribution, $7 cost: 3.5

15

Price × stated share: 7.5

Contribution, $7 cost: 4

18

Price × stated share: 5.4

Contribution, $7 cost: 3.3

20

Price × stated share: 4

Contribution, $7 cost: 2.6

The threshold worksheet shows that $10 has the highest revenue index; $15 has the highest contribution index among these tested prices. These are arithmetic indices, not observed sales.

The other contribution indices are $3.50 at $12, $3.30 at $18 and $2.60 at $20. These calculations use the same stated shares and the assumed constant cost. Fees, returns, channel terms, repeat and acquisition may change the actual economics. Keep those inputs explicit when using an index to choose a pilot.

A penetration objective might favor a different amount from near-term contribution. Set that priority in the brief. The study can show the response tradeoff; the business must identify which tradeoff it is willing to make. An unlabeled peak cannot make that decision for it.

Use $15 as the contribution-leading candidate under the stated $7 cost, and carry $10’s stronger stated response into the pilot comparison. Use the seller’s actual costs and purchasing evidence to select the commercial price.

Keep the price paths, separate threshold worksheet, calculations and next evidence together. That lets the reviewer distinguish what respondents saw, what the analyst summarized and what the business decided.

Copy the threshold worksheet and analysis

Save the complete CSV below as N014-gabor-granger.csv and the Python code as N014-gabor-granger.py in the same folder. Run python3 N014-gabor-granger.py. The output includes the count, valid base, stated share, revenue index and contribution index at the assumed $7 cost.

Complete ten-record threshold data

response_id,maximum_accepted_price,evidence_type
D01,8,fictional_teaching_data
D02,10,fictional_teaching_data
D03,10,fictional_teaching_data
D04,12,fictional_teaching_data
D05,12,fictional_teaching_data
D06,15,fictional_teaching_data
D07,15,fictional_teaching_data
D08,18,fictional_teaching_data
D09,20,fictional_teaching_data
D10,25,fictional_teaching_data

Complete threshold analysis

"""Editable fictional threshold worksheet. No purchase or profit forecast."""
import csv
from pathlib import Path
rows=list(csv.DictReader(Path(__file__).with_name('N014-gabor-granger.csv').open()))
values=[float(r['maximum_accepted_price']) for r in rows]
prices=[10,12,15,18,20]
print('Fictional teaching data; threshold summary, not actual adaptive survey logs.')
print('price,accepting_count,total,stated_share,revenue_index,contribution_index_at_cost7')
for p in prices:
    count=sum(v>=p for v in values);share=count/len(values)
    print(f'{p},{count},{len(values)},{share:.4f},{p*share:.2f},{(p-7)*share:.2f}')

Further reading

  • our pricing-method selector

Source reference

Bring the decision, audience and evidence needed to a scoped Sapien study discussion.

← Back to all articles