Communications
Part of the IP4CMS portal. β All module guides
What it's for β Communications is the portal's outbound messaging hub. From here you reach your members and contacts across multiple channels β email, SMS and WhatsApp β either one message at a time through the Compose Wizard or as a bulk send to many recipients at once. You build messages from reusable templates, target them at saved recipient lists (channels) or live searches of your members, locations, accounts and transactions, and then send immediately or schedule for later. Every send is recorded in Send Logs so you can see what went out, to whom, and whether it succeeded.
Where to find it β Main left-hand navigation β Communications. The menu lands on Send Logs (/app/communications/send-logs). Sub-items in the nav include Compose (Compose Wizard), Bulk Communications, Saved Drafts, Send Logs, plus Surveys, E-Forms and News Stands (documented separately). The actual setup pages β Mail Servers, Email Wrappers, SMS Gateways, Omni Channels, Message Templates and Channels β live under Settings β Communication (see Before you start).
Before you start
- Licence module. Your tenant must have the
communicationmodule enabled for any of this to appear. The recipient-list feature (Channels) is gated behind a separatecommunication:channelssub-module β if it's off, the "Add from channels" options are hidden. - Permissions. The Communications menu shows if you hold any of:
communication:read:history,communication:send:email,communication:send:sms,communication:compose:send,communication:channels:read:all,communication:bulk_communications:read:all(orsurveys:read:all). Specific actions need specific permissions β see Permissions & access. - Mail server / SMS gateway must be configured first. You cannot actually deliver anything until the relevant transport is set up under Settings β Communication:
- Settings β Communication β Mail Servers β an outbound SMTP / Google / Microsoft mail server with a from-address (required for email).
- Settings β Communication β SMS Gateways β an SMS provider (Twilio, AWS SNS, Clickatell, SMS Portal, BulkSMS, Infobip, etc.) with a from-number (required for SMS).
- Settings β Communication β Omni Channels β a WhatsApp provider, e.g. Twilio WhatsApp or Infobip WhatsApp (required for WhatsApp).
- Settings β Communication β Email Wrappers and Message Templates β branding wrapper and the reusable templates the Compose Wizard and Bulk sends draw from.
- A Message Template that supports the channel you want to use is needed for Bulk Communications; the Compose Wizard can start from a blank draft instead.
Key tasks
Compose and send a single message (Compose Wizard)
The Compose Wizard is the main way to build and send one message. Open Communications β Compose (/app/communications/compose/new). It is a four-step wizard.
Step 1 β Select delivery method
- Delivery Channels β pick one or more of Email, SMS, WhatsApp. (Only channels your tenant has transports for will deliver.)
- Choose a Starting Point:
- Blank Draft β start empty.
- Template β pick from the grid of Message Templates (columns: Template, Channels, Priority; searchable; Use Template / View per row). Only templates supporting your chosen channels appear.
- Saved Draft β resume a previously saved compose draft (columns: Draft Name, Channels, Updated, Status).
- Click Next.
Step 2 β Create message
The left panel holds Draft Details:
- Draft name (internal label for the draft).
- Email subject (shown when Email is selected).
- SMS content box ("Write the SMS content here") when SMS is selected.
- WhatsApp content box ("Write the WhatsApp content here") when WhatsApp is selected.
- Quick Placeholders β one-click insert buttons:
{{member.first_name}},{{member.last_name}},{{location.name}},{{account.account_name}}. - Channel Summary β pills showing the active channels.
When Email is enabled, the centre shows a drag-and-drop HTML email builder (GrapesJS). Click Next.
Step 3 β Choose recipients
Add recipients three ways:
- Add Recipient β manually enter First name, Last name, Email, Mobile. At least one of email or mobile is required. This adds a draft-only recipient (it does not create a reusable channel subscriber).
- Add From Channels β import all subscribers from one or more saved Channels. You can also Manage a channel inline (add/remove ad-hoc subscribers) or Create Channel before importing.
- Add From Search β search and filter live entities β Members, Locations, Accounts, Transactions β and tick the ones to add. Use Add filter to narrow results.
Recipients appear in a grid (Name, Email, Mobile, Origin, Status) with a Remove action. Click Next.
Step 4 β Confirm and send
Review the summary (draft name, channels, recipient count β note primary recipients only; CC is not supported in bulk compose) and the per-channel previews (Email Preview with subject, SMS Preview, WhatsApp Preview). Then either:
- Send Message β sends now (button shows "Sendingβ¦").
- Schedule Message β opens a Send at date/time picker (must be at least ~60 seconds in the future) and queues it.
Save, resume and reuse drafts
- Compose drafts are saved automatically as you work. Find them under Communications β Saved Drafts (
/app/communications/compose/drafts). - Each draft row (Draft Name, Channels, Updated, Status) offers Resume Editing (reopens the wizard) and Duplicate Draft (clones it into a new draft).
- New Compose Wizard starts a fresh one.
Work with Message Templates (and predefined content)
Reusable, multi-channel templates are managed under Settings β Communication β Message Templates (not inside the Communications module). A Message Template can carry content for several channels at once:
- Email: subject, HTML content, plus the Mail Server, Email Wrapper and Mail Template to use.
- SMS: plain-text content + SMS Gateway.
- WhatsApp: content + Omni Channel (provider) and any provider template metadata.
- Push / In-app: title/body/icon/action URL or in-app content.
- Variables: placeholder names (e.g.
{{first_name}}, dotted paths like{{account.balance}}) that are merged in at send time. - Priority: Low / Normal / High / Urgent, and an Active flag.
Create one here first if you want it available as a starting point in Compose or as the basis for a Bulk Communication.
Set up mail wrapper (branding) templates
Settings β Communication β Email Wrappers holds the branded shells that surround your email content. A wrapper defines header/footer HTML, header/footer/body/content background and text colours, and a wrapper HTML body that must include a {{content}} placeholder β your message content is injected there at send time. Mark one as default to apply it automatically. (The plainer header/footer content templates are the related Mail Templates, also referenced from a Message Template.)
Bulk send to groups and audiences
For a campaign-style send driven by a Message Template, use Communications β Bulk Communications (/app/communications/bulk).
- Click Add Bulk. Enter an optional Name, choose a Message template (only active templates appear; if none, the page links you to Set up message templates in Settings), and tick the Channels to use (Email / SMS / WhatsApp β only channels the template supports can be selected). Click Create.
- On the bulk detail page, add receivers while it's still a draft:
- Add from channels β adds all subscribers of the selected Channels.
- Add from search β search/filter Members, Locations, Accounts or Transactions and select recipients.
- Use Preview to see the rendered message with sample placeholder values, and Edit to change name/template/channels.
- Send via Publish (immediate) or set a date/time and click Schedule.
- The detail page shows live stats cards β Total recipients, Sent, Pending, Failed β and a receivers grid (Name, Email, Mobile, Origin, Status). You can only delete a bulk (or remove receivers) while it is a draft.
Bulk status values: draft β scheduled β published; each receiver is tracked as pending β sent / failed.
Manage channels and subscribers
A Channel is a reusable, named recipient list (an audience / distribution list). Channels live under Settings β Communication β Channels (/app/settings/communication-channels) β the old /app/communications/channels links redirect there.
- Add Channel β enter a Name (required) and optional Description.
- The channels list shows Name, Description, Subscribers (count) with View / Edit / Delete.
- On a channel's detail page, click Add subscriber and choose a Source:
- Ad-hoc β First name, Last name, Email, Mobile (at least one of email/mobile required).
- Entity β pick an entity type (Member / Location / Account) and supply the entity ID, linking the subscriber to a real record.
- Remove subscribers individually. Channels are then selectable in the Compose Wizard and Bulk Communications via "Add from channels".
View send history and logs
Communications β Send Logs (/app/communications/send-logs) is the record of everything sent.
- Columns: Status (Sent / Pending / Failed), Channel (Email / SMS badge), Date, Entity (linked record, if any) and Recipient.
- Use the filter toolbar (Add filter β field + value) to narrow by status, channel, date or linked entity.
- Click View Details on a row to open the detail panel: Channel, Status, Subject, Recipients (count), Sent By, Sent At, Linked Entity, and the full message Content (rendered HTML or plain text). Close when done.
How the data connects
- What you enter β where it's stored. Channels and their subscribers are saved as reusable lists (
communicationchannel/communicationchannelsubscriber); a subscriber is either ad-hoc (typed-in name/email/mobile) or linked to a real Member / Location / Account. Message Templates, Email Wrappers, Mail Templates, Mail Servers, SMS Gateways and Omni Channels are tenant-level configuration records under Settings. - A Compose or Bulk send captures its recipients as receivers β a snapshot of each recipient's name/email/phone is taken at the moment you add them, alongside a link to the source channel subscriber or entity. So editing a member later does not retroactively change an already-built send.
- What it feeds. Recipients are drawn from your members, contacts, locations, accounts and transactions (via Add From Search) and from saved channels. After a send, every message is written to Send Logs, and bulk sends additionally maintain per-receiver status (Sent / Pending / Failed with an error message). Placeholders such as
{{member.first_name}}are merged from the linked entity at send time. Messages reach members through their email/SMS/WhatsApp; in-app/push content (where templates define it) surfaces in the member portal. - Sends run asynchronously. Publishing or scheduling does not block the page β each recipient is queued as a background job (BullMQ on Redis) on the Communications queue. These jobs are at-least-once: a job can in principle run more than once after a crash/retry, so the system uses deterministic, idempotent job IDs (one job per bulk + receiver) to avoid sending the same recipient twice. Scheduled sends are released at the chosen time and then fan out one job per pending receiver. Because delivery is async, a recipient may briefly sit at Pending before flipping to Sent or Failed.
Permissions & access
The whole module requires the communication licence module (and communication:channels for the Channels/recipient-list features). Key permission strings:
| Action | Permission |
|---|---|
| See Communications menu | any of communication:read:history, communication:send:email, communication:send:sms, communication:compose:send, communication:channels:read:all, communication:bulk_communications:read:all, surveys:read:all |
| Use the Compose Wizard / send compose | communication:compose:send |
| View Bulk Communications | communication:bulk_communications:read:all |
| View Send Logs / history | communication:read:history |
| Send email / SMS | communication:send:email / communication:send:sms |
| View Channels | communication:channels:read:all |
| Settings β Mail Servers | communication:mail_servers:read:all |
| Settings β Email Wrappers | communication:email_wrapper_templates:read:all |
| Settings β SMS Gateways | communication:sms_gateways:read:all |
| Settings β Omni Channels | communication:omni_channels:read:all |
| Settings β Message Templates | communication:message_templates:read:all |
Menu items, buttons (e.g. Compose Wizard on the Bulk list) and Settings tabs are hidden when you lack the matching permission or module, so different operators may see different subsets.
Tips & gotchas
- Set up a transport before you send. No mail server = no email delivery; no SMS gateway = no SMS; no omni channel = no WhatsApp. The Compose Wizard will let you build a message for a channel you can't actually deliver on, so confirm the relevant Settings β Communication transport exists first.
- Channels and the rest of the setup live in Settings, not Communications. The
/app/communications/channelsURLs redirect to Settings β Communication-Channels; templates, wrappers, gateways, mail servers and omni channels are all under Settings β Communication tabs. - "Add Recipient" in Compose is draft-only. Manually typed recipients are not saved as reusable channel subscribers β use the Manage option inside Add From Channels, or the Channels settings page, if you want a reusable list.
- CC is not supported in bulk compose β every recipient is a primary recipient.
- You can only edit/delete while in draft. Once a bulk communication is published, it (and its receivers) are locked; removing receivers and deleting are draft-only actions.
- Bulk needs a Message Template; Compose doesn't. If the Bulk template dropdown is empty, create/activate one under Settings β Communication β Message Templates. The Compose Wizard can start from a blank draft instead.
- Channel checkboxes follow the template. In a Bulk send you can only tick channels the chosen Message Template actually supports.
- Scheduling has a minimum lead time β the "Send at" picker won't accept a time less than ~60 seconds out.
- Pending is normal, briefly. Because sends are queued background jobs, expect a short Pending window. A stuck Failed row carries an error message in the receiver record / Send Log detail.
- Email wrappers must contain
{{content}}. A wrapper template without that placeholder has nowhere to inject the message body.