MaxDiff, short for Maximum Difference Scaling, is a survey technique to measure preferences or the relative importance of different attributes, products, or features. It involves presenting respondents with a series of choice sets, where they are asked to select the most and least preferred options from a list. By analyzing these choices, MaxDiff helps identify the most and least important factors in decision-making, making it a powerful tool for prioritizing options based on customer preferences.
You might use MaxDiff in scenarios where you need to understand what features or attributes are most valued by customers, such as in product development, marketing, or branding. For example, suppose you're developing a new product and want to know which features appeal most to potential buyers. In that case, MaxDiff can provide clear insights into what matters most to your target audience. It's advantageous when you have many attributes to evaluate, as it forces respondents to make trade-offs, providing more discriminating data than traditional rating scales.
Designing the MaxDiff
Use the MaxDiff Design Tool to turn an item list into deterministic custom sets, check item and pair exposure, confirm that the comparison graph is connected, and export a programming-ready max_diff_question block.
The tool also controls the respondent experience without changing the generated task sets. Item order and the least/most label order can each be randomized independently. Anchoring can be omitted, asked indirectly after each task using all/some/none, or asked directly for every item using acceptable/unacceptable/not sure. Choose one anchoring method. Direct anchoring is recommended for most studies because it is quicker and explicitly classifies every item. Indirect anchoring is limited to four items per task because larger sets leave more items without a clear relationship to the anchor.
Respondent experience
If we've got a study where we want to trade off between 14 different items, we only want to show some trade-offs to each user. We typically want to ensure that we mix up the trade-offs shown to each user and that each option is shown uniformly.
The MX8 Labs Research Platform will optimally create a set of trade-offs for each set of items and will display these to the user. For the inference reasons behind balanced exposure and a discussion of how set assignment relates to the least-fill balancing mechanism used elsewhere in the platform, see the methodology page.
In the chat survey experience, this is shown as a series of questions:

For the traditional survey experience, its shown using a grid, where the trade-offs are more explicit:

Choosing the number of items and set size
When running MaxDiff, two design constraints have to hold:
a) All users see the same selection of sets.
b) Each option is asked the same number of times.
The MaxDiff Design Tool also checks the comparison structure used by model-based reporting. Equal item counts are not sufficient when groups of items never appear together: the complete set design must connect every item through direct or indirect comparisons.
If you don't do a), you won't be able to slice your data across demos because different groups will have been asked different questions. If you don't do b), your data will be skewed toward whichever options were offered more often.
To satisfy both, MX8 Labs generates a set of sets sized to a multiple of the number of items and the number of repetitions. With 13 items at two repetitions, you need sets drawn from 26 items; with 14, from 28; and so on.
The available set sizes are determined by the prime factors of that total. For 26, the prime factors are 13 and 2, which means:
- 13 options per question and two questions
- 2 options per question and 13 questions
Neither is great from a respondent-experience standpoint. 28 factors as 7 × 2 × 2, which gives:
- 7 options per question and four questions
- 4 options per question and seven questions
Both are workable. If you want to test 13 options in MaxDiff, add another item to improve the test. The same logic applies any time the number of items is prime.
Reporting
Cross-tab reporting
We report MaxDiff questions using a simple cross-tabulation of each response.

Bayesian reporting
MaxDiff also supports model-based reporting that estimates each respondent's preference for each item from their choices across tasks. In the report editor's Analysis step, choose a calculation:
- Utility Scores (
discrete_choice_utility_scores) — a score per item showing how strongly it drives preference. - Simulated Share (
discrete_choice_simulated_share) — the predicted share of respondents who would pick each item.
The report renders as a cross-tab. With Simulated Share, each row is one MaxDiff item and the bar shows that item's modeled share of preference, with uncertainty whiskers and stat-significance highlighting:

When both best and worst selections are present, both are used to estimate the scores.
Anchoring adds an absolute acceptability reference to these relative preferences. Indirect anchoring records whether all, some, or none of the items in a task are acceptable. Direct anchoring classifies every item as acceptable, unacceptable, or uncertain. The MaxDiff Design Tool generates the required survey code for the selected method. Direct item observations are recorded with set_maxdiff_direct_anchor; uncertain answers stay missing rather than becoming unacceptable.
When anchor data is present, choose Utility relative to anchor or Probability above anchor in Analysis. The former compares an item's utility with the acceptance threshold; the latter reports the model's probability above that threshold. These are different from relative Simulated Share, which divides preference among the items being compared.

For the estimator, weighted aggregation, exports, and uncertainty methodology, see Utility and simulated share methodology.
Example code
Here is an example for a simple Max Diff study:
from survey import Survey
s = Survey(**globals())
# Introduction
s.show_message(
"Welcome! Thank you for participating in our survey. We are conducting this study to understand the preferences and priorities of smartphone users. Your responses will help us improve future smartphone designs and features."
)
# Consent
consent = s.get_consent(
consent_text="Before we begin, we need your consent to participate in this survey. Your responses will be kept confidential and used only for research purposes."
)
# Screening Questions
# Age
age = s.select_question(
question="What is your age?",
options=["Under 18", "18-24", "25-34", "35-44", "45-54", "55-64", "65 and above"],
)
s.terminate_if(
age == "Under 18",
reason="Sorry, but this survey is only for people aged 18 and above.",
)
# Gender
s.select_question(
question="What is your gender?",
options=["Male", "Female", "Prefer not to say"],
)
# Ethnicity
s.multi_select_question(
question="What is your ethnicity? (Choose all that apply)",
options=[
"White",
"Black or African American",
"Asian",
"Other",
],
other_options=["Other (Please specify): __________", "Prefer not to say"],
)
# Hispanic Origin (For USA)
s.select_question(
question="Are you of Hispanic, Latino, or Spanish origin?",
options=["Yes", "No", "Prefer not to say"],
)
# Income
s.select_question(
question="What is your annual household income?",
options=[
"Less than $25,000",
"$25,000 - $49,999",
"$50,000 - $74,999",
"$75,000 - $99,999",
"$100,000 - $149,999",
"$150,000 and above",
"Prefer not to say",
],
)
# Education
s.select_question(
question="What is the highest level of education you have completed?",
options=[
"Less than high school",
"High school diploma or equivalent",
"Some college, no degree",
"Associate degree",
"Bachelor's degree",
"Graduate degree",
"Prefer not to say",
],
)
# Smartphone Ownership
smartphone_ownership = s.select_question(
question="Do you own a smartphone?", options=["Yes", "No"]
)
s.terminate_if(
smartphone_ownership == "No",
reason="Sorry, but this survey is only for people who own a smartphone.",
)
# Ask the MaxDiff question - the platform generates the sets and asks about each one
s.max_diff_question(
question="Which feature is MOST important and LEAST important to you?",
items=[
"High-Resolution Camera",
"Long Battery Life",
"Fast Processor",
"Water Resistance",
"Wireless Charging",
"Large Display",
"Face Recognition",
"Ample Storage Space",
"5G Connectivity",
"Affordable Price",
"Durable Build Quality",
"Wide Range of Apps",
"Fingerprint sensor",
"Dual SIM capability",
],
labels=["Least", "Most"],
)
# Conclusion
s.show_message(
"Thank you for participating in our survey. Your responses are valuable to us and will help shape the future of smartphone technology. Have a great day!"
)
# Finalize the survey
s.complete()
