Appearance
Newsletter
The Newsletter module (internally "Bulk Email") is Lubb ERP's email-marketing subsystem: subscriber groups, segmented campaigns, a drag-and-drop template builder, and per-recipient send/open/click tracking. It's used by tenant admins to build and send email campaigns to customer lists, CRM leads, or hand-managed subscriber groups, with delivery through the platform's Postal service or SMTP, and bounce/unsubscribe handling built in.
What you can do
- Email Groups — create named subscriber lists, either "manual" (you add/remove members yourself) or "live" (membership auto-syncs from an accounting customer group or a CRM lead-status segment, added via "+ Add customer group" / "+ Add lead segment" on the Compose page).
- Group Members — manage individual subscribers within a group: email, name, free-form tags (for segmentation), unsubscribed flag, and bounced flag.
- Campaigns — the history/management grid for newsletters (drafts, scheduled, sending, sent, error). Composing the actual email body happens on a dedicated Compose page, not inline in the grid.
- Compose page — build a campaign's subject, sender name/email, HTML/rich-text/markdown body, target group(s), and optional tag-based include/exclude segmentation.
- Preview & Send — preview a draft, send a test email to yourself, or send/schedule the real campaign, from a modal on the Campaigns grid.
- Duplicate — clone a sent or draft campaign as a fresh draft (subject prefixed "Copy of...", same sender/content/target groups, but never the send counters or recipient log).
- Recipients — drill into a campaign to see the per-recipient send log: delivery status (sent/failed/skipped/disabled/bounced), open tracking, and click tracking.
- Campaign Links — drill into a sent campaign's tracked links to see click counts per URL.
- Templates — reusable campaign bodies, either hand-built in the drag-and-drop Template Builder or saved from Compose via "Save as template."
- Attachments — attach files to a campaign before sending.
- Org SMTP override — an org admin can configure and test their own outbound SMTP (host/port/user/password/security/from address), used instead of the platform default.
- Public subscriber actions — one-click unsubscribe links, an open-tracking pixel, and click-through redirect links, all served without authentication.
Common tasks
Create an Email Group and add subscribers Open Email Groups, click New, and set a title/description. Drill into the group ("Members") and add rows with email, name, and optional tags. Alternatively, add a "live" group from the Compose page's "+ Add customer group" or "+ Add lead segment" picker — its membership syncs automatically and is never hand-edited.
Compose and send a campaign From the Campaigns grid, start a new campaign on the Compose page (
/newsletter). Set the subject, sender, body, and target group(s); optionally narrow the audience with include/exclude tags. Save as a draft, then use the "Preview & Send" row action to review it and either send immediately or schedule it.Send a test email before the real send While composing (or via "Preview & Send"), use the send-test option to deliver the draft to a specific address so you can check formatting before sending to the full list.
Check open/click tracking after a send On the Campaigns grid, a sent row shows Recipients, Opens, and Clicks counts. Drill into "Recipients" for the per-subscriber send log (opened/clicked flags and timestamps, plus delivery status such as bounced or failed). Use the row's "Links" button to see click totals per tracked URL in the campaign.
Build or reuse a template Open Templates and create a new one in the drag-and-drop Template Builder, or save the current Compose draft as a template ("Save as template"). Loading a template into Compose copies its HTML into the new draft.
Duplicate a past campaign On the Campaigns grid, use "Duplicate" on any campaign to create a new draft with the same subject (prefixed), sender, body, and target groups — the new draft starts with no send history.
Data model
- Email Group (
newsletter_email_groups) — a named subscriber list; manual or "live" (auto-synced from a customer group or CRM lead segment). - Email Group Member (
newsletter_email_group_members) — one subscriber in a group, with tags, unsubscribed/bounced flags, and a one-click unsubscribe token. - Newsletter (
newsletters) — one campaign: subject, sender, body, target group ids, include/exclude tag segments, status, schedule time, and send/open/click counters. - Newsletter Recipient (
newsletter_recipients) — one per-recipient send record: delivery status, open/click flags and timestamps, error message, and the Postal message id used to match bounce webhooks. - Newsletter Attachment (
newsletter_attachments) — a file attached to a campaign send. - Newsletter Link (
newsletter_links) — one distinct tracked URL inside a sent campaign, with its total click count. - Newsletter Template (
newsletter_templates) — a reusable campaign body, optionally with a saved Template Builder design (block-tree JSON). - Newsletter Image (
newsletter_images) — an image uploaded from the Template Builder, served publicly by token for embedding in email bodies. - Newsletter SMTP Settings (
newsletter_smtp_settings) — a tenant's own SMTP override (host/port/user/encrypted password/security/from address) for outbound sending.
Configuration & integrations
- Outbound delivery goes through the bulk-email server's Postal HTTP API when the site's
bulkemailRemote Connection is configured, falling back to the shared SMTP mailer otherwise. - A tenant admin can configure and test a per-org SMTP override (
/newsletter/smtp,/newsletter/smtp/test) that takes priority over the platform default for that org's sends. - Postal delivery/bounce webhooks (
/newsletter/postal-webhook) update recipient status (e.g. mark aNewsletterRecipientorEmailGroupMemberas bounced) by matching the storedpostal_message_id. - "Live" Email Groups integrate with the tenant's accounting customer groups and CRM lead status segments as membership sources, kept in sync via a scheduled sync job.
- Open tracking uses a tracking-pixel image (
/newsletter/track/open/{token}.png); click tracking rewrites links to a redirect endpoint (/newsletter/track/click/{link_token}/{rec_token}); unsubscribe uses a tokenized public link (/newsletter/unsubscribe/{token}) — none of these require authentication, since recipients access them from their own mail client.
API reference
All endpoints are under the /newsletter prefix (admin-role protected unless noted "public").
| Method | Path | Purpose |
|---|---|---|
| GET | /newsletter/groups | List email groups |
| GET | /newsletter/customer-groups | List accounting customer groups (for the "live group" picker) |
| GET | /newsletter/lead-segments | List CRM lead-status segments (for the "live group" picker) |
| POST | /newsletter/groups/live | Create a "live" email group sourced from a customer group or lead segment |
| POST | /newsletter/groups/{group_id}/sync | Re-sync a live group's membership from its source now |
| GET | /newsletter/smtp | Get this org's SMTP override (password withheld) |
| PUT | /newsletter/smtp | Save this org's SMTP override |
| POST | /newsletter/smtp/test | Live connect/authenticate test of the saved org SMTP settings |
| POST | /newsletter/newsletters | Create a new campaign draft |
| GET | /newsletter/newsletters/{id} | Get a campaign's full detail (for Compose) |
| PATCH | /newsletter/newsletters/{id} | Update a draft campaign |
| POST | /newsletter/newsletters/{id}/attachments | Upload a file attachment to a campaign |
| DELETE | /newsletter/newsletters/{id}/attachments/{attachment_id} | Remove an attachment |
| GET | /newsletter/newsletters/{id}/send-preview | Render a preview of the campaign |
| POST | /newsletter/newsletters/{id}/send-test | Send a test copy to a given address |
| POST | /newsletter/newsletters/{id}/send | Send (or schedule) the campaign now |
| GET | /newsletter/newsletters/{id}/send-progress | Poll in-flight send progress |
| GET | /newsletter/unsubscribe/{token} | Public: one-click unsubscribe page |
| GET | /newsletter/track/open/{token}.png | Public: open-tracking pixel |
| GET | /newsletter/track/click/{link_token}/{rec_token} | Public: click-tracking redirect |
| POST | /newsletter/postal-webhook | Public (keyed): Postal delivery/bounce webhook |
| GET | /newsletter/templates | List templates |
| GET | /newsletter/templates/{id} | Get a template's body/design |
| POST | /newsletter/templates | Create a template |
| PUT | /newsletter/templates/{id} | Update a template |
| POST | /newsletter/template-images | Upload an image for use in a template/campaign body |
| GET | /newsletter/image/{token} | Public: serve an uploaded body image |
The Email Group Members, Campaigns, Recipients, Templates, and Campaign Links grids themselves (list/search/sort/stats, and delete where enabled) are served by the generic grid CRUD system rather than bespoke endpoints — reachable at /g/newsletter-groups, /g/newsletter-group-members, /g/newsletters, /g/newsletter-recipients, /g/newsletter-templates, and /g/newsletter-links.