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.