Channels
How CoPhrase connects to messaging channels — the full matrix of connection methods, what each channel supports, and which ones are unofficial.
A channel is a place your customers message you. A connection is one linked account on that channel: one WhatsApp number, one Discord server, one Instagram professional account, one website widget.
You connect channels. You configure one agent. Every connection points at an agent, and that's the whole wiring model.
What you can connect today
Web chat, Discord, email, WhatsApp, Telegram, and Instagram DMs are live. Messenger, WhatsApp Business API, iMessage, SMS, and connected Gmail/Outlook inboxes are being built — each is marked below.
One agent, one brain, every channel
Channels differ wildly — Discord is a persistent socket to a server, WhatsApp Web is a linked-device session, Messenger is a signed webhook from Meta. The agent doesn't know about any of that.
Every inbound message, whatever the channel, is converted into the same normalized message before it reaches the agent:
- who sent it (resolved to a contact within the current channel identity)
- which thread it belongs to
- what's in it — text, image, audio, video, file, location
The agent replies with a normalized message back, and the connector layer figures out how to actually deliver it on that channel. The agent code contains zero channel-specific logic.
Three consequences worth knowing:
One contact, many identities. The data model can attach multiple channel identities (an Instagram user id, a phone number, a Discord user id) to one contact. Contacts are created per channel identity; verified rules for safely linking the same person across channels are being built.
The thread is the work item, not the person. That same contact still has two separate threads — one Instagram, one WhatsApp. Taking over the WhatsApp thread doesn't silence the agent on Instagram. The merged cross-channel history shows up as context on the contact, not as one merged conversation.
Capabilities degrade, they don't break. Every channel declares what it can carry — maximum message length, which media types, whether it supports typing indicators. The agent is told the limits before it writes, so it writes a reply that fits. Anything richer than the channel supports falls back to text.
The channel matrix
| Channel | How you connect it | Official API? | Status |
|---|---|---|---|
| Web chat widget | Script tag on your site → iframe | Yes | Live |
| Discord | Invite the CoPhrase bot into your server | Yes | Live |
| Forward your support address to a CoPhrase inbound address | Yes | Live | |
| WhatsApp (Web) | Linked device — scan a QR code or enter a phone code | No | Live |
| Telegram | Bot token from BotFather → webhook | Yes | Live |
| Instagram DMs | Instagram Login on a professional account | Yes | Live |
| WhatsApp Business API | Managed number, or bring your own via Meta signup | Yes | Being built |
| Messenger | Meta OAuth on a Facebook Page | Yes | Being built |
| iMessage | A BlueBubbles server on a Mac you run | No | Being built |
| SMS | Bring your own Twilio account, number, and credentials | Yes | Being built |
| Email — connected Gmail / Outlook | OAuth on a mailbox you already have | Yes | Being built |
Official vs unofficial — read this before connecting
Some channels have an API the platform vendor sanctions. Others work by holding a session that looks, to the vendor, like the customer's own device.
Official channels (widget, Discord, Telegram bot, Instagram DMs, Messenger, WhatsApp Business API, SMS, email) avoid the account-session automation risk of unofficial connectors. Provider policy, approvals, messaging windows, templates, and rate limits still apply.
Unofficial channels are WhatsApp Web and iMessage.
Unofficial channels put your account at risk, not ours
WhatsApp Web is a linked-device session on your real WhatsApp number — the same mechanism as WhatsApp on your laptop. WhatsApp does not sanction automating it. Numbers that send too much, too fast, or from the wrong kind of network get restricted or permanently banned, and the ban lands on your number, not on CoPhrase. iMessage requires a Mac you own and keep running, and is likewise not an official Apple integration.
We ship WhatsApp Web because it's what many businesses actually use, and we surround it with the machinery it needs: automatic warm-up ramps, a dedicated residential IP per number, send governors, and restriction detection. Those controls reduce the risk. They cannot remove it. If an official route exists for you — WhatsApp Business API instead of WhatsApp Web — take it.
What's next
Every channel above marked Being built is in active development:
| Channel | Why it's not live yet |
|---|---|
| WhatsApp Business API | Number resell runs through a managed Twilio subaccount, and A2P/10DLC registration is filed in your name. Telephony registration is calendar-bound and cannot be rushed. |
| Messenger | Meta App Review. Provider review is calendar-bound. |
| iMessage | Requires a Mac you own and keep running, plus a tunnel back to us. High setup cost, so it's sequenced behind broader demand. |
| SMS | Bring-your-own Twilio, gated on the same A2P/10DLC registration as WhatsApp Business API. |
| Connected Gmail / Outlook | OAuth on a mailbox you already have, so the thread lives in your real inbox. Until it lands, email works by forwarding — same agent, same inbox, replies still from your own domain. |
Messaging windows (Meta channels)
Instagram, Messenger, and WhatsApp all enforce a 24-hour window. It is the single most surprising constraint on these channels, so it's worth stating once here:
- The window opens (and re-opens) only when the customer messages you. Nothing you send extends it.
- Instagram and Messenger: free-form replies are only allowed inside the window. You can never message someone who hasn't messaged you first.
- WhatsApp: outside the window, only pre-approved templates may be sent — and sending a template does not re-open the free-form window. Only a reply from the customer does.
CoPhrase tracks the window per conversation and routes sends accordingly. Details on each channel's page.
What each channel can carry
Limits are enforced before sending, not discovered afterwards — providers silently truncate over-length messages, so we don't let them get that far.
| Channel | Outbound message length | Outbound media |
|---|---|---|
| Instagram DMs | 1,000 characters | Text and images |
| Telegram | 4,096 characters | Text |
| WhatsApp (template body) | 1,024 characters | Per approved template |
| SMS | Billed in 160-character GSM-7 segments | Text out; MMS receive-only |
| Web chat widget | No practical limit | Text; buffered reply |
The agent sends a complete reply on every channel. The widget's authenticated SSE stream carries identity-only wake events and then refetches durable items; it does not carry token deltas, so the reply appears at once rather than typing itself out. Token-by-token widget display is being built. Provider channels receive the full reply in one message, with a typing indicator where supported.
Inbound media
The web chat widget is text-only. Every other channel runs inbound media through the same pipeline, where the provider supports it:
- Audio messages (voice notes) are transcribed before the agent replies.
- Images and PDFs are read and described before the agent replies.
WhatsApp and Instagram customers lead with voice notes and photos constantly, which is why media understanding is part of the target connector design rather than an optional add-on.
A few behaviors that apply everywhere
- Rapid-fire messages collapse. A customer who sends four messages in ten seconds gets one considered reply, not four.
- Language is mirrored. The agent replies in the language the customer wrote in.
- First message from a stranger is spam-checked. Flagged contacts get no reply and stay out of your inbox counts. The raw message is still stored — nothing real is silently dropped.
- A verified human reply pauses the AI on that thread. Take over and reply from the inbox, or reply as a mapped manual owner in Discord. See Handoff.