Quota logic examples in AskiaDesign
Pre-requisites
AskiaDesign and AskiaField version 5.4.0 or more.
Recommended reading
Before diving into the quota logic inside AskiaDesign, we recommend that you get familiar with the following section of our AskiaField user manual, describing the automatic handling of quotas during fieldwork.
When is this needed to handle quotas inside the questionnaire?
As you probably know now, flexibility can be achieved automatically thanks to Supervisor's quota priority menu . . .
Note: First, high, normal and low priorities only have an effect on List quota (because you have to know the answer beforehand to be able to prioritize calls to specific quota cells). "Blocked" has an effect on any quota and will completely close a specific quota cell.
Other typical use case are handled by properly configuring the "Allow over target" option . . .
"Never" and "Agent decides" are effectively blocking over-quota respondents.
But sometimes, the quota logic cannot be that simple.
In order to apply the following use-cases, you will need to define a quota table in Supervisor, and choose "Survey routing". CCA/Supervisor will not block over-quotas anymore, unless told so by the questionnaire logic.
Sending an "overquota respondent" to a short survey
Instead of using the default overquota behaviour (sending the respondent to the "overquota" page if they don't match a quota cell), we'd still like the respondent to answer a few demographic questions.
We'll ask a multi-question about which actors the respondent knows about, and if none of the actors they know about is in an open quota cell, we'll recode the respondent as "quota full" without letting them go.
Here, my quota setup is looking like this : I need to do 45 interviews from people who know any actor, except the ones whose target is already reached.
So I need to check that they don't know any of the actors who still have quota cells available.
This information is available through the .AvailableQuota() keyword.
This script will simply check if one of the actors selected is in the list of open quota cells.
If yes, we recode "Quota_recode" as 1 (quota OK) and if no we recode it as 2 (Quota full). The rest of the questionnaire logic can be based off our recode.
Least Filled quotas
This is one of the most common use cases. We want the respondent to give us a list of actors they know. Among this list, we will ask them questions only about three of the actors, selected by "least filled" order (selecting only the 3 actors they know and we need most in the quota table).
So on one hand we have a list of Actors the respondent knows about (Q1_KnownActors) and on the other hand we have the list of actors we need interviews for (Q1_KnownActors.AvailableQuota()).
A simple intersection of these lists will give us the actors that are in both lists.
NB : AvailableQuota() automatically sorts the list of actors in the order we need (from least-filled to most-filled quota cell).
So, you should do Q1_KnownActors.AvailableQuota() INTERSECTION Q1_KnownActors rather than Q1_KnownActors INTERSECTION Q1_KnownActors.AvailableQuota() to keep this order in your intersection.
Then all what's left to do is select the first three actors of this list.
Adapting this to your needs
Most use cases are simply forks of the 2 above-mentioned use-cases, so here are a set of parameters you could be needing.
AvailableQuota() will sort the list based off the absolute number of interviews to do.
In this scenario, I only need one interview from a Demi Moore fan. The quota cell can be represented as 0/1 (0 completed out of a target of 1).
AvailableQuota() will put all actors at a higher rank than Demi Moore (because you still need 45 interviews for each) except the ones whose target have been reached. 0/1 means 1 to do here.
But, you could want to consider the Demi Moore target as a percentage, and so 0/1 would mean a 0% target. Doing that puts a 0/1 target at the same priority rank as a 0/45 target.
So, if you wish to base quota priorities on percentages rather than total number of interviews to do, you should use AvailableBalancedQuota()
And in the same fashion as we have AvailableQuota() , which returns the ranked available quota list. We can decide to also return the full quota list, including reached targets. If so, you can use QuotaList() and BalancedQuotaList().
Cheat sheet
Now that you get the idea, you might wonder how to reach a specific quota cell in more complicated quota trees than this flat one-question example. Here's a cheat sheet . . .
![]() |
Comparing age segments nested in a gender question, for a specific gender.
I2Age.AvailableQuota(Gender:1) |
![]() |
Comparing age segments nested in a gender question, for all gender segments
I2Age.AvailableQuota() will directly find what age segment needs most completes, even though the age question is nested. |
![]() |
Comparing age segments nested in a gender question, for the specific gender selected by the respondent
I2Age.AvailableQuota(I1Gender:I1Gender.value) |
![]() |
Comparing job-category segments nested in an age question, nested in a gender question for the specific gender/age selected by the respondent
I3SocioProfessional.AvailableQuota(I1Gender:I1Gender.value,I2Age:I2Age.value) |