Skip to content

# Newsletter (Listmonk)

Integrated with Listmonk for opt-in mailing lists and newsletter campaigns. Enable with `LISTMONK_SYNC_ENABLED=true`.

## Managed Lists

The platform automatically creates and maintains 13 subscriber lists in Listmonk:

List Name | Source | Tags
--- | --- | ---
All Contacts | All synced records | `v2`
Campaign Participants | Users who sent advocacy emails | `v2`, `influence`
Locations - All | Address occupants with email | `v2`, `map`
Support Level 1-4 | Addresses by canvass support level | `v2`, `map`, `support`
Has Campaign Sign | Addresses with a yard sign | `v2`, `map`, `signs`
Users | Active non-temp platform accounts | `v2`, `users`
Volunteers | Shift signups | `v2`, `map`, `shifts`
Canvassers | Users who completed canvass sessions | `v2`, `map`, `canvass`
Subscribers | Active paid subscribers | `v2`, `payments`
Donors | Users who completed a donation | `v2`, `payments`

## Bulk Sync

The admin panel provides a manual "Sync All" action that synchronizes four data sources to Listmonk:

1. Campaign participants -- distinct email senders from advocacy campaigns
2. Location contacts -- address occupants with email, mapped to support level and sign lists
3. Users -- active platform accounts (excludes TEMP users)
4. CRM tags -- contacts tagged in the People module, synced to tag-linked Listmonk lists

Each source upserts subscribers (creates new or merges into existing), preserving existing list memberships and merging metadata attributes.

## Event-Driven Sync

In addition to bulk sync, the platform fires real-time subscriber upserts on application events:

- Shift signup -- adds to Volunteers list
- Canvass session completed -- adds to Canvassers list
- Campaign email sent -- adds to Campaign Participants list
- Subscription activated -- adds to Subscribers list
- Donation completed -- adds to Donors list
- Product purchased -- adds to Donors list
- Address updated (canvass visit) -- updates support level list membership
- Re-engagement email sent -- updates Volunteers list metadata
- CRM tag changed -- adds/removes from tag-linked Listmonk lists

All event-driven syncs are fire-and-forget and silently fail if Listmonk is unreachable.

## Admin Routes

- `/app/listmonk` (sidebar: "Newsletter") -- sync status, subscriber counts, campaign stats, and manual sync trigger