How do you stop one bad run from changing thousands of CRM records?
Give every automation a per-run limit. Before it writes anything, count how many records it is about to change. If the count is far above normal, stop the run and alert a person instead of writing. This one guardrail turns a disaster that touches your whole CRM into a small, recoverable incident.
Most automation failures are small. One record gets the wrong owner, one email goes out twice. Those are annoying but fixable. The failures that really hurt are the ones where a bad filter, a changed field, or an empty lookup makes an automation treat every record as a match.
When that happens, the automation does exactly what it was built to do, just to everything at once. It reassigns every contact, overwrites every lifecycle stage, or enrolls your whole database in a sequence. A per-run limit is how you make sure that never gets past the first few records.
What is a per-run limit, and why does it matter?
A per-run limit is a ceiling on how many records one execution of an automation may create, update, or delete. It is a blast radius control. It does not prevent bugs. It caps how much damage a bug can do before a human notices, which is what decides whether a mistake costs an hour or a week.
I think of it the way an engineer thinks of a fuse. The fuse does not care why the current spiked. It just cuts the circuit when the load goes past a safe level. A per-run limit does not need to understand what went wrong either. It only needs to notice that the volume is abnormal.
That simplicity is the point. Smart validation catches the problems you predicted. A volume cap catches the ones you did not, because almost every catastrophic failure shows up first as an unusually large number of changes.
How do you pick the right limit for an automation?
Look at how many records the automation normally touches per run, then set the limit well above that but far below your total record count. If a daily sync usually updates a few dozen records, a limit of a few hundred catches a runaway without blocking a busy day. Revisit the number as volume grows.
The right number is specific to each automation. A real-time form-to-CRM flow should touch one record per run, so a limit of a handful is plenty. A nightly enrichment refresh might touch hundreds by design. Use the run history in your tool to see what normal looks like before you choose.
Err on the side of a limit that sometimes trips on a legitimate busy day. A false alarm costs a few minutes of review. A limit set too high is no limit at all.
How do you build a per-run limit in n8n?
Count the items before the step that writes, then branch. If the count is under your limit, continue. If it is over, send an alert and stop the workflow with an error, so nothing is written. Do not rely on simply trimming the extra items, because that hides the problem instead of surfacing it.
n8n has a Limit node, and its docs say it removes items beyond a defined maximum number, keeping either the first or last items. That is useful for sampling or testing, but I do not use it as a safety cap on writes. If a bad filter matches thousands of records, trimming to the first hundred still writes a hundred wrong changes, and quietly drops the evidence.
The pattern I prefer is explicit. A step that counts, an If node that compares the count to the limit, and on the over-limit branch an alert to Slack or email followed by an error. The run fails loudly, the workflow history shows exactly why, and nothing downstream executes.
How does Zapier handle large batches by default?
Zapier has a built-in safeguard called flood protection. Its help docs say that if 100 or more events trigger a Zap at once, Zapier holds them and emails you to confirm they should run. It applies to polling triggers. Instant triggers are not subject to flood protection, because each item is sent individually.
That is a helpful default, but it is not a full per-run limit. Zapier's docs note that flood protection counts all incoming trigger items before any Filter or Path steps run, and that held runs can be replayed or deleted. It protects you from a sudden flood of triggers. It does not protect you from a single run that updates the wrong records through a search step.
So in Zapier I still add my own checks where a step can change many records, such as a search that returns multiple matches. A Filter step that stops the Zap when a search returns more results than expected is a simple way to do it.
What about Make and HubSpot workflows?
The same principle applies everywhere: count before you write, and stop when the count is abnormal. In Make, add a counting step and a filter before modules that update records in bulk. In HubSpot workflows, watch enrollment criteria closely, because a broad trigger is the usual way an entire database ends up enrolled at once.
HubSpot deserves special attention because its workflows act on records directly. A property-based trigger that suddenly matches every contact, for example after a field is renamed or a default value changes, can enroll everyone in one go. I test enrollment criteria against a filtered list view first, and check the count, before I turn a workflow on.
The tool matters less than the habit. Wherever an automation writes to a system of record, there should be a point where it checks the size of what it is about to do.
What should happen when the limit trips?
Stop, alert, and preserve the evidence. The automation should not write anything, should notify a named owner with the count and a sample of the records it would have changed, and should leave the run in a state you can inspect. Then a person decides whether to approve, fix, or discard the batch.
The alert needs to be useful. "Workflow failed" tells nobody anything. "Lead routing tried to reassign 3,400 contacts, normal is under 50, nothing was changed, here are five examples" tells the owner exactly what to look at.
This works best alongside a way to pause the automation entirely while you investigate. I described that in how to give an automation a kill switch. The limit catches the problem. The kill switch keeps the next scheduled run from trying again before you have fixed it.
Does a per-run limit replace testing and rollback plans?
No. It is one layer. You still test changes before they go live, ideally with a dry run that reports what would change without writing. You still need a way to undo changes that slip through. The per-run limit is the layer that catches what testing missed, before rollback becomes necessary.
Dry runs and per-run limits work especially well together. A dry run shows you the count before you go live. The limit enforces that count in production. I wrote about the first half in why every automation I build has a dry-run mode.
Rollback is the last line of defense. If something does get through, you need a record of what changed and a way to restore it. My piece on a rollback plan for an automation that writes to your CRM covers that. The smaller the batch the limit allows, the easier that rollback will be.
What should you do next?
List every automation that writes to your CRM or another system of record. For each one, check its normal run size in the history, set a limit well above normal, and add a count-and-stop check before the write step. Make the over-limit alert specific. Then test it by forcing a run over the limit.
Per-run limits are not glamorous. Nobody notices them until the day they save you. That day usually comes after a small change nobody thought was risky, which is exactly why the guardrail needs to be there before you need it.
If you want help adding guardrails like this to your automation stack, reach out. It is one of the first things I add when I take over automations that touch revenue data.
Get found, cited and the back office automated
Let's make your site the source AI engines quote and wire up the systems behind it.
Read more blogs
Let's get your website found and cited by AI
Tell me what you're working on, whether AI search is skipping your product, your back office is buried in manual work, or you need a build that does both.