Cara Menggunakan Formspree untuk Contact Form Tanpa Backend
2026-07-02 · 13 min read
Aku punya website yang di-host di shared hosting. PHP. Ga ada Node.js. Ga ada serverless function. Ga ada API endpoint custom. Dan aku butuh contact form yang beneran kirim email ke inbox aku.
Solusinya? Formspree. Satu baris di atribut action, selesai. Form berjalan. Email masuk. Tanpa nulis satu baris pun kode backend.
Ini bukan tutorial copy-paste dari dokumentasi Formspree. Ini catatan dari seseorang yang udah pasang Formspree di production, di halaman contact hibranwar.com, dan sudah menerima ratusan enquiry lewat form itu. Aku bakal tunjukin persis apa yang aku pakai, kenapa aku pilih Formspree, dan kapan kamu mungkin butuh solusi lain.
Kenapa contact form itu wajib
Sebelum bahas teknis, aku mau klarifikasi satu hal dulu. Beberapa orang bilang "taruh aja alamat email di halaman, selesai." Itu approach yang valid. Tapi ada masalah praktis.
Pertama, email yang ditampilkan plain text di halaman web itu target empuk buat email harvester. Bot scraper jalan 24 jam mengumpulkan alamat email dari website. Kamu bisa obfuscate pakai JavaScript atau encoding, tapi itu tambahan kompleksitas yang ga perlu.
Kedua, form memberi kamu kontrol atas informasi yang masuk. Kamu bisa minta nama, email, subject, dan pesan dalam format yang konsisten. Kalo cuma email biasa, orang kirim apa aja dengan subject apa aja. Good luck sorting itu di inbox.
Ketiga, form itu sinyal profesionalisme. Klien enterprise yang aku target, yang budgetnya $250k ke atas, mereka expect interface yang rapi. Bukan mailto: link yang buka email client mereka yang mungkin belum di-setup.
Masalahnya: shared hosting dan static site
Kalo kamu punya VPS atau dedicated server, kamu bisa bikin endpoint PHP sendiri. mail() function, validasi input, kirim email, done. Tapi ada beberapa masalah.
mail() di shared hosting itu unreliable. Banyak shared hosting yang membatasi atau bahkan disable PHP mail() karena abuse. Email yang dikirim dari shared hosting sering masuk spam karena IP address-nya sudah di-blacklist oleh pengguna lain di server yang sama.
Kamu bisa pakai SMTP library seperti PHPMailer. Tapi itu artinya kamu harus manage credentials, update library, handle error, dan maintain kode backend yang honestly ga worth it untuk satu form.
Kalo kamu pakai website statis yang dioptimasi untuk AI, apalagi yang pure HTML tanpa backend, kamu literally ga punya tempat untuk memproses form submission. HTML ga bisa kirim email. Titik.
Di sinilah form backend service masuk.
Apa itu Formspree
Formspree itu form backend-as-a-service. Kamu bikin form HTML biasa, arahkan action ke endpoint Formspree, dan mereka yang handle sisanya: menerima data, validasi, filter spam, kirim email notifikasi ke kamu.
Yang kamu perlu:
- Akun Formspree (free tier: 50 submissions per bulan).
- Form ID yang didapat setelah bikin form baru di dashboard.
- HTML form di halaman kamu dengan
actionyang mengarah ke endpoint Formspree.
Ga perlu install apa-apa. Ga perlu npm. Ga perlu Node.js. Ga perlu serverless function. Kamu cuma butuh HTML.
Setup dasar: form HTML + Formspree endpoint
Ini bentuk paling sederhana yang bisa langsung jalan:
<form action="https://formspree.io/f/YOUR_FORM_ID" method="POST">
<label for="name">Name</label>
<input type="text" id="name" name="name" required>
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<label for="message">Message</label>
<textarea id="message" name="message" rows="6" required></textarea>
<button type="submit">Send</button>
</form>
Itu aja. Serius. Kamu ganti YOUR_FORM_ID dengan ID dari dashboard Formspree, dan form kamu sudah functional. Kalo seseorang submit, data dikirim ke Formspree, dan Formspree forward ke email yang kamu daftarkan.
Ga ada JavaScript. Ga ada AJAX. Ga ada backend. Form HTML standar yang udah ada sejak HTML 2.0 di tahun 1995.
Setup di hibranwar.com: contoh real
Aku ga cuma bahas teori. Ini yang beneran jalan di halaman contact aku:
<form class="contact-form"
action="https://formspree.io/f/xpwdgkra"
method="POST">
<div class="form-field">
<label for="name">Name</label>
<input type="text" id="name" name="name"
required autocomplete="name">
</div>
<div class="form-field">
<label for="email">Email</label>
<input type="email" id="email" name="email"
required autocomplete="email">
</div>
<div class="form-field">
<label for="company">Company / Organisation</label>
<input type="text" id="company" name="company"
autocomplete="organization">
</div>
<div class="form-field">
<label for="subject">What is this about?</label>
<select id="subject" name="subject">
<option value="">Select one</option>
<option value="Entity infrastructure">Entity infrastructure</option>
<option value="Pump systems">Pump systems</option>
<option value="Book conservation">Book conservation</option>
<option value="Speaking / training">Speaking / training</option>
<option value="Other">Other</option>
</select>
</div>
<div class="form-field">
<label for="message">Message</label>
<textarea id="message" name="message"
rows="6" required></textarea>
</div>
<!-- honeypot spam trap -->
<input type="text" name="_gotcha" style="display:none">
<button type="submit" class="btn">Send message</button>
</form>
Beberapa hal yang perlu kamu perhatikan:
1. Field _gotcha (honeypot)
Ini field tersembunyi yang ga terlihat oleh manusia karena display:none. Tapi bot spam biasanya mengisi semua field di form. Kalo field _gotcha terisi, Formspree tau itu bot dan langsung buang submission-nya.
Ini solusi anti-spam yang elegan karena ga butuh CAPTCHA. Ga ada gambar aneh yang minta kamu klik traffic light. Ga ada checkbox reCAPTCHA yang kadang muncul kadang ga. Visitor ga tau ada honeypot. Bot kena jebak. Semua senang.
2. Field autocomplete
Setiap input punya atribut autocomplete yang sesuai (name, email, organization). Ini bikin browser bisa auto-fill data visitor. Kecil, tapi ngurangin friction. Orang yang isi form dengan autocomplete lebih likely untuk submit dibanding yang harus ketik manual.
3. Dropdown subject
Ini bukan cuma soal UX. Ini soal routing. Kalo aku tau subject-nya dari awal, aku bisa prioritaskan response. Entity infrastructure enquiry dapat response 48 jam. Pump systems 24 jam. Kalo cuma free text, aku harus baca dan classify manual.
4. Required fields
Name, email, dan message itu required. Company dan subject ga required. Kenapa? Karena aku ga mau orang abort form submission cuma karena mereka ga punya nama company atau ga tau mau pilih category apa. Better dapat pesan tanpa company name daripada ga dapat pesan sama sekali.
Fitur-fitur Formspree yang berguna
Selain menerima dan forward submission, Formspree punya beberapa fitur yang worth knowing:
Custom redirect (thank-you page)
By default, setelah submit, Formspree menampilkan halaman "Thank you" mereka sendiri. Itu functional tapi ga on-brand. Kamu bisa redirect ke halaman kamu sendiri dengan menambahkan hidden field:
<input type="hidden" name="_next"
value="https://hibranwar.com/contact/thank-you/">
Dengan ini, setelah submit, visitor langsung kembali ke halaman kamu. Kamu bisa desain thank-you page yang sesuai dengan branding site kamu, kasih informasi soal response time, atau arahkan mereka ke halaman lain.
Reply-to otomatis
Kalo kamu namain field email dengan name="email" atau name="_replyto", Formspree otomatis set reply-to di email notifikasi ke alamat visitor. Jadi kamu tinggal klik Reply di inbox, dan langsung balas ke orang yang submit form. Ga perlu copy-paste alamat email.
Subject line custom
Kamu bisa control subject email yang masuk ke inbox kamu:
<input type="hidden" name="_subject"
value="New enquiry from hibranwar.com">
Ini berguna kalo kamu punya multiple forms di situs yang berbeda. Kamu bisa filter di inbox berdasarkan subject.
File upload
Formspree mendukung file attachment. Kamu cuma perlu tambahkan enctype="multipart/form-data" ke form dan input file:
<form action="https://formspree.io/f/YOUR_FORM_ID"
method="POST"
enctype="multipart/form-data">
<!-- fields biasa -->
<input type="file" name="attachment">
<button type="submit">Send</button>
</form>
File dikirim sebagai attachment di email. Limit 10MB per submission di free tier.
Anti-spam: honeypot vs reCAPTCHA
Formspree punya dua mekanisme anti-spam. Honeypot (yang aku pakai) dan reCAPTCHA.
Honeypot itu invisible. Ga ada friction untuk visitor. Tapi ga 100% efektif. Bot yang sophisticated bisa detect hidden fields dan skip mereka. Untuk majority kasus, terutama website personal dan bisnis kecil-menengah, honeypot itu cukup.
Kalo kamu butuh proteksi lebih, Formspree juga support reCAPTCHA. Tapi ada trade-off: reCAPTCHA butuh JavaScript, menambah load time, dan kadang annoying buat visitor. Aku ga pakai reCAPTCHA di hibranwar.com karena volume spam aku rendah dan honeypot udah cukup.
Formspree juga punya built-in spam filtering di backend mereka yang bekerja di luar honeypot dan reCAPTCHA. Jadi bahkan tanpa konfigurasi tambahan, sebagian besar spam udah di-filter sebelum sampai ke inbox kamu.
Perbandingan solusi contact form
Formspree bukan satu-satunya pilihan. Ini perbandingan berdasarkan pengalaman aku evaluasi beberapa opsi sebelum memilih:
| Kriteria | Formspree | Netlify Forms | Google Forms | Custom PHP |
|---|---|---|---|---|
| Setup time | 5 menit | 5 menit | 10 menit | 2-4 jam |
| Butuh backend | Tidak | Tidak | Tidak | Ya |
| Hosting agnostik | Ya, di mana aja | Hanya Netlify | Ya | Butuh PHP |
| Custom design | Full kontrol HTML/CSS | Full kontrol | Terbatas | Full kontrol |
| Spam protection | Honeypot + reCAPTCHA | Built-in Akismet | Google filter | Manual |
| Email delivery | Reliable | Reliable | Ke spreadsheet | Sering masuk spam |
| Free tier | 50/bulan | 100/bulan | Unlimited | Unlimited |
| Branding | No Formspree branding | No branding | Google branding jelas | Full kontrol |
| Cocok untuk | Static site, shared hosting | Netlify-hosted sites | Internal, survey | VPS, dedicated server |
Kenapa aku pilih Formspree:
- Hosting agnostik. hibranwar.com di shared hosting Rumahweb. Bukan Netlify. Bukan Vercel. Netlify Forms out of the question.
- Full kontrol desain. Google Forms itu functional tapi tampilannya screams "ini form gratisan." Buat website yang target klien enterprise, itu ga bisa.
- Ga mau maintain PHP mail code. Aku punya tiga perusahaan. Aku ga mau debug kenapa
mail()tiba-tiba ga jalan karena shared hosting update konfigurasi server tanpa pemberitahuan. - Honeypot cukup. Volume enquiry aku ga gila-gilaan. 50 submissions per bulan di free tier itu lebih dari cukup.
Kapan Formspree bukan pilihan yang tepat
Aku ga mau jual Formspree seolah itu solusi untuk semua kasus. Ada situasi di mana kamu butuh sesuatu yang lain:
- Volume tinggi. Kalo kamu dapat 500+ submissions per bulan, free tier ga cukup. Paid plan mulai dari $8/bulan. Masih reasonable, tapi kalo volume terus naik, custom backend jadi lebih cost-effective.
- Processing kompleks. Kalo kamu perlu validasi data di server, simpan ke database, trigger workflow, atau integrasi ke CRM, Formspree terlalu sederhana. Kamu butuh backend.
- Data sensitivity. Formspree menyimpan submission di server mereka (US-based). Kalo kamu handle data yang sangat sensitif atau ada compliance requirement (GDPR strict, data kesehatan, dll), pertimbangkan self-hosted solution.
- Offline atau air-gapped environment. Formspree butuh internet. Kalo form kamu harus jalan di intranet atau environment tanpa akses external, ini ga bisa.
Setup step-by-step
Buat kamu yang mau mulai dari nol, ini langkah-langkahnya:
Step 1: Buat akun Formspree
Pergi ke formspree.io dan sign up. Free tier ga butuh credit card. Setelah masuk, klik "New Form" dan beri nama (misalnya "Contact Form"). Kamu akan dapat Form ID, formatnya kayak xpwdgkra.
Step 2: Bikin form HTML
Copy template ini dan sesuaikan field-nya:
<form action="https://formspree.io/f/YOUR_FORM_ID" method="POST">
<label for="name">Nama</label>
<input type="text" id="name" name="name" required>
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<label for="message">Pesan</label>
<textarea id="message" name="message" rows="6" required></textarea>
<!-- honeypot anti-spam -->
<input type="text" name="_gotcha" style="display:none">
<!-- optional: custom redirect -->
<input type="hidden" name="_next"
value="https://sitekamu.com/terima-kasih/">
<button type="submit">Kirim</button>
</form>
Step 3: Style form kamu
Formspree ga inject CSS apapun. Form kamu bisa di-style sepenuhnya dengan CSS kamu sendiri. Ini contoh minimal yang clean:
.contact-form label {
display: block;
margin-bottom: 0.25rem;
font-weight: 600;
}
.contact-form input,
.contact-form textarea,
.contact-form select {
width: 100%;
padding: 0.75rem;
margin-bottom: 1rem;
background: #191918;
border: 1px solid #2e2e2c;
color: #ede9e3;
border-radius: 4px;
font-size: 1rem;
}
.contact-form button {
padding: 0.75rem 1.5rem;
background: #c8a882;
color: #111110;
border: none;
border-radius: 4px;
cursor: pointer;
font-weight: 600;
}
Step 4: Test
Submit form kamu sendiri. Cek inbox. Cek spam folder. Kalo email masuk, kamu selesai. Kalo ga masuk, cek Form ID dan pastikan email di akun Formspree kamu bener.
Satu hal: submission pertama dari form baru akan meminta kamu konfirmasi email. Ini one-time verification. Setelah itu, semua submission langsung forward tanpa konfirmasi lagi.
Integrasi dengan Formspree AJAX (opsional)
By default, form HTML submit via redirect. Visitor diarahkan ke halaman Formspree (atau halaman _next kamu), lalu kembali. Kalo kamu mau experience yang lebih smooth tanpa page reload, kamu bisa submit via JavaScript:
const form = document.querySelector('.contact-form');
form.addEventListener('submit', async function(e) {
e.preventDefault();
const data = new FormData(form);
const response = await fetch(form.action, {
method: 'POST',
body: data,
headers: { 'Accept': 'application/json' }
});
if (response.ok) {
form.innerHTML = '<p>Terima kasih. Pesan kamu sudah terkirim.</p>';
} else {
alert('Ada masalah. Coba lagi atau email langsung ke hi@hibranwar.com.');
}
});
Aku ga pakai ini di hibranwar.com. Kenapa? Karena redirect biasa udah cukup. Dan aku ga mau tambah JavaScript yang ga perlu ke halaman yang tujuannya sederhana: terima pesan, kirim email. KISS.
Tapi kalo kamu punya form yang embedded di tengah halaman panjang dan ga mau visitor kehilangan posisi scroll mereka, AJAX submission masuk akal.
Hubungan dengan arsitektur website statis
Ini yang sering ga dibahas: contact form itu satu-satunya titik di website statis yang butuh interaksi server-side. Semua halaman lain bisa pure HTML. Tapi form butuh sesuatu yang menerima dan memproses data.
Seperti yang aku bahas di kenapa website statis lebih baik untuk AI visibility, arsitektur statis memberi keuntungan besar: HTML bersih, load time cepat, ga ada database vulnerability. Tapi trade-off-nya, kamu kehilangan kemampuan server-side processing.
Formspree mengembalikan satu kemampuan itu, contact form, tanpa mengorbankan arsitektur statis kamu. Kamu tetap pure HTML everywhere, kecuali satu form yang endpoint-nya di-handle external service.
Kalo kamu pernah baca panduan aku soal setup Eleventy untuk static site, konsepnya sama. Static site generator menghasilkan HTML murni. Formspree menghandle satu-satunya interaksi yang butuh server. Arsitekturnya bersih. Responsibilities jelas.
Bahkan kalo kamu akhirnya pindah dari static site ke PHP includes (seperti yang aku lakukan), Formspree tetap relevan. Aku bisa bikin endpoint PHP sendiri, tapi kenapa? Formspree udah reliable, udah handle spam, dan aku ga perlu maintain kode tambahan.
Pertimbangan SEO dan visibilitas
Contact form sendiri ga langsung mempengaruhi ranking. Tapi halaman contact yang well-structured itu penting untuk GEO dan SEO.
Halaman contact kamu bisa punya ContactPage schema (JSON-LD) yang kasih tau search engine dan AI bahwa halaman ini adalah titik kontak resmi. Di hibranwar.com, aku punya schema yang menyatakan nama, email, job title, contact type, dan bahasa yang available. Ini membantu AI systems memahami bahwa Ibrahim Anwar bisa dihubungi untuk business enquiries.
Form itu sendiri ga di-index oleh search engine. Tapi konten di sekitar form, seperti area layanan, response time, dan informasi kontak lainnya, itu valuable content yang bisa muncul di search results.
Kesalahan yang pernah aku buat
Supaya kamu ga perlu ulangin:
- Lupa honeypot. Minggu pertama tanpa
_gotcha, aku dapat 20+ spam submissions. Setelah tambahkan, turun ke hampir nol. - Field name typo. Aku pernah typo
name="emial"dan bingung kenapa reply-to ga jalan. Formspree cari field bernamaemailatau_replytountuk auto-set reply address. Typo means it doesn't work. - Ga test di mobile. Form aku responsive, tapi input field pertama kali ga cukup besar touch target-nya di mobile. Minimum 44px height untuk mobile usability.
- Required field terlalu banyak. Versi awal form aku punya 6 required fields. Conversion rate rendah. Aku kurangin ke 3 (name, email, message) dan conversion naik signifikan.
Frequently Asked Questions
Apakah Formspree gratis?
Free tier Formspree memberikan 50 submissions per bulan dan 2 form. Untuk website personal atau bisnis kecil, ini lebih dari cukup. Paid plan mulai dari $8/bulan dengan limit lebih tinggi, file upload yang lebih besar, dan fitur tambahan seperti auto-responder dan Zapier integration.
Apakah data form submission aku aman di Formspree?
Formspree mengenkripsi data in transit (HTTPS) dan at rest. Mereka compliant dengan GDPR dan menyediakan opsi untuk delete submission data. Tapi ingat, data kamu melewati dan disimpan di server pihak ketiga yang berbasis di US. Kalo compliance requirement kamu sangat ketat, evaluasi dulu apakah ini acceptable.
Bisa ga Formspree dipakai di WordPress?
Bisa. Kamu tinggal masukkan kode form HTML di Custom HTML block di editor WordPress. Ga perlu plugin form. Ga perlu WPForms, Contact Form 7, atau plugin lain. Cuma HTML biasa yang action-nya mengarah ke Formspree. Ini actually approach yang lebih ringan dibanding plugin-plugin form WordPress.
Gimana kalo Formspree down? Submission hilang?
Kalo Formspree server sedang down saat visitor submit, mereka akan dapat error page. Submission ga terkirim dan ga tersimpan. Ini kelemahan dari dependency pada third-party service. Solusi pragmatis: selalu tampilkan alamat email kamu sebagai alternatif di halaman contact. Kalo form ga jalan, visitor bisa tetap kirim email manual.
Apa bedanya honeypot dan reCAPTCHA di Formspree?
Honeypot itu hidden field yang hanya diisi oleh bot. Visitor ga tau ada field itu. Zero friction, tapi kurang efektif melawan bot canggih. reCAPTCHA itu challenge dari Google yang minta visitor buktikan mereka manusia. Lebih efektif, tapi menambah friction dan butuh JavaScript. Untuk website dengan volume rendah sampai menengah, honeypot biasanya cukup.
References
- Formspree. "HTML Forms for Static Sites." Formspree Documentation. formspree.io/html
- Formspree. "Spam Mitigation." Formspree Help. help.formspree.io
- MDN Web Docs. "HTML Form Element." Mozilla Developer Network. developer.mozilla.org
- Formgrid. "Formspree Alternatives in 2026." Formgrid Blog. formgrid.dev/blog
- Static Forms. "Adding Contact Forms to Static Websites Guide." Static Forms Blog. staticforms.dev/blog