Guides / Finipage / Putting it online
Contact Forms on a Static HTML Page: What Actually Works
Finipage guide · Edit HTML files without code. Open Finipage
A template arrives with a tidy contact form: name, phone, message, a "Send" button. You put the page online, a visitor fills it in, presses the button, and the message goes nowhere. Sometimes the page reloads, sometimes the browser shows a "405 Method Not Allowed" or "404" error, sometimes nothing visible happens at all. Nobody gets an email. Here is why, and what actually works for collecting enquiries from a one-page site.
Why the form does nothing on its own
An HTML form is only the part the visitor sees. When it is submitted, the browser packs the field values and sends them to the address in the form's action attribute, using the method (usually post). Something at that address has to receive the data and do something with it: store it, email it, or both. On a static host such as GitHub Pages, Cloudflare Pages or a basic FTP web space, there is no program listening at that address. The server can hand out files, but it cannot accept a submission.
Look at the opening tag of your form. If it says <form action="#">, action="/contact", action="send.php" on a host without PHP, or has no action at all, the form will not deliver anything.
Finipage, like any page editor, only changes the file and does not receive form submissions, so the options below apply whichever tool built the page.
Option 1: embed a Google Form
If you already use Google, the simplest route is to build the form in Google Forms and embed it. In the form editor, the embed option (currently labelled Embed HTML) gives you an <iframe> snippet to paste into your page. Responses land in the form's Responses tab, and from the three-dot menu there you can turn on Get email notifications for new responses.
- Good: free, nothing to configure on your server, responses can go to a Google Sheet.
- Less good: it looks like Google Forms, not like your page, and the iframe needs a fixed height, which can leave a scroll bar inside the page on phones.
Pasting an iframe means editing the HTML source. Do that in VS Code or Notepad; Finipage's HTML source view is for checking, not typing.
Option 2: a form back-end service
These services keep your own form design and give you an address to put in action. Each was checked against its official site in November 2026; plans change, so look at the current pricing page before you commit.
| Service | How it connects | Free use |
|---|---|---|
| Formspree | Create a form in its dashboard, then set action="https://formspree.io/f/your-form-id" and method="POST" on your own form. Submissions arrive by email and in the dashboard. | A Free plan aimed at testing, limited to 50 submissions a month at the time of writing. |
| Netlify Forms | Only for sites hosted on Netlify. Enable form detection in the site's Forms settings, add a name and the netlify (or data-netlify="true") attribute to the form, and redeploy. Netlify finds the form when it builds the site. | Check Netlify's current plan page for form limits. |
| Tally | You build the form in Tally and embed it (Standard, Popup or Full page) from the form's Share tab, similar to Google Forms. | Tally advertises unlimited forms and submissions on its free plan, subject to fair use. |
With Formspree or Netlify the form keeps your styles, because it is still your HTML. Make sure every field has a name attribute; inputs without one are silently left out of the submission.
Option 3: skip the form
For many small businesses a form is not the best contact method.
- A
mailto:link.<a href="mailto:hello@yourshop.kr">opens the visitor's email program with your address filled in. It needs no service, but a visitor on a work PC or a library computer may have no mail program set up, so show the address as plain text too. - Why not
<form action="mailto:...">? The HTML standard handles this by turning the form data into amailto:address and handing it to the visitor's mail program. It does not send anything by itself. Whether a draft appears, and whether the fields survive, depends on the browser and the mail setup. On many machines the visitor clicks "Send" and nothing visible happens. Treat it as unreliable. - Phone and KakaoTalk. In Korea, a
tel:button and a KakaoTalk Channel button are often what customers expect. A KakaoTalk Channel has a public address of the formhttps://pf.kakao.com/_xxxxx; the channel admin centre shows the link to use for a chat button. A phone link looks like<a href="tel:02-1234-5678">.
Changing a button's target to https://pf.kakao.com/... can be done in Finipage's Link field. For mailto: and tel: links, edit the source in a text editor.
Keeping spam out
Bots find public forms quickly. The basic defences, most of which the services above support:
- Honeypot field. A hidden input that people never see but bots fill in. Netlify supports this with a
netlify-honeypot="bot-field"attribute on the form; Formspree also recommends a honeypot. - CAPTCHA. reCAPTCHA or a similar check stops most automated posts, at the cost of some friction for real people. Netlify and Formspree both offer reCAPTCHA options.
- Service-side filtering. Netlify filters every submission with Akismet and keeps flagged ones in a separate spam list. Formspree has its own filter. Real enquiries occasionally land in spam, so check it now and then.
- Do not print your address in hidden fields. Older form scripts put the recipient email inside the HTML, where harvesters read it. Services that use a form ID, such as Formspree's
/f/addresses, avoid this.
Personal data: what you take on
A name and a phone number are personal information, and collecting them makes you responsible for them. In Korea the Personal Information Protection Act (개인정보 보호법) requires that, when you collect personal data with consent, you tell people what you collect and why, how long you keep it, that they may refuse, and what happens if they do. In practice a contact form usually carries:
- a short consent notice next to the button listing the purpose, the items collected and the retention period;
- a consent checkbox that is not ticked by default;
- a link to your privacy policy, also linked from the footer.
Collect only what you need. If you will reply by phone, you do not need an address or date of birth. The form service also holds the data, so name it in your privacy policy and delete old submissions you no longer need. For your exact obligations, check the guidance from Korea's Personal Information Protection Commission or ask a professional; this article is not legal advice.
Proving the form actually delivers
- Publish the page, then submit a test entry from the live address, not from the file on your computer.
- Do it once from a phone on mobile data and once from a desktop browser.
- Confirm the message arrives where you expect: the inbox, the service dashboard, or the Google Sheet. Check the spam folder too.
- Check what the visitor sees afterwards. A blank page or a bare JSON response looks like an error; set a thank-you page if the service allows it.
- Repeat the test whenever you change the form, the host or the email address.
action address and its status code, such as 200, 404 or 405, usually tell you whether the problem is the address, the host or the service.Before launch, run through the landing page checklist, and if the page is not online yet, start with how to put an HTML file online.
Want to try it on your own file? Open the Finipage editor. It runs in your browser and your file stays on your device.