The Email Love Figma Plugin's Custom Webhook export lets you POST your email designs as JSON to any HTTP(S) endpoint — perfect for custom integrations, internal tools, or any ESP / automation platform that accepts a webhook. Drop in a URL, optionally add custom headers and payload fields, click Export, and the plugin sends each selected frame as a separate POST request.
When to use the Custom Webhook export
- Pushing email HTML into a custom internal tool, CDP, or content store
- An ESP that isn't a built-in integration but accepts a webhook (most do)
- Triggering automation flows in any platform that can catch an HTTP request
- For Zapier or Make specifically, see Upload your email to Zapier and Upload your email to Make — those docs walk through the platform-specific setup
Prerequisites
- An HTTP(S) endpoint ready to receive a POST request
- The Email Love Figma plugin installed
- At least one email designed in Figma using the plugin
- An Email Love Footer with an Unsubscribe link in your design
Step 1: Open the Export Panel
- Select the email frame(s) you want to export. Multi-select to send several templates in one go — each frame is POSTed as its own request.
- Click the Export button in the top right of the plugin
- Pick Custom Webhook from the Export dropdown
Step 2: Configure Your Webhook
- Paste your endpoint into the Custom Webhook Webhook URL field (e.g.
https://api.yourtool.com/emails)
- (Optional) Custom headers — paste a JSON object to merge into the request headers. Useful for authentication:
{ "Authorization": "Bearer your-token", "X-Source": "email-love" }- (Optional) Extra JSON data — paste a JSON object to merge into the payload body:
{ "workspace": "my-team", "tags": ["onboarding"] }- Give the connection a name in the Custom Webhook connection name field (e.g. "Production endpoint" or "Internal CMS"). This lets you save the config and switch between multiple webhook destinations later.
- Click Save Connection
The saved connection appears under API Connections → Connect with an existing API Key so you can switch between webhook configs without re-entering them. To edit a connection later, select it from the dropdown.
Step 3: Set Output Options
Two toggles at the bottom of the panel control how the HTML is generated:
- Upload hosted images URLs (on by default) — Uploads your images to Email Love's CDN before generating the HTML. The
htmlfield in the payload references those public URLs as thesrcattribute for every<img>tag, so the email renders in any inbox without you hosting images yourself. Leave on unless you have your own image pipeline.
- HTML Minification (off by default) — Strips whitespace and comments from the output HTML. Smaller payloads, but harder to debug. Turn on for production sends.
Step 4: Set Subject and Preheader per Frame
Each selected frame has its own Email Subject line and Preheader text inputs at the bottom of the export panel, with a Preview icon to see them in context. These values are sent in the payload as the subject and preheader fields — set them before exporting.
If you multi-select multiple frames, each frame gets its own subject and preheader inputs, so you can customise each one before a batch export.
Step 5: Export
- Click Export to CUSTOM WEBHOOK in the top right
- For each selected frame, the plugin hosts images (if enabled), generates the email HTML, and POSTs it to your URL
- On success you'll see a confirmation toast per template
Payload Format
Each template is sent as its own POST request with this JSON body:
{
"name": "Frame name from Figma",
"subject": "Email subject line",
"preheader": "Preheader text",
"html": "<html><head>...</head><body>...</body></html>"
}If you added Extra JSON data, those fields are merged into the same object:
{
"name": "Welcome Email",
"subject": "Welcome aboard!",
"preheader": "We're glad to have you",
"html": "<html>...</html>",
"workspace": "my-team",
"tags": ["onboarding"]
}This matches the Emailify webhook format, so if you're moving from Emailify your existing webhook receivers will keep working.
CORS and the Backend Proxy
Figma plugins run inside a sandboxed iframe with no origin, so a direct POST from the plugin to your endpoint would be rejected as a cross-origin request by most servers. To work around this, Email Love automatically routes every Custom Webhook request through a backend proxy that forwards the request and adds a real origin. There's no user-facing toggle — it just works.
This means:
- You don't need CORS configured on your endpoint to receive requests from the plugin. The proxy handles it.
- Requests come from a dynamic IP each time (a pool of Email Love's backend IPs). If your endpoint is firewalled to a static IP range — for example, an internal tool only accepting requests from your office or VPN — you'll need to either allowlist Email Love's IPs (contact us) or configure your endpoint with
Access-Control-Allow-Origin: *so we can connect more directly in the future.
What the Plugin Handles for You
- Image hosting — Images are uploaded to our CDN and referenced as
srcURLs in the HTML payload.
- Multi-template — Each frame is sent as its own POST request, so a transient failure on one doesn't stop the others.
- CORS — The backend proxy handles cross-origin restrictions transparently.
- Saved connections — URL, headers, custom data, and connection name are persisted in the plugin. Switch between connections via Connect with an existing API Key.
Troubleshooting
401 / 403 from the endpoint: Add an Authorization header under Custom headers — most APIs need a bearer token or API key. Make sure the JSON is valid (double quotes, no trailing commas).
Custom headers or Extra JSON data didn't apply: Both fields must be valid JSON. Quote your keys, use double quotes (not single), and no trailing commas. Invalid JSON is silently skipped.
Subject or preheader is empty in the payload: Each frame has its own Subject and Preheader inputs at the bottom of the export panel. Scroll down to the frame's section and fill them in before clicking Export.
Some templates exported, others failed: Each frame is sent as its own request, so a transient failure on one doesn't stop the others. Check the toast for the specific frame name and re-export just that one.
Request timing out: The backend proxy has a 30-second timeout. If your endpoint is slow, have it respond quickly and process asynchronously.
Unsubscribe link not working: Make sure your design includes an Email Love Footer with an Unsubscribe link.
Need help? Reach out at hello@emaillove.com or join our Discord community.
Related Articles
- Upload your email to Zapier — Zapier-specific setup using Catch Hook
- Upload your email to Make — Make-specific setup using Custom webhook
- Export Overview — All export options
