A multi-select picklist is one text value with semicolons between the selections, not a list. Decision conditions see that string, so Contains matches substrings and Equals only matches when the user picked exactly one thing. Use the INCLUDES formula function against the field itself, and if you need the values as separate items, you are splitting the string yourself.
What the value looks like
Three selections come back as Red;Green;Blue. No spaces around the semicolons. The order is the picklist’s defined order, not the order the user clicked, and it is not something to build logic on.
That single string is what every flow element sees. A record variable field, a formula reference, a Decision condition, an Assignment: all of them are handling text. Assign it to a Text variable and look at it in the debug panel before you write anything against it, because guessing at this costs more time than checking.
Why Contains is the wrong operator
A Decision condition with Contains does a plain substring match on that string. Two problems follow.
If one picklist value is a prefix of another, you get false positives. Testing Contains “Red” matches a record whose only selection is “Reddish Brown”. Testing Contains “Gold” matches “Gold Partner” and “Goldsmith”. This is not hypothetical. Picklists grow, and the value that breaks your condition is added by someone else two years later.
INCLUDES is the right tool, with one restriction
The formula function is built for this:
INCLUDES({!$Record.Colours__c}, "Red")
It matches whole values, not substrings, so “Reddish Brown” does not satisfy a test for “Red”. Combine as you like:
AND(
INCLUDES({!$Record.Colours__c}, "Red"),
NOT(INCLUDES({!$Record.Colours__c}, "Blue"))
)
The restriction matters: INCLUDES needs an actual multi-select picklist field. It does not work on a Text variable holding the same semicolon string, which is exactly what you have after a Get Records that stored the field into a text variable, or after a screen component handed you a value. Reference the field on the record, not a copy of it.
When you genuinely only have the string, fall back to a delimiter-safe comparison rather than a bare Contains. Wrapping both sides in semicolons removes the prefix problem:
CONTAINS(";" & {!varSelected} & ";", ";Red;")
Splitting into a collection
Flow formulas have no SPLIT function. There is no core element that turns a delimited string into a Text collection either. Three honest options.
- Invocable Apex. Five lines wrapping
String.split(';'), returning a List of String. This is the correct answer if you are allowed to write Apex. - A formula loop. A repeat structure using
FIND,LEFTandMIDto peel off one value per iteration, with a counter and a Decision to stop when nothing is left. It works. It is about eight elements and nobody enjoys reading it. - Avoid needing it. Very often the requirement is “do something if X is selected”, which
INCLUDESanswers without any splitting at all.
Filtering and screens
In a Get Records filter, Equals on a multi-select field requires the exact full set of selections, which is almost never what you want. Contains is available and carries the same substring risk as in a Decision. The SOQL INCLUDES operator is not exposed in the filter builder, so a precise query usually means querying wider and testing with a formula afterwards, or moving the work to Apex.
On a screen, check what the component actually outputs before you design around it. Bind it to a variable, run the flow in debug, and read the value. Whether it hands you a joined string or a collection changes the whole downstream design, and it is not worth assuming.
Frequently asked
How do I add one value without wiping the others? Read the current value, test whether it already contains the new one with the semicolon-wrapped comparison, and concatenate only if not. Assigning the new value alone replaces the whole set.
Why does my Assignment fail with an invalid value error? One of the values in your string is not in the picklist, or has different casing or a stray space. Values must match the API value exactly.
Should I use a multi-select picklist at all? Often no. A junction object or a set of checkboxes reports better, filters better, and does not force this string handling on every flow that touches it. If the field is new and you have a choice, take the choice.
