# Channel Setup

> How accounts, senders and channels relate in Zavu - what you connect, what bills, and how to find the sender to send from.

- Skill: `zavudev/channel-setup` (Agent Skill)
- Install (CLI): `npx skillmds add zavudev/channel-setup`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zavudev/channel-setup/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: zavudev (https://skillmd.com/u/zavudev)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/zavudev/channel-setup

---


# Channel Setup

## When to Use

Use this skill when wiring a freshly connected channel (WhatsApp, Telegram, Instagram, Messenger, email, phone number) into code, or when deciding which sender ID to pass to the API.

## The two-layer model

Zavu has two objects that beginners often conflate:

| Layer | What it is | Where it lives |
|---|---|---|
| **Account** | The connection to a provider: a WhatsApp Business Account, a Facebook Page, an Instagram account, a Telegram bot, an email domain, a phone number | Connected in the dashboard (Accounts, Phone Numbers) or via partner invitations |
| **Sender** | The API handle that ROUTES accounts: what you pass as `Zavu-Sender`, what carries the webhook and the AI agent | `GET /v1/senders` |

**Billing:** accounts are what you pay for (a WhatsApp account, a channel connection, a phone number). **Senders are free** — they are the view that groups your accounts under one sending identity.

**Connecting always yields a ready sender.** When an account is connected and no sender references it, Zavu creates one automatically, named after the account (the WhatsApp verified name, the Page name, the @username). The first sender of a project becomes the default. Partner-invitation connects have always worked this way; every connect surface now does.

## Finding the sender to send from

`GET /v1/senders` is the answer to "what can I send with, and from where?". Each sender's `channels` array is the source of truth for capability — computed from its actual configuration, not inferred:

```json
{
  "id": "sender_12345",
  "name": "Acme Store",
  "channels": ["whatsapp", "sms", "voice"],
  "isDefault": true
}
```

- An empty `channels` array means the sender cannot send anything yet (a phone number alone does not enable SMS).
- Omit `Zavu-Sender` to use the project's default sender.
- To target a specific one, pass its ID as a header inside the send params object: `'Zavu-Sender': "sender_12345"`.

## Per-channel wiring

| You connected... | The sender... | Send with |
|---|---|---|
| WhatsApp (embedded signup or invitation) | auto-created, `channels` includes `whatsapp` once the account is active | `channel: "whatsapp"` |
| Messenger Page / Instagram account | auto-created, named after the Page/@username | `channel: "messenger"` / `"instagram"` |
| Telegram bot | attached via `POST /v1/senders/{senderId}/telegram` (bot token from @BotFather) | `channel: "telegram"` |
| Email domain (verified) | attach with `emailAddress` on sender create/update | `channel: "email"` |
| Nothing yet (zero-setup start) | `enableSmsOneway: true` on `POST /v1/senders` or `PATCH /v1/senders/{senderId}` — no number, no credential, active immediately; recipients cannot reply | `channel: "sms_oneway"` |
| Phone number | route it to a sender (`PATCH /v1/phone-numbers/{id}` with `senderId`) — that is what turns SMS on; add `enableVoice` for calls | `channel: "sms"` / `"voice"` |

One sender can carry several channels at once — that is the point: one `Zavu-Sender`, every channel.

## Constraints

- A sender belongs to one project; an account is routed by at most one sender.
- Webhooks and AI agents are configured per sender, so they apply to every channel that sender carries.
- Free plans include two connection slots (one can be a WhatsApp account); paid plans add connections at a monthly fee per connection. Creating senders never costs anything.

