Signals
Use signals in agent handlers for metadata, workflow triggers, and conversation resolution.
Signals let you change conversation state without sending another chat message. Replies go to the user; signals update metadata, fire workflows, or mark a thread resolved.
Use ctx.reply() when the user should see something. Use signals when you only need to persist data, trigger a Novu workflow, or close the conversation.
Signal types
| Signal | What it does | Method |
|---|---|---|
| Metadata | Store key-value data on the conversation (persists across messages) | ctx.metadata.set(key, value) |
| Trigger | Fire a Novu workflow (email, push, SMS, multi-step) | ctx.trigger(workflowId, options) |
| Resolve | Mark the conversation as resolved, with an optional summary | ctx.resolve(summary?) |
You can combine both in one handler turn: reply to the user, set metadata, call ctx.trigger() for an escalation email, and ctx.resolve() when the issue is done.
How signals are delivered
Signals are not sent the instant you call them. They are queued in memory and batched with your next ctx.reply() in a single HTTP request. That batches work into one request instead of several round trips.

If your handler finishes without calling ctx.reply(), pending signals are still sent automatically.
Set metadata
Store key-value data on the conversation (up to 64 KB cumulative). Metadata persists across messages and is available in ctx.conversation.metadata on every subsequent handler call.
Use metadata for intent, ticket IDs, escalation flags, or any state your agent needs across turns.
Trigger a workflow
Start any Novu workflow from a handler, the same workflows you use for email, push, or SMS elsewhere in your account.
Common patterns:
- Escalation emails
- CSAT surveys after resolution
- Alerting on-call teams
Resolve a conversation
Mark the conversation as resolved with an optional summary. This sets status to resolved, fires onResolve, and stores the summary as signal activity.
Resolved conversations automatically reopen if the user sends a new message.