Build your form online
Each row is one field: its label, its type, a Required box and, for lists, the options separated by commas. The arrows move a row up or down. Remove deletes it, and Add field puts a new one at the end. When the list looks right, press “Update the preview”. The preview and all five code tabs are rebuilt from the rows in the order you left them.
The box at the top is still there if you would rather describe the form in a sentence. The AI answer replaces the preview and the code, but it does not fill the rows. Build by hand or by description, not both at once.
Fields, no AI
Live preview
Preview only. Nothing is sent from this page.
Tell us about your project
Copy the code
Replace fk_your_access_key with your own Formgong access key. The placeholder does not accept submissions. The honeypot field is named botcheck. Leave it empty.
The HTML form posts in the browser. React and Vue show an error on the page if the request fails. These class names need Tailwind on your site. This page does not load Tailwind. Bootstrap 5 class names need Bootstrap on your site. This page does not load Bootstrap.
<style>
#fg-fk_your_access_key{box-sizing:border-box;max-width:520px;width:100%;padding:28px;border:1px solid #dbe2ea;border-radius:8px;background:#fff;color:#0f172a;font:16px/1.5 system-ui,sans-serif;display:grid;gap:16px}#fg-fk_your_access_key *{box-sizing:border-box}#fg-fk_your_access_key h2{font-size:24px;line-height:1.3;margin:0 0 4px;color:#0f172a}#fg-fk_your_access_key label{display:grid;gap:6px;font-weight:500}#fg-fk_your_access_key input,#fg-fk_your_access_key textarea,#fg-fk_your_access_key select{width:100%;font:inherit;min-height:44px;border:1px solid #94a3b8;border-radius:8px;padding:10px 12px;background:#fff;color:#0f172a}#fg-fk_your_access_key textarea{min-height:96px;resize:vertical}#fg-fk_your_access_key .fg-reminder-consent{display:flex;align-items:flex-start;gap:10px;font-weight:400}#fg-fk_your_access_key input[type=checkbox]{width:20px;min-height:20px;flex-shrink:0;margin:2px 0}#fg-fk_your_access_key button{font:inherit;font-weight:600;min-height:48px;padding:12px 20px;border:0;border-radius:8px;background:#4338ca;color:#ffffff;cursor:pointer}#fg-fk_your_access_key :focus-visible{outline:3px solid #4338ca;outline-offset:3px}#fg-fk_your_access_key button:disabled{cursor:wait;opacity:.7}#fg-fk_your_access_key p{margin:0}#fg-fk_your_access_key fieldset{border:0;padding:0;margin:0;display:grid;gap:8px;min-width:0}#fg-fk_your_access_key legend{font-weight:500;padding:0;margin-bottom:6px}#fg-fk_your_access_key .fg-choice{display:flex;align-items:center;gap:10px;font-weight:400}#fg-fk_your_access_key input[type=radio]{width:20px;min-height:20px;flex-shrink:0;margin:0}#fg-fk_your_access_key .fg-trap{position:absolute;inset-inline-start:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
</style>
<form id="fg-fk_your_access_key" action="https://formgong.com/submit" method="POST">
<h2>Tell us about your project</h2>
<input type="hidden" name="access_key" value="fk_your_access_key">
<input type="hidden" name="_lang" value="en">
<label>Name * <input type="text" name="name" required autocomplete="name"></label>
<label>Email * <input type="email" name="email" required autocomplete="email"></label>
<label>Phone <input type="tel" name="phone" autocomplete="tel"></label>
<label>Current website <input type="url" name="website"></label>
<fieldset><legend>Project type *</legend><label class="fg-choice"><input type="radio" name="project_type" value="New site" required> New site</label><label class="fg-choice"><input type="radio" name="project_type" value="Redesign" required> Redesign</label><label class="fg-choice"><input type="radio" name="project_type" value="Small fixes" required> Small fixes</label></fieldset>
<fieldset><legend>What do you need</legend><label class="fg-choice"><input type="checkbox" name="services" value="Design"> Design</label><label class="fg-choice"><input type="checkbox" name="services" value="Development"> Development</label><label class="fg-choice"><input type="checkbox" name="services" value="Copywriting"> Copywriting</label></fieldset>
<label>How did you hear about us <select name="heard_from"><option value="">—</option><option value="Search">Search</option><option value="A friend">A friend</option><option value="Social media">Social media</option></select></label>
<label>Number of pages <input type="number" name="pages"></label>
<label>Ideal start date <input type="date" name="ideal_start_date"></label>
<label>Project details * <textarea name="details" required></textarea></label>
<label class="fg-choice"><input type="checkbox" name="agree" value="yes" required> I agree to be contacted about this inquiry *</label>
<div class="fg-trap" aria-hidden="true"><label>Leave this field empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div>
<button type="submit">Send inquiry</button>
</form><form class="relative mx-auto grid w-full max-w-lg gap-4 rounded-lg border border-slate-200 bg-white p-6 text-base text-slate-900" action="https://formgong.com/submit" method="POST"> <h2 class="text-2xl font-semibold">Tell us about your project</h2> <input type="hidden" name="access_key" value="fk_your_access_key"> <input type="hidden" name="_lang" value="en"> <div class="grid gap-1"><label class="font-medium" for="tw-name">Name *</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-name" type="text" name="name" autocomplete="name" required></div> <div class="grid gap-1"><label class="font-medium" for="tw-email">Email *</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-email" type="email" name="email" autocomplete="email" required></div> <div class="grid gap-1"><label class="font-medium" for="tw-phone">Phone</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-phone" type="tel" name="phone" autocomplete="tel"></div> <div class="grid gap-1"><label class="font-medium" for="tw-website">Current website</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-website" type="url" name="website"></div> <fieldset class="grid gap-2 border-0 p-0"><legend class="font-medium">Project type *</legend><label class="flex items-center gap-2 font-normal" for="tw-project_type-0"><input class="h-5 w-5" id="tw-project_type-0" type="radio" name="project_type" value="New site" required> New site</label><label class="flex items-center gap-2 font-normal" for="tw-project_type-1"><input class="h-5 w-5" id="tw-project_type-1" type="radio" name="project_type" value="Redesign" required> Redesign</label><label class="flex items-center gap-2 font-normal" for="tw-project_type-2"><input class="h-5 w-5" id="tw-project_type-2" type="radio" name="project_type" value="Small fixes" required> Small fixes</label></fieldset> <fieldset class="grid gap-2 border-0 p-0"><legend class="font-medium">What do you need</legend><label class="flex items-center gap-2 font-normal" for="tw-services-0"><input class="h-5 w-5" id="tw-services-0" type="checkbox" name="services" value="Design"> Design</label><label class="flex items-center gap-2 font-normal" for="tw-services-1"><input class="h-5 w-5" id="tw-services-1" type="checkbox" name="services" value="Development"> Development</label><label class="flex items-center gap-2 font-normal" for="tw-services-2"><input class="h-5 w-5" id="tw-services-2" type="checkbox" name="services" value="Copywriting"> Copywriting</label></fieldset> <div class="grid gap-1"><label class="font-medium" for="tw-heard_from">How did you hear about us</label><select class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-heard_from" name="heard_from"><option value="">Choose</option><option value="Search">Search</option><option value="A friend">A friend</option><option value="Social media">Social media</option></select></div> <div class="grid gap-1"><label class="font-medium" for="tw-pages">Number of pages</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-pages" type="number" name="pages"></div> <div class="grid gap-1"><label class="font-medium" for="tw-ideal_start_date">Ideal start date</label><input class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700" id="tw-ideal_start_date" type="date" name="ideal_start_date"></div> <div class="grid gap-1"><label class="font-medium" for="tw-details">Project details *</label><textarea class="w-full rounded-md border border-slate-400 bg-white px-3 py-2 text-base text-slate-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-700 min-h-24" id="tw-details" name="details" required></textarea></div> <label class="flex items-center gap-2 font-normal" for="tw-agree"><input class="h-5 w-5" id="tw-agree" type="checkbox" name="agree" value="yes" required> I agree to be contacted about this inquiry *</label> <div class="absolute start-0 top-0 h-px w-px overflow-hidden" aria-hidden="true"><label>Leave this empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div> <button class="min-h-12 rounded-md bg-indigo-700 px-4 py-3 font-semibold text-white" type="submit">Send inquiry</button> </form>
<form class="position-relative mx-auto" style="max-width:32rem" action="https://formgong.com/submit" method="POST"> <h2 class="h4 mb-3">Tell us about your project</h2> <input type="hidden" name="access_key" value="fk_your_access_key"> <input type="hidden" name="_lang" value="en"> <div class="mb-3"><label class="form-label" for="bs-name">Name *</label><input class="form-control" id="bs-name" type="text" name="name" autocomplete="name" required></div> <div class="mb-3"><label class="form-label" for="bs-email">Email *</label><input class="form-control" id="bs-email" type="email" name="email" autocomplete="email" required></div> <div class="mb-3"><label class="form-label" for="bs-phone">Phone</label><input class="form-control" id="bs-phone" type="tel" name="phone" autocomplete="tel"></div> <div class="mb-3"><label class="form-label" for="bs-website">Current website</label><input class="form-control" id="bs-website" type="url" name="website"></div> <fieldset class="mb-3"><legend class="form-label mb-1">Project type *</legend><div class="form-check"><input class="form-check-input" type="radio" name="project_type" id="bs-project_type-0" value="New site" required><label class="form-check-label" for="bs-project_type-0">New site</label></div><div class="form-check"><input class="form-check-input" type="radio" name="project_type" id="bs-project_type-1" value="Redesign" required><label class="form-check-label" for="bs-project_type-1">Redesign</label></div><div class="form-check"><input class="form-check-input" type="radio" name="project_type" id="bs-project_type-2" value="Small fixes" required><label class="form-check-label" for="bs-project_type-2">Small fixes</label></div></fieldset> <fieldset class="mb-3"><legend class="form-label mb-1">What do you need</legend><div class="form-check"><input class="form-check-input" type="checkbox" name="services" id="bs-services-0" value="Design"><label class="form-check-label" for="bs-services-0">Design</label></div><div class="form-check"><input class="form-check-input" type="checkbox" name="services" id="bs-services-1" value="Development"><label class="form-check-label" for="bs-services-1">Development</label></div><div class="form-check"><input class="form-check-input" type="checkbox" name="services" id="bs-services-2" value="Copywriting"><label class="form-check-label" for="bs-services-2">Copywriting</label></div></fieldset> <div class="mb-3"><label class="form-label" for="bs-heard_from">How did you hear about us</label><select class="form-select" id="bs-heard_from" name="heard_from"><option value="">Choose</option><option value="Search">Search</option><option value="A friend">A friend</option><option value="Social media">Social media</option></select></div> <div class="mb-3"><label class="form-label" for="bs-pages">Number of pages</label><input class="form-control" id="bs-pages" type="number" name="pages"></div> <div class="mb-3"><label class="form-label" for="bs-ideal_start_date">Ideal start date</label><input class="form-control" id="bs-ideal_start_date" type="date" name="ideal_start_date"></div> <div class="mb-3"><label class="form-label" for="bs-details">Project details *</label><textarea class="form-control" id="bs-details" name="details" rows="4" required></textarea></div> <div class="mb-3 form-check"><input class="form-check-input" type="checkbox" id="bs-agree" name="agree" value="yes" required><label class="form-check-label" for="bs-agree">I agree to be contacted about this inquiry *</label></div> <div class="position-absolute top-0 start-0 overflow-hidden" style="width:1px;height:1px" aria-hidden="true"><label>Leave this empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div> <button class="btn btn-primary" type="submit">Send inquiry</button> </form>
import { useEffect, useRef, useState } from "react";
// Visitor language for Formgong messages, thank-you text and autoreply.
const LANG = "en";
export default function ContactForm() {
const captcha = useRef(null);
const feedback = useRef(null);
const [failed, setFailed] = useState(false);
const [busy, setBusy] = useState(false);
const [status, setStatus] = useState("");
useEffect(() => mountCaptcha(captcha.current, null), []);
useEffect(() => { if (failed && status) feedback.current?.focus(); }, [failed, status]);
async function onSubmit(event) {
event.preventDefault();
if (busy) return;
const form = event.currentTarget;
const body = new FormData(form);
body.set("access_key", "fk_your_access_key");
body.set("_lang", LANG);
setBusy(true);
setFailed(false);
setStatus("Sending…");
try {
const response = await fetch("https://formgong.com/submit", {
method: "POST", headers: { Accept: "application/json" }, body,
});
const result = await response.json();
setFailed(!result.success);
setStatus(result.success ? (result.message || "Sent. Thank you!") : (result.message || "Could not send. Please try again."));
} catch { setFailed(true); setStatus("Connection failed. Please try again."); }
finally { setBusy(false); resetCaptcha(form); }
}
return <form id="fg-fk_your_access_key" onSubmit={onSubmit} aria-busy={busy}>
<style>{"#fg-fk_your_access_key{box-sizing:border-box;max-width:520px;width:100%;padding:28px;border:1px solid #dbe2ea;border-radius:8px;background:#fff;color:#0f172a;font:16px/1.5 system-ui,sans-serif;display:grid;gap:16px}#fg-fk_your_access_key *{box-sizing:border-box}#fg-fk_your_access_key h2{font-size:24px;line-height:1.3;margin:0 0 4px;color:#0f172a}#fg-fk_your_access_key label{display:grid;gap:6px;font-weight:500}#fg-fk_your_access_key input,#fg-fk_your_access_key textarea,#fg-fk_your_access_key select{width:100%;font:inherit;min-height:44px;border:1px solid #94a3b8;border-radius:8px;padding:10px 12px;background:#fff;color:#0f172a}#fg-fk_your_access_key textarea{min-height:96px;resize:vertical}#fg-fk_your_access_key .fg-reminder-consent{display:flex;align-items:flex-start;gap:10px;font-weight:400}#fg-fk_your_access_key input[type=checkbox]{width:20px;min-height:20px;flex-shrink:0;margin:2px 0}#fg-fk_your_access_key button{font:inherit;font-weight:600;min-height:48px;padding:12px 20px;border:0;border-radius:8px;background:#4338ca;color:#ffffff;cursor:pointer}#fg-fk_your_access_key :focus-visible{outline:3px solid #4338ca;outline-offset:3px}#fg-fk_your_access_key button:disabled{cursor:wait;opacity:.7}#fg-fk_your_access_key p{margin:0}#fg-fk_your_access_key fieldset{border:0;padding:0;margin:0;display:grid;gap:8px;min-width:0}#fg-fk_your_access_key legend{font-weight:500;padding:0;margin-bottom:6px}#fg-fk_your_access_key .fg-choice{display:flex;align-items:center;gap:10px;font-weight:400}#fg-fk_your_access_key input[type=radio]{width:20px;min-height:20px;flex-shrink:0;margin:0}#fg-fk_your_access_key .fg-trap{position:absolute;inset-inline-start:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}"}</style>
<h2>{"Tell us about your project"}</h2>
<label>{"Name"} * <input type="text" name="name" required autoComplete="name" /></label>
<label>{"Email"} * <input type="email" name="email" required autoComplete="email" /></label>
<label>{"Phone"} <input type="tel" name="phone" autoComplete="tel" /></label>
<label>{"Current website"} <input type="url" name="website" /></label>
<fieldset><legend>{"Project type"} *</legend><label className="fg-choice"><input type="radio" name="project_type" value={"New site"} required /> {"New site"}</label><label className="fg-choice"><input type="radio" name="project_type" value={"Redesign"} required /> {"Redesign"}</label><label className="fg-choice"><input type="radio" name="project_type" value={"Small fixes"} required /> {"Small fixes"}</label></fieldset>
<fieldset><legend>{"What do you need"}</legend><label className="fg-choice"><input type="checkbox" name="services" value={"Design"} /> {"Design"}</label><label className="fg-choice"><input type="checkbox" name="services" value={"Development"} /> {"Development"}</label><label className="fg-choice"><input type="checkbox" name="services" value={"Copywriting"} /> {"Copywriting"}</label></fieldset>
<label>{"How did you hear about us"} <select name="heard_from"><option value="">—</option><option value={"Search"}>{"Search"}</option><option value={"A friend"}>{"A friend"}</option><option value={"Social media"}>{"Social media"}</option></select></label>
<label>{"Number of pages"} <input type="number" name="pages" /></label>
<label>{"Ideal start date"} <input type="date" name="ideal_start_date" /></label>
<label>{"Project details"} * <textarea name="details" required /></label>
<label className="fg-choice"><input type="checkbox" name="agree" value={"yes"} required /> {"I agree to be contacted about this inquiry"} *</label>
<div aria-hidden="true" style={{position:"absolute",insetInlineStart:0,top:0,width:1,height:1,overflow:"hidden",clipPath:"inset(50%)"}}><input name="botcheck" tabIndex={-1} autoComplete="off" /></div>
<button type="submit" disabled={busy}>{busy ? "Sending…" : "Send inquiry"}</button>
<p ref={feedback} role="status" tabIndex={-1}>{status}</p>
</form>;
}
function mountCaptcha(node, siteKey) {
if (!node || !siteKey) return () => {};
let disposed = false;
let widget;
function render() {
if (disposed || !window.turnstile) return;
window.turnstile.ready(() => {
if (disposed) return;
widget = window.turnstile.render(node, { sitekey: siteKey, language: node.dataset.language || document.documentElement.lang || "auto" });
node.dataset.widgetId = widget;
});
}
if (window.turnstile) render();
else {
let script = document.querySelector('script[src^="https://challenges.cloudflare.com/turnstile/v0/api.js"]');
if (!script) {
script = document.createElement("script");
script.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
script.async = true;
document.head.appendChild(script);
}
script.addEventListener("load", render, { once: true });
}
return () => { disposed = true; if (widget !== undefined) window.turnstile?.remove(widget); };
}
function resetCaptcha(form) {
const widget = form.querySelector("[data-turnstile]")?.dataset.widgetId;
if (widget !== undefined) window.turnstile?.reset(widget);
}<script setup>
import { ref } from "vue";
const status = ref("");
const busy = ref(false);
async function onSubmit(event) {
const form = event.currentTarget;
if (busy.value || !form.reportValidity()) return;
const body = new FormData(form);
body.set("access_key", "fk_your_access_key");
body.set("_lang", "en");
busy.value = true;
status.value = "Sending…";
try {
const response = await fetch("https://formgong.com/submit", {
method: "POST",
headers: { Accept: "application/json" },
body,
});
const result = await response.json();
status.value = result.success ? (result.message || "Sent. Thank you!") : (result.message || "Could not send. Please try again.");
} catch {
status.value = "Connection failed. Please try again.";
} finally {
busy.value = false;
}
}
</script>
<template>
<form style="position:relative;display:grid;gap:16px;max-width:32rem" @submit.prevent="onSubmit" :aria-busy="busy">
<h2>Tell us about your project</h2>
<label>Name * <input type="text" name="name" required autocomplete="name"></label>
<label>Email * <input type="email" name="email" required autocomplete="email"></label>
<label>Phone <input type="tel" name="phone" autocomplete="tel"></label>
<label>Current website <input type="url" name="website"></label>
<fieldset><legend>Project type *</legend><label class="fg-choice"><input type="radio" name="project_type" value="New site" required> New site</label><label class="fg-choice"><input type="radio" name="project_type" value="Redesign" required> Redesign</label><label class="fg-choice"><input type="radio" name="project_type" value="Small fixes" required> Small fixes</label></fieldset>
<fieldset><legend>What do you need</legend><label class="fg-choice"><input type="checkbox" name="services" value="Design"> Design</label><label class="fg-choice"><input type="checkbox" name="services" value="Development"> Development</label><label class="fg-choice"><input type="checkbox" name="services" value="Copywriting"> Copywriting</label></fieldset>
<label>How did you hear about us <select name="heard_from"><option value="">—</option><option value="Search">Search</option><option value="A friend">A friend</option><option value="Social media">Social media</option></select></label>
<label>Number of pages <input type="number" name="pages"></label>
<label>Ideal start date <input type="date" name="ideal_start_date"></label>
<label>Project details * <textarea name="details" required></textarea></label>
<label class="fg-choice"><input type="checkbox" name="agree" value="yes" required> I agree to be contacted about this inquiry *</label>
<div aria-hidden="true" style="position:absolute;inset-inline-start:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)"><input name="botcheck" tabindex="-1" autocomplete="off"></div>
<button type="submit" :disabled="busy">Send inquiry</button>
<p role="status" tabindex="-1">{{ status }}</p>
</form>
</template>Create a free form, then open Connect on that form in this browser. If it still has the default name, email and message fields, they are replaced with this form.
| This page | Basin HTML form generator | |
|---|---|---|
| How you build | Field rows you add, remove and move with arrows, or a description | Templates, then add, remove and reorder fields |
| Output | Plain HTML with a scoped style block, plus Tailwind, Bootstrap 5, React and Vue | Plain HTML for your own styles |
| Where it posts | Formgong, after you add a key | Basin, after you add an endpoint |
| Account to copy | None | None |
The 11 field types and the HTML they become
- Short text:
<input>. If the label is Name, the code getsautocomplete="name". - Email:
type="email", so the browser rejects an address without an @. A field labelled Email also getsautocomplete="email", and Formgong uses it as the reply-to address. - Phone:
type="tel", which opens the number keypad on phones. - Long text: a
<textarea>. - Dropdown: a
<select>whose first option is empty, so a required list makes people choose. - Choose one: radio buttons inside a
<fieldset>with a<legend>. - Checkboxes: several boxes under one name. Every ticked option is sent.
- Single checkbox: one box with the value
yes, for consent or “email me a copy”. - Number, Date and Website:
type="number",type="date"andtype="url", each with the browser's own picker and check.
The field name, the key you see in the inbox and in webhooks, is made from the label: “Ideal start date” becomes ideal_start_date. Two fields with the same label get _2 on the second name. A form can have up to 20 fields.
What the builder adds for you
You only choose labels and types. The rest is written into every copy: the action pointing to Formgong's /submit address with method="POST", a hidden access_key, a hidden _lang for the thank-you page, a label tied to every field, and a hidden botcheck field that catches simple bots.
The HTML tab works without any script on your page. Formgong saves the submission and only then shows a thank-you page; a wrong key or a failed check shows an error page with the reason. The React and Vue tabs stay on the page and say “sent” only when Formgong answers success: true.
The HTML tab carries a short style block, every rule scoped to the form's id. Delete it and your own CSS takes over. Keep the field names and the hidden inputs: those are what make the form send.
Builder, generator or examples?
Use this page when you know the fields and want to set each one yourself: an inquiry with a project type, a registration with a consent box, a survey with checkboxes. For a quick name, email and message form, the HTML form generator and the contact form generator are faster. If you would rather start from a finished design, the contact form examples page has fourteen forms with previews, including a multi-step form and a file upload, which this builder does not make.
One limit to know: the rows move with the ↑ and ↓ buttons, not by dragging. The buttons work with a keyboard too.
Free limits, email and storage
The builder and the code are free. Submissions are delivered only after you replace the placeholder key.
Copying the code needs no account. AI generations are limited to 5 an hour and 10 a day for each network, plus 100 a day for the whole site. When a limit is hit, use “Build it yourself, without AI”. That path does not call the model.
On the free plan, Telegram is instant and email is sent for every submission. The free plan is 1,000 submissions a month. Auto-reply is not on the free plan. Submission data is stored in the EU. Support is Formgong at support@formgong.com.
Your description is sent to the model so it can choose fields. It is not stored. Do not paste passwords, card numbers or other secrets.
Questions
Is this HTML form builder free?
Yes. Building the form and copying the code need no account. To receive submissions, create a free Formgong form and replace fk_your_access_key with its key.
Can I drag fields to reorder them?
Not on this page. Each row has up and down arrows instead, and they work with a keyboard. The form builder inside the Formgong dashboard also supports dragging.
Which field types can I add?
Short text, email, phone, long text, dropdown, choose one (radio buttons), checkboxes, a single checkbox, number, date and website. Up to 20 fields per form.
Does the HTML form need JavaScript?
No. The HTML tab is a normal POST form. Formgong stores the submission and then shows a thank-you page, or an error page that says what went wrong.
Can I add a file upload or several steps?
Not in this builder. The contact form examples page has a file upload form and a multi-step form you can copy and edit.
Sources
Checked on 16.10.2026 against these public pages: MDN: <form>, MDN: <input> types, MDN: <fieldset>, Basin HTML form generator, Formgong HTML guide.