Skip to main content
After this guide, a connected integration delivers an event such as a new Linear issue either to the agent as a background turn or to a webhook or trigger URL you choose. Verified against lua-cli 3.33.0. Before you begin
1

List the events a type offers

Each event is <object>.<event>; [virtual] events are polled by Unified.to at an interval you choose, [native] ones are pushed by the provider.
Output
--connection <id> lists the events of an existing connection instead; --json prints { source, events, defaults }.
2

Create the subscription

Name the connection, the event, and the destination; for a virtual event add --interval in minutes (minimum 1; the interactive menu offers 1 to 2880). Without --hook-url the CLI asks where to send events, so a headless run passes the agent’s own address explicitly.
The same subscriptions can be made at connect time with lua integrations connect … --triggers task_task.created,task_task.updated (add --hook-url <url> for your URL); a virtual event subscribed this way polls every minute.
3

Decide what receives the event

With the agent’s address as the destination, each delivery starts a background turn on the channel integration:<type> (integration:linear), as the user who connected the integration. The model receives the message [Webhook Trigger] <event description> and a context block holding the event as JSON; data holds the changed objects in Unified.to’s model for that object type, each with its id.
The block is cut at 50,000 characters; what happens next is up to the persona and the agent’s tools. Delivery is at most once: the platform acknowledges every event on receipt and never retries or deduplicates, so a redelivered event wakes the agent again. With --hook-url, Unified.to posts directly to your webhook or trigger URL, with the changed objects in data and the subscription’s integration_type, object_type, event, and connection_id under webhook.
4

Pause, resume, or delete

Pause one subscription by ID or every subscription of a connection; resume the same way. Delete is by ID only.
5

Verify

List the subscriptions: each prints as <object>.<event> (poll|push, agent trigger|custom URL) with its ID, and a paused one carries (paused by you).
Then make the change in the provider (create an issue) and, for a virtual event, wait one interval. lua logs --type user_message --limit 20 lists the wake-up turn as [Webhook Trigger] <event description> with Channel: integration:<type>; a custom URL delivery shows in your webhook’s logs (see Logs and debugging).

Options you may need

The two triggers commands

lua integrations triggers <action> is an alias of lua integrations webhooks <action>, and the CLI calls a subscription a trigger elsewhere too: the --triggers flag on connect, the Available Trigger Events heading of events, the agent trigger destination in list, and the [Webhook Trigger] prefix on the message the agent receives. The top-level lua triggers command manages platform triggers, which are unrelated: pasteable URLs that invoke the agent on demand (see Create a trigger). The comparison table sets the three side by side.

Start a workflow once per event

For a durable record, point --hook-url at a trigger whose transform returns { startWorkflow, idempotencyKey }: the run is created in the delivery request, and a repeated post with the same object IDs returns the same run instead of starting another.
src/triggers/linear-issue.trigger.ts
Unified.to signs each post with sig256 over a secret only the platform holds, so your destination can’t verify it, and the post carries no x-lua-signature: a LuaWebhook with secret set answers it 401. Prefer a trigger URL, whose token is the credential (lua triggers rotate-token replaces it), to an unsigned webhook URL, which anyone knowing the agent ID and webhook name can call.

Filters

--json on events lists each event’s availableFilters, but the CLI has no flag to set them: a subscription made with the CLI receives every occurrence of the event.

If it isn’t working

The object and event pair isn’t offered for that connection. Run lua integrations webhooks events --connection <id> and use one of the listed pairs.
create needed a prompt: --connection, --object, --event, or --hook-url is missing, or the event is virtual and --interval is missing. Pass them all.
lua integrations webhooks list shows the subscription as (paused by you) or (credit-suspended), or the polling interval hasn’t elapsed. Resume it with lua integrations webhooks resume --webhook-id <id>; a credit-suspended subscription resumes only after credits are added. If it is active, lua logs --type agent_error --limit 20 shows a delivered turn that failed, Channel: integration:<type> under the entry; --type agent_response shows one that ran. No --type filters by channel.

Next steps

Handle a webhook

Receive a --hook-url delivery in your own code.

About triggers

Platform triggers, and how they differ from integration webhooks.

Manage integration MCP tools

The tools a woken agent can call.

lua integrations reference

Every webhooks option.