Everything fits in one Embed element
The markup, the inline thank-you, and the few lines of fetch all live in a single Code embed. Carrd embeds allow script tags, so visitors never leave your page.
integrations · site builder
Carrd doesn't need a form service bolted on with widgets or Zapier: add one Embed element, paste the HTML below, and your landing page has a working contact form. Submissions land in your project's mailcontact inbox, and a notification pings Discord, Slack, email, or a webhook the moment someone writes.
Carrd is where indie landing pages get shipped, and every landing page needs a way for early users to reach you. mailcontact gives each one its own inbox, fed by the form and by a real email address ([email protected]) you can put in the footer. No DNS, no mail server, no glue code.
The only prerequisite is on the Carrd side: Embed elements are part of Carrd's Pro plans (Pro Standard and up, at the time of writing). Everything past that is copy-paste: five minutes from blank element to first test message.
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 id="contact" action="https://mailcontact.app/api/forms/your-form-id" method="POST">
<input type="text" name="name" placeholder="Your name" />
<input type="email" name="email" placeholder="[email protected]" required />
<textarea name="message" placeholder="What's on your mind?" 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>
<p id="contact-thanks" hidden>Thanks, your message is in.</p>
<p id="contact-status" role="status" aria-live="polite"></p>
<script>
var form = document.getElementById("contact");
form.addEventListener("submit", async function (e) {
e.preventDefault();
try {
var response = await fetch(form.action, { method: "POST", body: new FormData(form) });
var data = await response.json();
if (!response.ok || data.ok !== true) throw new Error(data.error || "Please try again.");
form.hidden = true;
document.getElementById("contact-thanks").hidden = false;
} catch {
document.getElementById("contact-status").textContent = "We could not confirm reception. Your text is still here.";
}
});
</script>how it works
One inbox per landing page. Name it after the project and you get a form endpoint and a project email address immediately.
In the Carrd editor, add an Embed element, set its type to Code, paste the snippet, and replace your-form-id with your endpoint's id. Publish.
Add a Discord, Slack, email, or webhook channel. Delivered messages ping you where you already are, no dashboard-checking habit required.
why mailcontact
The markup, the inline thank-you, and the few lines of fetch all live in a single Code embed. Carrd embeds allow script tags, so visitors never leave your page.
Carrd makes it cheap to launch many one-pagers. Give each its own inbox and its own address instead of piling every reply into your personal email. Free covers one form project and 50 submissions per month; Pro covers ten projects and adds receiving email.
Some visitors skip forms and just want an address. Put [email protected] in your Carrd footer. It works immediately, and lands in the same inbox as the form.
faq
You need a Carrd plan that includes Embed elements: Pro Standard and up, at the time of writing. On mailcontact, Free includes one project, one form and 50 submissions per month. Pro adds receiving email addresses, ten projects and 1,000 messages per month.
It can, but a native post currently shows a raw JSON response instead of returning to your page. The hosted script keeps visitors on your Carrd page, handles automatic verification and shows inline feedback. A configurable redirect for native posts is not currently available.
Yes, it's your HTML. Add a style tag inside the same Embed element to match your palette and fonts. The direct API does not change your markup. The hosted script keeps your design and adds a visible attribution link on Free; Pro and Plus need no attribution.
The endpoint accepts up to 20 requests per minute per IP, which is far beyond what a contact form on a landing page sees. Higher overall volume comes with Pro (€9/month) or Plus (€29/month).
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.