Matching the trigger to the event
Start from the event you want to react to, then read across to the trigger that catches it. Most wrong-trigger mistakes come from skipping this step and reaching for the trigger whose name sounds closest.
Read the table as “event, then trigger.” A funding-signal webhook from Clay maps to Webhook received. A stage moving to Won on a pipeline list maps to List entry updated. The rest of this page expands the rows that trip people up most.
Distinguishing created from updated
Record updated and List entry updated only fire for changes made after the record or entry already exists. If a value is set during creation, these triggers stay silent. That silence is the trap. Many values arrive already set at creation time, so an update-style trigger sees nothing to react to. Think of a deal imported with stage already set to Won, a CSV row that lands withpriority pre-filled, or an API call that creates a record fully formed.
Attribute value changed fires in both cases. It catches the value set at creation and the value changed later. When your logic is “this field became X,” default to it. Suppose you want to alert sales the moment any deal reaches stage = Won. That alert should fire whether a rep dragged the card or an importer set it on day one.
Configured this way, the workflow fires for a deal Priya Sharma closes by hand. It also fires for the fifty deals your migration imported as Won last night. A Record updated trigger would have caught only Priya’s. Reserve the update-style triggers for cases where you specifically want post-creation edits and nothing else.
Choosing between object and list triggers
Attio separates records and list entries, and that separation runs all the way through to triggers. A trigger scoped to an object cannot see list attributes. A trigger scoped to a list cannot see object attributes.- Record updated ignores changes to list attributes.
- List entry updated ignores changes to object attributes.
- Attribute value changed can point at either. You choose the object or the list when you configure it.
stage lives as a list attribute on a “Sales pipeline” list rather than as an attribute on the Deals object. Picture a Record updated trigger on Deals watching for stage changes on that pipeline.
This workflow never fires, because the object-scoped trigger cannot see a list attribute. The fix is to watch the surface where
stage actually lives. Use List entry updated on the Sales pipeline list, or Attribute value changed scoped to that list.
Scoping triggers to control volume
An unscoped Record updated on a busy object fires constantly. A single run may cost only 0 to 1 credits, but thousands of pointless runs a month add up. They clutter the run history, and they can trigger loops when a workflow’s own write fires the trigger again. Before you save a change-style trigger, ask two questions. First, can you select a specific attribute on the trigger itself? Both Record updated and List entry updated let you narrow to one attribute instead of any change. Second, can a free Filter block immediately after the trigger discard the runs you do not care about? A scoped trigger followed by an early filter makes all the difference. For example, you might check “Owner is not empty” before any enrichment runs. That is the gap between a workspace with tidy, debuggable automation and one with forty thousand mystery runs nobody can account for.Combining multiple triggers in one workflow
The new engine lets one workflow carry several triggers. So the same downstream steps run whether a lead arrives by Webhook received or is created by hand with Manual run. Connect each trigger to the first shared step, then let downstream blocks read from whichever trigger actually fired. Because only one trigger fires on any given run, downstream inputs need a fallback. Use multiple data sources on the input. Read the email from the webhook payload if it exists, otherwise from the record. That way a block resolves correctly no matter which entry point started the run. The result is one workflow to maintain instead of two near-identical copies that drift apart over the months.Reading trigger outputs to filter precisely
Every trigger emits at least three things: the triggering entity’s data where one applies, which actor performed the action, and when it happened. Change-style triggers with a selected attribute add two more, the new value and the previous value. Those two let you catch only true transitions rather than every save. Feed both values into a Filter so a status-change workflow fires only when the deal genuinely crosses into Won, not on later edits that leave it there.
With both conditions in place, a deal saved twice while already Won runs the workflow once, at the real transition. The actor output earns its own guard. Filtering on Updated by → Type → is not → Workflow stops a workflow from re-triggering on its own writes. It is the standard way to keep a workflow from spinning into an infinite loop.
See also
Records vs list entries
Why object triggers and list triggers see different attributes
Variables & data passing
Read from whichever trigger fired with multiple data sources
Infinite loops and safety
Guard self-triggering workflows with the actor output
Filter
The free block that discards irrelevant runs after a trigger
Block reference overview
Full inputs, outputs, and limits for every trigger