# Pre-send email QA checklist: 8 checks before you send

Canonical: https://brew.new/blog/pre-send-email-qa-checklist
Author: Thomas Park
Published: 2026-10-11
Updated: 2026-10-11

A pre-send QA checklist is the short list of checks you run on every email before it goes out. Broken campaigns usually ship with a button still pointing at `#`, a hero image swapped for a 4 MB PNG at 6pm, or a two-column layout classic Outlook ignores. Each takes a minute to catch before the send and can't be fixed after.

We rebuilt Brew's email audit this month around these checks, each with an exact threshold. Run them by hand, with or without Brew.

![An email audit result showing a score, readiness status and findings grouped by severity.](/images/blog/email-audit-findings.png)

*Findings grouped by severity, with one readiness verdict.*

## Key takeaways

- Check eight areas: links, size, images, client support, accessibility, copy, compliance and markup.
- Gmail clips HTML over about 102 KB, hiding the footer and unsubscribe link. Brew warns at 80 KB because click tracking adds weight.
- Click every link in a delivered test, but never let an automated checker open unsubscribe or preference links.
- Brew's audit scores 0 to 100: minus 20 per critical, 10 per error, 3 per warning. Any critical or error means not ready.
- The audit never blocks a send, and it doesn't test inbox placement, rendering screenshots or dark mode.

## 1. Links

A broken link wastes the send. Check that:

- every button has a real destination, not `#`, `example.com` or an unfilled `{{url}}`
- no link returns 404 or 410, points at a domain that doesn't resolve, has a bad certificate, refuses the connection or loops through redirects
- every link uses `https`
- visible link text matches the destination. `brew.new/pricing` pointing elsewhere looks like phishing
- you skip public URL shorteners, which share reputation with every spammer using them

Click every link in a delivered test, not the editor. Your ESP rewrites links for click tracking at send time, so redirect chains and broken tracking parameters only show up there.

Never let an automated checker request unsubscribe or preference links. Some providers treat any request to that URL as an unsubscribe. And a bot wall served to a checker doesn't prove a link dead. Click it yourself.

## 2. Size

Gmail clips messages with more than about **102 KB** of HTML behind a "View entire message" link. That hides the footer, unsubscribe link and postal address, so a clipped marketing email quietly becomes a compliance problem.

Our thresholds:

- **80 KB** of HTML is a warning
- **102 KB** of HTML is an error, because Gmail will clip it
- **3 MB** total loaded size, HTML plus images, is a warning
- **5 MB** total loaded size is an error

We warn at 80 KB because click tracking swaps short links for longer redirect URLs, and some ESPs add markup. 98 KB in your editor can arrive as 105 KB.

Usual bloat: inline styles repeated on every element, leftover builder comments, hidden duplicate mobile and desktop sections, and embedded base64 images.

## 3. Images

Every image should:

- have `alt` text, or `alt=""` if purely decorative
- have `width` and `height`, so the layout holds while images load or when they're blocked
- load, and be an image, not an HTML error page
- be under **1 MB**, or **3 MB** for a GIF

One big image over a line of text is unreadable with images off, opaque to screen readers and a spam signal for some filters. Put the headline and offer in live text.

## 4. Client support

Flexbox, grid, `position`, background images and inline SVG each break in at least one major client. [Can I email](https://www.caniemail.com/) tracks support per feature and client, and it's the best single reference.

Watch Outlook hardest. Gmail and Apple Mail usually degrade quietly. Classic Outlook on Windows renders with Word's layout engine, ignores many CSS widths, drops background images and strips padding from buttons built as styled links.

We flag a feature for a client family, such as Gmail or Outlook, only when at least two of its clients drop it. It's a warning only when Outlook breaks it with no fallback. Everything else is info. Otherwise every email gets twenty client warnings and people ignore them all.

## 5. Accessibility

The cheap checks:

- `lang` on `<html>`, so screen readers pronounce things correctly
- a `<title>`
- heading levels in order, no jumping from `h1` to `h4`
- alt text that says what the image communicates. "Bar chart showing signups doubling in March" helps. "image1.png" doesn't
- contrast on body text, buttons and light grey footer text, where most failures hide

[WCAG 2.2](https://www.w3.org/TR/WCAG22/) is the reference. Most email problems map to its criteria on text alternatives, contrast, page language and headings.

## 6. Copy, subject and preview text

Keep subjects under about **60 characters** and **9 words**, or phones cut them off. Skip ALL CAPS, "RE:" or "FWD:" on mail that isn't a reply, and runs of exclamation marks.

Keep preview text under about **90 characters**, without repeating the subject. Leave it empty and many clients show "View in browser" instead.

A merge tag without a fallback sends "Hi ," to everyone missing a first name. Readers remember.

Every figure should have a source you can point to, especially in AI first drafts, which produce confident numbers easily. [How to write marketing emails](/blog/how-to-write-marketing-emails) and the [subject line guide](/blog/email-subject-lines) go deeper on wording.

## 7. Compliance

Commercial email needs a working unsubscribe link and a valid postal address under [CAN-SPAM](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business). Senders above Gmail's and Yahoo's bulk thresholds also need one-click unsubscribe headers, covered in [What still applies when an agent sends your email](/blog/agent-email-deliverability).

Transactional mail skips some marketing rules, not this checklist. A receipt with a dead link still becomes a support ticket.

## 8. Markup

Remove what email clients strip or block:

- `<script>`, `<form>` and `<iframe>` elements
- embedded SVG and `data:` URIs
- background images without a `background-color` fallback, so text stays readable if the image fails

Start with a doctype. Without one, some clients render in quirks mode and spacing shifts.

## Running the checklist in Brew

Brew's email audit runs this list from:

- the **Audit** tab in the send dialog, next to Preview and Audience
- the **Audit** button on email steps in the automations canvas
- the API and MCP, with `POST /v1/emails/audit` or the `audit_email` tool

See the [audit docs](https://docs.brew.new/create-emails/audit-email) and the [API reference](https://docs.brew.new/api-reference/public-v1/emails/audit-an-email) for every field.

Free **instant checks** run automatically on every rule that only needs the HTML: placeholders, size, missing alt text and image dimensions, heading order, `lang` and `<title>`, subject and preview length, merge tags without fallbacks and blocked markup.

**Run audit** adds the checks that need the network or judgment:

- a live request to every link, up to 100 per email, skipping unsubscribe and preference links. Bot walls come back "not verified", not dead
- a request to every image, catching dead or oversized assets
- client support across 15 clients in four families, Gmail, Apple Mail, Outlook and Yahoo, using the rule from section 4
- contrast and other accessibility rules, with WCAG 2.2 references
- an AI review of whether the subject misleads, whether link and alt text mean something, whether a postal address is present in any country's format, and whether the email is marketing or transactional

Each AI judgment is tuned so a raised finding is right at least 95% of the time on emails we own. An AI reviewer that cries wolf is worse than none.

A full audit costs 5 credits. If a required check is unavailable, you get a free partial audit with no score, since a score that skipped checks would mislead.

## How the score works

Every audit returns a 0 to 100 score and a state: ready, needs review or not ready. Each finding has a severity, Critical, Error, Warning or Info, plus evidence such as a dead link's HTTP status.

The score starts at 100. Each critical costs 20 points, each error 10, each warning 3, and info nothing. Only the first three hits per rule count.

Example: a button linked to `#`, a footer link returning 404, two images without alt text, a 68-character subject and flexbox two Yahoo clients ignore.

| Finding | Severity | Points |
| --- | --- | --- |
| Button link is a placeholder | Critical | −20 |
| Footer link returns 404 | Error | −10 |
| Image without alt text (×2) | Warning | −6 |
| Subject over 60 characters | Warning | −3 |
| Flexbox dropped by 2 Yahoo clients | Info | 0 |
| **Score** | | **61** |

Any critical or error means "not ready"; warnings alone, "needs review". Fix the two links and this one scores 91, needs review. Honest: it would send fine, and the rest is worth a minute.

**Fix in chat** hands warnings and worse to the Brew agent, then reruns the free instant checks on the repair.

## What the audit does not do

It doesn't block sends. With critical findings, the send dialog asks for **Send anyway** and logs the override. API, MCP and automation sends report the findings and go ahead. That's the right default. Some emails the audit dislikes should still go out, and a QA tool that holds sends hostage gets switched off.

It doesn't rewrite your HTML. Fixes are a separate step you start.

It doesn't test inbox placement, render screenshots or check dark mode. For dark mode, open a test on your phone with dark mode on. It catches the logo that vanishes on black.

## Frequently asked questions

### How long is an audit valid?

In the send dialog, 15 minutes. After that, or if the email changes, the panel asks you to rerun it. Through MCP, you can reread a saved report for 7 days at no charge.

### Does a high score mean the email will land in the inbox?

No. The audit checks the email itself. Placement also depends on domain reputation, authentication and complaint rate, covered in the [deliverability guide](/blog/email-deliverability).

### Can I audit an email built in another tool?

Yes, through the API or MCP. Send `emailHtml` or `emailJsx` instead of a Brew email ID and get the same report before it goes into your ESP. If you [remix a gallery template and export it to your ESP](/blog/how-to-remix-a-real-brand-email-template-and-export-it-to-your-esp), audit it in Brew before you export.

### Who on my team can run it?

Members can. Viewers can see emails but can't run audits.
