Interactive blocks
Every interactive block ships with three output tiers — kinetic, static, and Outlook — so you never have to think about compatibility while designing. This page is a quick summary of what each block does and what its fallback looks like — every block also has its own dedicated page with the full configuration surface and worked examples, linked at the end of its section below. The tier system itself is explained in How fallbacks work. Looking for charts, KPI scorecards or dashboards instead? See Analytics & chart blocks.
Carousel
A swipeable image gallery with navigation dots and arrows, driven entirely by CSS.
- Interactive: recipients flip through slides in place. Each slide can carry a caption and a link.
- Fallback: the first slide, plus a "See all N slides" link to the hosted live view — where every slide is one tap away, not lost.
Accordion
Expandable sections — ideal for FAQs, order details, or keeping long emails scannable.
- Interactive: tapping a title expands its content.
- Fallback: all items render expanded, so nothing is lost.
Poll
A one-tap survey. Each option is a link that records the vote the moment it's confirmed.
- Interactive: recipients vote without leaving the inbox; the block acknowledges their choice.
- Fallback: options render as buttons that record the vote through a hosted page. Voting works in every email client, because plain links are the one universal primitive.
Results stream into your project's analytics. See Interactions & analytics.
Form
A full multi-page survey builder, right inside the studio. Drop in as many question types as you need, optionally split them across pages, and read the results as per-question rollups instead of a raw dump.
- Question types: short text, long text, email, number, phone, date, dropdown, single checkbox — plus multiple choice (pick one), checkboxes (pick any number), linear scale, and star rating. Mix and match freely; a form is just a container of
form-fieldchildren of whatever types you add. (File-upload questions aren't supported yet.) - Single-page forms work exactly as before: in clients that support in-email form posts, recipients fill in every field and submit without leaving the inbox; everywhere else the form renders as a call-to-action button that opens a hosted form page, prefilled with what you already know about the recipient.
- Multi-page surveys: give any question a page number in the inspector to split a form across multiple pages — a "Page 1 of 3"-style progression with Back navigation. Because paging a real form can't be expressed as static HTML/CSS, a multi-page form always mails as a single Start survey button (customize its label) that opens the hosted survey wizard; recipients answer one page at a time, and answers carry forward between pages automatically, including if they use Back. Nothing is recorded until the final page is submitted — an abandoned survey midway through leaves no partial response.
Every submission — single-page or multi-page — lands in your responses per recipient, and rolls up per question on the Responses page: see Survey question rollups.
Countdown
A live ticking timer for launches, sales and deadlines. Countdown timers are generated as server-rendered animated GIFs — the only technique that keeps ticking across all major clients — with a meaningful first frame for clients that only show static images.
Rating
A one-tap feedback question — the block behind CSAT, CES and NPS-style surveys. Like polls, each option is a recorded link, so ratings work everywhere: one tap in the inbox, confirmation on a hosted page.
- Display styles: Stars (the classic 3–10 star row), Numbered scale (a Likert-style row of numbered buttons with your own low/high end labels — e.g. "Strongly disagree" → "Strongly agree"), or NPS (a fixed 0–10 row defaulting to "Not at all likely" → "Extremely likely"). All three submit the same
rateaction, so switching styles never breaks existing responses. - Low-score alert threshold: set "rating ≤ N" on the block to flag a bad response the moment it arrives — it's what powers both the webhook's
lowScoreflag and in-app alert emails. Each rating block sets its own threshold, since a 1–5 CSAT question and a 0–10 CES question need different cutoffs. - Follow-up question: optionally ask a free-text question — "What went wrong?" — whenever a response falls at or below a threshold you set. It only appears on the hosted live view (email HTML can't branch), immediately after the rating is submitted, and lands in your responses as a normal answer attached to the same recipient.
Responses roll up automatically into averages, response distributions, an NPS score where relevant, and trend over time — see Responses & webhooks.
Spin-to-win
A gamified promo wheel that assigns a reward. Where kinetic CSS is supported the wheel animates in the email; elsewhere recipients get an equivalent one-tap reveal through the live view, so every recipient can win.
Quiz
A scored, multi-question quiz — the studio's answer to lead-scoring quizzes and personality/knowledge tests. Add a Quiz block, then drop Quiz question children into it, each with its own options and a correct answer.
- Interactive: in clients that support in-email form posts, recipients answer every question and submit in one shot, right from the inbox.
- Fallback: everywhere else, a link opens the same quiz on the hosted live view — there's no link-per-answer tier the way poll/rating have, since a multi-question combination can't be enumerated as plain GET links.
- Scoring: correct answers are checked server-side against the block's configured answer key — never trusted from the client — and the recipient is shown one of two configurable results messages depending on whether they cleared the pass score you set (a percentage of correct answers). Set a redirect to send them somewhere specific afterward, like a coupon page for a passing score.
Each submission lands as a normal event in Interactions & analytics, with the computed score and per-question answers as its value.
Scratch-off
A scratch-to-reveal prize card — the same mechanic behind gamified promo reveals, built on the same :checked CSS technique as the accordion and spin-to-win blocks.
- Interactive: tapping the scratch surface reveals the prize underneath, right in the inbox.
- Fallback: the prize renders unhidden by default wherever the reveal gesture isn't supported — the same "safe default" pattern the accordion uses — so nobody ever gets stuck looking at an un-scratchable card.
Product
Sell straight from the email: a product card with a Buy now button that carries a real payment, no storefront required. Connect your own Stripe account under Settings → Payments first — funds settle directly there, MailInApp never holds them or sees card details.
- Fulfillment: Digital (a download link/code you enter on the block, emailed automatically the moment payment clears) or Physical (Stripe Checkout collects a shipping address; you mark the order shipped from the responses dashboard's Orders table — MailInApp doesn't handle shipping itself, but it does email the buyer the moment you do).
- Inventory: an optional cap. Once paid orders reach it, the block shows Sold out instead of Buy now on the hosted live view. The mailed email itself stays fresh too: a capped product's stock pill ("3 left" / "Sold out") is a small server-rendered image refreshed on every open — the same trick the countdown block uses — so it never shows stale availability days after the send. The purchase itself is still authoritatively checked on the buyer's click, not trusted from what the badge shows — if a sale clears just as the last unit goes, the buyer is refunded and emailed automatically rather than being silently over-sold.
- Interactive: unlike a vote or rating, a purchase can only complete on Stripe's own secure page, so there's no in-email kinetic tier — Buy now always opens the hosted live view first to confirm, then redirects to Stripe.
- Fallback: the same product card and Buy now link work in every email client, since it's a plain link like the rest of the static tier.
Every completed order shows up as a purchase event in Interactions & analytics, plus a dedicated Orders table on the project's responses page — see Orders, fulfillment and refunds for what happens (and what gets emailed to the buyer) at each stage, and issuing a manual refund. Need to ask a buyer something directly? Contact them straight from the Orders table.
Assignment
Homework or coursework with a due date — add a title, instructions, an optional point value, and any number of resource links.
- Due date: shows as a live-ticking countdown image in the mailed email (the same server-rendered-GIF technique the countdown block uses) alongside a plain-text due line, so the deadline is accurate whether or not a client renders the image.
- Submission: choose Mark as done (a one-tap checkbox, like a poll option), Short text answer, or Link answer (e.g. a shared-document URL). Marking done is a link-first tier-2 action the same way poll/rating options are; text and link answers open the hosted live view to type a reply, the same pattern the quiz block uses for anything a plain link can't carry.
- Fallback: everywhere else, a static due-date line plus the resource links list, both always visible.
Every completion or submission lands as a normal event — see Interactions & analytics — and rolls up into a Gradebook (a student-by-assignment table, with late submissions flagged) on the Responses page: see Homework & gradebook.
Flashcard deck
A flip card for vocabulary or fact drilling. Add a Flashcard deck, then drop Flashcard children into it, each with its own front (question) and back (answer) text, plus an optional image on either side.
- Interactive: tapping a card flips it in place, independently of every other card in the deck.
- Fallback: everywhere else, front and back stack statically, labeled "Q:" / "A:" — nothing is ever hidden behind a gesture that isn't supported.
A flashcard deck is a study aid, not a question, so it doesn't record anything and never appears in the responses dashboard, CSV export, or analytics.
Meeting link
Join details for an online or hybrid event: a provider label (Zoom, Meet, Teams, or Custom — label only, there's no account integration with any of them, just a URL you paste), a Join URL, a start time, an optional dial-in line for phone access, and how many minutes before the start the Join link should present as live.
- Always live in mail: the mailed email's Join button is always a real, clickable link — same "static at send time" convention as the countdown and product blocks — alongside a "Starts in" / "Live now" badge rendered with the same server-generated GIF technique the countdown block uses.
- Gated on the hosted live view: the live view is fetched fresh every time, so there the Join button is dynamic — it shows an inert "Opens N minutes before start" chip until the configured window opens, then swaps to the real link.
- The dial-in line, if set, renders as plain text next to the Join button.
Venue
In-person location details: a venue name, an address, an optional photo, and a "Get Directions" button.
- Get Directions opens Google Maps — no API key, no map-thumbnail integration, just a link. It uses the most precise thing you've given it: a pasted Google Maps link (share a place from Google Maps and paste the URL, short links like
maps.app.goo.gl/...work too) first, then latitude/longitude if you've filled those in, and only falls back to geocoding the plain address text if neither is set. - Pure content, like Image or Text — there's nothing to answer, so it never appears in the responses dashboard or CSV export. The directions link is still tracked in the block-level click heatmap like any other link.
- Leave the address, maps link, and coordinates all blank and the block still shows the venue name and photo, with no dead directions link.
Add to calendar
A one-tap "add this to my calendar" block, and the practical fix for cross-timezone invites: since a mailed email can't detect a recipient's own timezone (no JavaScript in email), this block encodes the event's start and end as an absolute instant rather than a pre-computed local-time string — every attendee's own calendar app then displays it correctly in their local time automatically.
- Takes a title, an optional description, a start time, an end time (left blank, it defaults to one hour after the start), and a free-text location — fill the location in yourself from your Venue or Meeting link block's own text; the two aren't linked automatically.
- Renders three links from the same details: Download .ics (opens directly in desktop and mobile calendar apps), Add to Google Calendar, and Add to Outlook.com — the latter two are plain deep links built at send time, no server round-trip.
RSVP
A free "Will you attend?" question with capacity and waitlist support — the free-RSVP equivalent of the Product block's paid-ticket inventory cap, for events that just need a headcount rather than a charge.
- Interactive: Yes/No chips are one-tap links, the exact shape a poll's single-choice vote uses. Turn on Allow bringing guests to add a guest-count picker to the "Yes" response — picking a guest count needs the hosted live view, the same "a fixed link can't offer a choice" reasoning the assignment block's text/link answers already follow; a guest-less "Yes" (0 guests) still works as a plain one-tap link.
- Capacity and waitlist: set an optional cap (0 = unlimited). Once confirmed RSVPs — plus any guests — would exceed it, further "yes" responses are recorded as waitlisted instead of confirmed, and the recipient sees your own configured waitlist message rather than a generic thank-you.
- Fallback: everywhere else, a static "RSVP here" link into the hosted live view.
Every RSVP rolls up into confirmed/declined/waitlisted counts and a guest total on the Responses page, alongside every other block's summary.
Standings table
A ranked season table for a sports team or club: team name, played/won/drawn/lost, points for/against, and points, sorted by points with the top three ranks marked. Unlike every block on the analytics & chart blocks page, this one never renders as an image — a real HTML table is the entire block, in every email client including Outlook, since sorted tabular data is exactly what table markup already does well.
- Rows are typed in directly, one team per row — there's no live data-source binding yet, so update the block by hand after each match (the same way you'd update a KPI scorecard's manual value before it's bound to a data source).
- Turn off Show draws column for a sport with no draws (basketball, tennis leagues). Points is always a field you fill in yourself, not computed from wins/draws/losses — leagues award points differently (3-point wins, bonus points, etc.).
- Set Highlight team to bold and tint the row for one team by its exact name — useful for a parent digest so a family can spot their kid's team at a glance.
- Pure content, like Venue or Add to calendar — there's nothing to answer, so it never appears in the responses dashboard or CSV export.
Input elements
The palette's Inputs section holds the entry elements: text, email, long text, dropdown, checkbox, number, phone, date picker, multiple choice, checkboxes, linear scale and star rating. Drop one into a form and it becomes one of its fields; drop it anywhere else and it arrives wrapped in a fresh form — in email, an input can only submit as part of a form. The same types are also reachable without dragging: click the + on a form in the Tree panel, or on its empty canvas placeholder, to search and insert one directly.
- Dropdowns, multiple choice and checkboxes all take a list of choices, added/reordered as rows in the inspector. A single checkbox submits
yeswhen ticked; a checkboxes field can select any number of its choices, and each one counts separately in the results. - Linear scale takes a maximum value and optional low/high end labels (e.g. "Not likely" → "Very likely"). Star rating takes a maximum number of stars.
- Give any field a page number in the inspector to place it on that page of a multi-page survey.
Whatever the type, answers arrive in your project's analytics keyed by the field name — see Survey question rollups for how they're summarized.
Layout & content blocks
Alongside the interactive set, the studio includes the structural blocks every email needs: section, columns (side-by-side layout with per-column width, padding and vertical alignment — built on tables so it holds up in Outlook), heading, text, image, button, list, divider, spacer and social links, plus a repeat block that renders a template once per row of a connected data source — useful for product grids and digests. All text-bearing blocks accept merge tags. Already built something and want it side-by-side with something new instead? Select it and use the Inspector's ⧉ Wrap in… (see The workspace) rather than rebuilding it inside a fresh Columns block by hand.
Formula
Math and science notation — fractions, exponents, subscripts, Greek letters, named functions (\sin, \lim, \log, ...), set/logic symbols (\forall, \in, \cup, \neg, ...) and common operators — written in a small LaTeX-like syntax (e.g. \frac{-b \pm \sqrt{b^2-4ac}}{2a}) since no email client typesets real math. \left(/\right) are recognized (at normal size, not auto-scaled — this is a small bitmap renderer, not a real TeX engine) and \text{...} drops back to plain words mid-formula. Chemical formulas get their own \ce{...} macro (a small mhchem-like subset), e.g. \ce{H3O+} or \ce{2H2 + O2 -> 2H2O} — element counts auto-subscript, trailing ionic charges (+, 2-, SO4^2-, ...) auto-superscript, and -> renders as a reaction arrow, so you don't have to hand-write ^/_ for every atom count and charge. It's rendered server-side to an image, in Inline (small, sits within a line of text) or Block (larger, its own line) display mode. Syntax it doesn't recognize (full LaTeX documents, packages, matrices, tables) renders literally as its own text instead of breaking the send, and the image's alt text always carries the raw notation, so the formula is never trapped inside a picture with no text equivalent.
Video and audio
No email client executes media playback, so a Video or Audio block always mails as a static preview image (its poster/cover image if you set one, otherwise a plain placeholder) that opens the file when tapped. On the hosted live view — a real page, not an inbox — the same block renders as a working native player instead: <video> with your poster image, or <audio> with cover art stacked above the controls if you set one. The video/audio file itself is still a plain URL you host elsewhere — paste a link to it. The poster/cover image, though, is picked from the media library instead of typed in: Choose image… opens a grid of everything you've already uploaded, with an upload button right there for a new one.
→ Video: full guide & examples · Audio: full guide & examples
Prebuilt components
The palette's Prebuilt section holds ready-made compositions — header, hero, card, product row, feature columns, testimonial, coupon and footer. Dropping one inserts ordinary blocks arranged for you: there is nothing special about them afterwards, so restyle or restructure them freely.