Have you ever had a Flow just blow up in production for no apparent reason? I've seen teams struggle with a specific bug where the Flow IN operator behaves like a wild animal when you feed it an empty collection. Instead of returning nothing, it sometimes tries to grab every single record in your org, which is a nightmare for performance.
The assumption that trips people up is that an empty list means "find zero records." In Salesforce Flows, if your text collection is empty, the engine might evaluate the query as if there's no filter at all. In an org with a lot of data, you'll hit that 50,000-row governor limit faster than you can refresh the page.
Why the Flow IN operator fails on empty collections
When you use a Get Records element and tell it to look for IDs "IN" a collection, Salesforce expects that collection to actually have something in it. If the collection is empty, the underlying SOQL query can get messy. Instead of a clean "where ID in ()" which would just return nothing, the Flow engine sometimes treats it as a null filter.
When that happens, the query runs wide open. It starts pulling every Account, Contact, or custom record it can find. That's especially dangerous when you're following bulk record processing practices and handling batches of data. If one of those batches happens to have an empty collection, the whole transaction crashes.
I once spent three hours debugging a Flow that only failed on Fridays. It turned out a specific scheduled job was passing an empty list of IDs once a week, causing the Get Records to try and query 2 million records. Always check your collections!

A decision element sitting in front of the Get Records, guarding the query.
How to fix the Flow IN operator with a simple decision
The fix is low-tech, and most teams get this wrong by skipping it. Guard your Get Records element so the Flow never attempts the query when there's nothing to look for. It's a bit like checking whether you have a grocery list before you drive to the store: if the list is empty, stay home.
In my experience, the cleanest way to handle this is a Decision element right before your query. Check the count of your collection, or use the "Is Empty" operator. If it's empty, route the Flow to an end step or a different logic branch. If it isn't, you're safe to use the Flow IN operator.
Step-by-step defensive logic
- Create a Decision element named "Has Collection IDs?".
- Set your first outcome to "Yes" and use the logic:
{!myIdCollection} Is Empty False. - Set your default outcome to "No" and just let it end the Flow or move to the next task.
- Connect the "Yes" path to your Get Records element.
Decision: Check Collection
- Outcome: Has IDs (Collection Is Empty = False)
- Outcome: No IDs (Default)
Get Records (On "Has IDs" path)
- Filter: Id IN {!myIdCollection}
Managing scale and governor limits
If you're dealing with Large Data Volumes, this check is a requirement. Even if your Flow doesn't fail today, that wide-open query will eventually hit a wall as your data grows. Using the Flow IN operator correctly keeps your automation predictable and your logs clean.
Another tip? Use descriptive names for your decisions. Don't just call it "Decision 1." Call it "Are there IDs to Query?" so the next person who looks at your Flow knows exactly why that check is there. It saves everyone a headache during troubleshooting sessions later on.
Key takeaways
- An empty collection used with a Flow IN operator can trigger a "select all" query.
- Always use a Decision element to verify your collection has data before a Get Records step.
- Failing to check for empty collections often leads to the 50,000-row limit error.
- This simple check is a core part of building scalable, production-ready automation.
It's a small change, but it's the difference between a Flow that works and one that wakes you up with error emails at 2:00 AM. Start making this a habit in every project. Your future self will thank you when the org hits half a million records and your Flows are still running like a champ.
Leave a Comment