Stays a static site
No Netlify Functions, no serverless glue, no eleventy-plugin anything. Your build output is still plain HTML that deploys to any static host.
integrations · static site generator
Eleventy compiles templates to plain HTML, so a contact form is one include away: point a standard <form> at your mailcontact endpoint and submissions land in your project's inbox, with a notification in Discord, Slack, email, or a webhook. No serverless function, no mail service, no plugin.
Because it's plain HTML, the same snippet works unchanged in Nunjucks, Liquid, WebC, markdown, or any other template language 11ty renders. Drop it in _includes once and pull it into any page.
recommended setup
Add this HTML to your site, or use the form builder. Replace the form link with yours. The hosted script injects the hidden check, handles sending and automatic verification, and preserves the draft on errors. You control the HTML and CSS. Free forms display a visible “Processed by mailcontact.app” link; Pro and Plus do not. Feedback follows the browser’s language; set data-mailcontact-language="fr" on the form to force French.
<form action="https://mailcontact.app/api/forms/your-form-id" method="POST" data-mailcontact-form>
<fieldset>
<legend>Contact us</legend>
<label>
Name (optional)
<input name="name" type="text" autocomplete="name" maxlength="200" />
</label>
<label>
Email
<input name="email" type="email" autocomplete="email" maxlength="320" required />
</label>
<label>
Message
<textarea name="message" rows="5" maxlength="5000" required></textarea>
</label>
<noscript>
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden;">
<label>Website
<input name="company_website" type="text" tabindex="-1" autocomplete="off" />
</label>
</div>
</noscript>
<button type="submit">Send message</button>
</fieldset>
<p data-contact-status role="status" aria-live="polite" aria-atomic="true"></p>
</form>
<script defer src="https://mailcontact.app/forms/v1.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>For a component with its own submit handler, load the same script and use MailContact.prepare(form) and MailContact.send() instead of the automatic marker. See the custom interface reference for loading, feedback and Free attribution.
the snippet
This example posts directly to the API. Keep the required company_website field present and empty. Native posts open JSON on success or a verification page when needed. Custom scripts without verification support send suspicious messages to Spam for review; strong spam is also held there without notifications or quota usage. A success response confirms reception, including review, or a silent discard of a filled check. See spam protection for the full behavior.
<form action="https://mailcontact.app/api/forms/your-form-id" method="POST">
<label for="name">Name</label>
<input type="text" id="name" name="name" />
<label for="email">Email</label>
<input type="email" id="email" name="email" required />
<label for="message">Message</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Send</button>
<input name="company_website" type="text" tabindex="-1" autocomplete="off"
style="position:absolute;left:-10000px" aria-hidden="true" />
</form>how it works
One inbox per project. Name it after your site and you get a form endpoint and a project email address immediately.
Save the snippet as _includes/contact-form.njk, then {% include "contact-form.njk" %} on your contact page. It's your markup; style it with your site's CSS.
Add a Discord, Slack, email, or webhook channel. Delivered messages ping you where you already are.
why mailcontact
No Netlify Functions, no serverless glue, no eleventy-plugin anything. Your build output is still plain HTML that deploys to any static host.
Nunjucks, Liquid, WebC, markdown: 11ty passes plain HTML through untouched, so the same include works no matter which engine your project uses.
Eleventy makes it cheap to spin up small sites. Give each one its own inbox and its own address instead of piping everything into your personal email.
faq
No. The form posts directly to your mailcontact endpoint, which stores the message and sends your notifications. Your 11ty build stays fully static.
Yes. The endpoint accepts posts from any origin, so it works wherever your Eleventy output is served, including hosts with no form handling of their own like GitHub Pages.
Completely. mailcontact only receives the POST. The markup above is yours, so your existing stylesheet applies. Add classes, rearrange fields, or wrap it in your own layout.
Use the hosted MailContact script or MailContact.send() for submission, verification and inline feedback (the endpoint returns JSON). A configurable redirect for native form posts is not currently available.
related
Forms and a real email address, together, with notifications where you live. Start with a free account.
Create your free formNo credit card needed. Free includes one project and 50 form messages per month.