MX8 Labs allows researchers to define and apply screeners for targeting respondents based on demographic or behavioural conditions. This includes defining custom quota groups and using pre-built standardized screeners for national representation.
This guide outlines how to set up screeners using both methods.
1. Quota Strategies
MX8 Labs supports four quota strategies:
Strategy | Description |
STRICT | Both quotas and total respondents are strictly enforced. Survey ends when all quotas are met and the total is reached. |
RESPONDENT_DRIVEN | Survey closes when the total number of respondents is reached. Quotas can overfill. |
QUOTA_DRIVEN | Survey closes when all quotas are filled. Total number of respondents may exceed the target. |
IGNORE | Quotas are ignored. All respondents are accepted. |
2. Defining Quota Lines
Use s.quota() to define individual quota lines. These specify criteria that respondents must meet.
s.quota(name: str, criteria: bool, quota: float = 0.0)
Example:
age = s.numeric_question("How old are you?", min_max=(18, 100)) gender = s.select_question("What is your gender?", options=["Male", "Female"]) s.quota("Young Males", criteria=(age < 35) & (gender == "Male"), quota=0.25)
Notes:
quota is the proportion of the sample for that group.
During fielding, the actual achieved sample may deviate from these targets due to rounding, natural variation in panel availability, or speed differences between groups.
In reporting, MX8 automatically applies weights to adjust back to the target proportions defined in the quotas.
3. Combining Quota Lines into a Quota
Use s.set_quota() to combine a set of individual quota lines into a single quota. All quota lines within a group must sum to 100%.
s.set_quota( name="Demographics", quotas=[ s.quota("Young Males", criteria=(age < 40) & (gender == "Male"), quota=0.25), s.quota("Older Males", criteria=(age >= 40) & (gender == "Male"), quota=0.25), s.quota("Young Females", criteria=(age < 40) & (gender == "Female"), quota=0.25), s.quota("Older Females", criteria=(age >= 40) & (gender == "Female"), quota=0.25), ] )
Respondents must qualify for at least one of the quota lines. Those who do not qualify or exceed the quota limits (depending on strategy) are terminated.
Note: If quotas are not perfectly filled (e.g., one group is harder to recruit or fills faster), the final dataset will still reflect the specified proportions through post-fielding weighting.
4. Using Standard Screeners
MX8 Labs provides pre-defined screeners per country. These include standard demographic questions and apply national weighting by default.
To apply a standard screener:
s.standard_screener(country="GB")
Parameters:
country: Two-letter country code (e.g., “US”, “GB”, “AU”).
name: Optional. Defaults to "GenPop". Alternate versions may be available (e.g., "NestedGenPop", "16to54").
Example:
s.standard_screener(country="US", name="GenPop")
If the named screener is not available for the specified country, an error is raised.
Supported combinations include:
"US": ["GenPop", "NestedGenPop"] "GB": ["GenPop", "16to54"] "AU": ["GenPop"]
Use SCREENER_REGISTRY.all_screeners to retrieve all available (country, screener) combinations.
5. Boosting Individual Quota Lines
In some cases, a group may be too small to support reliable analysis even if its proportional target is met. For example, a group with a 5% target in a 500-person survey would only yield 25 respondents.
To ensure a higher base size for analysis, use the min_respondents parameter to boost that line during data collection:
s.quota("LGBTQ+", criteria=(orientation == "LGBTQ+"), quota=0.05, min_respondents=50)
In this example, although 5% of 500 is 25, the min_respondents value of 50 will take precedence.
If you don't include the quota element for your boost line, then it won't be weighted, for example, if you want at least 500 Xbox and PlayStation owners but don't want to weight against this:
s.quota("Has Xbox", criteria=has_xbox, min_respondents=500)
s.quota("Has Playstation", criteria=has_xbox, min_respondents=500)