Writing a campaign message template
One composer for every channel's message body, merge fields that stay honest in preview, an optional AI draft pass, and two lifecycles that move independently.
Every campaign's channel ladder points at message templates, not raw text typed per send — one template, reused across every campaign that needs the same wording. The templates screen is one page: a list of what already exists on the left, a composer on the right.
Choosing a channel decides your editor
Plain-text channels (WhatsApp, SMS, Telegram, and the rest) get a merge-field-aware text composer with a live character ceiling per channel. Email gets a completely different, drag-and-drop HTML builder — switching between a plain-text channel and Email clears the body, because a plain-text draft and an HTML canvas aren't the same content in any sense worth carrying across.
Merge fields
Add a slot name once (letters, digits and underscores only) and reference it in the body as {{ slotName }}. The preview substitutes an obviously-fake sample value keyed off the name itself — a field with "balance" in it previews a fake number, one with "date" previews a fake date — so you can see roughly how a real send will read without a real resident's data ever touching this screen.
Use the preview before saving anything. A slot name that doesn't parse into a real value in production shows up as a literal {{ slotName }} on a resident's screen, not an error you'd catch here — the preview is your only check.
Drafting with AI
Type a short brief and let the copilot produce a first draft, scoped to your chosen channel's length ceiling and the slot names you've already defined. If your current body is empty, or is exactly the AI's last suggestion untouched, the draft lands silently. If you've written anything of your own since, you're asked to confirm before it's overwritten — nothing here silently destroys hand-written wording.
Two lifecycles, moving independently
A template's editorial status — Draft, Submitted, Approved, Rejected, Paused — is your own organization's sign-off, entirely separate from what a channel provider thinks of it.
For WhatsApp specifically, there's a second, provider review status tracked alongside it: not submitted, pending, approved, rejected, paused, disabled, or submission failed. Submitting a WhatsApp template really does reach Meta's own template review; the provider's verdict arrives asynchronously and is shown with its own reason code translated into a sentence wherever Kav recognizes it, and the raw code shown either way.
Editing an already-Approved template shows a warning before you touch it. Your organization's approval and the provider's approval both describe the current body — changing it without resubmitting can leave the two out of sync.