Triggers
Every graph starts with exactly one trigger node. A trigger does not run any logic itself, it just decides when the rest of the graph gets a new run.
Quick overview
- Drag one trigger node onto the canvas; it is the first node and has no input connector.
- Configure it, if it takes any fields (a schedule's cadence, a folder to watch).
- Activate the automation so it starts listening for that trigger.
- Or skip all of that and press Test any time to run the graph once regardless of the trigger.
Detailed reference
Manual
Manual start has no fields. It is what the builder's Test button uses: publish the current draft, then queue one run immediately.
Scheduled
Scheduled fires on a cadence you set.
| Field | Options |
|---|---|
| Frequency | Interval, Daily, Weekly, or Cron |
| Every (minutes) | Used only in Interval mode |
| Cron expression | Used only in Cron mode; a standard 5-field expression (minute hour day-of-month month day-of-week), for example 0 9 * * 1-5 for weekdays at 09:00 |
| Timezone | Used only in Cron mode; an IANA name like Europe/Istanbul. Left blank, the expression is matched against the server's own clock |
An active scheduled automation is checked on a recurring cycle in the background; you do not need to keep the app open. Interval, Daily, and Weekly modes fire relative to the automation's own last fire time. Cron mode keeps a running "next due" pointer and catches up on a missed minute (a deploy, a restart, a slow tick) by firing once as soon as it notices, instead of silently losing that occurrence; it never fires twice for the same missed window.
Incoming webhook
Incoming webhook gives every automation a unique inbound URL, /api/workflow/hook/<automation id>, that starts a run when called with a GET or POST request. It only fires while the automation's status is Active.
The builder does not currently show or copy this URL for you; the node's own inspector only has the HMAC secret field. To use it, you (or a developer on your team) need the automation's id, which you can read from the network requests the app already makes while the builder is open, and combine it with the fixed /api/workflow/hook/ path yourself.
Design and workspace events
These fire when something happens elsewhere in the app. Today, Design updated is wired to fire automatically whenever a design is saved. The rest are available to configure now; more of the app's own actions are connected to them as those surfaces are built out.
| Node | Fires when |
|---|---|
| Design created | A new design is created |
| Design updated | A design is saved |
| Design shared | A design is shared or published |
| Design downloaded | A design is downloaded |
| Part tagged | A tag is added to a part (optionally filtered to one tag) |
| Brand applied | A brand kit is applied to a design |
| Asset uploaded | A file is added to the media library |
| AI generation done | An AI generation finishes |
| New work in folder | A project is added to a folder you choose |
The event bridge
Any trigger type can also be started through a generic, authenticated API call scoped to your workspace: a triggerType and an optional payload. This is how the design-update hook above fires under the hood, and it is available for your own integrations to call the same way.
Multiple automations, one trigger type
More than one active automation can use the same trigger type. A design being saved, for example, can start every active "Design updated" automation in your workspace at once, each running independently with its own history.
How to use it
Walkthrough: a weekday-morning cron schedule
- Drag a Scheduled trigger onto an empty graph; it must be the graph's only trigger.
- Set Frequency to Cron.
- Type
0 9 * * 1-5(09:00, Monday through Friday) into the cron expression field. - Set Timezone to your own, for example
Europe/Istanbul, so 09:00 means your local morning rather than the server's clock. - Add at least one action node after it (a bare trigger fails Validate), then Validate and Activate.
- The first activation arms the schedule's next occurrence rather than firing immediately; from then on it fires every matching morning without you touching it again.
Walkthrough: a signature-verified webhook
- Drag an Incoming webhook trigger, fill in a long random string as its HMAC secret, and keep a copy somewhere safe; there's no way to reveal a forgotten secret afterward, only to overwrite it with a new one.
- Add at least one action after it, Validate, then Activate; the inbound URL only accepts calls once the automation's status is Active.
- Find the automation's id (see above) and give the sending system the URL
/api/workflow/hook/<id>, with instructions to sign the raw JSON request body with your secret and send it asX-Signature: sha256=<hex hmac>. - If the sending system has a "send test event" feature, use it; otherwise send one request by hand and check the Activity view for a new run rather than waiting on a real event.
Walkthrough: firing a trigger from your own code
- Any trigger type can be started through the generic event bridge: an authenticated
POSTto/api/workflow/eventswith a body like{ "triggerType": "trigger.asset_uploaded", "payload": { "assetId": "..." } }. - This is the same path the app's own Design updated hook uses internally, so it's a proven way to wire up an event the built-in editor doesn't fire automatically yet.
- One call fires every ACTIVE automation in your workspace whose trigger matches that type, each getting its own independent run seeded with your payload as its starting context.
Troubleshooting
- My trigger's event happened but no run started. Only Design updated is wired to fire automatically from the app itself today. The other design and workspace event triggers are fully functional once fired, but nothing in the app calls them yet outside your own integration through the event bridge above. Use Test to run the graph regardless of the trigger while you wait on that wiring.
- The automation is Active but a webhook call gets 404. Confirm the status really is Active, not Paused or Draft, since only an Active automation resolves its webhook URL, and double-check the id in the URL is exact.
- A webhook call gets 401. The trigger has an HMAC secret configured and the call's signature either wasn't sent or didn't match. The signature is computed over the exact raw request body, so reformatting or re-serializing the JSON before signing it will break the check even if the content looks identical.
- The event fires but a run doesn't start every time. Check the automation's Settings for a Debounce window, and the trigger node's own debounce field (on event triggers); either one silently drops a fire that lands inside the cooldown after the previous one.
- A scheduled automation goes quiet during certain hours. Check Settings for Quiet hours; a trigger that would otherwise fire inside that window (in the automation's own timezone) is deferred rather than dropped or queued, so it will not fire retroactively once the window ends.
- Two automations share a trigger type and only one ran. That's expected if only one was Active, or if the other's own tag/folder filter on the trigger node didn't match this particular event.
Tips
One trigger per graph
Validation flags a graph with zero triggers or with more than one; keep exactly one.
Webhooks only fire while active
An incoming webhook call to a Paused or Draft automation is ignored. Activate it first.