Skip to main content
This walkthrough drafts a newsletter, targets a specific audience, sends it, and demonstrates a follow-up pattern (re-sending to people who didn’t open). It uses the Newsletter and Contact resources. Who is this for: marketing-automation pipelines that compose campaigns from a CRM, A/B testers running variations, or admin tools that schedule sends ahead of time.

Step 1 — Draft the newsletter

Newsletters are owned by a Unit — usually a local center or the tenant root. The audience is implicitly everyone in that unit who has newsletter opt-in.
Response:
estimatedRecipientCount is the count of recipients the current audience filter would target right now. It is recalculated each time you fetch the newsletter.

Placeholders

{{firstName}}, {{lastName}}, {{email}} and any tenant custom field are resolved per recipient. Use them anywhere in content and they’re substituted at send time.

Step 2 — Preview and test-send

Always send a test to yourself first.
Check the test email rendered correctly — placeholder substitution, links, images, and unsubscribe footer.

Step 3 — Choose: schedule or send now

Send immediately

Status flips to SENT. The actual delivery is queued — large campaigns take a few minutes to flush through SES.

Schedule for later

Status flips to SCHEDULED and the worker picks it up at the specified time.

Step 4 — Resend to non-openers (one week later)

A standard pattern: wait 5-7 days after the initial send, then re-send (with a new subject line) only to people who haven’t opened. First check how many would be re-targeted:
Then clone the original into a new draft targeting only those non-openers:
The clone keeps the body content but you can edit before sending. Then PATCH /api/v1/newsletters/{uuid}/send as usual.

Step 5 — Read engagement statistics

Once the send completes (typically a few minutes after triggering), opens and clicks start streaming in. Fetch them on the newsletter resource:
The response includes recipientCount, openCount, clickCount, and unsubscribeCount.

Common gotchas

Two filters apply: (1) the Unit membership (only people in or under that unit), (2) isNewsletterSubscribed: true on each recipient (User or Contact). Run the audience filter manually with GET /api/v1/users?unit=...&isNewsletterSubscribed=true to see the same count.
Placeholders are case-sensitive and must match exactly. {{FirstName}} won’t work; neither will {{ firstName }} (with spaces). If a recipient’s field is null, the placeholder resolves to an empty string — consider wrapping with HTML so empty fields don’t leave dangling punctuation.
SES has per-tenant sending limits. New tenants are sandboxed (50 emails/day, verified-recipient only) until granted production access. Check Settings → Developers → Email for the current quota. Contact support to lift sandbox.
Not directly — there’s no first-class A/B testing UI. The pattern is: send the campaign to a 10% sample (filter the audience tighter), wait, compare open rates against a held-back variant, then send the winner to the rest.

What to do next