A condition makes a question appear only when it is relevant. Ask "Which brand do you drive?" only of people who said they own a car, or show a follow-up only to people who rated you poorly.
Two things are worth understanding before you start:
A question that has a condition is marked with a small C badge on its card in the editor, so you can see at a glance which questions are conditional.
Each condition row reads Display only if… and has three parts:
YYYY-MM-DD).Add more rows with + Add condition, then click Apply. Nothing is saved until you click Apply.
These are the two kinds of thing you can test, and they behave differently:
The participant-data fields cover more than the person's details — they also include the state of their invitation:
That last group is more useful than it looks. Language code lets you branch by the language someone was invited in, and the reminder fields let you ask a different question of people who needed chasing.
Participant data has two prerequisites: the survey needs a participant list to draw from, and Anonymized responses must be off. If responses are anonymized there is deliberately no link between a person and their answers, so there is nothing to test against. This is a real trade-off — promising anonymity means giving up participant-data conditions.
An existing condition appears in the panel as its scenario and its expression. Click the expression to edit it, or the ✕ beside it to remove it.
Read the confirmation before you click Delete. It asks "Are you sure you want to delete all conditions for this question?" — the ✕ removes every condition on that question, not just the row you clicked. On a question with several conditions, that is more than you probably meant.
You do not choose AND or OR. LimeSurvey decides for you, by what you are testing:
You can watch this happen: add a second condition on the same question and the joiner between the rows reads OR; point it at a different question and it reads AND.
These two rules already give you bracketed logic for free. Two conditions on question A plus two on question C evaluate as (A1 or A2) and (C1 or C2) — an and of or-groups — without you doing anything.
What the rules cannot give you is the mirror image: an or between two groups that each need an and — (A and B) or (C and D). There is no way to type your own brackets. That is what scenarios are for.
A scenario is a numbered group of conditions. Inside a scenario, the same/different rules above apply. Separate scenarios are joined with OR — the question is shown if any one scenario is satisfied.
The builder opens with a Default scenario box containing 1; conditions you add belong to that scenario. Give a group of conditions a different scenario number and it becomes an alternative route to showing the question. The numbers are only labels — they need not be consecutive.
Example: show a question to "people in Berlin who own a car, or anyone who complained". The Berlin and car conditions go in one scenario (they are ANDed, being different questions); the complaint condition goes in another. The result is (Berlin and car) or (complained) — the OR-of-ANDs shape the automatic rules cannot produce on their own.
Everything the designer builds is ExpressionScript underneath — the form is a friendly way to write it. Next to New logic there is an Enter expression… field with an expand icon that opens the Condition code window, where you can read or write the expression directly.
The condition "first name is John and they rated Customer support as Poor" is stored as:
(( TOKEN:FIRSTNAME == "John" ) and ( Q001_SQ001.NAOK == "A001" ))
Reading that: TOKEN:FIRSTNAME is participant data; Q001_SQ001 is the sub-question SQ001 of question Q001; A001 is an answer option code. .NAOK means "not applicable is OK" — evaluate this even if the question was skipped, which is usually what you want.
Use the expression field when the form cannot express what you need — real brackets, arithmetic, or functions such as is_empty(), sum() or count(). For example, show a question only when someone actually entered a name:
!is_empty(name)
One important trade-off, which LimeSurvey warns you about: conditions written in ExpressionScript mode can't be displayed inside the visual condition builder. A hand-written expression cannot be rendered back into the form, so use the form for anything the form can do, and keep hand-written expressions for the cases that genuinely need them.
Relevance expressions take no curly braces. Braces are only for tailoring — inserting an answer into text, as in Hello {name}. See Use answers from previous questions (piping).
A common need: ask "Which of these did you buy?", then ask a follow-up about only the ones they picked. This is array filtering, and it is configured with question attributes in the classic question editor rather than in the Condition designer.
Open the question in the classic question editor and use the Logic section of its settings panel:
The rule that catches everyone: the sub-question codes must match between the source question and the filtered one. Filters can also be chained — question 3 filters on question 2, which filtered on question 1 — so each step narrows the list further.