Channels
A channel is a surface where messages enter and leave. Neofir treats all channels as wire formats for the same agent. The agent does not know which channel it is on except as a string in its system prompt — there is no per-channel prompt branch.
Supported channels
| Channel | Inbound | Outbound | Onboarding | Status |
|---|---|---|---|---|
| Web widget | POST /widget/message | SSE stream | Paste one line of HTML | Live |
| Instagram DM | Meta webhook | Send API | OAuth + page subscribe | Live (Dev Mode) |
| Facebook Messenger | Meta webhook | Send API | OAuth + page subscribe | Live (Dev Mode) |
| WhatsApp Business | Twilio webhook | Twilio Messages API | BSP-managed (1–3 days) | Live (BSP) |
| TikTok Business Messaging | — | — | — | Deferred (EEA excluded) |
How channels share an agent
Every inbound webhook resolves the org from the channel-side identifier (page ID, phone number, widget API key) and then passes the message through a single channel-agnostic message processor. From this point the path is identical: intent detection → RAG retrieval → personality prompt → LLM → tool dispatch → save → reply.
The channel string is included in the system prompt under Channel: web | instagram | messenger | whatsapp. The personality can be aware of it (the agent may behave slightly differently on IG vs web), but the platform does not branch.
Channel-specific behaviour
The few places channels do differ:
- Phone collection. On web, the booking tool requires a phone for SMS reminders. On IG/Messenger, the platform sets a
phone_optionalvisitor flag — the agent will not insist (it can DM the user instead). - Slot picker UI. On web the widget renders an inline slot picker. On IG/Messenger/WhatsApp the agent presents slots as a numbered text list and the user replies with a number.
- Welcome message. Sent automatically on web (on widget open). On messaging platforms the agent only speaks when spoken to.
- Streaming. Web uses SSE — replies stream token by token. IG/Messenger/WhatsApp send a single reply per turn.
Message quota
Every message counted against the org's plan quota, regardless of channel. The dashboard's Today page shows daily usage; the sidebar plan badge shows monthly usage.