{"id":98001,"date":"2026-10-04T03:02:00","date_gmt":"2026-10-04T07:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98001"},"modified":"2026-09-29T07:51:36","modified_gmt":"2026-09-29T11:51:36","slug":"emdash-contact-form-setup-98001","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-contact-form-setup-98001\/","title":{"rendered":"EmDash Contact Form Setup: No Plugin Required"},"content":{"rendered":"<p>The form builder inside <a href=\"https:\/\/emdash.dev\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">EmDash<\/a> ships as a core feature, not a plugin. You don&#8217;t install anything extra. The portfolio template that ships with version 0.1.0 already includes a contact form with email, location, and social links pre-configured. But if you started with the blog template or a blank starter, here&#8217;s exactly how to build one from scratch.<\/p>\n<h2>Access the Form Builder<\/h2>\n<p>Log into your EmDash admin panel. Look at the left sidebar menu under &#8220;Content.&#8221; You will see a &#8220;Forms&#8221; entry between &#8220;Widgets&#8221; and &#8220;Sections.&#8221; Click it.<\/p>\n<p>The screen shows an empty table with a single button in the top right: &#8220;Create Form.&#8221; Click that.<\/p>\n<h2>Configure the Form Basics<\/h2>\n<p>A modal opens with three fields. &#8220;Name&#8221; \u2014 type &#8220;Website Contact Form.&#8221; &#8220;Submission Email&#8221; \u2014 enter the address where responses should arrive, like <code>hello@yourdomain.com<\/code>codecode. &#8220;Success Message&#8221; \u2014 write &#8220;Thanks for reaching out. We will reply within 24 hours.&#8221;<\/p>\n<p>Below those fields sits a toggle labeled &#8220;Enable Turnstile.&#8221; Turn it on. Turnstile is Cloudflare&#8217;s bot detection tool \u2014 it replaces CAPTCHA without requiring user interaction. This is built into EmDash, no plugin needed.<\/p>\n<h2>Add Form Fields<\/h2>\n<p>The form builder presents a blank canvas with an &#8220;Add Field&#8221; button. Click it.<\/p>\n<p>A dropdown appears with five field types: Text, Email, Textarea, Select, and Checkbox. Build your form one field at a time.<\/p>\n<p><strong>Field 1:<\/strong> Choose &#8220;Text.&#8221; Label it &#8220;Full Name.&#8221; Mark it as required by toggling the switch next to &#8220;Required.&#8221; The placeholder reads &#8220;Your name&#8221; by default \u2014 leave it.<\/p>\n<p><strong>Field 2:<\/strong> Choose &#8220;Email.&#8221; Label it &#8220;Email Address.&#8221; Mark required. The system auto-validates this field format on submission \u2014 no regex writing needed.<\/p>\n<p><strong>Field 3:<\/strong> Choose &#8220;Textarea.&#8221; Label it &#8220;Message.&#8221; Set the row count to 5 using the number input. Mark required.<\/p>\n<p><strong>Field 4:<\/strong> Choose &#8220;Select.&#8221; Label it &#8220;Subject.&#8221; Add three options by typing into the list: &#8220;General Inquiry,&#8221; &#8220;Support Request,&#8221; &#8220;Partnership.&#8221; Mark the first option as default.<\/p>\n<p><strong>Field 5:<\/strong> Choose &#8220;Checkbox.&#8221; Label it &#8220;I agree to the privacy policy.&#8221; Mark required.<\/p>\n<p>Click &#8220;Save Form&#8221; in the top right corner.<\/p>\n<h2>Place the Form on a Page<\/h2>\n<p>Navigate to &#8220;Pages&#8221; in the sidebar. Open the page where you want the form to appear \u2014 for a contact page, either create a new page or edit an existing one.<\/p>\n<p>The editor uses block-based content (portable text, structured JSON). Type <code>\/<\/code>codecode to open the block inserter. Choose &#8220;Form&#8221; from the list.<\/p>\n<p>A dropdown shows all forms you have created. Select &#8220;Website Contact Form.&#8221; The block renders inside your editor as a placeholder \u2014 you see the field labels but not the live inputs.<\/p>\n<p>Save the page. Visit the front end of your site. The form renders with all five fields, Turnstile protection active, and the submit button labeled &#8220;Send.&#8221;<\/p>\n<h2>Where Submissions Land<\/h2>\n<p>EmDash stores every submission inside the admin panel under &#8220;Forms&#8221; &gt; &#8220;Submissions.&#8221; Each entry shows: the field values, the timestamp, and the IP address. You can mark submissions as read or delete them individually.<\/p>\n<p>Submissions also forward to the email address you set during form creation. The email arrives as plain text with each field on its own line. No SMTP configuration required \u2014 EmDash uses Cloudflare&#8217;s email sending infrastructure by default.<\/p>\n<h2>What Happens When a Visitor Submits<\/h2>\n<p>The form posts to EmDash&#8217;s internal API endpoint. The runtime validates required fields, checks Turnstile, writes the submission to the D1 database, and fires the email send \u2014 all within a single request cycle. If the visitor leaves a required field empty, the form shows an inline error message below that specific field. No page reload needed.<\/p>\n<h2>One Caveat About Multi-Step Forms<\/h2>\n<p>The built-in form builder handles single-page submissions only. It <a href=\"https:\/\/overcentral.com\/en\/rascal-does-not-dream-trailer-release-80139\/\" title=\"Rascal Does Not Dream Drops Trailer for Final Film\" data-iacss-internal=\"1\">does not<\/a> support conditional logic \u2014 showing field B only when field A has a specific value \u2014 or multi-step workflows. For those scenarios, you would need a sandbox plugin that declares <code>forms: write<\/code>codecode and <code>email: send<\/code>codecode capabilities, then builds the logic inside a dynamic worker. That is the point where EmDash&#8217;s &#8220;no plugin&#8221; promise meets its plugin architecture.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The form builder inside EmDash ships as a core feature, not a plugin. You don&#8217;t install anything extra. The portfolio template that ships with version 0.1.0 already includes a contact form with email, location, and social links pre-configured. But if you started with the blog template or a blank starter, here&#8217;s exactly how to build [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":99084,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98001.png","fifu_image_alt":"EmDash Contact Form Setup: No Plugin Required","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98001","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98001.png","fifu_image_alt":"EmDash Contact Form Setup: No Plugin Required","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98001","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=98001"}],"version-history":[{"count":2,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98001\/revisions"}],"predecessor-version":[{"id":99085,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98001\/revisions\/99085"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/99084"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98001"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}