Free tool

Form builder

We read your home page once and copy its colour, corners and font. Nothing about your site is saved.

What form?

Fields

Style

The hidden spam trap is always in the code. Turnstile adds a free, mostly invisible bot check.

Preview

Contact us

Add it to your site

  1. Open the HTML of the page where the form should go.
  2. Paste the code below where the form should appear.
  3. Save and upload the page the way you usually publish it.
HTML
<style>
#fg-form{position:relative;box-sizing:border-box;display:grid;gap:16px;width:100%;max-width:520px;padding:28px;border:1px solid #dbe2ea;border-radius:8px;background:#fff;color:#0f172a;font:16px/1.5 system-ui,sans-serif}
#fg-form *{box-sizing:border-box}
#fg-form h2{margin:0;font-size:24px;line-height:1.3}
#fg-form .fg-field{display:grid;gap:6px;min-width:0;margin:0;padding:0;border:0}
#fg-form label,#fg-form legend{font-weight:500}
#fg-form legend{padding:0;margin-bottom:2px}
#fg-form input,#fg-form select,#fg-form textarea{width:100%;min-height:44px;padding:10px 12px;border:1px solid #94a3b8;border-radius:8px;background:#fff;color:inherit;font:inherit}
#fg-form textarea{min-height:120px;resize:vertical}
#fg-form .fg-choice{display:flex;align-items:center;gap:10px;font-weight:400}
#fg-form .fg-choice input{width:20px;min-height:20px;margin:0;flex-shrink:0}
#fg-form [aria-invalid=true]{border-color:#b91c1c}
#fg-form .fg-error{margin:0;color:#b91c1c;font-size:14px}
#fg-form .fg-status{margin:0}
#fg-form .fg-error:empty,#fg-form .fg-status:empty{display:none}
#fg-form button{min-height:48px;padding:12px 20px;border:0;border-radius:8px;background:#4338ca;color:#fff;font:inherit;font-weight:600;cursor:pointer}
#fg-form button:disabled{opacity:.7;cursor:wait}
#fg-form :focus-visible{outline:3px solid #4338ca;outline-offset:3px}
#fg-form .fg-trap{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
</style>
<form id="fg-form" action="https://formgong.com/submit" method="POST">
  <h2>Contact us</h2>
  <input type="hidden" name="access_key" value="fk_your_access_key">
  <input type="hidden" name="_lang" value="en">
  <div class="fg-field">
    <label for="fg-name">Name *</label>
    <input type="text" id="fg-name" name="name" autocomplete="name" required aria-describedby="fg-name-error" placeholder="Jane Smith">
    <p class="fg-error" id="fg-name-error"></p>
  </div>
  <div class="fg-field">
    <label for="fg-email">Email *</label>
    <input type="email" id="fg-email" name="email" autocomplete="email" required aria-describedby="fg-email-error" placeholder="jane@example.com">
    <p class="fg-error" id="fg-email-error"></p>
  </div>
  <div class="fg-field">
    <label for="fg-message">Message *</label>
    <textarea id="fg-message" name="message" required aria-describedby="fg-message-error" placeholder="How can we help?" rows="4"></textarea>
    <p class="fg-error" id="fg-message-error"></p>
  </div>
  <div class="fg-trap" aria-hidden="true"><label>Leave this empty <input type="text" name="botcheck" tabindex="-1" autocomplete="off"></label></div>
  <button type="submit">Send message</button>
  <p class="fg-status" data-fg-status role="status"></p>
</form>
<script>
// Optional. Without it the browser posts the form and Formgong shows its own thank-you or error page.
(function () {
  var form = document.getElementById("fg-form");
  var status = form.querySelector("[data-fg-status]");
  form.noValidate = true;
  form.addEventListener("submit", function (event) {
    event.preventDefault();
    var first = null, seen = {};
    Array.prototype.forEach.call(form.elements, function (field) {
      var id = field.getAttribute("aria-describedby");
      if (!id || seen[id]) return;
      seen[id] = true;
      var ok = field.checkValidity();
      field.setAttribute("aria-invalid", ok ? "false" : "true");
      document.getElementById(id).textContent = ok ? "" : field.validationMessage;
      if (!ok && !first) first = field;
    });
    if (first) { first.focus(); return; }
    var button = form.querySelector("[type=submit]");
    button.disabled = true;
    status.textContent = "Sending…";
    fetch(form.action, { method: "POST", headers: { Accept: "application/json" }, body: new FormData(form) })
      .then(function (response) { return response.json().catch(function () { return {}; }); })
      .then(function (data) {
        if (data.success === true) { form.reset(); status.textContent = "Thank you. Your message was sent."; }
        else status.textContent = data.message || "Could not send. Please try again.";
      })
      .catch(function () { status.textContent = "Could not reach the server. Check your connection and try again."; })
      .then(function () { button.disabled = false; });
  });
})();
</script>

The code has a placeholder key, fk_your_access_key, until you get yours below.

Get your key

Your key tells Formgong where to deliver. Enter your email: we send a link and a code, and you come back here with the key already in the code.

Free, no password. Your form is kept in this browser until you confirm.

Type your site's address and the form takes its colour, corners and font. Edit the fields, copy the code for your platform, and get a key by email when you want it to send.

Short answer: Building and copying the code are free and need no account. The key comes by email; after that, the builder sends a test submission so you know the form delivers.

How the builder works

  1. Type your site's address, or skip it. Formgong reads your home page and copies three things into the form: the colour of your buttons, how round their corners are, and your font.
  2. Pick a form: contact, booking, quote, feedback, newsletter, job application, event registration or support. Click any field in the list or in the preview to change its label, placeholder or whether it is required. Add a field with the button, or type a slash and the type you want. Drag the handle to change the order.
  3. Choose where your site is built. WordPress, Shopify, Wix, Webflow, Framer, Squarespace and Tilda get the HTML with the three steps for that platform; React and Vue get a component; Lovable, Bolt and v0 get a prompt.
  4. Get your key. You confirm your email, come back to the same form with the key in the code, and press "Send a test submission". The form is done when that test is saved and delivered to you.

Your code, in your site's style

The form is plain HTML that sits in your own page, not a frame from another site. The colour, corner radius and font are CSS variables at the top of the style block (--fg-accent, --fg-radius, --fg-font), so one edit restyles it later. The preview runs exactly that HTML and CSS.

The form needs no script at all: the browser sends it and Formgong shows a thank-you page. The short optional script keeps the visitor on your page and shows the message there. The builder shows both sizes under the preview, measured from the code it gives you. A voice message is the one block that needs a script, Formgong's voice.js, which draws the recorder.

What we read from your site, and what we keep

When you press "Match my site", Formgong requests your home page once, over HTTPS, as Formgong-FormBuilder/1.0. It reads the first 200 KB. If the page has almost no styles of its own, it also reads your first stylesheet. It does not follow links or open other pages, so it does not crawl and does not read robots.txt.

From that page it takes the button colour, the corner radius, the font name, the logo and the site builder it was made with, if the page says so. The answer is kept in Cloudflare's cache for a day, so the next person who types the same address gets it without another request. Nothing else is stored, and no cookie is set on your site.

Private and internal addresses are refused before any request. Each network can match 10 sites a day.

Star ratings, voice messages and spam checks

  • Star rating. Five radio buttons named rating with the values 1 to 5, drawn as stars with CSS. On a form with Reviews turned on, the stars become a review.
  • Voice message. A recorder with a box to type instead. Formgong writes the transcript after the form is sent. It needs Uploads on in the form's settings and your Cloudflare Turnstile keys under Protection.
  • Spam. Every form has a hidden field that bots fill and people never see. Tick the Turnstile box to add Cloudflare's bot check as well; switch it on in the form's settings once you see it on your site.

What it does not do yet

The builder does not host the form, take payments or show and hide fields based on answers. Fields are limited to 20. It keeps your form in this browser until you confirm your email; on another device you start again. Building with AI from a description is still on the AI form generator.

Something missing or broken? Write to support@formgong.com with the form you were building. We read every message.

Questions

Is the form builder free?

Yes. Building the form and copying the code need no account. The free plan delivers 1,000 submissions a month by email and Telegram once you have a key.

Do I need to sign up to build a form?

No. You only enter your email at the end, to get the key that makes the form deliver. Until then your form stays in your browser.

Will the form look like my website?

It takes your button colour, corner radius and font from your home page, and it is your own HTML, so your site's styles apply to it too. You can change all three under Style.

Does it work with WordPress, Shopify or Wix?

Yes. Pick your platform under the preview and follow the three steps; the code goes into a Custom HTML block, a Custom Liquid section or an Embed HTML element.

How do I know the form works?

After you get your key, press Send a test submission. The builder tells you when it was saved and delivered to your email or Telegram.

Sources

Checked on 23.10.2026 against these public pages: MDN: <form>, Cloudflare Turnstile, Formgong HTML guide.

← Formgong