Connect any agent to the outside world — HTTP webhooks, Gmail, Drive, Calendar, and marketplace apps. The agent wakes, acts, and logs every event automatically.
Your agent picks up the phone when the world calls.
Wire any agent to an inbound HTTP webhook, a Gmail inbox, a Drive folder, a Google Calendar, or a marketplace app. No polling script, no relay service, no cron job — the agent wakes the instant an event fires and leaves a full audit trail behind.
The ~45-second poll interval means an event delivered to the backend can take up to 45 seconds before the agent starts processing. Design time-sensitive workflows accordingly.
A Reaction is the configuration that connects an external event source to an agent. Every time a matching event arrives, Actionist hands the event data to your agent along with a natural-language task — and the agent runs.
The old way
Write a polling script. Deploy a webhook relay. Schedule a cron job. Check your inbox manually. Every approach involves infrastructure you have to build, host, and monitor before your agent sees a single byte of data.
With Reactions
Pick a source, write a task description in plain English, and click Create trigger. Actionist handles the subscription, receives the event, renders your instruction, runs the agent, and logs the whole thing — while you do something else.
Two vocabulary terms used throughout this page: trigger is the saved configuration (source + task + filter + delivery settings); event is each individual inbound payload that the trigger receives. One trigger receives many events over its lifetime.
Reactions are a desktop-only feature. Trigger creation, management, and event history require the Actionist desktop app.
Pick a source type in the creation drawer — each one sets up differently. Select below to see what each involves.
HTTP webhook — setup
1.Name the trigger (e.g. New Stripe payment). Select the HTTP webhook tile.
2.Choose auth: Public (no auth) or Bearer secret backed by the Credentials Vault.
3.Save. Copy the generated webhook URL from the trigger row.
4.Paste the URL into Stripe / GitHub / Typeform — or any service that sends webhooks.
supports any JSON payload · up to 256 KB · bearer secret via X-Actionist-Trigger-Secret header
The source type is locked after save. If you need to switch from HTTP to Google (or vice versa), delete the trigger and recreate it. The UI shows: “Delete and recreate to change (avoids subscription orphan).”
Google — 3-step inline wizard
step AChoose a service: Gmail · Drive · Calendar
step BSelect an event type (8 types across the three services).
step CPick your Google account, then narrow by label / folder / calendar.
native push subscriptions · no middleman · subscription health badge on trigger row
Gmail: New message, Label added — Drive: File created, File updated, File trashed — Calendar: Event created, Event updated, Event cancelled. Google OAuth tokens can be revoked silently — watch for the Needs reconnect health badge.
App trigger — marketplace apps
1.Select an installed app tile. Only apps already in your workspace appear.
2.Choose the app-specific event type. Dynamic option fields load from the provider live.
3.Save. A post-save panel may show a callback URL and one-time secret header to paste into the provider’s dashboard.
app handles the subscription · provider-specific event catalog · connect banner if no active connection
App triggers require the app to be installed from the marketplace first. If the provider connection is revoked, save will fail until reconnected.
Open your agent in the studio, select the Triggers tab, and click Create trigger. The creation drawer has five sections — which ones appear depends on the source type you choose.
HTTP webhook
Google
App trigger
1
Basics — name and source
Give the trigger a name (e.g. New Stripe payment). Select the HTTP webhook tile. Toggle Enabled on to start receiving events immediately after save.
2
Task — what the agent should do
Write a plain-language task description (up to 5,000 characters). This tells the agent what to do with each event. Use {{payload.fieldName}} to embed live values from the webhook body — for example:
task description
Process the new payment for {{payload.customerEmail}} and log it to the CRM.
The Event Data picker below the field controls which payload fields the agent receives. Without a pasted sample payload, toggle Send the full payload to the agent on to forward everything.
3
Filter — scope the events that matter (optional)
Toggle Filter incoming events on if you only want the agent to run on a subset of payloads. Add one or more conditions with Add condition, choose All conditions (AND) or Any condition (OR), then pick a field path, an operator, and a value.Leave the toggle off to run on every event — useful for prototyping.
4
Webhook — authentication
Choose Public (no auth) for open integrations or Bearer secret for anything sensitive. If you choose bearer secret, pick an existing credential from your vault or click + Create new credential to create one inline. The credential value is checked against the incoming X-Actionist-Trigger-Secret header on every request.
5
Delivery — where the result goes
Choose how the run result surfaces: Tell me when it’s done (default — a card appears in Home), Just run it (no card; visible on the Triggers page only), or notify via Telegram, Slack, or a specific conversation. Failure cards always go to Home regardless of this setting.
6
Save
Click Create trigger. The trigger appears in the list. Expand the row to see the Webhook URL with Copy URL and Copy curl buttons — paste that URL into your external service.
1
Basics — name and source
Name the trigger and select the Google tile (labeled Gmail · Drive · Calendar). The Google wizard expands inline in three steps.
2
Wizard step A — choose a Google service
Click Gmail, Drive, or Calendar.
Gmail event types
New message — fires when a message arrives in the inbox
Label added — fires when a label is applied to a message
Drive event types
File created — a new file appears in the selected folder
File updated — an existing file is modified
File trashed — a file is moved to Trash
Calendar event types
Event created — a new calendar event is created
Event updated — an existing event is modified
Event cancelled — an event is cancelled
3
Wizard step B — event type
Select the event type chip that matches when the agent should fire.
4
Wizard step C — account and resource
Pick your Google account from the Select an account… dropdown. Then narrow the scope:
Gmail: optionally filter by one or more labels
Drive: optionally filter by folder and file type
Calendar: select the calendar to watch
5
Task, Filter, and Delivery
Complete these sections exactly as described in the HTTP webhook path. The Webhook section does not appear for Google triggers.
6
Save
Click Create trigger. Google subscription provisioning begins in the background. A subscription health badge appears on the trigger row once provisioning completes.
1
Basics — name and source
Name the trigger and select the app tile under App trigger. The list shows only apps you have already installed from the marketplace.
2
Choose event type and options
Select the app-specific event type. Some apps show dynamic option fields (e.g. workspace or channel IDs fetched live from the provider). These fields require an active provider connection — if the connection is revoked, save will fail until reconnected.If the app requires a connection and none is linked yet, a banner with a Connect app button appears.
3
Task, Filter, and Delivery
Complete these sections as with the other source types.
4
Save and wire if needed
Click Create trigger. For apps that use their own webhook infrastructure, a post-save panel may appear with a callback URL and a one-time secret header name and value to paste into the provider’s dashboard — this step completes the subscription on the provider’s side.
agent studio · New Stripe payment · Create trigger
Create trigger✕
Basics
NameNew Stripe payment
Source
HTTP webhookGoogleApp trigger
Task
Process the new payment for {{payload.customerEmail}} and log it to the CRM.
Filter On
payload.amountgreater_than500
Webhook auth
Public (no auth)Bearer secret
Delivery
Tell me when it’s done
Just run it
Create triggerCancel
Create trigger drawer — HTTP webhook mode, all five sections
The Task section controls three things: what the agent should do, which payload values to embed in the instruction, and which event fields to pass alongside it.
Task description
Write a plain-language instruction for the agent — up to 5,000 characters. Tell it what to do with the event, who to notify, where to store the result. The placeholder shows a minimal example:
Event details are automatically appended to what the agent receives — you do not need to describe the payload schema in the task description itself. Use the task description for the goal, not the data.
Payload templating with the double-brace syntax
Embed live payload values directly in the instruction using {{payload.fieldName}} tokens. When the trigger fires, each token is replaced with the matching field from the incoming event before the agent sees it.
example instruction
Process the new payment for {{payload.customerEmail}} and log theamount ({{payload.amount}}) to the CRM under their account.
What happens when a field is missing: the token renders as an empty string. Over-templating on fields that are not always present in the payload can produce confusing instructions — use tokens only for fields the provider reliably sends every time.The path supports dot notation for nested fields: {{payload.customer.email}}.
Event data picker
Below the task description, the Event data section controls which fields from the incoming event are included in the JSON block the agent receives alongside your task description.Choosing fields: the picker shows a catalog of fields built from a sample payload. Checked fields are sent; unchecked fields are omitted. The count summary shows how many are included:
Leave it as “All fields” unless context window size is a concern. When no explicit selection is made, all fields are forwarded and new fields added to the event schema in the future are automatically included. An explicit selection is frozen — new fields require re-saving the trigger to include.For HTTP triggers without a sample payload: toggle Send the full payload to the agent on to forward every field from the webhook body. Only top-level fields can be individually selected; nested objects are always sent wholesale.
If no fields are checked and “All fields” is also off, the agent receives only your task description — no event data at all. The picker shows a warning: “The agent will only see your task description, not any event data.”
Task · Event data picker · Gmail trigger
Event data3 of 5 fields included
FromRecommended
SubjectRecommended
Email bodyRecommended
Message IDOther
Thread IDOther
Agent input preview
Summarize the email and add it to my notes
Event data picker — 3 of 5 Gmail fields selected with agent input preview
High-volume event sources like webhooks can fire hundreds of events per day. The filter layer lets the agent sleep through the noise and act only on the events you care about.
Toggle Filter incoming events on to add rules. The toggle hint describes the default: “Off = run on every event. On = only run on matching payloads.” Choose All conditions (AND — every rule must match) or Any condition (OR — any rule is enough).
equals / does not equal
Exact string or number match. Works on any field type.
contains
Substring match for string fields. Not available on boolean or object fields.
greater than / less than
Numeric comparison. Only available when the field type is a number.
exists
Checks whether the field is present in the payload at all. Use it to gate on optional fields.
For HTTP triggers, paste a sample payload before building filter rules. The Choose a field… path picker builds its suggestions from the sample — without one, you can only type custom paths manually (e.g. payload.x.y).
Filter evaluation on the client (Dry Run) and on the server (live dispatch) use the same @actionmodel/triggers-runtime package — the preview and production behavior cannot drift. What you see in Dry Run is exactly what fires live.
The Preview with sample payload panel renders the exact instruction and evaluates every filter rule against any JSON you paste — instantly, client-side, with no model call and no event stored.
1
Open the trigger detail
Click the trigger row in the Triggers list to expand the detail panel.
2
Paste a sample payload
In the Preview with sample payload section, paste a representative JSON payload — a real webhook body, a copied event from your provider’s dashboard, or a hand-crafted example.For Google triggers, click Fetch latest event instead. This pulls the most recent matching event from your Google account in the last 7 days, normalized to the same shape the trigger will receive.
3
Click Preview
The panel instantly shows two things: the rendered instruction (with all {{payload.x}} tokens resolved), and the filter result:
Pass — would dispatch
Fail — event would be filtered (the agent would not run)
Once Dry Run looks right, fire a real end-to-end test with the Run live test button.
Run live test creates a real event and runs the agent. If the agent can write to external systems — send email, update records — those writes will happen. Ensure the agent’s approval mode is set appropriately before running.
1
Enable the agent
The Run live test button is disabled when the agent is off. Enable the agent in the studio first.
2
Click Run live test
Confirm the dialog, which warns: “This creates a real event and runs the agent.”
3
Follow the run
A toast confirms: “Live test fired. Open the chat session to follow it.” Switch to the Recent events tab to watch the event progress through statuses in real time.
trigger · stripe-payments · Preview with sample payload
Sample payload
Preview
Rendered instruction
Process the new payment for [email protected] (amount: $1200) and log it to the CRM.
Filter result
Pass — would dispatch
Dry run — payload tokens resolved, filter result: Pass
The Recent events tab on each trigger keeps a full log of every inbound event: its status, the rendered payload, the filter outcome, and a direct link to the agent run transcript.
The table auto-refreshes every 5 seconds so you can watch a live test progress in real time. Click any row to open the Event detail drawer.
What the event detail drawer shows
Payload — the raw event body, with sensitive keys automatically redacted
Filter result — which rule passed or dropped the event
Dispatch info — the agent, model, and run metadata
Open chat session — a direct link to the full agent run transcript for completed or failed events
Reading the status badges
Status
Meaning
Received
Event arrived; awaiting processing
Ready
Event parsed and queued; awaiting claim by the worker
Claimed
Worker picked it up; agent run starting
Dispatched
Agent is actively running
Completed
Agent run finished successfully
Failed
Agent run threw an error; details in drawer
Filtered
Event did not match the filter rules; agent was not invoked
Expired
Event was not claimed within 7 days and will not run
Cancelled
Run was stopped before completion
Diagnosing a trigger that fires but nothing happens
If a trigger receives events but the agent never seems to run, the most likely cause is that events are being filtered. Check the Recent events tab for rows with a Filtered badge and click the row — the drawer shows exactly which filter condition dropped it.
trigger · stripe-payments · Recent events
TimePayloadStatus
11:03amount: 2400, status: paidCompleted
10:55amount: 80, status: refundedFiltered
10:42amount: 1200, status: paidCompleted
10:18amount: 560, status: failedFailed
10:02amount: 3100, status: paidReceived
Event detail
Payload
Filter result
Filtered out — amount less than 500
Open chat session
Not available — agent was not invoked
Recent events — mixed status badges with detail drawer open on a Filtered row
Rotate the URL when a secret is compromised or when you want to revoke access from a specific producer. The old URL stops accepting requests the moment you confirm.
1
Select the trigger row
Expand the trigger in the list to see the detail panel.
2
Click Rotate URL
A confirmation dialog appears with the warning: “The current URL will stop working immediately. Update any external integrations after rotating.”
3
Confirm
Click Rotate URL. The new URL appears immediately. A toast confirms: “New webhook URL generated.” Update every external producer before they send the next event.
Rotation takes effect with no grace period. Any request sent to the old URL after you rotate will be rejected — plan accordingly, especially for high-volume producers.
The trigger row shows a badge indicating whether the webhook endpoint is ready. If it shows Provisioning failed, a Retry button appears — click it to re-attempt provisioning without deleting the trigger.
Google push subscriptions expire and can be revoked. Actionist shows a health badge on each Google trigger row so you can spot problems before events start silently dropping.
Healthy
Healthy
Subscription is active and receiving events normally.
Renewing
Renewing
Subscription is being automatically renewed. Brief gap in delivery is possible.
Needs reconnect
Needs reconnect
OAuth token was revoked. No events will be received until reconnected.
Stopped / Expired
Stopped
Subscription has ended. Reconnect to resume delivery.
7 daysevent TTL — unclaimed events expire and will not dispatch
7 daysraw payload retention window
30 minmax agent run duration per event
~45 sworker poll interval (±5s jitter)
60 sHTTP deduplication window — identical payloads within window fire the agent once
7 daysGoogle sample event lookback for Fetch latest event
The ~45-second poll interval means an event delivered to the backend can take up to 45 seconds before the agent starts processing. Design time-sensitive workflows accordingly.
Paste a real payload before adding filter rules (HTTP)
The Choose a field… path picker and the Event Data Picker both build their suggestions from the sample payload you provide. Without a pasted sample, only top-level keys appear and you cannot get field-level operator suggestions. Paste a real payload first, then build the filter.
Leave Event Data as 'All fields' unless token count is a concern
The all-fields setting (undefined in the data model) auto-includes fields added to the event catalog later. An explicit selection is frozen — any new fields the provider adds require you to re-save the trigger to include them. Prefer all-fields for low-stakes triggers; use an explicit selection only when the payload is large enough to cause context window issues.
Use Dry Run before connecting real traffic
Paste a representative payload and confirm both the rendered instruction and the filter result look correct. Dry Run is instant, client-side, and has zero side-effects. There is no reason not to use it — it catches template errors and filter misconfiguration before the first real event arrives.
Use Bearer Secret authentication for any sensitive webhook
Store the secret in the Credentials Vault; the credential’s value is checked against the incoming X-Actionist-Trigger-Secret header on every request. Public (no auth) is fine for low-stakes event buses; anything involving PII or financial data should always use bearer secret.
Rotate the URL only when a secret is compromised
Rotation takes immediate effect with no grace period. Update all external producers before rotating if you can — not after. If you are responding to a leaked secret and cannot coordinate, accept a brief delivery gap and update producers immediately after rotation.
Template the double-brace syntax sparingly
Missing tokens render as empty strings silently. Over-templating on fields that are not reliably present produces confusing agent instructions. Use tokens only for fields your provider sends consistently on every event of that type.
Watch the 'Filtered' badge before assuming a trigger is broken
If the trigger receives events but the agent never runs, check the Recent events tab for Filtered status rows. The Event detail drawer shows exactly which condition dropped the event — usually a value mismatch or a field that was not present in the payload.
Monitor Google subscription health
Google OAuth tokens can be revoked silently — by the user, by a password reset, or by a security policy. The Needs reconnect badge is the only signal. Check trigger rows periodically and reconnect immediately when it appears; the subscription stops delivering events the moment the token is invalidated.
Three event-driven reactions that eliminate the gap between something happening and your team knowing about it.
Dario · Sales
New-lead webhook fires the moment a form submission lands. Dario’s agent reads the payload, checks the CRM for context, and drafts a personalised intro email — ready to review before the lead has closed the tab.
live in < 2 min after the first webhook fires
Felix · Finance & Ops
Gmail: New message with “invoice” in the subject wakes Felix’s agent. It extracts the amount and due date, logs them to the expenses tracker, and schedules a payment-reminder task for three days before the deadline.
saves ~3 hrs/wk on manual invoice triage
Sam · Solo founder
Drive: File created in the Contracts folder triggers Sam’s agent. It reads the filename and folder, adds a needs-legal-review flag to the project tracker, and posts a summary to the legal Slack channel — all before Sam is back from the meeting.
zero manual handoffs on contract intake
You were in a two-hour meeting. Three things happened in the world. Your agents dealt with all of them.