What is form conversion rate, and how do you calculate it?
Real submissions divided by the people who saw the form, times 100. Twelve messages from 400 people who saw the form is 3%.
Both halves of that fraction are easy to get wrong.
The bottom half: people who saw the form, not visitors to the page. If the form sits below three screens of text, most page visitors never reach it, and your rate looks terrible for a reason that has nothing to do with the form. Count a view when the form itself is on screen. Formgong's analytics script does it this way: a view is counted once, when at least 40% of the form is visible, and a start when the visitor first clicks into a field they can fill in. Hidden fields and the spam trap don't count.
The top half: real submissions, not all submissions. We counted every submission to forms on Formgong accounts that aren't ours over the 30 days to 6 November 2026: 154 in total on 30 forms. 28 of them, 18%, were bots caught by the hidden honeypot field, and all 28 went to just 3 of the 30 forms. On the worst of those three, 20 of 24 submissions were bots. If your number jumped and the inbox didn't, check the spam folder before you celebrate a redesign.
The same mix-up explains the “average conversion rate” numbers you'll find online, which run from a couple of percent to nearly half. One article divides by everyone who opened the page, another by people who started typing, a third by visitors to a landing page that is nothing but the form. Those are three different numbers. Don't aim for any of them; compare your form with itself, before and after a change.
First, fix what fails without an error
The most expensive form problems don't look like problems. The visitor clicks Send, nothing visible happens or a thank-you appears, and no message reaches you. While writing this week's articles on form details, we hit five of these in Chromium:
| What the page did | What happened |
|---|---|
A required checkbox hidden with display: none to style it | Send did nothing, no message on screen; only the console said why |
| The thank-you message replaces the form in the click handler | Nothing was sent; console: “Form submission canceled because the form is not connected” |
| Two submit buttons, Delete before Save | Enter in a field sent the form as Delete |
| A ZIP code in a number field | The mouse wheel changed the value while the visitor scrolled |
| A prefilled date in dd/mm/yyyy | The field showed empty; the value was dropped |
None of them would show up in a heatmap or an A/B test. Fill in your own form on a phone and a computer, send it, and check that the message arrives, with the browser's console open. Our contact form testing checklist covers the rest, including a send that fails on the server side, which is a different story.
Then look at where people stop
With views, starts and submits counted, you can see which step loses people, and each step has different fixes.
Few starts per view means people see the form and decide not to begin. The form looks long, asks for something they won't give, or doesn't say what happens next. Put a one-line promise above it (“We reply within one working day”), cut fields you can live without, and make the first field an easy one, like a name. And if the form is three screens down the page, move it up, or put a link at the top that jumps to it.
Few submits per start means people begin and give up. That's usually a specific field: a required phone number, a captcha puzzle, an error that only appears after Send, or the wrong keyboard on a phone. Our article on why people abandon contact forms goes through those one by one, with the studies behind them. Formgong's analytics shows the last field people touched before leaving, which points straight at the field to fix.
Changes that usually help
Ask only for what you need to reply. Name, email and the message cover most contact forms; a phone field can be optional. Use the right input types, so phones open the email or number keyboard, and add autocomplete so the browser fills in what it knows. Write the button as what happens, “Send message” or “Get my quote”, rather than “Submit”. Keep your own error messages next to the field they belong to.
Put each label above its field and keep it visible; a placeholder that vanishes when typing starts is not a label. Mark the optional fields as optional, so nobody has to guess which ones they can skip. Where a format matters, say so in a short hint under the field, “e.g. +1 555 010 0123”, rather than in an error afterwards. Group related fields, contact details together and the details of the job together, so a long form reads as two short ones.
When something is wrong, keep everything the visitor typed and take them to the problem. The browser's own checks already do that: when we pressed Send with two empty required fields, Chromium put the cursor in the first one and showed its message there. If you add your own checks, run them when a field loses focus rather than on every keystroke, so nobody is told their email is invalid while they're still typing it. Lock the button while the form sends, so a second click doesn't send it twice.
Be careful with prefilled answers. Pre-selecting the most likely option saves a click, but our date test above shows a prefilled value in the wrong format simply vanished, and a wrong default that nobody changes is worse than an empty field.
Drop the captcha puzzle if you can. Every one of the 28 bot submissions in our count was caught by a hidden honeypot field that visitors never see; nobody had to pick out traffic lights. Our test of spam protection without a captcha shows what that catches and what it misses.
Watch what loads with the form. A form drawn by a third-party builder arrives after its loader script; the ones we measured were 11 to 15 KB compressed before the form itself started loading, as our form backend vs form builder comparison shows. On a slow phone, a form that appears a second late is a form some people never see.
If a form needs eight or ten questions, the usual fix is to split it into short steps with a progress line, and questions that only matter for some people can appear only after the answer that makes them relevant. Formgong doesn't build multi-page forms, so that is a job for a full form builder; for a three-field contact form, one screen is best.
And answer the question that stops people. Someone who isn't sure whether you deliver to their area or take their insurance often leaves rather than write. Formgong's AI help chat can answer from your own pages on the same site, and a few recent reviews near the form, from the same account, give a hesitant visitor the reason to send. Both sit on the same dashboard as the form.
A line under the form that says what happens to the message works the same way: it answers “who reads this, and will I end up on a mailing list?” before anyone has to ask. Formgong's form code can carry that line with a link to your privacy policy.
What happens after Send also counts
The conversion doesn't end at the click. Show a clear thank-you message or a thank-you page that says what happens next, so people don't send the form again to be sure. Then reply quickly, which only works if the submission reaches you at once. By default Formgong emails every submission as it arrives, on the free plan too, to up to three people, and to Telegram if you prefer your phone.
And judge the form by what it brings, not only by its rate. Adding a qualifying question, such as the budget or the date of the job, can lower the number of submissions and still be the better form if more of them turn into work. Count replies, bookings or sales next to the submissions.
How to know a change worked
Change one thing, wait until each version has been seen by enough people, and compare the rates with their counts, not just percentages. “31 submits from 900 views, then 44 from 920” tells you far more than “up 40%”. With fewer than a few hundred views per version, a difference of a couple of submissions is noise.
Formgong counts views, starts, submits and spam per form on every plan, once the page has the small analytics script; the hosted form page has it already. Our analytics docs explain each number.
What moved your rate?
If one change raised or lowered your form's conversion rate, tell us at support@formgong.com, with the counts before and after. Real results with their denominators help other readers more than any rule of thumb, and we will add them here.
Frequently asked questions
How do you calculate form conversion rate?
Divide real submissions by the number of people who saw the form, and multiply by 100. Count views of the form itself, not of the page, and leave spam out.
What is a good form conversion rate?
There is no useful average: published figures range from a few percent to nearly half because they divide by different things. Compare your form with itself over time. Our own sample is too small to publish one.
Why is my form conversion rate suddenly high?
Check for bots. In our 30-day count, 18% of submissions to customer forms were spam, concentrated on 3 of 30 forms.
How do I increase form submissions?
Fix anything that blocks sending without an error, cut fields you don't need, use the right input types, and answer visitors' questions near the form.
Sources and documentation
Official references for this guide: . Form analytics, where data is stored.
Related guides
- Lovable form submissions to email and Telegram
- HTML contact form without a backend: a working example
- How to send website form submissions to Telegram
- Contact form not sending email? Check where it stops
- Managing website leads in Telegram without a CRM
- Form backend for Lovable, Bolt, v0, Cursor
- Telegram bot for a contact form: build or skip?
- GDPR form backend: 7 checks before you choose
- Lovable form not sending email? 6 fixes
- Netlify Forms not working? React and Bolt fixes
- Stop contact form spam without a CAPTCHA
- GitHub Pages contact form: a working setup
- Mailto Form in HTML: Why It Fails and What to Use
- HTML form to Google Sheets: 2 free methods
- Webflow form submission limit: what to do at 50
- Turnstile vs reCAPTCHA vs hCaptcha for forms
- Contact Form 7 and Elementor forms to Telegram
- Squarespace contact form not sending email?
- Shopify contact form: where do messages go?
- Google Form to Telegram: free Apps Script way
- Wix contact form not sending email? Fixes
- EU / GDPR Formspree alternatives compared
- HTML form action attribute explained
- How do HTML forms work? The HTTP request
- Types of Injection Attacks on Web Forms (2026)
- Indirect Prompt Injection in MCP
- MCP Rug Pull Attack: Detect Tool Changes
- Form without a backend: 7 ways that work
- Thank-you page after form submission (HTML)
- Indirect Prompt Injection Examples (2023–2026)
- Indirect Prompt Injection via Email
- What Is Tool Poisoning in MCP?
- WordPress contact form without a plugin
- Send email from frontend JavaScript
- How to Prevent Indirect Prompt Injection
- Honeypot Form Field: How to Add One That Works
- Contact Form with File Upload (HTML, No PHP)
- Angular contact form without a backend
- Send form submissions to Slack or Discord without Zapier
- Verify a form webhook signature (HMAC-SHA256)
- Contact forms that send nothing: 793 AI-built sites tested
- v0 contact form that actually sends: 3 ways
- How we tested AI-built contact forms, and 12 bugs we hit
- Cloudflare vs Netlify free plan: hosting that never pauses
- EmailJS 412 “Gmail_API: Invalid grant”: reconnect Gmail
- Resend “You can only send testing emails”: verify a domain
- Supabase Edge Function blocked by CORS policy: 3 causes
- Formspree “Form not found” and other errors: fixes
- Web3Forms errors: “Invalid access key” and 403 explained
- How to add customer reviews to your website for free
- Getform not working? “This form has been deleted” and more
- Next.js contact form not working? 6 errors, reproduced
- Webflow form not sending email? What to check, tested
- FormSubmit not working? “This form needs Activation” fix
- Contact form “TypeError: Failed to fetch”: causes and fixes
- WooCommerce product enquiry form
- Contact Form 7 vs WPForms
- Gravity Forms alternative free
- WordPress contact form block
- 535-5.7.8 Username and Password not accepted (Gmail)
- 535 5.7.3 Authentication unsuccessful: Office 365 SMTP
- Nodemailer “Missing credentials for "PLAIN"”: the fix
- Nodemailer “Greeting never received”: port 465 fix
- Nodemailer SSL “wrong version number”: the port fix
- Nodemailer “self-signed certificate in certificate chain”
- Nodemailer ECONNREFUSED 127.0.0.1:587: missing SMTP host
- SendGrid “authorization grant is invalid”: 401 fix
- Mailgun 401 Forbidden: why the API rejects your key
- “Edge Function returned a non-2xx status code”: the fix
- Next.js “Body exceeded 1 MB limit”: Server Action fix
- Unexpected token '<', "<!DOCTYPE "... is not valid JSON
- “TypeError: Body is unusable”: body has already been read
- Turnstile “timeout-or-duplicate” and other siteverify errors
- Turnstile vs hCaptcha vs reCAPTCHA: speed and size tested
- Judge.me reviews not showing on Shopify: how to fix it
- Judge.me review carousel not showing: how to fix it
- Yotpo reviews not showing on Shopify? Check the app embed
- Loox reviews not showing on product page: how to fix
- Shopify reviews not showing: what to check first
- How to show reviews on Shopify
- GDPR for website forms: what each type of form needs
- WooCommerce reviews not showing: how to fix it
- Stamped.io reviews not showing on Shopify: how to fix it
- Etsy reviews not showing: why and what to do
- Trustpilot widget not loading: how to fix TrustBox
- Yotpo problems in 2026: what merchants report
- Contact Form 7 “error trying to send your message” fix
- Elementor form “Your submission failed because of an error”
- Framer form not sending email or not working: what to check
- Carrd contact form not working: plans, spam and errors
- Google review link not working: what customers see and why
- tawk.to widget not showing on your website: causes and fixes
- How to add questions and answers to your product page
- “Failed to send a request to the Edge Function”: fixes
- Next.js “Failed to find Server Action”: what it means
- Brevo “unauthorized: Key not found” 401: the fix
- Amazon SES “Email address is not verified”: the fix
- Shopify contact form not working: how to fix it
- Judge.me alternative for WooCommerce after the 2025 shutdown
- Free WooCommerce review plugins compared on the free version
- WooCommerce review reminder emails without a paid plugin
- Add Voice Recording to a Website Form
- Contact Form 7 spam: how to stop it
- WPForms not sending email: how to fix it
- Contact form emails going to spam: how to fix it
- HTML form not submitting: how to fix it
- Contact form not working: how to find the fault
- Webflow form spam: how to stop it
- Website form to Notion: how to set it up
- Website form to WhatsApp: what works and what does not
- What 1-star reviews say about AI support chatbots
- Which free form backend gives you the most submissions?
- Elfsight reviews widget not showing? Check the view limit
- Next.js contact form backend vs Server Actions
- Review stars not showing in Google search results
- How to stop duplicate form submissions
- How to see which form leads came from ChatGPT
- What happens when a form webhook fails
- When to send a review request email after an order
- How to collect video testimonials for free
- Add contact form sign-ups to Mailchimp or Klaviyo
- How to migrate from Formspree without losing submissions
- How to get a Google review link for your business
- What is a headless form backend?
- Is it safe to put a form access key in your HTML?
- AI chatbot that answers only from your website
- Minified React error #441 in Next.js
- Squarespace product reviews after Judge.me
- Accessible contact form checklist for WCAG 2.2
- How to ask a client for a testimonial by email
- How to respond to negative reviews, with examples
- 429 Too Many Requests on a contact form
- MCP server for forms in Cursor and Claude
- Can you offer a discount for a review?
- Do EU stores have to say if reviews are verified?
- Webflow form backend options compared
- How to add review schema JSON-LD to a product page
- How to turn a customer review into an Instagram post
- How to make a QR code for Google reviews
- Live chat or chatbot for a small business website
- Why people abandon your contact form halfway
- Which form backend do AI assistants pick? 54 answers
- PHP mail() not sending email, even when it returns true
- What “Failed to fetch” means, tested in three browsers
- 405 Method Not Allowed when you submit a form
- Send a contact form to more than one email address
- What is review syndication, and who needs it?
- How to save HTML form data to a database
- NetworkError when attempting to fetch resource
- Send product reviews to Google Merchant Center
- PHPMailer not working on a live server
- AI review reply generator: does it help?
- React 19 contact form with useActionState
- Astro Actions or a form backend?
- Is no-reply@wixsiteautomations.com legit?
- Where to find the Judge.me review widget code
- AI review summaries: what shoppers actually see
- Photo reviews for WooCommerce, and the GPS inside them
- Review request email templates you can copy
- Reviews in AI search: what ChatGPT and Perplexity cite
- Lead capture form with UTM tracking, built and tested
- Form design best practices, with our own form data
- Client intake form template with file upload
- What is social proof? Meaning and examples
- What is user-generated content (UGC)?
- Benefits of negative reviews for your store
- How to get your first reviews as a new store
- How to use customer reviews in your marketing
- How to get more customer reviews
- React form validation without a library, tested
- jQuery submit form with validation
- reCAPTCHA v3 setup with the server score check
- Shopify social proof that shoppers can check
- HTML file input: accept, multiple, capture and size checks
- How to add hCaptcha to a form, with the server check
- How to add invisible reCAPTCHA to a form
- Bug report form template with browser details
- What the FTC fake reviews rule bans for online stores
- How to show reviews on your homepage
- Do reviews increase sales? What the studies show
- HTML input types and what each one sends
- HTML textarea, tested in a real form
- HTML dropdown menu in a form, tested
- Do reviews help SEO? What Google says and shows
- How to add a review carousel people can read
- Product review examples that help shoppers decide
- Which trust badges actually mean something
- Customer satisfaction survey with CSAT and NPS
- JavaScript FormData and what fetch actually sends
- JavaScript form validation without a library
- Server-side form validation and what it catches
- Email validation in JavaScript, tested on 33 addresses
- Zod form validation with FormData, tested
- Store reviews vs product reviews
- How to send review requests through Klaviyo
- How to tag customer reviews by topic and mood
- Custom review form questions worth asking
- Online reputation management for small businesses
- HTML radio button groups and what they send
- HTML label tag and what screen readers hear
- HTML autocomplete attribute, tested with Chrome autofill
- HTML fieldset and legend, and what disabled leaves out
- HTML button tag and what a form button sends
- Vite contact form that still works after the build
- How to test a contact form, end to end
- How to embed a Google Form, and what it loads
- Customer feedback questions that get real answers
- How to convert a file to base64 in JavaScript
- FilePond with a form backend, and when to skip it
- Bootstrap form validation and server errors
- Tailwind form validation, tested in three browsers
- Donation form in HTML, and where the payment goes
- How to ask for a review in person or by text
- Which review sites matter for your business
- What are customer reviews, and which kinds count
- Online review statistics, checked at the source
- Best review app for Shopify and WooCommerce
- Why Gmail sends your self-hosted mail to spam
- htmx contact form that sends to another domain
- AI form builders tested, from prompt to sent form
- Headless WordPress forms with Contact Form 7, tested
- React Hook Form watch vs useWatch, and what gets sent
- Elfsight widget not working? It vanishes when views run out
- Jotform not sending emails? Check Jotform's bounce list
- Typeform not working? A white box means a blocked script
- Positive review response examples that don't sound copied
- How to remove a Google review when you can't delete it
- Google reviews not showing up? 8 causes to check in order
- Is buying Google reviews illegal? Even a review swap counts
- Which reviews can you hide? A review moderation checklist
- Average star rating: what 4.8 from 5 reviews means
- Reviews on a product page: where and how many to show
- SaaS testimonials: 3 of 27 had a number in them
- Do reviews reduce returns? Not when they're too good
- Testimonial examples for business: what makes one believable
- Testimonial questions to ask clients, by type of business
- Testimonial page design: a page or a section?
- Testimonial advertising rules: what the FTC requires
- Form submission canceled because the form is not connected
- Input type date format dd/mm/yyyy: what you can change
- How to disable textarea resize, or allow only vertical
- How to prevent Enter from submitting a form
- form.submit() vs requestSubmit(): what submit() skips
- Custom HTML checkbox CSS that doesn't break required
- How to reset a form after submit, and what reset() keeps
- Input type number maxlength not working? What to use
- How to create an HTML form, step by step
- Best form builder: free plans and branding, checked
- Best WordPress contact form plugin: 10 free ones compared
- Form backend vs form builder: which one do you need?
- WordPress contact form not sending email? 3 plugins tested
- Contact Form 7 webhook? Turning it on switched our email off
- Gravity Forms webhook: what it sends and the URLs it rejects