Channels β
A channel is the bridge between GCM and a messaging provider β WAHA for WhatsApp, Twilio for SMS, Resend for email, web push for browsers, in-app for the notification bell. The Channels page (sidebar β Channels, also reachable from Settings) lists every channel category, lets you pick a provider per category, and stores the credentials needed to send.
This is admin territory β channel configuration affects every member's inbox, so the page is gated by isAdmin.

Open the channels page β
Click Channels in the sidebar. You'll see one card per channel category β WhatsApp, SMS, Email, Push, In-app. Each card shows:
- The channel name and an icon.
- A Configured / Not configured badge.
- An Enabled switch β flip on once you've saved credentials.
- A Configure button that expands the credentials form inline.
Configuring a channel β
Click Configure on the channel you want to wire up. The card expands to show a provider selector (if there's more than one provider for this category) and a credentials form.
Provider selector β
Each channel category supports one or more providers:
| Channel | Provider options |
|---|---|
| WAHA (recommended) Β· WhatsApp Cloud API (Meta) | |
| SMS | Twilio Β· smsmobileapi |
| Resend Β· SMTP Β· Platform Default | |
| Push | Web Push (browser-native, no third party) |
| In-app | Built-in (no third party) |
The default provider is marked with "(default)" in the dropdown. You can switch providers later by re-opening the configure form and picking a different one β credentials are stored per provider so switching back doesn't lose your config.
Credentials form β
The form is built dynamically from the provider's config_schema. Each provider declares which fields it needs (API key, endpoint, sender ID, etc.) and the form renders the matching inputs. Required fields are marked with a red asterisk.
A few common patterns:
WAHA-backed WhatsApp:
- Session URL β
https://your-waha.example.com - API token
- A QR-scan step on first save to pair the WhatsApp account
WhatsApp Cloud API:
- Phone number ID (from Meta)
- Permanent access token
- Business account ID
- Webhook verify token
Twilio SMS:
- Account SID
- Auth token
- Sender β either a Twilio phone number or an alphanumeric sender ID where supported
smsmobileapi:
- API key
- Sender label
Resend (for email):
- API key
- Optional from-domain override
SMTP (for email):
- Host, port, username, password
- TLS/SSL toggle
Password and token fields are masked by default. Click the eye icon to reveal while you paste, then close it again before saving.
Save configuration β
Click Save Configuration. The credentials are written to org_channel_config (a per-org, per-channel row keyed by (organization_id, channel_id)) and the toast confirms. The credentials column is jsonb; the values are stored encrypted at rest in Supabase. They never appear in the browser after save β the next time you open the form, sensitive fields render as β’β’β’β’ until you click reveal.
Enable the channel β
Saving credentials doesn't automatically turn the channel on. Flip the Enabled switch in the card header to make the channel selectable in the messaging composer, workflow nodes, and reminder configuration.
TIP
You can configure a channel without enabling it β useful for setting up a staging config you'll switch on later. Disabled channels don't appear anywhere else in the app.
How channels are used downstream β
Once a channel is configured and enabled, it shows up in:
- Send Message β the channel picker in the composer.
- Workflows β the "Send notification" action node.
- Reminders β the channel checkbox list for event reminders.
- System emails β password resets, magic links, welcome emails (email channels only).
If a channel is disabled, the composer hides it; workflow nodes that reference it pause with an "channel not available" error rather than failing silently.
Multiple providers per category β
You can have more than one provider configured per category β for example, two SMS providers (domestic via Twilio, international via smsmobileapi). The send-message edge function picks the first provider that supports the recipient's country; you can also override per-send by picking the provider manually in the composer.
Plan limits β
Plan tiers cap how many recipients you can send to in one bulk message:
| Plan | Max recipients per bulk send |
|---|---|
| Starter | 100 |
| Growth | 1,000 |
| Network | 10,000 |
| Unlimited | no cap |
Per-second rate limits are enforced at the provider level β see the messaging channels overview for the gory details on how WACRM auto-spreads bulk sends across days when you exceed daily provider quotas.
What's saved where β
channelsβ platform-level catalog of channel categories (read-only for orgs).channel_providersβ platform-level catalog of providers per channel, withconfig_schema.org_channel_configβ per-org rows:(organization_id, channel_id, provider_id, credentials, is_enabled). RLS scopes bycurrent_org_id().
Testing a channel β
The configuration form doesn't include a built-in test sender (yet). To verify, send a test message from the Send Message page β pick the channel, address it to your own phone or email, and check delivery. If anything fails, the messaging logs (Settings β Data Logs β Messaging) show the provider's exact response.
Common pitfalls β
"WhatsApp says Configured but messages never deliver." Your WAHA session probably expired. Re-scan the QR from the WAHA dashboard. Sessions die when WhatsApp Web rotates auth, which can happen every few weeks.
"Twilio rejects all my sends." Twilio requires either a verified sender number or a registered alphanumeric ID for the destination country. Check the Twilio console for unregistered-sender errors β those don't surface in GCM's logs as clearly.
"I configured Resend but emails still go through Platform Default." The provider selector in Settings β Email is separate from the Channels page for email. Email has a dedicated config because some orgs run email through their own SMTP while the other channels stay default. Set the email provider in Settings β Email.
Next steps β
- Email + notifications β email provider lives on its own tab.
- Reminders β pick which channels send event reminders.
- Messaging overview β actually send messages once channels are wired up.
