You can write a [broadcast](/sending-email/broadcasts) email directly in SendOps. You type the message in a visual editor, and SendOps places it inside a [layout](/templates/layouts): your logo, brand colour and footer. You don't need to build a template first.

## Write email or use a template

When you create a broadcast, the **Content** switch offers two options:

- **Write email** (the default for new broadcasts) — write the message here, in the editor, inside a layout.
- **Use a template** — send one of your stored [email templates](/templates/template-management). The template holds the whole email, so there's no layout and no editor.

If you switch after you've written something, SendOps asks first: **Switch content mode?** *"Switching discards the content you've written for this mode."* Click **Switch** to go ahead, or cancel to keep your work.


  A broadcast whose complete HTML was supplied through the API has no switch. It shows *"This broadcast's HTML was supplied through the API. Edit it through the API."*


## Pick a layout

The **Layout** picker sits under the Content switch. A layout is the branded wrapper around your message, and the unsubscribe link and postal address are added automatically (see [why on the Layouts page](/templates/layouts#the-unsubscribe-link-and-postal-address)).

- New broadcasts start on your organisation's default layout, marked **Default** in the list. If you haven't made one, that's the built-in **SendOps default**.
- Search the list to pick another one. **Manage layouts** at the bottom takes you to the Layouts tab.
- The layout is fixed when you save. Changing the default later doesn't move broadcasts you've already saved.

## The editor

The **Email** card has two tabs, **Edit** and **Preview**. On **Edit** you fill in the **Subject** and **Preview text**, then write the body underneath.



### Formatting

The toolbar covers what works reliably in email:

- **Paragraph** or **Heading 1–3**
- **Bold** (⌘B), *italic* (⌘I), underline (⌘U) and strikethrough
- Align left, centre or right
- Link (⌘K), bulleted and numbered lists, quote, divider
- **Button** and **Image**
- **Insert field** and **Conditional** (see below)
- Undo (⌘Z) and redo (⇧⌘Z)

**Links** can start with `https://`, `http://` or `mailto:`, or be a single field such as `{{sendops_unsubscribe_url}}`.

A **button** has a **Label** and a **Link**, and an alignment. It's drawn in your brand colour, built so it renders in every major mail client.

### Images

Click **Image** to open **Insert image**. It has three tabs:

- **Upload** — drop a file or click **Choose a file**. PNG, JPEG, GIF or WebP, up to 5 MB.
- **Library** — pick an image you've already uploaded to your [asset library](/edge/asset-library).
- **URL** — link to an image hosted elsewhere. The address must start with `https://`.

You can also drag an image file into the editor, or paste one, and it uploads straight away.

Every image needs **Alt text**. It's what recipients see when their mail client blocks images. **Width (px)** can be 1 to 600 and starts at the image's own width, capped at 600.


  Images you upload are served from your [Edge CDN](/edge/edge-stack). Until it's set up, uploading shows *"Image upload needs the Edge CDN. Set it up in Infrastructure."* You can still use the **URL** tab. SVG images can't be used in email.


### Merge fields

A merge field fills in a value per recipient, such as their first name. You can insert one in three ways:

- the **Insert field** menu on the toolbar
- typing `{{` in the text, which opens a list of fields to choose from
- typing a complete field name, such as `{{first_name}}`

The fields on offer are your [contact attributes](/audience/attributes), plus `sendops_unsubscribe_url`. To use a new field, add it as an attribute first. Text in braces that doesn't match a field stays as plain text.

A field shows up as a pill. Click it to set a **Fallback**: the text shown when a contact has no value for that field (for example, "there" in "Hi there"). See [Merge defaults and fallbacks](#merge-defaults-and-fallbacks) before you set one.

### Conditional sections

A conditional section shows a block of content only to some recipients. Choose **Conditional**, then a field under **Show a section only if…**. In the block that appears you can:

- pick the field
- choose **is set** (the contact has a value) or **is not set** (they don't)
- turn on **Add otherwise** to add a second block, labelled **Otherwise**, that the other recipients see instead

Conditions can nest only two deep: a condition inside a condition, but no further.

### Pasting from Google Docs, Word or Markdown

You can paste a draft you've written elsewhere. SendOps keeps the structure that works in email (headings, bold, italic, underline, strikethrough, links, lists, quotes, dividers and images) and drops the rest, such as fonts and colours. Text written in Markdown (`#` headings, `-` lists, `**bold**`, `[link](https://…)`) is converted as it pastes. Any `{{field}}` that matches one of your fields becomes a merge field.

### Edit as HTML

**Edit as HTML**, under the **More options** (…) menu, swaps the visual editor for an HTML editor. It's one-way. SendOps warns you first:

> **Edit as HTML?** You'll edit raw HTML from now on. This can't be switched back to the visual editor for this broadcast.

Use it only if you need markup the toolbar can't produce. The HTML editor suggests fields when you type `{{`.

## Subject and preview text

- **Subject** — the subject line.
- **Preview text** — the short summary most inboxes show after the subject. It's sent as hidden text at the top of the email.

Merge fields work in both when you write the email in SendOps, for example `Your {{plan}} renewal`.

## Preview

The **Preview** tab renders the whole email as recipients will get it: layout, body, footer and merge values. It updates a moment after you stop typing.



**Preview as** picks whose values to fill in:

| Option | What it shows |
|---|---|
| **Merge defaults only** | Your [merge defaults](#merge-defaults-and-fallbacks), and fallbacks where there's no default. This is the starting view. |
| **Sample data** | Values you type in, field by field. |
| **A sample profile** | A test data profile saved on the layout. Only offered for a custom layout that has profiles. |
| **A contact** | The real values of the contact with the email address you enter. |

Switch between **Desktop** and **Mobile** to check the email at both widths.

The **Merge fields** list under the preview names every field the email uses. A field that isn't one of your attributes and has no merge default is flagged *"Will be blank for every recipient."*

If the email can't be rendered (for example, broken HTML after **Edit as HTML**), a red dot appears on the **Preview** tab and the error is shown there. You can't save until it's fixed.

### The Gmail clip warning

If the preview shows *"Over 102 KB. Gmail will clip this message."*, the email is too big for Gmail to show in full. Gmail cuts off anything after the first 102 KB and adds a "View entire message" link. Most people don't click it, so they miss the end of your email, including the unsubscribe link and your postal address.

The size is measured on the finished email: your layout, the body, the preview text and the footer, with merge values filled in. To get under the limit, shorten the text, remove some images, or simplify the layout. Linked images don't count towards the size, only the markup around them.

## Merge defaults and fallbacks

There are two ways to cover a contact who has no value for a field:

- **Merge defaults** — set in the **Merge defaults** section of the broadcast form. One value per field, for the whole broadcast.
- **A fallback** — set on one field in the editor, by clicking its pill.

A field fills in in this order:

1. **the contact's own value**, if they have one
2. **the merge default**, if you set one
3. **the field's fallback**, if you set one
4. **blank**

A merge default always wins over a fallback. That's because SES puts the merge default in place of a missing value before the email checks whether the field is set, so the fallback never gets a chance. When a field has both, the editor warns you on the field: *"The merge default ('…') is used instead of this fallback."*

**Set either a merge default or a fallback for a field, not both.** Use a fallback when the wording depends on where the field sits ("Hi there" in the greeting, "your team" elsewhere). Use a merge default when one value fits everywhere.

## Limits

| Limit | Value |
|---|---|
| Body size | 400 KB |
| Finished email size (layout + body + footer) | 500 KB, the SES limit |
| Image upload | PNG, JPEG, GIF or WebP, up to 5 MB |
| Image width | 1–600 px |
| Conditional nesting | Two deep |

## Send a test

There's no test button inside the editor. Test the saved broadcast:


  <Step title="Save the broadcast">
    Click **Create broadcast** for a new one, or **Save changes** when editing.
  </Step>
  <Step title="Open Send a test">
    On the broadcast's page, click **Test**. In **Send a test**, enter one or more **Recipients**, separated by commas, spaces or new lines.
  </Step>
  <Step title="Optionally add sample data">
    **Sample data (optional)** overrides your merge defaults for these test sends only.
  </Step>
  <Step title="Send">
    Click **Send test**. The test uses the **saved** version, so save again after any edits you want to see.
  </Step>


## What's next?

- [Broadcasts](/sending-email/broadcasts) — audience, consent, scheduling and results.
- [Layouts](/templates/layouts) — brand the wrapper around every email you write.
- [Attributes](/audience/attributes) — add the fields you can merge into an email.