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?) |
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 nextctx.reply() in a single HTTP request. That batches work into one request instead of several round trips.

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 inctx.conversation.metadata on every subsequent handler call.
Trigger a workflow
Start any Novu workflow from a handler, the same workflows you use for email, push, or SMS elsewhere in your account.- 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 toresolved, fires onResolve, and stores the summary as signal activity.
Example: all three signals in one turn
Related
Reply
Send plain text, markdown, attachments, and interactive cards.
Handle events
Event handlers and the context object your agent receives on every turn.
Connect your first agent
Walk through a full support-bot handler file.