Skip to content

Email Broadcasting

Broadcasting sends one email to many recipients from a subscriber list. Each recipient gets a personalized email with their own merge tags. Forge handles batching, unsubscribe compliance, and bounce tracking automatically.

Lists are named groups of recipients. Each recipient stores:

  • Email address (unique per list)
  • Custom fields (JSON) — used for merge tags like {{first_name}} or {{plan}}
  • Statussubscribed, unsubscribed, bounced, or complained

Go to System Settings → Email → Broadcasts → ListsCreate List.

Name your list (e.g., “Newsletter”, “Product Updates”) and add an optional description.

Single add: Use the Add Recipient form — enter email and any custom fields.

CSV import: Upload a CSV file. The first column must be email. All other columns become custom fields:

email,first_name,plan,company
alice@example.com,Alice,pro,Acme Inc
bob@example.com,Bob,free,Beta LLC
carol@example.com,Carol,pro,Gamma Co

Forge shows a preview of detected columns before importing. Duplicate emails are skipped.

Click Export CSV to download all subscribed recipients — useful for backup or migration.

  1. Go to System Settings → Email → Broadcasts → New Broadcast
  2. Select a list
  3. Write your subject and body with merge tags:
Subject: Hey {{first_name}}, check out Forge v2!
Text: Hi {{first_name}},\n\nWe just shipped some big updates...
HTML: <h1>Hey {{first_name}}!</h1><p>We just shipped...</p>
  1. Preview with a sample recipient to verify merge tags render correctly
  2. Click Send Broadcast

Forge queues the broadcast and begins sending in batches. Progress updates in real-time.

  1. Broadcast is queued → status: queued
  2. Worker picks it up → status: sending
  3. Recipients are processed in batches of 50 (configurable)
  4. Each batch is sent concurrently
  5. 1-second delay between batches (configurable) to avoid overwhelming the SMTP server
  6. All batches complete → status: completed

You can cancel a broadcast while it is queued or sending. Already-sent emails cannot be recalled.

Every broadcast email includes:

List-Unsubscribe: <mailto:unsubscribe@forge.yourdomain.com?subject=unsub%20list_abc%20alice@example.com>,
<https://forge.yourdomain.com/api/v1/email/unsubscribe?list=list_abc&recipient=rec_xyz&token=sha256...>

Many email clients show an “Unsubscribe” button based on this header — no click into the email needed.

Use the {{{unsubscribe_url}}} merge tag to include a one-click unsubscribe link:

<p>Don't want these emails? <a href="{{{unsubscribe_url}}}">Unsubscribe</a>.</p>

This is a required merge tag for all broadcasts. Forge validates that it is present in the template.

  • Recipient status changes to unsubscribed
  • They are permanently excluded from future broadcasts to that list
  • No confirmation page or “are you sure?” — one click, done (RFC 8058 compliant for bulk mail)
  • Cannot be re-subscribed through CSV import (must use a dedicated re-subscribe flow)

Forge tracks SMTP delivery failures. After a recipient bounces:

Bounce #Action
1Logged, status unchanged
2Logged, status unchanged
3Auto-unsubscribed, status → bounced

This prevents repeatedly sending to invalid addresses and protects your domain’s sender reputation.

While sending, the dashboard shows:

  • Sent: 1,234 / 5,000
  • Failed: 12
  • Progress bar with percentage
  • Estimated time remaining

After completion, the Deliveries tab shows per-recipient status: sent, failed, or skipped (unsubscribed/bounced).

LimitValue
Max recipients per broadcast50,000 (configurable)
Default batch size50 recipients
Default batch delay1,000 ms
Max concurrent broadcasts per identity1
Unsubscribe sourceOne-click, RFC 8058 compliant
  1. Create list “All Users” with CSV import of your user database
  2. Write the broadcast:
Subject: {{first_name}}, Forge v2.0 is here
Text:
Hi {{first_name}},
We're excited to announce Forge v2.0! Here's what's new for {{plan}} plan users:
- Feature A
- Feature B
See the full changelog: https://forge.yourdomain.com/changelog
{{{unsubscribe_url}}}
  1. Preview renders: “Alice, Forge v2.0 is here” / “Bob, Forge v2.0 is here”
  2. Send → 5,000 recipients processed in ~100 seconds
  3. Dashboard shows: 4,987 sent, 3 failed, 10 skipped (unsubscribed/bounced)