← Al Davies, 250 High Street

My trigger condition does not work

Short answer: a trigger condition that seems ignored is either false for your item or has a typo. Open the run history and look for a skipped check, then paste the expression into a Compose step in a copy of the flow to see what it returns for a real item. Our advice, not a Microsoft rule: for a Yes/No column use equals(triggerOutputs()?['body/Done'], true), for a Choice column compare the Value property, and for a filled-in test use not(empty(...)).

Exact names may differ on your screen.

The example used in this guide

Picture a SharePoint list named Repair tickets, with these columns:

The goal: the flow should start only when Status is "3 Closed". Without a trigger condition, the flow starts on every change and you stop it later with a Condition card. A trigger condition stops it earlier.

The number prefixes are part of the choice text, so a test for "Closed" will not match "3 Closed".

What a trigger condition does

Microsoft's page on optimizing triggers says: "If you don't want your flows to run every time they're triggered, set them to execute only when a specific condition is met." Its example is an expense flow that runs "only when the amount is greater than 100".

So a trigger condition that is false is not an error. The flow simply does not start. That is why it can feel like nothing happened.

Step 1. Find out if the check was skipped

Before you change anything, see what Power Automate recorded.

  1. Open https://make.powerautomate.com and select My flows.
  2. Select your flow.
  3. In the 28-day run history, select All runs.
  4. Look for the run you expected.

Microsoft's trigger troubleshooting page says: "A skipped check means the trigger condition wasn't met, and the flow wasn't initiated." It adds that you "might need to adjust the condition expression to fix the issue."

If you see a skipped check for an item that should have passed, the condition is the problem. If you see no entry at all, the trigger itself may be the problem. In that case start with "Why Power Automate turned your flow off, and how to turn it back on".

Step 2. Look at the condition you saved

Microsoft's page says to open your flow with Edit, select the trigger card, select the Settings tab, and locate "Trigger conditions". In the older designer the page says to select the ellipsis button on the card, then Settings. Exact names may differ.

Read the condition out loud, one piece at a time. Ask: which column does it point at, what does it compare to, and is that text the same as what is in the list?

Step 3. Write the condition so it can return true

Microsoft's page on expressions in conditions shows examples that start with an at sign, such as:
@and(equals(item()?['Status'], 'blocked'), equals(item()?['Assigned'], 'John Wonder'))
Microsoft describes equals as "Returns true if two values are equal."

For a trigger on a SharePoint list, our advice, not a Microsoft rule, is to start the condition with @ and use the trigger's own output. One way to start:
@equals(triggerOutputs()?['body/Status/Value'], '3 Closed')

Notice three things in that line:

  1. The test names the Value part of the choice, not the whole choice.
  2. The text inside the quotes includes the number prefix: '3 Closed'.
  3. The quotes are plain straight quotes. Quotes copied from a document or an email can be curly, and a curly quote is not the same character.

Check the exact path in a real run (Step 4), because your names may differ.

Copy-paste expressions for each column type

Microsoft's page on expressions in conditions defines the functions used here. It says not "Returns the opposite of a boolean value", empty "Returns true if the object, array, or string is empty", and or "Takes two arguments and returns true if either argument is true", with the note "Both arguments must be Booleans." Microsoft's function reference says contains "is case-sensitive" and endsWith "isn't case-sensitive".

Our advice, not a Microsoft rule: the column paths below follow the pattern in this guide. Confirm each path in a Compose step (Step 4), because your column names may differ.

Take a ticket with Status "2 Waiting" and Notes left blank. The Or line returns true for it, the Empty line returns true, and the Not empty line returns false.

Step 4. Test the expression in a Compose step first

A trigger condition gives you very little feedback. A normal action gives you a lot. So test the same expression in an action first.

  1. Make a copy of your flow, so the live flow is not touched.
  2. In the copy, remove the trigger condition.
  3. After the trigger, add a Compose action.
  4. In the Compose input, select the expression tab and paste the test, without the leading @. For the example: equals(triggerOutputs()?['body/Status/Value'], '3 Closed')
  5. Save and change one list item so the flow runs.
  6. Open the run history, open the run, and open the Compose step.
  7. Read the output. It says true or false.

Do this with one item that should pass and one that should not. If the first returns false, the expression is wrong, and the Compose output shows you the real values to compare. For the same idea applied to Choice columns, see "My condition on a choice column always goes to No".

Add a second Compose that holds only the column, for example triggerOutputs()?['body/Status/Value']. Its output shows the exact text the flow received, with the number, spaces and capitals. Paste that text into your condition instead of typing it.

Only when an item is modified, not when it is created

The trigger "When an item is created or modified" starts for both events. To start only for changes, compare two fields that SharePoint fills in. Our advice, not a Microsoft rule: try this condition and confirm it in a Compose step.

@not(equals(triggerOutputs()?['body/Modified'], triggerOutputs()?['body/Created']))

A brand new item has the same Created and Modified time, so the test is false for it. Check that on one new item before you rely on it.

Stop the flow from starting itself

A flow on "When an item is created or modified" that updates the same item starts itself again. Use a sent-flag guard:

  1. Add a Yes/No column named Sent and set its default value to No.
  2. Set the trigger condition to @equals(triggerOutputs()?['body/Sent'], false).
  3. Let the flow do its work, then add an Update item action that sets Sent to Yes.
  4. The update starts the flow once more, the condition is false, and the run is skipped.

For more on this loop, see "Power Automate flow keeps running itself over and over".

Step 5. Check for typing slips

Go through each one.

  1. Text does not match. You typed 'Closed' but the choice reads '3 Closed'.
  2. Capitals do not match. Our advice, not a Microsoft rule: match capitals letter for letter.
  3. Wrong column name. A column can have a display name and a different internal name. Open the list settings, click the column, and read the end of the page address after field=. Use that name in the expression.
  4. Wrong part of the value. Use the Value part of a choice, not the whole choice.
  5. Empty value. If the column is blank on the item, the test has nothing to compare. See "Power Automate condition to check if a field is empty".
  6. Quotes and brackets. Count the opening and closing brackets. Use straight quotes.
  7. A number compared as text. A Number column holds a number. Do not put quotes around the number you compare to.

Step 6. Remember when expressions are worked out

Microsoft's trigger troubleshooting page has a section called "Triggers don't respect expressions used in them". It says: "For triggers, the values of expressions are calculated only when the flow is saved." Its example: if a trigger uses utcNow() in an input, then utcNow() "is calculated when you save the flow".

Our advice, not a Microsoft rule: do not build a trigger condition on today's date. Check dates in a Condition card after the trigger instead.

Step 7. Make sure the trigger itself fires

If the run history shows nothing at all, the condition may not be the cause. Microsoft's page lists other checks, including broken connections and whether the trigger is failing. It says to open the flow's Details page and look for the message "There's a problem with the flow's trigger. Fix the trigger." The page lists broken connections as one cause: "The password for the connection expires."

Microsoft also lists steps to try when a trigger does not fire: test the flow manually, remove and re-add the trigger, switch the connection, and turn the flow off and on. Make a copy before you try these.

Step 8. Fall back to a Condition card

If you cannot get the trigger condition to work, move the same test to a normal Condition card right after the trigger. The flow then starts on every change, but each run shows you the result of the test in the run history. Once the test works there, move it back to the trigger.

Microsoft's page says: "Use trigger conditions to reduce the number of times the flow triggers." So moving it back is worth doing when the flow starts too often.

What to avoid

A quick checklist

  1. Open the run history and look for a skipped check.
  2. Open the Settings tab on the trigger and read the condition.
  3. Start the condition with @ and use straight quotes.
  4. Test the same expression in a Compose step in a copy.
  5. Copy the exact text from a Compose output.
  6. Check the internal column name.
  7. Move the test to a Condition card if it still fails.

When to get help

You can build all of this yourself in Microsoft 365. If you would rather have it built and tested for your team, I do that. A tracker like this is a fixed price: $5,000 for one, built in 2 weeks. See "What a SharePoint tracker costs to build". Bring one example of the problem to a free call.

Tell me what's still manual

I am Al Davies. I run 250 High Street LLC and build SharePoint trackers and Power Automate flows for operations teams. I work remotely. The first call is free, and I will not try to sell you anything.

See trackers I built: Tools I built

FAQ

What happens when a trigger condition is false?

The flow does not start. Microsoft's page says: "A skipped check means the trigger condition wasn't met, and the flow wasn't initiated." Look for the skipped check in the run history under All runs.

How do I write a not equal trigger condition in Power Automate?

Wrap equals in not, as in not(equals(...)). Microsoft says not "Returns the opposite of a boolean value." For two allowed values, use or with two equals tests.

How do I test for an empty or not empty field in a trigger condition?

Use empty(...) for blank and not(empty(...)) for filled. Microsoft says empty "Returns true if the object, array, or string is empty."

How do I write a trigger condition for a SharePoint Choice column?

Our advice, not a Microsoft rule: compare the Value property, such as triggerOutputs()?['body/Status/Value'], to the full choice text including any number. Copy the text from a Compose output.

How do I write a trigger condition for a Yes/No column?

Our advice, not a Microsoft rule: use equals(triggerOutputs()?['body/Done'], true), and set the column's default value to No. Check the output in a Compose step first.

Sources