Channel Adapters: Custom UI, Slack, WhatsApp Cloud
Last updated 2026-02-12
Official starter repositories:
rooaak-custom-ui-sample-approoaak-slack-adapter-starterrooaak-whatsapp-cloud-adapter-starter
Rooaak uses one public message lifecycle for all channels:
- Adapter receives inbound provider/user message.
- Adapter calls
POST /v1/agents/:id/messages. - Rooaak responds immediately (
200 responded) or async (202 pending). - Adapter either polls
GET /v1/messages/:idor waits formessage.respondedwebhook. - Adapter posts Rooaak reply back to provider/customer UI.
Metadata conventions
Send channel metadata so webhook payloads can be correlated without extra lookup:
{
"sessionId": "channel-session-123",
"message": "hello",
"metadata": {
"correlationId": "adapter-request-1",
"channel": {
"type": "slack",
"externalChannelId": "C123",
"externalThreadId": "1700000000.123",
"externalMessageId": "1700000000.123"
}
}
}channel.type should be one of:
custom_uislackwhatsapp_cloud
Slack adapter shape
- Verify Slack signatures.
- Map Slack
channel + thread_ts + tsto Rooaak metadata channel fields. - Use webhook
message.respondedand post response to Slack viachat.postMessage.
WhatsApp Cloud adapter shape
- Verify Meta webhook signature/token.
- Map
wa_id + message.idto Rooaak session/correlation metadata. - On
message.responded, send outbound WhatsApp message via Graph API.
Custom UI adapter shape
- Use your own auth/session model.
- Use stable app conversation ID as
sessionId. - Attach app request ID as
metadata.correlationId.
This keeps custom UI, Slack, and WhatsApp on one Rooaak contract without exposing provider-specific APIs from Rooaak itself.
Detailed guides
custom-ui-adapter-guideslack-adapter-starter-guidewhatsapp-cloud-adapter-starter-guidewebhook-lifecycle-guidechannel-adapter-production-checklistchannel-adapter-e2e-validation-matrixarchitecture-decisions-adapter-first