# Personalization

Flomailr personalizes at send time, once per recipient. Merge tags insert a contact's details into the subject line and body. Conditional blocks show or hide a whole block depending on who is receiving the email.

## Merge tags

There are four tags. Write them with double braces and no spaces inside.

| Tag             | Inserts                               | Empty when                    |
| --------------- | ------------------------------------- | ----------------------------- |
| `{{firstName}}` | First name                            | The contact has no first name |
| `{{lastName}}`  | Last name                             | The contact has no last name  |
| `{{fullName}}`  | First and last name joined by a space | Both names are missing        |
| `{{email}}`     | Email address                         | Never                         |

- Tags are not case sensitive. `{{FirstName}}` works.
- In the builder, use the **Personalize** menu next to **Subject line**, or the `{ }` button in the text toolbar. Both insert the tag for you.
- Values are HTML-escaped in the body. In the subject, control characters are stripped.
- The plain-text version of a campaign gets the same substitution.

## Empty and unknown tags

A known tag with no value becomes an empty string. `Hi {{firstName}},` becomes `Hi ,` for a contact with no first name. There is no fallback syntax, so write copy that reads without the name, or use a conditional block (below).

Anything else is sent exactly as typed. That covers a misspelled tag such as `{{firstname2}}`, a tag with spaces such as `{{ firstName }}`, and single braces such as `{firstName}`. The **Preflight** panel in the builder warns about unknown tags and single-brace tags before you send.

## Where tags are filled in

| Message                                     | Tags filled in |
| ------------------------------------------- | -------------- |
| Campaign sends, including scheduled and RSS | Yes            |
| Emails sent by an automation                | Yes            |
| Test emails sent from the builder           | No             |
| `send_email` and `POST /api/v1/send`        | No             |

Test emails show tags as typed and include every conditional block. To see how a message resolves for a sample contact, use the `preview_personalization` tool (see [MCP tools](/docs/ai/tools)). For single sends, write the final text yourself.

## Conditional content

Any block can carry a rule. Select the block and open **Show to** in the inspector, then turn on **Only some contacts**. Flomailr removes the block from the document before rendering, so each recipient gets an email that contains only their blocks. This works for blocks inside columns and sections too.

A rule tests one field with one condition:

| Field                        | Conditions                                                       |
| ---------------------------- | ---------------------------------------------------------------- |
| Email, First name, Last name | is exactly, is not, contains, does not contain, is set, is empty |

- Comparison ignores case and surrounding spaces.
- Only these three fields can be tested. Contact tags, list membership and custom fields cannot.
- A rule with a condition that needs a value but has none is ignored, and everyone sees the block. An unknown or half-written rule also resolves to visible, because hiding content silently is harder to notice than showing too much.
- A campaign with no rules renders once for the whole list. Only campaigns that use rules are rendered per recipient. Automation emails apply rules the same way.

A common use: one heading shown when **First name** is set, and a second heading shown when **First name** is empty.

## Custom fields

Custom contact fields (**Settings > Workspace > Custom contact fields**) are stored on the contact, can be imported and exported, and can drive segments. They are not merge tags, and a rule cannot test them. To send different content to different groups, build a segment and send to it.

See also [Campaigns](/docs/platform/campaigns) and [Automations](/docs/platform/automations).
