Your first form
Let's build a small contact form, put it on a page with a single tag, and follow a submission back into the control panel. It takes about five minutes. You'll need Formidable installed.
Create the form
Start a new form
Open Add-Ons › Formidable, then Forms, and choose New. Name it Contact Us. Formidable suggests the handle
contact_us.Templates find a form by its handle, so pick one you won't want to change.
Add some fields
Once the form is saved, its edit screen opens on the builder. Drag three fields from the Add field palette into the page:
- a Text field called First Name
- a Text field called Last Name
- an Email field called Email Address
Click a field to edit its label, instructions and validation. Each field gets a handle from its label (
first_name,email_address). That's the name its answer is posted under, and the name you'll use for it in templates.Make Email required
Open Email Address, switch to its Validation tab and turn on Required. An Email field already checks that the answer is a real address.
Put it on a page
Add the form tag to any template:
{exp:formidable:form form_handle="contact_us"}
That's the whole template. With only a handle, the tag renders the complete form from your site's theme: the <form> element, its hidden processing inputs, every field, error messages and the submit button.
Submit it
Visit the page, fill the form in and submit it. With no return= parameter, the visitor comes back to the same page and the form shows its success message.
Try it again with the email left empty. The page shows the error beside the field and keeps everything else you typed.
Find the submission
Back in the control panel, the dashboard lists your new submission under Latest submissions. Open it to read the answers, change its status, or edit it. The form's Submissions screen lists every submission, with filters and exports.
What the tag produced
Here's that one-line template, rendered by a real install. Its Contact Us form has the fields above and a few more, and the site uses the Tailwind theme. The excerpt shows the start of the form and its first field.
The whole form, from one tag
Example{exp:formidable:form form_handle="contact_us"}
<form id="contact_us" name="contact_us" method="post" action="https://example.com/index.php?ACT=101" data-formidable-disable-submit="1"><div class="formidable-meta" style="display:none"><input type="hidden" name="_formidable_meta" value="…"><input type="hidden" name="csrf_token" value="…"><input type="text" name="formidable_hp" value="" tabindex="-1" autocomplete="off" aria-hidden="true" style="position:absolute;left:-9999px;height:0;width:0;border:0;padding:0"><div data-formidable-columns="12" data-formidable-page="1" data-formidable-section="s_1_1" class="col-span-1 flex flex-col space-y-1 lg:col-span-12">
<label class="formidable-field-label font-semibold" for="age">Age</label>
<output class="formidable-computed-value" id="age" aria-live="polite" data-formidable-computed-display></output><input name="age" value="" type="hidden" data-formidable-computed='{"type":"date","config":{"to":{"today":true},"from":{"ref":"birthday"},"unit":"years","inclusive":true,"operation":"difference"},"format":{"decimals":2,"thousands":"","decimal_point":".","prefix":"","suffix":""},"today":"2026-10-11","now":"2026-10-11T15:09"}'>
</div>
</div>
<div class="formidable-form-content"><div class="formidable-page mb-8" data-formidable-page="1" data-formidable-page-id="p_1">
<div class="formidable-section mb-6" data-formidable-section="s_1_1" data-formidable-page="1">
<div class="grid grid-cols-1 gap-6 lg:grid-cols-12">
<div data-formidable-columns="12" data-formidable-page="1" data-formidable-section="s_1_1" class="col-span-1 flex flex-col space-y-1 lg:col-span-12">
<label class="formidable-field-label font-semibold" for="first_name">First Name</label>
<span class="formidable-field-instructions text-sm text-grey-300" id="first_name-instructions">We prefer your legal name</span>
<input id="first_name" name="first_name" value="" type="text" aria-describedby="first_name-instructions" class="block w-full rounded-md border border-gray-300 px-4 py-2 shadow-sm">
…
A few things worth noticing:
- The form posts to a Formidable action (
?ACT=…). You never write that URL yourself. - A hidden block comes first. It holds a signed
_formidable_metavalue telling the server which form this is and how it was rendered, ExpressionEngine's CSRF token, and a honeypot that bots tend to fill in. - The input's
id,nameandtypecome from the field. Its instructions have an id the input points at witharia-describedby, so screen readers announce them. - The classes come from the theme, and from attributes saved in the control panel. You can change them without touching this template. See Regions and attributes.