Skip to content

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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 bulkemail Remote 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 a NewsletterRecipient or EmailGroupMember as bounced) by matching the stored postal_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").

MethodPathPurpose
GET/newsletter/groupsList email groups
GET/newsletter/customer-groupsList accounting customer groups (for the "live group" picker)
GET/newsletter/lead-segmentsList CRM lead-status segments (for the "live group" picker)
POST/newsletter/groups/liveCreate a "live" email group sourced from a customer group or lead segment
POST/newsletter/groups/{group_id}/syncRe-sync a live group's membership from its source now
GET/newsletter/smtpGet this org's SMTP override (password withheld)
PUT/newsletter/smtpSave this org's SMTP override
POST/newsletter/smtp/testLive connect/authenticate test of the saved org SMTP settings
POST/newsletter/newslettersCreate 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}/attachmentsUpload a file attachment to a campaign
DELETE/newsletter/newsletters/{id}/attachments/{attachment_id}Remove an attachment
GET/newsletter/newsletters/{id}/send-previewRender a preview of the campaign
POST/newsletter/newsletters/{id}/send-testSend a test copy to a given address
POST/newsletter/newsletters/{id}/sendSend (or schedule) the campaign now
GET/newsletter/newsletters/{id}/send-progressPoll in-flight send progress
GET/newsletter/unsubscribe/{token}Public: one-click unsubscribe page
GET/newsletter/track/open/{token}.pngPublic: open-tracking pixel
GET/newsletter/track/click/{link_token}/{rec_token}Public: click-tracking redirect
POST/newsletter/postal-webhookPublic (keyed): Postal delivery/bounce webhook
GET/newsletter/templatesList templates
GET/newsletter/templates/{id}Get a template's body/design
POST/newsletter/templatesCreate a template
PUT/newsletter/templates/{id}Update a template
POST/newsletter/template-imagesUpload 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.

Lubb ERP Documentation