FormThunder isn't open yet. This site describes the service as it will run at launch. Find out more

FormThunder
Menu

Emails, updated

Email templates and brand kit

FormThunder emails can match your site in three ways. The brand kit holds your logo, colours and fonts, and every built-in theme picks it up. Three themes work on every plan, and two more come with Pro. For full control, custom HTML templates use mustache variables, also on Pro. Your AI can read your website and set all of this up.

Brand kit

bash
# Read a website's branding
npx formthunder brand pull https://example.com

# Save a brand kit from a file
npx formthunder brand set --file brand.json
json
{
  "name": "Acme",
  "logo_url": "https://example.com/logo.png",
  "colors": {
    "primary": "#0f766e",
    "background": "#f8fafc",
    "surface": "#ffffff",
    "text": "#0f172a",
    "muted": "#64748b",
    "border": "#e2e8f0",
    "button_text": "#ffffff"
  },
  "font_family": "Inter, Arial, sans-serif",
  "heading_font_family": "Inter, Arial, sans-serif",
  "border_radius": "8px",
  "footer_text": "Acme Ltd",
  "website_url": "https://example.com"
}

Use a PNG for the logo at an absolute https URL, because many email clients won't show SVG. Give font stacks email-safe fallbacks.

POST /api/v1/brand/extract returns {brand, confidence, notes, applied}. It only sees the served page, so check its output against your CSS or Tailwind config if you can. An AI agent with your code open is told to do this.

Built-in themes

ThemePlan
cleanAll plans
cardAll plans
letterAll plans
boldPro and Agency
compactPro and Agency
bash
npx formthunder themes
npx formthunder forms update YOUR_FORM_ID --theme card

Custom HTML templates

Pro. Write HTML with mustache variables. Use tables and inline CSS, as email clients ignore most modern CSS, and keep the width near 600px. Include a loop over the fields so nothing goes missing when the form changes.

html
<table width="600" style="font-family: {{brand.font_family}}; color: {{brand.colors.text}}">
  <tr><td><img src="{{brand.logo_url}}" alt="{{brand.name}}" height="32"></td></tr>
  <tr><td><h1 style="color: {{brand.colors.primary}}">{{subject}}</h1></td></tr>
  {{#fields}}
  <tr><td><strong>{{label}}</strong><br>{{value}}</td></tr>
  {{/fields}}
  <tr><td><a href="{{report_spam_url}}">Report spam</a></td></tr>
</table>
bash
npx formthunder template preview template.html
npx formthunder template push template.html --name "Branded notification" --kind notification
npx formthunder template test YOUR_TEMPLATE_ID --to you@example.com
npx formthunder forms update YOUR_FORM_ID --template YOUR_TEMPLATE_ID

Preview returns warnings. Fix each one before you save. {{{raw}}} output is stripped from custom templates, so all values stay HTML-escaped.

Generate one

generate_template writes a template from your brand kit and an optional URL. The response's generator field says claude if AI wrote it, or theme if we used a brand-themed fallback because no AI key was configured.

bash
npx formthunder template generate --url https://example.com --out template.html

The prompt that does it all

The MCP server ships a prompt named match_website_branding. Outside MCP, this prints the same instructions to paste into any AI.

bash
npx formthunder prompt branding https://example.com