Campaigns
Send one message to many contacts — WhatsApp templates, rich media, or interactive broadcasts — with per-recipient personalisation, scheduling, retry, and real-time delivery analytics.
TL;DR
- What it is — a broadcast module for WhatsApp and email. A campaign targets a recipient audience (chats, contacts, or a CSV), carries a message that fits the channel — an approved WhatsApp template, free text/media, or an email (subject + rich HTML body) — schedules for a future time, and tracks per-recipient delivery status.
- Who it's for — admins running marketing pushes, operations teams sending transactional bulk messages, and owners reviewing campaign performance.
- Top outcome — reach up to 100,000 recipients in one campaign with per-recipient personalisation, automatic retry, and delivery analytics — without losing the CRM's guest-context features on the replies that come back.
At a glance
| Plan tier | All paid tiers. |
| Who can use it | Account Owners and Admins can create campaigns. Users can view. |
| Channels | WhatsApp Official (templates at scale — around 600 messages per minute), WhatsApp Unofficial (free text only — around 6 messages per minute by default, tunable), and Email (subject + rich HTML body). The campaign channel picker shows only these three; Instagram, Messenger, and web chat aren't campaign-capable. See Official vs Unofficial below. |
| Integrations | Approved WhatsApp templates, Contacts for audience, Bot Journeys for reply handling. |
| Top limits | 100,000 recipients per campaign · 1 – 10 retry attempts · Schedule must be in the future. |
| API | Yes — partner API for creating, listing, cancelling, and inspecting campaigns. |
How to find it
Sidebar → Campaigns.
Direct URL: https://app.lodgestory.com/crm/campaigns
Creation path: + New Campaign at the top of the list — opens the four-step wizard.
Detail path: click any row in the list to open that campaign's progress view.
📸 [SCREENSHOT: campaigns-nav.png — sidebar with Campaigns highlighted]
What is Campaigns?
The problem it solves
Broadcasting on WhatsApp isn't like email. There's a 24-hour rule that limits free-text messaging once a conversation goes cold; to initiate at scale you need pre-approved templates with constrained variable slots. Template approval takes 24 – 48 hours. Rate limits are real and different per channel grade. Per-recipient personalisation requires variable substitution at send time. And delivery isn't automatic — every message has its own lifecycle (queued → sent → delivered → read / failed).
Campaigns handles all of that: the approval check (it refuses to schedule a campaign using a non-approved template), the rate-limit pacing (releasing messages at the channel's allowed rate), per-recipient variable substitution (from global values, contact fields, or CSV columns), retry logic (up to 10 attempts on transient failures), and real-time delivery roll-up (refreshed while the campaign runs).
What you get
- Audience from three sources. Pick existing chats, query contacts with filters (including custom fields), or upload a CSV.
- Message types per channel. WhatsApp templates on Official (the scale path); free text (with optional media caption or interactive buttons/lists) on Unofficial; and on Email, a subject line + rich HTML body — composed in a rich-text editor or pasted as a full HTML template, with a live mobile-email preview.
- Per-recipient personalisation. Template campaigns fill each slot globally, from a standard or custom contact field, or from a CSV column. Free-text and email campaigns use named
{{tokens}}(for example{{firstName}}or{{booking_id}}) that resolve per recipient — first from a matching CSV column, then a contact field, then a custom field. Both are evaluated at send time. - Scheduled, not immediate. Every campaign requires a future send time. The system releases messages at the channel's rate cap until the campaign completes.
- Retry built in. Per-recipient attempts are tracked; transient failures retry automatically up to your configured limit; permanent failures (invalid number, opt-out) stop trying and log the reason.
- Cancel mid-run. You can cancel a running campaign; already-sent messages aren't rolled back (that's a platform limitation — messages can't be recalled), but no further messages go out.
- Auto-refreshing progress. The list page refreshes automatically while any campaign is active. The detail page updates every few seconds while a campaign is in progress.
How it's different
- Template approval is enforced before scheduling. If your template hasn't been approved yet, the campaign won't schedule. You cannot accidentally queue a broadcast against a pending template.
- Variable substitution is three-layered. Each template slot can pull from a campaign-wide global, a named contact field, or a CSV column — in that priority. One campaign can mix all three across its slots. Free-text and email campaigns use the same idea with inline named
{{tokens}}instead of numbered template slots. - Campaigns share the same scheduled-message engine as the inbox. Scheduling a single message from the inbox composer uses the same pipeline as a 100,000-recipient campaign. They aren't separate code paths.
Customer scenarios
- Flash-sale broadcast. A hospitality group sends a template to 12,000 recent guests: "Weekend rates up to 30% off — valid 48 hours." The template has one slot for the guest's first name pulled from contacts. Scheduled for Thursday at 4 PM. By Friday morning, 11,400 delivered, 410 failed (mostly opt-out), 190 still retrying. Replies enter the inbox; the assigned bot journey classifies interested vs not interested and routes interested chats to an agent.
- Utility notification at booking time. A property-management webhook triggers a "booking confirmed" campaign to one recipient with the confirmation template. Mechanically identical to a 100,000-person campaign; the engine doesn't penalise singletons.
- Re-engagement via CSV. Marketing exports a segment from a BI tool, adds an Offer code column, and uploads the CSV as the audience. Each recipient's template fills {first name} and {offer code} from the row. The campaign runs; offer codes land personalised.
How it fits with the rest of Lodgestory
Upstream: Contacts is the audience source; WhatsApp Templates is the content source; Connections decides which channel a campaign can run on. Downstream: every reply to a broadcast enters Home; if the channel has a Bot Journey, replies trigger that journey. Cross: Analytics rolls up campaign volume; Reports exports per-message delivery history.
📸 [SCREENSHOT: campaigns-landing.png — campaigns list with active and completed campaigns]
Core concepts
| Term | What it means |
|---|---|
| Campaign | A scheduled broadcast with a recipient audience, a message (or template), and a send time. |
| Status | Draft, Scheduled, In progress, Completed, or Cancelled. |
| Message type | Text, Template, Image, Video, Document, or Interactive. |
| Variable mapping | How per-recipient values are filled. Template campaigns map each numbered slot to a global value, contact field, or CSV column. Free-text and email campaigns use inline named {{tokens}} resolved from a CSV column, then a contact field. |
| Audience source | How recipients were chosen — existing chats, filtered contacts, or an uploaded CSV. |
| Per-recipient status | Pending, Processing, Completed, or Failed — tracked individually for every person in the audience. |
Quick Start — send your first broadcast in 7 minutes
Step 1 — Open Campaigns
Sidebar → Campaigns or https://app.lodgestory.com/crm/campaigns.
Step 2 — Click + New Campaign
Opens the four-step wizard.
Step 3 (Wizard 1) — Pick the channel
Choose a connected channel — only WhatsApp Official, WhatsApp Unofficial, and Email are campaign-capable, so those are the only ones shown. WhatsApp Official is the default for scale. The choice drives which message types and templates are available downstream — picking Email switches the composer to a subject + HTML body.
📸 [SCREENSHOT: campaigns-qs-1-channel.png — wizard step 1, channel]
Step 4 (Wizard 2) — Compose the message
Paths, based on channel capability:
- Template (WhatsApp Official) — picker shows only approved templates for the selected channel. On pick, variable slots appear with a source selector per slot: contact field, CSV column, or global value.
- Quick (WhatsApp text or simple media) — plain text with optional media attachment. Supports inline
{{tokens}}for per-recipient personalisation. - Interactive (channels that support it) — reply buttons or list selection built inline.
- Email (Email channel) — a subject line and a body. Compose in the rich-text editor, or switch to HTML mode to paste a full email template (tables, inline styles) sent as-is. Insert
{{variables}}into the subject or body, and watch a live Gmail-style mobile preview render the result for a sample recipient.
If the template isn't approved yet: you'll see "Template is not approved for use" and the campaign won't save. Wait for approval.
Step 5 (Wizard 3) — Pick the audience
Three options:
- Existing chats — multi-select from the chat list with the same filters as the inbox.
- Contacts — filter by standard fields and custom fields. Campaign creates a chat per contact at send time if needed.
- CSV upload — for WhatsApp, include at minimum a
phonecolumn (plus optionalcountryCode); for Email, anemailcolumn is required. Any extra columns feed personalisation variables ({{column_name}}). Use Download Sample CSV for a channel-correct template, then click Import to add the rows to the audience.
Step 6 (Wizard 4) — Schedule & submit
Pick a future date and time. The send-rate budget is configurable here. Click Schedule.
What you'll see next: the campaign appears in the list with status Scheduled and a countdown to the send time.
Step 7 — Watch it run
The list refreshes automatically. Click the row to open the detail page — it updates every few seconds while the campaign is in progress. Progress bars show sent, delivered, and failed counts.
How it works
When you schedule a campaign, Lodgestory:
- Validates the template's approval status (for template campaigns).
- Validates the audience size (up to 100,000) and the future send time.
- Validates every variable slot has at least one source to pull from.
- Resolves the audience to a list of recipients — creating chats for contacts that don't have one yet.
- Creates one send-job per recipient in the message queue.
At send time:
- The queue releases as many messages as the channel's rate cap allows.
- For each recipient, Lodgestory resolves variable values (global, contact field, or CSV row) and delivers the message.
- Success marks the recipient's job as delivered; transient failures retry with back-off up to the configured limit; permanent failures stop trying and log the reason.
- When every recipient has either succeeded or exhausted retries, the campaign moves to Completed.
Official vs Unofficial WhatsApp — the rules that change per channel
Campaigns behave differently depending on the WhatsApp channel type. The differences come from WhatsApp's own policy (for Official) and account-safety throttling (for Unofficial).
Templates
- WhatsApp Official — templates and free text are both possible, but for broadcasts at scale you almost always use an approved template. Template approval is a platform-side process; approvals typically take 24 – 48 hours. A campaign against a non-approved template won't save.
- WhatsApp Unofficial — templates are not supported. Campaigns on Unofficial channels send free text (plus media and interactive messages). No approval process, no waiting.
24-hour messaging window
- Official is subject to the 24-hour rule at the platform level. For scale broadcasts this effectively means "template-only for Official campaigns" — you can't rely on a 24-hour window for 100,000 people.
- Unofficial has no 24-hour window. Free text to opted-in contacts at any time.
WhatsApp groups
Both channels support groups. In practice, Unofficial is the typical choice for group-heavy broadcasts because the Official channel is oriented to 1:1 business-to-customer flows.
Campaign rate limits — why Unofficial is much slower
| Channel | Effective throughput |
|---|---|
| WhatsApp Official | Around 600 messages per minute |
| WhatsApp Unofficial | Around 6 messages per minute by default |
| Around 6 messages per minute by default |
The Unofficial throttle is a deliberate account-safety measure, not a technical limit. Sending faster on an unofficial WhatsApp number can trigger abuse detection and get the number banned — banned numbers are significantly harder to recover than any per-conversation fee.
Admins who have warmed up an Unofficial number with steady engaged traffic can ask for the per-channel send rate to be tuned up.
Campaign implications. A 50,000-recipient Official campaign finishes in around 90 minutes. The same 50,000 on Unofficial at default settings takes several days. Plan accordingly:
- Use Official for time-sensitive promos and transactional sends; use templates; accept the approval delay.
- Use Unofficial for drip campaigns, lists where opt-in is clear and a 24-hour window isn't available, or group broadcasts. Stagger them across days rather than queuing huge batches in one go.
Cost model
- Official charges per conversation window (pricing varies by country and message category). Predictable but per-message adds up.
- Unofficial has a flat account cost; per-message cost is effectively zero. The trade-off is account-ban risk.
Why future scheduling is mandatory
The send time must be in the future. This forces every campaign through the paced queue — you can't accidentally fire 100,000 messages into a single burst that would slam the channel and your own rate budget.
Features in depth
Campaigns list
Paginated table. Typical columns: campaign name, channel, status, recipient count, sent / delivered / failed progress, send time, creator, actions (open, cancel).
Filters: Status dropdown, Search by name. Auto-refreshes while any campaign on the page is in progress.
Creation wizard
Four linear steps with Next / Back navigation:
- Channel — picks the messaging channel (WhatsApp Official / Unofficial / Email); downstream options depend on this.
- Compose — sub-paths by channel: Template / Quick / Interactive for WhatsApp (variable mapping UI if Template), or the Email composer (subject + rich-text/HTML body + live preview) for Email.
- Audience — three sub-paths (Chats / Contacts / CSV). The Contacts picker uses the same filter builder as the Contacts page. On Email, contacts are filtered to those with an email address and the CSV uses an
emailcolumn. - Schedule & Submit — date picker, rate selector, submit.
Detail page
Click any row in the list. Shows the campaign metadata, status, progress bars, a paginated messages table with per-recipient status filter, Cancel button, and a Download link to the CSV export in Reports.
Updates every few seconds while the campaign is in progress.
Audience — Chats source
Multi-select from the chat list. Resolves directly to chats — no contact lookup at send time.
Audience — Contacts source
Filter builder using standard fields and custom fields from Contact Fields. If a chosen contact has no chat on the selected channel yet, a chat is created at send time.
Audience — CSV source
- WhatsApp: must include a
phonecolumn (plus optionalcountryCode, defaulting to 91). Email: must include anemailcolumn. - A
namecolumn is optional on both. Any other columns can be referenced as variables —{{column_name}}in a quick-text body, or in the email subject and body. - After uploading you'll see a parsed preview; click Import to add the rows to the audience. The recipient count updates only once you've imported.
- Duplicate rows are de-duplicated within the upload (by phone for WhatsApp, by email for Email).
- For Email, each row creates (or reuses) an email contact and chat keyed by the address, so replies thread back into the inbox.
- File size: same 10 MB cap as bulk imports.
Email broadcasts
Pick an Email channel in step 1 and the composer switches to email mode:
- Subject + body. The subject is required. Compose the body in the rich-text editor, or toggle HTML to paste a complete email template (tables, inline styles,
<style>blocks) — it's sent exactly as written. The composer defaults to HTML mode when you paste a full document. - Variables. Insert
{{tokens}}into the subject or body from the variable picker (contact fields + detected CSV columns). They resolve per recipient at send time; values placed in the HTML body are escaped so a stray<or&can't break the markup. Token names may contain spaces or hyphens (matching lowercased CSV headers). - Live preview. A Gmail-style mobile preview (rendered in a sandboxed frame, so the email shows in isolation) displays the subject and body with a sample recipient's values — in both the Compose and Review steps.
- Recipients. Select email contacts (those with an email address) or upload a CSV with an
emailcolumn. Each recipient resolves to an email-keyed chat + contact, so any reply threads back into the inbox. - Send-from & replies. Messages go out from the channel's verified send-from address; replies arrive in Home on the Email channel, threaded under the original subject.
Per-campaign CC/BCC isn't offered — copying a fixed address on every message of a broadcast would mail that address once per recipient. CC/BCC exist for one-to-one email in the inbox composer, not for campaigns.
Retry and attempts
Set the per-recipient retry limit (1 – 10 attempts; typical default 3). The engine backs off between attempts. Final failures are logged with a readable reason.
Cancel mid-run
Valid from Scheduled or In progress. Pending recipients are skipped from the next send tick. Already-sent messages aren't rolled back — WhatsApp has no recall API.
Template approval gate
On save, Lodgestory checks that the selected template is approved. If not, the campaign won't save until the template is approved.
Reply handling
Campaigns are send-only. Inbound replies enter the inbox normally. The channel's assigned bot journey (if any) triages them; otherwise they queue for an agent.
Roles and permissions
| Action | Account Owner | Admin | User |
|---|---|---|---|
| View campaigns list | ✓ | ✓ | ✓ |
| View campaign detail and messages | ✓ | ✓ | ✓ |
| Create a campaign | ✓ | ✓ | ✗ |
| Cancel a campaign | ✓ | ✓ | ✗ |
| Download campaign CSV via Reports | ✓ | ✓ | ✗ |
Cross-module workflows
Broadcast → reply routing → conversion tracking
A campaign sends 50,000 approved templates. Replies arrive in the inbox over the next hour. The channel's assigned bot journey classifies intent. Interested replies hit a goal node that records which campaign the chat came from. The goals page shows the funnel: 50,000 sent → 4,200 replied → 1,100 classified interested → 340 converted to bookings.
Modules involved: Contacts → Campaigns → Home → Bot Journeys → Goals → Reports.
Single-recipient utility campaign
A property-management webhook fires a "booking confirmed" campaign for a single guest. The engine sends at the webhook-provided time — the same mechanics used for a 100,000-person broadcast.
Limits a user will run into
| Limit | Value |
|---|---|
| Max recipients per campaign | 100,000 |
| Retry attempts per recipient | 1 – 10 (typical default 3) |
| Send time | Must be in the future |
| Rate — WhatsApp Official | Around 600 messages per minute |
| Rate — WhatsApp Unofficial | Around 6 messages per minute by default; tunable after account warm-up |
| Rate — Email | Around 6 messages per minute by default |
| List page size | 100 campaigns per page |
| CSV upload | 10 MB |
Errors & FAQ
| You see | Likely reason | What to do |
|---|---|---|
| "Template is not approved for use" | Template is pending or rejected | Resubmit the template or pick an approved one |
| "Schedule time must be in the future" | Chosen send time is in the past | Pick a later time (even one minute ahead) |
| "Subject is required for email campaigns" | Email campaign has no subject | Add a subject line in the composer |
| "CSV must have an "email" column" | Uploaded a phone-style CSV on an Email campaign | Re-upload a CSV with an email column (use Download Sample CSV) |
| "Recipient count exceeds maximum of 100000" | Audience over the cap | Split into multiple campaigns |
| "Variable mapping is incomplete" | A template slot has no source set | Add a source (global, contact, or CSV) for every slot |
| "Campaign not found" | Bad ID or cross-organisation access | Verify the link; switch organisations if needed |
| "Cannot cancel a COMPLETED campaign" | The campaign already finished | Nothing to do — it's already delivered |
| Per-recipient "Template not approved" | Approval was revoked after the campaign was created | Cancel, resubmit the template, create a new campaign |
| Per-recipient "Recipient not opted in" | WhatsApp rejected the send | No fix per recipient; ensure opt-in upstream |
| Per-recipient "Rate limit exceeded" | Transient provider throttling | Usually self-heals on retry |
| Per-recipient "Invalid phone number" | Bad phone / country-code format | Clean contact data; re-run on a pruned audience |
Frequently asked
Why does my campaign still show "In progress" hours after the last message was sent?
Check the messages table — some recipients may still be retrying transient errors. The campaign moves to Completed only when every recipient is in a terminal state. If retries are exhausted they flip to Failed and the campaign closes.
Why did my 100,000-recipient campaign take three-plus hours to complete?
Rate limits. WhatsApp Official caps around 600 per minute — that's already close to three hours at full throughput. Rates are per-channel budgets set by the channel provider; Lodgestory can't exceed them.
Can I edit a scheduled campaign?
Not after creation. Audience and template are locked at create time for integrity. Cancel and create a new campaign.
Can I send a campaign without a template on WhatsApp Official?
Only within the 24-hour window of each recipient, which isn't a batch operation. In practice no — Official campaigns are template-only at scale.
Can I run a campaign on WhatsApp Unofficial without a template?
Yes — Unofficial is free-text only. Templates aren't supported there.
Why does Unofficial take so much longer than Official?
The default send rate is conservatively capped to protect the account from WhatsApp's abuse detection. Faster sending risks a ban on the number. Admins can tune the rate up once a number has warmed up.
Can I broadcast to WhatsApp groups?
Yes on both channels. Unofficial is the typical choice for group-heavy broadcasts.
Can I paste a designed HTML email into a campaign?
Yes. On an Email campaign, switch the body to HTML mode and paste your full template — tables, inline styles, and <style> blocks are sent as written. Any {{tokens}} you include still personalise per recipient, and the mobile preview shows how it renders. (The rich-text editor is for simple formatting and can't hold a full HTML document, so paste into HTML mode.)
Which CSV column does an email campaign need?
An email column (a name column is optional). The phone/countrycode columns are for WhatsApp campaigns. Use Download Sample CSV while an Email channel is selected to get the right template.
Why did some recipients get the wrong personalisation?
Variables are resolved at send time. If a contact's field changed between campaign creation and send time, the newer value wins. For a fixed snapshot, use the CSV source instead of contact-field references.
Why doesn't cancelling recall already-sent messages?
WhatsApp has no recall. Cancel stops further sends; it can't un-deliver.
Related modules & next steps
- WhatsApp Templates — approval prerequisite.
- Contacts and Contact Fields — audience and personalisation source.
- Bot Journeys — reply handler for the inbound flood.
- Home (Unified Inbox) — where replies land.
- Reports — per-message CSV export.
- Analytics — organisation-wide campaign volume.
- Connections — channel selector source.
Updated 6 days ago
