Sending emails
ReachBell handles two patterns of email sending. Campaigns are broadcasts: drafted in the dashboard, targeted with a segment, optionally scheduled, sent to many recipients. Transactional emails are one-recipient, API-triggered, used for receipts, password resets, order confirmations — anything that fires in response to a specific user action.
Both modes use the same underlying SES infrastructure, the same verified sending domain, and share the same suppression list (a recipient who unsubscribes from a campaign stops receiving transactional too, by default).
Sending a campaign
Campaigns are built in Email → Campaigns → New campaign. The builder walks you through five steps.
Step 1 — Content
Subject line and preheader text are at the top — keep both punchy (~50 characters for subject, ~80 for preheader). The dashboard shows a desktop + mobile preview that updates as you type.
The HTML body uses a WYSIWYG editor. Merge tags like {{first_name}} or {{order_id}} get interpolated per-recipient at send time — drop them anywhere inside the editor and the value comes from the subscriber's stored attributes.
A plain-text version is auto-generated from the HTML; you can override it if the rendered text doesn't read well.
Test sends keep you out of the spam folder. Before launching the campaign, click Send test email and ship the message to your own inbox. Render in Gmail and Outlook desktop at minimum — bad HTML often passes review but breaks in one of the two.
Step 2 — Targeting
Pick a saved segment or build an audience inline with the same filter UI used for push campaigns. The dashboard shows live reach — "12,847 subscribers will receive this" — as you adjust filters.
Email-specific filters apply automatically: only subscribers with emailStatus: active and preferences.channels.email !== false are considered.
Step 3 — Sender
Pick the from name, from email address, and reply-to address. Every value here is validated against your verified domain — if you enter support@example.com but your verified domain is vedhoroscope.com, the dashboard rejects the value at this step.
Step 4 — Schedule
Either Send immediately when you click the final button, or Schedule for a future time. Scheduled campaigns honour the subscriber's timezone if Use subscriber timezone is toggled — useful for cross-region newsletters where you want everyone to receive the message at 9 a.m. local.
Step 5 — UTM parameters
UTM source / medium / campaign / content fields appear here. The dashboard auto-appends them to every link in the email body so clicks attribute correctly in Google Analytics or Plausible. See the UTM tracking guide.
After launch
Once the campaign starts sending, the campaign detail page shows live progress via SSE — totalTargeted, sent, delivered, opened, clicked, bounced, complained, unsubscribed — refreshing every two seconds. Every event is also written to email_events so the per-campaign analytics chart populates as the data accumulates.
Sending transactional email
Transactional email goes through the REST API. Authenticate with your project's API key (x-api-key: rb_live_…).
curl -X POST https://api.reachbell.com/transactional/email \
-H "x-api-key: rb_live_yourkey" \
-H "Content-Type: application/json" \
-d '{
"to": "user@example.com",
"subject": "Your order is confirmed",
"htmlContent": "<h1>Order #ORD-12345</h1><p>Thanks for your order.</p>",
"senderEmail": "orders@vedhoroscope.com",
"senderName": "VedHoroscope",
"replyTo": "support@vedhoroscope.com"
}'
Required fields
to— the recipient address.subject— the email subject line.- Either
htmlContent(raw HTML) ortemplateId+variables(a saved template). senderEmail— must be on your verified domain, or a subdomain of it (updates.vedhoroscope.comis allowed ifvedhoroscope.comis verified).
Optional fields
textContent— plain-text fallback. If omitted, ReachBell auto-generates one fromhtmlContent.senderName— display name shown to the recipient.replyTo— Reply-To header. Must also be on your verified domain.
Using a template
curl -X POST https://api.reachbell.com/transactional/email \
-H "x-api-key: rb_live_yourkey" \
-H "Content-Type: application/json" \
-d '{
"to": "user@example.com",
"templateId": "tmpl_welcome_v1",
"variables": { "first_name": "Mukesh", "order_id": "ORD-12345" }
}'
Variable interpolation happens at send time, not at template creation. That means you can change a subscriber's stored attributes between when you create the template and when you send — the latest values flow through. See Email templates for the template authoring flow.
Tracking + suppression
ReachBell wraps every link in the email body with a click-tracking redirect — GET /e/click/:campaignId/:subscriberId?u=<encoded-url> — that logs the click and 302s the user to the original URL. A 1x1 transparent pixel at GET /e/open/:campaignId/:subscriberId measures opens.
The unsubscribe footer in every email points at the preference center. Clicking it sets the subscriber's emailStatus to unsubscribed and they're filtered out of every future send. Bounces and complaints arrive via SES → SNS → POST /email/ses-webhook (signature-verified) and update the subscriber's status automatically.
List-Unsubscribe header. Every email also carries the
List-Unsubscribe: <mailto:...>, <https://...>header so Gmail's one-click unsubscribe button and Outlook's similar UI work without the recipient having to scroll to the footer. This is required for Gmail bulk-sender compliance.
Limits and rate caps
- Plan-level monthly email caps are enforced atomically — the dashboard shows usage vs limit on the billing page.
- Per-IP rate limit of 120 requests per minute on
/transactional/email. - SES sandbox accounts default to 200 messages per 24h and 1 message per second; production accounts get raised after a review. The dashboard's Settings → Email → Sending limits page mirrors your current SES quota.
What's next?
- Build the reusable layouts that feed your campaigns — see Email templates.
- Wire up the transactional API as part of a drip automation.
- Set up UTM tracking so revenue attributes correctly.