The Claude email marketing skill that checks its own work.

A free Claude skill that builds HTML marketing email, then runs its own linter on the output before you ever see it. Portable to any ESP, dark-mode safe, and honest about the four things it deliberately won’t do.

Three marketing emails built by the skill, fanned in a stack: a welcome email for Fernwood & Fig in front, with a promotional sale and a newsletter behind it.

Three passes, not one prompt.

Audit what you already have.

Paste in an existing email and Claude runs the linter over it first — no rewriting, no guessing. You get the findings by severity and an offer to fix, not a silent replacement of work you spent a day on.

Build from a structured archetype.

Five email types are defined as records rather than advice — hero shape, zone sequence, module floors, CTA strategy, and the facts the type needs you to supply. Anything you did not supply becomes a bracketed placeholder instead of an invented discount.

Verify before it reaches you.

The skill runs its own linter on the output and fixes what it reports. A well-built email lints clean, so a non-empty report means real work remains. This is the pass a plain prompt cannot do.

Four archetypes, four finished emails.

Each of these came out of one prompt and went straight through the linter. The brands are made up. The HTML is not — open any of them and read the source.

  • A welcome email for Fernwood & Fig on a deep green background, headline reading “You’re on the list. Here’s what that actually means.”
    Welcome

    Fernwood & Fig

    One CTA, repeated once, and no product grid — the archetype rules that out.

  • A product launch email for Northbound Roasters in rust and cream, announcing a single-origin coffee called Kiruna.
    Product launch

    Northbound Roasters

    Four modules with a stat band cutting across them, so the rhythm breaks before it sets.

  • A seconds-sale email for the ceramics studio Atelier Sonn, with a large bracketed DISCOUNT placeholder as the headline.
    Promotional sale

    Atelier Sonn

    The offer is the hero, and the discount is still a bracket nobody filled in.

  • A newsletter issue from The Long Game in navy on paper white, leading on a piece about retention metrics.
    Newsletter

    The Long Game

    One text link per item and no buttons at all. Button soup kills newsletters.

Every fact the skill was not given stays a bracket — [DISCOUNT], [PRICE], [OFFER_END_DATE]. That is the point: a placeholder you have to fill beats an invented number that looks correct.

A script, not a promise.

Run it on any email HTML you have, with or without Claude, and it reports what a real inbox would do to it.

It’s calibrated both directions. Run it against a well-built email and it comes back clean. Run it against our intentionally broken fixture and it reports 10 errors, 12 warnings — proof the tool isn’t rubber-stamping everything that comes through it.

$ python3 scripts/lint_email.py evals/fixtures/good-welcome.html
✓ good-welcome.html — clean (4KB)

$ python3 scripts/lint_email.py evals/fixtures/broken-blackfriday.html
broken-blackfriday.html — 10 error(s), 12 warning(s)

  ERROR
    ✗ [clean-html] Flexbox or CSS grid detected.
      → Use nested tables. Outlook renders with Word’s engine.
    ✗ [deliverability] No unsubscribe link or placeholder found.
      → Legally required for marketing email, and ESPs reject imports
        without it. Add [UNSUBSCRIBE_URL].

Got an email already? Test an email first — no install, no email address.

What it checks

  • clean-html Flexbox and grid, unbalanced tables, base64 images, Gmail’s ~102KB clipping threshold, WCAG AA contrast, CTA buttons with no Outlook fallback.
  • dark-mode The color-scheme meta, zone backgrounds painted twice, pure white and pure black on large surfaces.
  • inline-css Styles that live only in a style block, and @import rules that get stripped.
  • deliverability Missing unsubscribe, missing postal address, images without alt text, no preheader.
  • responsive The 600px backbone, breakpoints that do not match the body width, images with no width.

What the Claude email marketing skill deliberately does not do.

It builds one email at a time, in portable HTML. Four things are out of scope on purpose, and it says so rather than pretend.

  • I Carry a brand kit between sessions. Colours and fonts are re-supplied every time, not remembered.
  • II Emit ESP-native syntax. Portable [BRACKET] tokens only — never Mailchimp *|MERGE|*, MailerLite {$var}, ActiveCampaign %TAG% or Klaviyo {{ }} and {% %}.
  • III Generate a sequence. One email per invocation, no cross-email arc.
  • IV Host images or push to an ESP. No asset hosting, no connector.

If you need eight on-brand emails in Mailchimp’s own merge-tag syntax, with hosted images, exported into your account in one click, that is a studio rather than a skill. Same method, four more layers, and it remembers your brand.

We ran it against plain Claude.

Four prompts, each run twice — once with the skill, once without — then both outputs linted identically. Plain Claude writes good-looking email HTML. What it does not do is stay portable, stay compliant, or check itself.

Same prompts, with the skill and without. August 2026.
Measure With the skill Plain Claude
ESP-native tags leaked into portable HTML 0, 0, 0 2, 22, 5
Verification pass 0 errors, 0 warnings, first run never checked its own output
Physical postal address (CAN-SPAM) present missing
Zone backgrounds painted twice every zone 1 of 11

→ Scroll the table for the plain-Claude column

The portability number is the one that matters most. Every unaided build mixed merge-tag dialects into an otherwise portable template — paste that into Mailchimp and it renders literally to the subscriber. You can check your own output for the same problem with one grep.

Or clone it yourself.

No dark patterns. The repo is public and MIT licensed — the email gate exists so we can send you the zip, not to hold the code hostage.

git clone https://github.com/marcusaureliusdigital/claude-email-marketing-skill.git \
  ~/.claude/skills/claude-email-marketing-skill

Unzip into ~/.claude/skills/ and Claude picks it up on its own. The only requirement is Python 3.9 or later for the linter, which uses the standard library — there is nothing to install.

The questions worth answering.

What is a Claude skill?

A skill is a folder of instructions and scripts that Claude loads when it recognises a matching task. It is not a plugin or an API — it is a method Claude follows, plus any code that method needs. Get this one by email below and Claude uses it whenever you ask for a marketing email.

How do I install the Claude email marketing skill?

Enter your email above and we send the zip straight away — unzip it into ~/.claude/skills/ and Claude picks it up automatically. The repository is also public on GitHub if you would rather clone it yourself. Either way the only requirement is Python 3.9 or later for the linter, which uses the standard library — there is nothing to pip install.

Does it work with Claude Code, or Claude on the web?

It is built for Claude Code, because the linter is a script that runs on your machine. The method and the reference files are readable anywhere, but the verification pass needs a local Python runtime.

Why does AI-written email HTML break in Outlook?

Outlook on Windows renders with Microsoft Word’s layout engine, which supports no flexbox, no grid and no CSS columns. Gmail strips style blocks in several contexts, and dark mode rewrites colours in clients that support it. A prompt can ask a model to respect all of that. It cannot enforce it, which is why this skill checks the output rather than trusting it.

Will it write emails for Klaviyo or Mailchimp?

It writes portable HTML with bracket placeholders like [FIRST_NAME] and [UNSUBSCRIBE_URL], which import into any ESP once you map them. It deliberately does not emit platform-native merge tags, because getting those wrong breaks the import and mapping brackets by hand takes a minute. If you want native Mailchimp, ActiveCampaign or MailerLite syntax generated for you, that is what the studio does.

Is it free?

Yes, MIT licensed and free to use, fork or ship client work with. The zip requires an email address so we can send it — the code itself has no cost and no catch, and the repo is public if you would rather skip the form entirely.

Already hit one of the four limits?

That’s the point where the skill starts saying no — on purpose. Grab the zip now so it’s ready the next time an email needs to survive Outlook, dark mode and CAN-SPAM at once.

I build email for a living, and the thing that kept catching me out was never the writing. It was the hour after — the table that collapsed in Outlook, the logo that vanished in dark mode, the merge tag that rendered literally to an entire list because it was the wrong dialect.

A prompt can ask a model to avoid all of that. It cannot enforce it. So the skill does what our own pipeline does: it treats anything that must be true of every email as something to check in code afterwards, rather than something to request politely up front.

It is free and MIT licensed because the method is knowable and the work is in maintaining it. If it saves you the hour, that is the whole point. If you get to the edge of what one email at a time can do, you know where we are.

Marc-Aurèle Legoux, founder

When one email at a time stops being enough.

EmailTemple generates whole sequences in your brand, in your ESP's own syntax, and exports them ready to send. Three free generations a month, no card.