Guides
GuideEmail Campaigns

Email Campaigns

Broadcast to your members with live audiences: “all Pro members” means whoever holds the Pro entitlement at the moment you hit send — the segment reads your real member database, not a stale export. Manage in Config → Monetization → Email Campaigns.

Flow: create a draft → Review & send shows the exact recipient count and your monthly allowance before anything sends → sending runs in the background in batches; watch progress live in the list.

Audiences = access rules

The audience is an Access Control condition evaluated per member at send time — the same vocabulary that gates your pages and tables:

  • Everyone — leave the audience empty
  • Paying members[{ "type": "has_entitlement", "key": "pro" }]
  • A role[{ "type": "has_role", "roleId": "…" }]
  • A profile field[{ "type": "user_property", "field": "city", "value": "Kathmandu" }]

Built-in compliance & quotas

  • Every campaign email carries a one-click unsubscribe link automatically — unsubscribed addresses land on your suppression list and are skipped by all future campaigns. Account email (sign-in, password reset, receipts) is never affected.
  • Campaigns draw from your plan’s “marketing & transactional emails” allowance; signup & password-reset emails have their own separate allowance — a big campaign can never block members from signing in.
  • If a send hits your monthly cap it stops with an honest error showing exactly how many went out — it never silently oversends.

For one-off transactional sends from function code, keep using ctx.email.send(). Campaigns are for broadcasts. Never work around the suppression list — it’s a legal requirement, not a preference.