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 Export Figma emails to Zapier and Export Figma emails 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
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
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:
-
(Optional) Extra JSON data: paste a JSON object to merge into the payload body:
- 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
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.
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.Payload Format
Each template is sent as its own POST request with this JSON body: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
- Export Figma emails to Zapier: Zapier-specific setup using Catch Hook
- Export Figma emails to Make: Make-specific setup using Custom webhook
- Export Overview: All export options

