Integrate · Last updated May 16, 2026
WordPress integration
SaveForm works on WordPress with no plugin to install. Because a SaveForm form is just an HTML <form> that POSTs to your endpoint, you paste it into a Custom HTML block and submissions start landing in your dashboard. No JavaScript, no build step, nothing to keep updated.
AI assistant prompt
Wording targets native HTML forms — action URL, POST, hidden helpers like _honey / _redirect / _emailTo, and swapping in your real form ID.
Help me integrate SaveForm.io (https://www.saveform.io) into my site with a plain HTML form (no SPA, no mandatory JavaScript).
Please:
1. Ask me which visible fields I need (names matching what I want in the dashboard, input types like email/tel/date, required vs optional, textarea vs input, selects, radios, validation attributes).
2. Output a complete, accessible <form>: action="https://saveform.io/api/submit/YOUR_FORM_ID", method="POST", with meaningful labels and suitable input types.
3. Tell me explicitly to replace YOUR_FORM_ID with my real form ID from SaveForm → Dashboard → Forms (copy the form ID). Without my actual ID in the URL, submissions will not reach my workspace.
4. Mention optional hidden <input>s for SaveForm behaviour: spam honeypot, thank-you redirects, notification routing — wired as normal named fields.
5. Explain that native HTML POST expects the browser-driven flow (redirect / success-page); if I need JSON in JS, steer me to fetch instead.
6. Use this doc when helpful: https://www.saveform.io/docs/html-integration
SaveForm control fields (names starting with _): pass them as normal keys in the JSON or form body when useful:
• _honey — honeypot for spam filtering: https://www.saveform.io/docs/spam-protection
• _redirect and _redirect_mode — thank-you URL and whether to show SaveForm's success page first vs redirect immediately: https://www.saveform.io/docs/custom-redirects
• _emailTo — optional per-submit override for where the notification email is sent: https://www.saveform.io/docs/email-notifications
• Submitter auto-reply (acknowledgement email) is configured on the form in the dashboard with {{field}} placeholders, not ad-hoc payload fields: https://www.saveform.io/docs/auto-replyWhich WordPress?
The right path depends on how locked-down your install is. The Custom HTML block works on the overwhelming majority of sites — the only ones it doesn't cover are the cheapest WordPress.com tiers, which strip custom markup.
| Your setup | Recommended path |
|---|---|
| Self-hosted (WordPress.org) | Full control. Use the Custom HTML block or drop the form into a theme template. |
| WordPress.com Business / Commerce | Plugins and custom code are allowed — the Custom HTML block works as-is. |
| WordPress.com Free / Personal / Premium | These plans strip raw HTML and scripts. The plain <form action> (no JavaScript) survives on most templates; if it's removed, you'll need a Business plan or a self-hosted install. |
Custom HTML block (recommended)
The block editor (Gutenberg) ships a Custom HTML block that renders raw markup exactly as written. This is the fastest way in.
- Edit the page or post and click the + to add a block.
- Search for Custom HTML and add it.
- Paste the form snippet below, swapping
YOUR_FORM_IDfor the ID from your dashboard. - Click Preview on the block to confirm it renders, then publish.
<form action="https://saveform.io/api/submit/YOUR_FORM_ID" method="POST">
<label>Name
<input type="text" name="name" required />
</label>
<label>Email
<input type="email" name="email" required />
</label>
<label>Message
<textarea name="message" required></textarea>
</label>
<!-- Spam honeypot — hidden from real users, see spam-protection docs -->
<input type="text" name="_honey" style="display:none" tabindex="-1" autocomplete="off" />
<button type="submit">Send</button>
</form>_honey (spam honeypot), _redirect / _redirect_mode (redirect after submit), _emailTo (notification recipient). Submitter replies use dashboard auto-reply. Supported fields →Classic editor
Still on the classic editor (or the Classic Editor plugin)? Switch the editor from the Visual tab to the Text tab and paste the same <form> markup. The Text tab preserves raw HTML; the Visual tab will try to reformat it, so paste while Text is active.
Theme template (for developers)
If you maintain the theme, the form is plain markup you can drop into any PHP template — page.php, a block pattern, or a template part. Use a child theme so updates to the parent theme don't overwrite it.
<form action="https://saveform.io/api/submit/<?php echo esc_attr( 'YOUR_FORM_ID' ); ?>" method="POST"> <input type="text" name="name" required /> <input type="email" name="email" required /> <textarea name="message" required></textarea> <!-- Send visitors to a thank-you page on your own site --> <input type="hidden" name="_redirect" value="<?php echo esc_url( home_url( '/thank-you/' ) ); ?>" /> <button type="submit">Send</button> </form>
The _redirect field is optional — see custom redirects for the full behaviour. Every other supported field works the same way it does on a static site.
Allow your domain
If you've restricted the form to specific domains in its settings, add your WordPress site's domain (for example example.com) to the allowed list — otherwise the submit endpoint rejects the request as a disallowed origin. Subdomains like www.example.com are matched automatically. Forms with no domain restriction accept submissions from anywhere.
Troubleshooting
| Symptom | Fix |
|---|---|
| The form markup disappears after saving | Your WordPress.com plan is stripping raw HTML. Upgrade to Business, move to a self-hosted install, or confirm you pasted into a Custom HTML block (not a Paragraph block). |
| Submissions return “Origin not allowed” | Add your site's domain to the form's allowed domains, or clear the restriction. |
| Nothing shows up in the dashboard | Double-check YOUR_FORM_ID in the action URL matches the ID in your dashboard, and that the form is active. |
| A page builder reformats the HTML | Elementor, Divi and similar builders have their own HTML/embed widget — paste the snippet there rather than into a rich-text element. |