How to write email campaigns in Notion
Nocadi turns a Notion database into branded, ready-to-send email campaigns on MailerLite and Mailchimp. This guide covers the one-time setup and, more importantly, every convention for authoring an email inside Notion: the 📨 columns, which blocks render, how to add buttons and merge variables, and the status flow that ships it.
How Nocadi works
You keep writing where you already work. Notion is the editor; Nocadi is the dispatcher that renders each page into a branded email and pushes it to your platform.
- Each row in your Notion campaigns database is one email. The page body is the content; a handful of 📨 columns hold the subject, audience and status.
- When you set the row's status to Ready to send, Nocadi renders the page and creates (or updates) a draft campaign in MailerLite or Mailchimp.
- You preview it, send yourself a test, and when it is right you set the status to Send to audience to ship it from Notion.
- After it goes out, opens, clicks and delivery counts write themselves back into the same Notion row.

Nocadi never sends on its own. A change of status builds or refreshes a draft; a real send only happens when you set Send to audience. With team approvals on, that opens a team review first and the sign-off is the gate (see the status flow).
One-time setup
Five steps, once per workspace. After this you stay in Notion.
1. Create your account and organization
Sign up, verify your email, and name your organization. Everything in Nocadi (connections, databases, branding, teammates) lives inside that organization, so you can invite colleagues to share it later.
2. Connect Notion
Connect your Notion workspace and grant Nocadi access to the database you want to use. Be sure to allow Update content: Nocadi needs it to add and maintain the 📨 columns and to write previews and stats back to your rows.

3. Connect MailerLite or Mailchimp
Add a marketing platform on the Connections page. MailerLite connects with an API token; Mailchimp connects with one click through OAuth. Set a default sender name and address while you are there; those become the from-line on every campaign unless a row overrides them.

4. Set your brand
In template settings, set your logo, colors, fonts, content alignment and the footer text. This is the look every email inherits, so you never style anything in Notion itself. Fill in your mailing address here too: it is required for compliance, and it stops MailerLite from appending a second footer of its own.

5. Attach your campaigns database
Pick the Notion database to use as your campaigns list. On attach, Nocadi provisions the 📨 columns automatically and fills the audience picker from your connected platforms. You are ready to write.

If the attach reports that columns could not be created, your Notion connection is missing Update content. Reconnect Notion, enable that capability, and re-run setup.
The campaign columns Nocadi adds
Nocadi owns a set of properties, all prefixed with the 📨 envelope so they group together and read as app fields. Some you fill in; the rest Nocadi writes for you.
| Column | Who fills it | What it does |
|---|---|---|
| 📨 Status | You | Drives the whole flow. You set Draft, Ready to send, Send test, Send to audience; Nocadi writes back In review, Approved, Scheduled, Sent, Rejected. |
| 📨 Subject | You | The subject line. If left empty, Nocadi uses the Notion page title. |
| 📨 Preview | You | Preheader text shown after the subject in the inbox. |
| 📨 Audience | You | Which connected list or segment receives the campaign. The platform is read from your pick. |
| 📨 Send at | You | Optional. A future date (and time) to schedule the send instead of sending now. Times are UTC. Leave blank to send immediately. |
| 📨 Result | Nocadi | The outcome of the last sync, including any error to fix. Read-only. |
| 📨 Preview URL | Nocadi | A link to the in-app preview of the rendered email. Read-only. |
| 📨 Recipients, Delivered, opens… | Nocadi | Send and engagement stats, filled in after the campaign goes out. Read-only. |
| 📨 Stats updated | Nocadi | When those numbers were last refreshed. |

Nocadi only ever adds columns. If you already have a matching column (say a Subject), it reuses it. It never deletes or restructures your data, so it is safe to point at an existing database.
Writing the email in Notion
Write the page body the way you would write any Notion page. Nocadi converts it to email-safe HTML. You never add CSS or HTML; the look comes from your brand template.
Supported blocks
| Notion block | How it renders |
|---|---|
| Heading 1 / 2 / 3 | Section headings, following your content alignment. |
| Paragraph | Body text, with bold, italic, links and inline code preserved. |
| Bulleted / numbered list | Lists, always kept left-aligned for readability. |
| To-do list | A checklist with ticked and unticked boxes. |
| Quote | An indented, accented quote. |
| Callout | A colored box with its emoji. Multi-line and nested blocks are kept. |
| Code | A monospace block. One-liners follow your alignment; multi-line code stays left. |
| Divider | A horizontal rule. |
| Image | An inline image with its caption. Nocadi rehosts it so the link never expires. |
| Columns | Side-by-side on desktop, stacked on mobile. |
| Toggle | Flattened: the summary and its contents both show (email cannot fold). |

Turn a link into a button
There is no button block in Notion, so Nocadi uses a simple rule: a paragraph whose only content is a single link becomes a call-to-action button. Put the link on its own line. The first such button in the email is the filled primary button; any later ones render as outline buttons.

Images and the hero
Drop images straight into the page. If the very first block is an image, Nocadi promotes it to a full-width hero at the top of the email, under your logo. Other images render inline at their natural size. A Notion image link normally expires within an hour, so Nocadi copies each image to stable storage before sending.
Alignment
Whether headings and paragraphs are centered or left-aligned is set once, in your brand template (centered by default). For readability, lists, quotes and multi-line code always stay left-aligned regardless of that setting.
Blocks that have no email-safe equivalent are dropped silently: tables, embedded databases, videos, files, audio, bookmarks and synced blocks. If something is missing from the rendered email, rebuild it with the supported blocks above.
Personalization variables
Use neutral merge tokens and Nocadi translates them to each platform's native tag on send. Write them anywhere text appears: the subject, the preview, headings, paragraphs, list items and button labels.
| Write this | Inserts | Fallback |
|---|---|---|
{{ first_name }} | The recipient's first name | Yes |
{{ last_name }} | The recipient's last name | Yes |
{{ full_name }} | First and last name together | No |
{{ email }} | The recipient's email address | Yes |
Add a fallback after a pipe for when the field is empty, for example {{ first_name | there }} renders "there" when no first name is on file. Fallbacks apply on MailerLite; Mailchimp ignores them and simply leaves the field blank. The one-click unsubscribe link is added to the footer for you, so you never write it yourself.
You do not have to memorize the exact spelling. Common variants like {{ firstname }}, {{ fname }} and {{ name }} all resolve to the first name.

Two rules keep a send from going out broken. Write each token as plain, unformatted text: if bold, italic or a link cuts through the braces, the sync fails. And only the variables above are allowed; an unrecognized token like {{ company }} blocks the sync until you fix it. The exact reason always shows up in 📨 Result. Tokens written inside a code block are left literal, so you can document syntax safely.
Sending: the 📨 Status flow
The 📨 Status select is the control surface, and it holds two kinds of value: the commands you set to drive Nocadi, and the states Nocadi writes back so the row always reflects what happened.
You set these
| Status | What happens |
|---|---|
| Draft | Nothing leaves Notion. Write and edit freely. |
| Ready to send | Nocadi builds or updates the draft campaign on your platform. Edit the page and it re-syncs. |
| Send test | Emails a live preview to you, then returns the row to Draft. |
| Send to audience | Dispatches the campaign to the whole audience. With team approvals on, it starts a review first and sends after sign-off. |
Nocadi sets these (read-only)
| Status | What it means |
|---|---|
| In review | Team approvals are on and the send is paused while approvers sign off. 📨 Result tracks who is still pending, and each approver is emailed the campaign. |
| Approved | Your team approved the campaign; it sends (or schedules) automatically. |
| Scheduled | Queued for the 📨 Send at time. Change the time to reschedule, or set Status back to Draft (or clear 📨 Send at) to cancel. |
| Sent | The campaign has gone out. |
| Rejected | An approver blocked the send. The reason is written to 📨 Result. Edit the campaign and set Status back to Send to audience to start a fresh review. |

Choose the audience
Set 📨 Audience from its drop-down. Nocadi keeps that list in sync with your connected platforms, and each option is namespaced by platform, for example MailerLite — Newsletter. Because the platform is read from your pick, there is no separate destination column to set.

Schedule a future send
To send later instead of right away, set a future date in 📨 Send at before you move Status to Send to audience. Nocadi hands the finished campaign to your platform right away, and your platform delivers it at the 📨 Send at time; the row shows Scheduled until it goes out. Include a time for precise control; leave 📨 Send at blank to send immediately. Reschedule by changing the time, or cancel by clearing the date or setting Status back to Draft.
Scheduled times are read in UTC. Nocadi has no per-account time zone, so 2:00 PM means 14:00 UTC, and a date with no time goes out at 00:00 (midnight) UTC that day. If you are not on UTC, convert your intended local time to UTC when you set it, or turn on Notion's own time-zone option for that date and Nocadi will honor the offset.
Setting Status to Send to audience dispatches to the whole audience, so set it deliberately. The send is irreversible, but it is guarded against duplicates: the same campaign can never go to the same audience twice. Want a required sign-off before anything goes out? Turn on team approvals below.
Team approvals
Approvals are optional and off by default. An organization owner or admin can turn them on under Settings, Approvals, choose which teammates can approve, and set how many of them must sign off before a campaign goes out.
With approvals on, Send to audience no longer sends straight away. The row moves to In review and every approver is emailed the full campaign with an Open in Notion link and a one-click approve or reject link, and 📨 Result shows who is still pending. Once enough approve, the row turns Approved and the campaign goes out exactly once. A single rejection blocks it, moves the row to Rejected, and writes the reason to 📨 Result.
Approvers always sign off on the exact content that ships. Edit the campaign after it is in review and the earlier approvals no longer count, so a fresh round starts on the next attempt. Fix a rejected campaign the same way, then set Status back to Send to audience to try again.
Preview and test before you send
Two ways to see exactly what recipients will get, both without leaving the row.
Open 📨 Preview URL for a live, in-app render of the email. The preview highlights every merge variable as a chip and warns you about any unknown or broken token before it can block a send, so you can fix issues early.
To check it in a real inbox, set Status to Send test. Nocadi emails the rendered campaign to you, using the same branding and merge-tag substitution as the real thing. 📨 Result confirms where it went. Test as many times as you like; only Send to audience reaches your real list.

Results write back
After a campaign sends, Nocadi pulls the numbers from your platform and writes them into the same Notion row, so your reporting lives next to your content.
Recipients, deliveries, opens, clicks and other engagement counts fill the 📨 stats columns, and 📨 Stats updated records when they were last refreshed. The numbers keep updating for a while after the send, so your database doubles as a campaign dashboard with no spreadsheets to maintain.
Troubleshooting
Whenever a sync cannot complete, the reason is written to 📨 Result on that row. The common ones:
| What you see | The fix |
|---|---|
| "Unknown variable(s)…" | You used a token Nocadi does not know. Use only the supported variables and check the spelling. |
| "Variable(s) split by formatting…" | Bold, italic or a link cut through a token. Retype it as plain text. |
| Columns were not created on attach | Reconnect Notion and grant Update content, then re-run setup. |
| A second footer in MailerLite | Add your mailing address in template settings so your footer satisfies the requirement. |
| A block is missing from the email | It is an unsupported block (table, video, file…). Rebuild it with a supported block. |

Quick reference
Blocks that render
- Headings, paragraphs
- Lists, to-dos, quotes
- Callouts, code, dividers
- Images, columns, toggles
- A lone link becomes a button
Variables
{{ first_name }}{{ last_name }}{{ full_name }}{{ email }}- Fallback:
{{ first_name | there }}
Status flow
- You set:
- Draft: edit freely
- Ready to send: build draft
- Send test: email yourself
- Send to audience: dispatch
- Nocadi sets:
- In review: awaiting sign-off
- Approved: team signed off
- Scheduled: queued for Send at
- Rejected: blocked, see Result
- Sent: gone out
Ready to write your first campaign?
Connect your Notion workspace and a marketing platform, attach a database, and send your first email without leaving Notion.