Email Poll: Add a One-Tap Poll to Any Email
An email poll asks your recipients one question and lets them answer with a single tap. MailInApp's poll block renders each option as a link: one tap opens a short page that records the vote, so voting works the same way in every email app, from Gmail to Outlook.
How to add a poll to an email
- In the studio, open the Insert panel and drag the Poll block onto the canvas.
- Type your question, then add, remove or reorder the options in the Tree panel. Each option is its own child with one label.
- Style the card and the option chips in the inspector (see the field list below).
- Open Live view to try a vote, then send a test copy to yourself from the Send tab.
- Send it, or export the HTML for your own ESP. Votes show up on the email's Responses page as they arrive.
Where an email poll works
| Where | How a recipient votes |
|---|---|
| Every email app (Gmail, Outlook, Mail on iPhone, Yahoo and the rest) | Taps an option, then confirms the vote on a short MailInApp page |
| The live view and MailInApp's inbox | Votes in place, without leaving the page |
The full picture per client is in Email client support.
How it works
In the mailed email, each poll option is a plain <a href> link into /v/[token]/act, styled as an option chip. The link is always visible, and it is the control: there is no in-email form and nothing hidden behind CSS. A plain link is the one primitive every email client can render and follow, which is why voting works the same in every inbox. The hosted live view renders each option as a real form instead, so a vote there posts in place. Both paths submit through the same recording endpoint and produce an identical event, so results never fork by where a recipient voted.
A vote is recorded once the recipient confirms it on the short page — not on a bare link fetch. This matters because corporate scanners and inbox security tools prefetch every link in an email as soon as it arrives; if a bare GET counted, poll results would fill up with bots before a human ever opened the message. Confirmation happens via a form post even on the link path, which is why /v/[token]/act is a two-step confirm-then-record rather than a redirect-and-record.
A recipient's own vote is deduplicated. Re-clicking their own link (an eager double-tap, a retried page load) is a no-op rather than a second row, enforced by a deterministic Firestore document id keyed on the campaign, block and recipient. Anonymous votes (no recipient token — for example, one from an exported HTML file pasted into a third-party ESP) aren't deduplicated per person; there's no person to key on. Instead they're rate-limited per IP, per campaign, per minute, since a campaign's id is visible in the email's own source and nothing else stops a script from posting arbitrary votes.
Configurable fields:
- Question — the poll's prompt text, plus its own color and font size.
- Background color, padding, border and border radius on the card.
- Option text color and option background color — a shared style override applied to every option chip.
Each poll option is a child node with a single label field — add, remove or reorder options freely in the tree.
If the project has a close date or response cap configured (see survey lifecycle) and it's been reached, the live view swaps the interactive chips for inert, gray equivalents, with a "This survey is closed to new responses" note. Mailed HTML itself never shows this state — it's static at send time, and the check only happens when the page is opened, not when the email is sent.
In an email that asks for several answers, this block can count towards a complete response: recipients see how many they've answered, and you see who answered them all. See Collecting an answer to every block.
Examples
Subject
Quick one: what should we build next?
A single-question poll ("Which feature should we build next?") dropped into a product newsletter gets a direct read on interest without the overhead of a full form. See Surveys & NPS feedback for the broader pattern of collecting structured feedback straight from an inbox. An event-recap email can ask "Would you come to another one?" with Yes/No/Maybe options, feeding straight into planning the next one. A/B undecided teams can use a poll as a lightweight internal vote ("Logo A or Logo B?") sent to stakeholders, with results visible live on the results page as they come in.
What the static fallback looks like
<div id="em-poll-1" style="margin:12px 0;background-color:transparent">
<p style="margin:0 0 10px;font-weight:600;font-size:16px;color:#111827">Which do you prefer?</p>
<div>
<a href="https://mailinapp.com/v/eyJhbGci.../act?blockId=poll-1&blockType=poll&action=vote&option=Option+A&optionId=poll-option-2"
style="display:inline-block;margin:0 6px 6px 0;padding:8px 14px;border:1px solid #d1d5db;border-radius:6px;background-color:#ffffff;color:#111827;font-size:14px;text-decoration:none">
Option A
</a>
<a href="...option=Option+B&optionId=poll-option-3" ...>
Option B
</a>
</div>
</div>
Each option is a plain <a> into /v/[token]/act, styled as a chip. It's always visible in every email app, and tapping it opens the short page that confirms and records the vote.
Email poll FAQ
Can you put a poll in an email?
Yes. A poll block is plain HTML and CSS, with no JavaScript, so every email client renders it. Each option is a link: one tap opens a short page where the recipient confirms the vote, and the vote is recorded.
Does an email poll work in Outlook and Apple Mail?
Yes. Outlook, Mail on iPhone and every other email app show each option as a link, and the recipient confirms the vote on a short page. Plain links work in every email app MailInApp has tested.
Can a recipient vote twice?
No. A recipient's vote is stored once per email and poll, so clicking their own link again changes nothing. Votes from an exported email with no recipient attached are rate-limited instead.
Where do I see the results?
On the email's Responses page, live as votes arrive. You can also push each vote to your own systems with a webhook.