Domma CMS User Manual

Campaigns Pro

Updated by Darryl Waterhouse on 18 October 2026 9 min read

Campaigns Pro

A campaign sends a message to an audience - with an offer attached, if you want one, that expires by a date or by a number of claims, whichever comes first. Campaigns Pro then shows how each campaign did, links the offer to a Shop code, and follows up for you.

Your audience

Campaigns › Audience (in the banner) holds everyone a campaign can reach - contacts with an email address, organised into groups. It is the same audience Surveys uses: import it from the Contacts tool once (Import from Contacts) and both Tools share it. A campaign sends to the groups it picks.

Every email carries a working unsubscribe link. An address that opts out goes on the unsubscribe list and is never emailed by Campaigns Pro or Surveys again - it stays visible in the audience, it is simply skipped.

The link opens a page with an Unsubscribe button; nothing changes until the person presses it. (Some workplace mail filters open every link in an email to check it - without the button they would unsubscribe people who never clicked.) Each email also carries the standard unsubscribe headers, so Gmail, Outlook and Apple Mail show their own Unsubscribe button next to the sender, which opts out in one click.

Writing a campaign

New campaign in the banner. Give it a title, pick the audience groups, and write the message. In the subject and body you can use merge fields:

  • {{name}} - the person's name
  • {{email}} - their address
  • {{code}} - the offer code, when there is an offer
  • {{link}} - the button: the claim page when there is an offer, or the Link URL you set

Test send to me (in the banner, after saving) sends the message to your own address so you can see it before anyone else does.

Sending

  • Send now sends to everyone in the audience who has not already been sent this campaign. Sending it again later only reaches people added since.
  • Scheduled: set the status to Scheduled and pick a time - it sends itself within a quarter of an hour of that time.
  • A send interrupted by a restart carries on by itself; nobody is emailed twice.

Offers

Tick This campaign carries an offer to attach a code. Set what it promises, and how it closes:

  • Offer ends - a date; past it the claim page says the offer has ended.
  • Claim limit - a number; once that many people have claimed, the page says so ("All 50 have been claimed."). Whichever of the two is reached first closes the offer.
  • One claim per email address stops the same person claiming twice.
  • Anyone may claim with just their email - off by default. Off, a claim needs the personal link from the campaign email, and each link claims once, so nobody who merely knows the page address can read the code or use the offer up. Turn it on when the offer sits on a public page (the shortcode below), where there is no personal link to carry.

People claim on the campaign's claim page (/campaign/<slug> - the button in their email takes them there with their personal link; Copy claim link in the list gives the bare address) by entering their email, or wherever you drop the shortcode:

[campaign-offer slug="summer-sale" /]

Claims… in a campaign's menu shows who has claimed and when.

Good to know

  • The sidebar badge shows a campaign sending now (a live dot) or scheduled; its popover lists offers close to their limit.
  • Closing a campaign stops its claim page and any further send; its records are kept.
  • Campaigns Pro sends through the site's email (SMTP) unless you give it a mail server of its own - see Sending below.

Sending

Sending in the banner of the campaigns list chooses the mail server campaigns go out through:

  • The site's email - the server set in Settings > Email, which the site's forms and password resets use too.
  • SendGrid API - sends through Twilio SendGrid's API and, once its Event Webhook is set up, hears back about bounces, spam reports and unsubscribes (below).
  • Mailgun API - the same for Mailgun: sends through its API and hears back about permanent failures, spam complaints and unsubscribes (below).
  • Its own mail server - a bulk sending service, so a campaign that upsets a spam filter never holds up the site's own email. Pick Twilio SendGrid, Mailgun (US or EU), Amazon SES or Mailchimp Transactional and the server, port and (where it is fixed) username are filled in; the panel says which username and password each one wants. Another mail server takes any SMTP server.

The From address and name are optional - left empty, the site's are used. Most services only send from an address or domain you have verified with them.

The password is never shown again once saved. Changing the server or username needs it typed again, so a saved password can never be sent to a different server. Send a test emails you through the saved settings. Only a site admin can change this screen.

SendGrid: bounces and spam reports

Choose SendGrid API, then:

  1. In SendGrid, Settings > API Keys > Create API Key - Restricted Access with Mail Send is enough. Paste it into API key. Pick EU data residency only if your SendGrid account is an EU one.
  2. Enter a From address SendGrid has verified (Settings > Sender Authentication).
  3. In SendGrid, Settings > Mail Settings > Event Webhook: set the Post URL to the address shown in the panel (the copy button copies it), tick Bounced, Dropped, Spam Reports and Unsubscribed, and turn on Signed Event Webhook. Copy the Verification Key it shows into the panel and Save.
  4. Send a test, then use SendGrid's "Test Your Integration" button - the panel's webhook line counts what arrived.

From then on an address that hard-bounces, reports a campaign as spam or unsubscribes through SendGrid joins the unsubscribe list (its source says "sendgrid bounce", "sendgrid spam report" and so on), so no campaign or survey emails it again. A bounced campaign email also shows as bounced on that campaign. Without the verification key every webhook call is refused, so nobody else can add addresses to your list. SendGrid's own click and open tracking is switched off on these emails - Campaigns Pro measures opens and clicks itself.

Mailgun: bounces and spam complaints

Choose Mailgun API, then:

  1. Enter the Sending domain you verified in Mailgun (e.g. mg.example.com) and its Region - EU only if the domain was created in Mailgun's EU region.
  2. Paste an API key (Mailgun > Settings > API Keys, or a Sending API key for that domain) and a From address on that domain.
  3. In Mailgun, Sending > Webhooks for the domain: add the URL shown in the panel for Permanent failure, Spam complaints and Unsubscribes.
  4. Copy the Webhook signing key (Mailgun > Settings > API Security) into the panel and Save. Mailgun's "Test webhook" button then shows up in the panel's webhook line.

An address that fails permanently because of the address (a hard bounce such as "user unknown", or one Mailgun already holds as bounced, complained or unsubscribed), complains, or unsubscribes through Mailgun joins the unsubscribe list ("mailgun bounce", "mailgun spam report"...). Failures about the message rather than the address - a send that gave up after retries, or one a mail provider blocked - suppress nobody. Each webhook call can be used once, so a copied call cannot be replayed; without the signing key every call is refused.

What it costs

Checked on 17 October 2026. Prices and free allowances change often and the sources below do not all agree, so check the service's own pricing page before you sign up.

  • Twilio SendGrid - the permanent free plan (100 emails a day) appears to have become a 60-day trial with the same daily limit in May 2025; paid plans from about $20 a month.
  • Mailgun - a free plan of 100 emails a day, with no extra sending on it; some sources now describe it as a 30-day trial. Paid from about $15 a month for 10,000.
  • Amazon SES - about $0.10 per 1,000 emails, the cheapest at volume. Its free allowance (3,000 messages a month for the first 12 months) reportedly closed to new accounts in July 2026; new AWS accounts get up to $200 of general credit instead.
  • Mailchimp Transactional - no free tier. It is a paid add-on to a Mailchimp Standard or Premium plan, from about $20 per 25,000 emails.
  • Not in the list but usable under Another mail server: Brevo (around 300 emails a day free) and Postmark (100 a month free, meant for testing).

Sources: SendGrid free tier caution, SendGrid free tier, Mailgun pricing 2026, Mailgun pricing explained, Mailgun free plan, AWS SES pricing, SES pricing (cloudburn), Mailchimp pricing 2026, Mailchimp review 2026.

How a campaign did

Open a campaign and press Performance in its banner - this section and the ones after it all live on that screen.

The funnel shows everyone the campaign reached, how many opened it, clicked a link, and (for an offer) claimed. Honest notes:

  • Opens are counted by a tiny image some mail apps block, so the true number is at least what you see. A click always counts as an open.
  • Clicks go through a short redirect on your own site that counts them, then land exactly where the email pointed. No cookies, no third parties, and nothing stored that names a visitor beyond the address the campaign was already sent to.
  • Clicked links lists each link in the email with its clicks.

Links to your own site are tagged automatically (utm_campaign with the campaign's slug), so the Analytics Tool's Sources screen shows the landings with no extra work. The unsubscribe link is never tracked.

The Shop code

With Shopping Cart Pro running, link the discount code shoppers type at checkout to your campaign's offer. The Performance screen then shows claims and redemptions side by side - together they are the offer's true usage. Create codes under Shop > Discount codes, then link one here.

One thing to know: each channel enforces its own limit. The claim page counts claims against the offer's limit, and the Shop counts redemptions against the code's limit - a limit of 10 on each can hand out up to 20 combined. Performance shows both tallies side by side so nothing hides; if the combined total must not pass one number, set each limit accordingly.

Follow-ups

Remind people after the send: everyone, the ones who never opened, or the ones who never claimed. A follow-up runs itself on its day (same day, 3 days, a week, two weeks), or Run now sends it at once. Resend to non-openers is the one-press version: a new subject line, the same message, to everyone who has not opened yet. Anyone on the opt-out list is never emailed.

A/B subject test

Two subject lines, one message. A slice of the audience gets subject A, a slice gets subject B, and after the measuring hours the better-opened subject goes to everyone else - automatically. Starting a test is the send for that campaign, so the ordinary Send now button is not needed afterwards. A test needs at least 10 people.

Send a survey

Invite the campaign's audience to one of your open surveys. Each person gets their own survey link; answers, reminders and statistics stay in the Surveys Tool.

The stats feed

Other Tools can read campaign statistics from GET /api/plugins/campaigns-pro/stats (all campaigns) and GET /api/plugins/campaigns-pro/stats/<slug> (one), behind the Campaigns permission. The answer carries version: 1; fields are added over time, never renamed or removed. Per campaign: slug, title, status, sentAt, sends {invited, sent, failed, waves}, opens, clicks {recipients, total}, claims, cart {code, uses} | null, tally {limit, claimed, redeemed, combined, state} | null, unsubscribed.

When the licence lapses

Campaigns Pro stops loading. Your campaigns, audience, claims and the opt-out list are all kept and come back as they were when you renew - and Surveys keeps honouring the opt-out list in the meantime. While it is off, nothing sends, and the claim pages and tracked links in emails already sent stop answering - except unsubscribe: the site itself answers those links, licence or no licence, so anyone can still opt out of an email you sent them.