Grow · Broadcasts

Write it once. Send it to the right people.

A visual editor for campaigns that hold up in the inbox, sent to segments built from what your product already knows. The contacts, the suppression list and the consent record are the ones your API already uses.

Also in the API
  • /broadcasts, Live
  • /segments, Live
  • /topics, Live
  • /templates, Live
Broadcasts · Festive collection previewSample data
POST /broadcastsJSON
{
  "name": "Festive collection preview",
  "segment_id": "<Recent buyers segment id>",
  "from": "Nimbu Books <[email protected]>",
  "subject": "Early access: the festive collection",
  "html": "<h1>Early access</h1><p>Hi {{ contact.first_name | there }}, …</p>",
  "send": true,
  "scheduled_at": "2026-09-25T04:30:00Z"
}
Sample campaign from Nimbu Books, a fictional bookshop: the audience and schedule bar, the block rail, the email on its canvas with a merge tag in the greeting, and the selected button’s settings. Switch to API to see the request that creates the same broadcast.

01, Editor

Blocks that hold their shape in the inbox.

The editor saves a structured document, not a pile of HTML. When you send, it compiles to email-safe markup: tables where older desktop mail apps need them, columns that stack on a phone, and colour hints for dark mode.

  • Headings, text, images, buttons, dividers, spacers, social links, a footer, product rows and HTML.
  • A footer with your postal address and an unsubscribe link is added to any campaign that lacks one.
  • Columns that stack

    Up to four columns in a row. On a phone they stack, or stay side by side if you say so.

  • Brand kit

    Your colours, fonts, button shape and footer, applied to every new block.

  • Saved blocks

    Save a header or a product row once and drop it into the next campaign.

  • Two previews

    The compiled email at desktop width and at phone width, before anyone else sees it.

  • Keyboard first

    Move any block without a mouse, with a Move to… menu, and undo or redo every edit.

  • Your HTML, cleaned

    Paste an HTML block and its scripts, iframes, forms and event handlers are removed before it is saved.

02, Personal

Personal, and safe with it.

Merge tags read from the contact record your product keeps up to date, with a fallback for anyone missing a value. Every value is escaped for the place it lands, so a name typed into a signup form can never rewrite your email.

  • {{ contact.first_name | there }} and any custom property, in the subject, the body and links.
  • Triple-brace tags such as {{{contact.first_name|there}}} also work in HTML you send through the API, so templates you bring with you render as they did.
  • An unknown tag is flagged as an error before sending. It never goes out blank.

TemplateHi {{ contact.first_name | there }},

first_name on the contactWhat the reader seesWhy
AshaHi Asha,The value itself.
Not setHi there,The fallback after the pipe.
<b>Asha</b>Hi <b>Asha</b>,Shown as text. A contact’s data never becomes markup.
{{ contact.email }}Hi {{ contact.email }},A value is never read as a new tag.
One greeting, four contacts. The last two rows are what someone might type into a signup form.

03, API

Your templates can live in your repo.

Render the email with whatever your code already uses, send the HTML, and create, schedule or cancel the campaign from a script or your CI. No SDK needed: it is one HTTP call.

  • POST /broadcasts creates a draft. POST /broadcasts/{id}/send sends it now, or at a time you give, such as in 1 hour.
  • A scheduled campaign can be cancelled back to a draft until it starts.
  • Recipients and clicked links can be read per campaign, so your own dashboards can use them.
send-festive.tsTypeScript
// Render the email with what you already use (a template engine,
// components rendered to HTML, plain strings), then create the
// broadcast from a script or your CI.
const html = await renderFestivePreview();

const res = await fetch('https://api.refiremail.com/broadcasts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.REFIREMAIL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    segment_id: process.env.RECENT_BUYERS_SEGMENT_ID,
    from: 'Nimbu Books <[email protected]>',
    subject: 'Early access: the festive collection',
    html,
    send: true,
    scheduled_at: 'in 1 hour',
  }),
});

const { id } = await res.json(); // keep it: the id pauses, resumes or cancels the send
Shell
curl -X POST https://api.refiremail.com/broadcasts \
  -H "Authorization: Bearer $REFIREMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "segment_id": "<Recent buyers segment id>",
    "from": "Nimbu Books <[email protected]>",
    "subject": "Early access: the festive collection",
    "html": "<p>Hi {{{contact.first_name|there}}}, the festive titles are in.</p>",
    "send": true,
    "scheduled_at": "in 1 hour"
  }'

04, A/B tests

Test on a slice. Send the winner to the rest.

Try two subject lines, two senders or two versions of the content on part of the audience. When the test window closes, the version more people clicked goes to everyone who was held back.

  • Winners are judged on unique human clicks. Opens are there too, but some mail apps fetch images when a message arrives, so an open is not proof of reading.
  • A test waits for its window and for a minimum number of deliveries per version, so an early lead cannot decide it.
  • No clear winner? You choose in advance: send version A, or send whichever is ahead.
A/B test · Festive collection previewSample data
Sample test set-up: each subject line goes to a tenth of Recent buyers, and the other 80% get whichever wins. The decision rule sits under the split.

05, Review

Checked before it leaves.

Every broadcast gets an unsubscribe link, and it will not launch without your postal address. The review also checks your sending domain against the rules the big mailbox providers set for bulk senders, and warns when a message is big enough to be clipped.

  • Every campaign carries one-click unsubscribe headers (RFC 8058). Opening an unsubscribe link never unsubscribes anyone by itself, so link scanners cannot opt your readers out.
  • Test sends to up to five addresses before a campaign launches.Coming
  • Scheduling in your team’s time zone, IST for a new team.Coming Until it ships, a broadcast is scheduled for an exact date and time.
  • Sending only to contacts with a marketing consent on record, as every team’s default.Coming
Review · Festive collection previewSample data
Sample review screen for a scheduled campaign. Each line is a check that runs before launch.

06, Sending

In control while it sends.

A big campaign takes time to go out. You can stop it, and it cannot surprise you halfway.

Pause, resume, cancel

Pause stops new sends at once and resume carries on from where it stopped. Cancel skips everyone not yet sent.

Frozen at launch

The content is locked when the campaign starts, so an edit made halfway cannot reach half your list.

Once per person

Each recipient gets the campaign at most once, even if a worker restarts in the middle of the send.

Checked again as it goes

Suppression is checked for each recipient at the moment of sending. Someone who unsubscribed an hour ago is skipped.

07, Reports

Coming

Numbers you can defend.

Delivered, bounced, clicked, unsubscribed and complained, per campaign and per link. Each figure will count one clear thing, and the ones that are easy to misread will say so.

DeliveredComing
Accepted by the recipient’s mail server.
Bounced
Split into permanent and temporary. A permanent bounce suppresses the address for every later send, campaign or transactional.
Clicked
Unique people, per campaign and per link. Clicks made by link scanners are marked as machine events and left out.
OpenedComing
Shown with a caution. Some mail apps fetch images when a message arrives rather than when it is read, so opens overstate reading.
Unsubscribed and complained
Each one also lands in the consent ledger and the suppression list, so the next campaign already knows.
Orders and revenueComing
Orders your code sends to POST /orders, credited to the last human click within 5 days, or else the last human open within 1 day.

Revenue from one call

Once revenue attribution ships, you will send each order from your checkout to POST /orders. It will be matched to the contact and credited to the email they last clicked within 5 days, or else opened within 1 day, so each campaign report can show orders and revenue, in your team’s currency, next to its clicks.

order.shShell
curl -X POST https://api.refiremail.com/orders \
  -H "Authorization: Bearer $REFIREMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "order-1042",
    "email": "[email protected]",
    "total_minor": 149900,
    "currency": "INR"
  }'

For the email your team writes, on the same contacts.

Send your first campaign.

Bring the contacts your product already has. Your transactional code stays as it is.