Panduan

Panduan14 menit baca

Tambahkan formulir feedback ke website atau aplikasi Anda

Pasang formulir feedback di halaman mana pun atau di dalam aplikasi Anda: rating, komentar, halaman asalnya, filter spam, dan peringatan saat skornya rendah.

Preet SutharPendiri, Ikiform

Tambahkan formulir singkat berisi rating 1 sampai 5, komentar opsional, dan email opsional, lalu kirim ke backend formulir agar Anda tidak perlu menjalankan server untuknya. Kirim alamat halaman bersama setiap jawaban, karena browser tidak akan memberi tahu URL lengkapnya dengan sendirinya. Teruskan skor rendah ke chat tim di hari yang sama dan simpan setiap jawaban di satu tempat untuk melihat tren.

Kebanyakan orang tidak pernah memberi tahu apa yang salah dengan situs Anda. Mereka langsung pergi. Formulir feedback kecil menangkap segelintir orang yang mau bicara, tepat saat mereka menyadarinya, di halaman yang menjadi penyebabnya. Panduan ini membuat formulir yang cocok untuk situs atau aplikasi apa pun, mengirim halaman asalnya, menahan bot, dan menyampaikan jawaban yang kecewa ke tim Anda di hari yang sama.

Cara kerja formulir feedback

Formulir mengirim ke Ikiform. Ikiform memvalidasi skor, memeriksa kiriman dari spam, menyimpannya, mengirim email ke tim Anda, dan mengirim webhook bertanda tangan. Dari webhook, skor rendah masuk ke channel chat dan setiap jawaban bisa masuk ke sheet atau database.

Perjalanan satu feedback dari halaman Anda ke tim Andahalaman ataulayaraplikasi apapunrating,komentar, alamathalamanIkiformvalidasi, saringspam, simpandashboardfilter performulir dantanggal, eksporCSVemailnotifikasike tim Anda,balasan kepengunjungwebhookbertandatangansubmission.createdberisi fielddan metachat timhanya skor 1atau 2kirimrelayPerjalanan satu feedback dari halaman Anda ke tim Andahalamanatau layaraplikasiapa punrating,komentar,alamat halamanIkiformvalidasi,saring spam,simpandashboardfilter per formulirdan tanggal, eksporCSVemailnotifikasike tim Anda,balasan kepengunjungwebhookbertanda tangansubmission.createdberisi field danmetachat timhanya skor 1 atau 2kirimrelay
  1. Pengunjung memilih skor, mungkin menulis komentar, lalu formulir mengirimnya bersama alamat halaman.
  2. Ikiform memeriksa bahwa skornya bilangan bulat dari 1 sampai 5, menjalankan pemeriksaan spam, dan menyimpan jawabannya.
  3. Jawaban muncul di dashboard, tempat Anda bisa memfilternya dan mengekspornya sebagai CSV.
  4. Ikiform mengirim email ke tim Anda. Jika pengunjung meninggalkan email, tombol Balas langsung menuju ke mereka.
  5. Ikiform mengirim webhook submission.created bertanda tangan berisi field dan metadata browser.
  6. Relay kecil hanya meneruskan skor rendah ke chat tim Anda, agar dibaca hari itu juga.
Relay bersifat opsional. Mulailah dengan email dan dashboard, lalu tambahkan peringatan chat saat jawaban mulai menumpuk.

Cara mengumpulkan feedback

Setiap jenis alat dibuat untuk tugas yang berbeda. Pilih berdasarkan apa yang perlu Anda lihat saat jawaban masuk, bukan dari tampilan widgetnya.

PendekatanUnggul dalamKekurangan
Alat feedback website, seperti Hotjar atau UsersnapScreenshot, anotasi, dan konteks halaman tanpa kode selain satu tag script.Script pihak ketiga di setiap halaman, jawaban disimpan di produk mereka, dan harga ditentukan oleh paket mereka.
Widget dari error tracker, seperti Sentry User FeedbackMengaitkan laporan dengan error-nya dan, jika session replay aktif, dengan rekaman kejadiannya.Dibuat untuk bug, bukan opini. Anda perlu SDK tracker-nya di aplikasi Anda terlebih dahulu.
Form builder, seperti Typeform, Tally, atau Google FormsFormulir rapi tanpa kode. Cocok untuk survei yang Anda kirim lewat tautan.Iframe atau halaman terpisah, sehingga jawaban kehilangan halaman yang dibahas kecuali Anda menyertakannya di URL.
Papan feedback, seperti CannyVoting publik dan pembaruan status untuk permintaan fitur.Dibuat untuk ide, bukan reaksi cepat. Jawabannya memang publik.
Route API dan database Anda sendiriKendali penuh atas data dan logika apa pun.Anda membangun sendiri filter spam, rate limit, email notifikasi, dan ekspor, dan Anda butuh server.
Form backend, seperti IkiformMarkup Anda sendiri di situs atau aplikasi apa pun. Validasi, filter spam, penyimpanan, email, dan webhook bertanda tangan tanpa server.Tanpa screenshot, karena unggah file tidak didukung, dan tanpa voting atau session replay.

Jika Anda butuh screenshot di setiap laporan, alat feedback atau error tracker sepadan dengan script-nya. Jika Anda ingin formulir tampil seperti situs Anda, jawaban tetap portabel, dan Anda sendiri yang menentukan ke mana jawaban dikirim, gunakan backend formulir. Sisa panduan ini melakukan hal itu.

Formulirnya

Tiga pertanyaan sudah cukup: skor, komentar, dan email opsional. Skor adalah yang paling sering dijawab orang; komentar adalah tempat nilainya berada; email adalah cara Anda menindaklanjutinya. Pilih stack Anda di bawah; pilihan itu berlaku untuk setiap contoh kode di panduan ini.

Satu blok markup dan script pendek. Tanpa JavaScript formulir tetap mengirim dan me-redirect; dengan JavaScript, pengunjung tetap di halaman dan melihat error dari server di sebelah tombol. Script mengisi page dengan alamat tanpa query string, sehingga token di URL tidak pernah sampai ke inbox Anda.

feedback.html
<form id="feedback" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <fieldset>
    <legend>How useful was this page?</legend>
    <label><input type="radio" name="rating" value="1" required /> 1</label>
    <label><input type="radio" name="rating" value="2" /> 2</label>
    <label><input type="radio" name="rating" value="3" /> 3</label>
    <label><input type="radio" name="rating" value="4" /> 4</label>
    <label><input type="radio" name="rating" value="5" /> 5</label>
  </fieldset>
  <label for="comment">What would make it better?</label>
  <textarea id="comment" name="comment" rows="4" maxlength="4000"></textarea>
  <label for="feedback-email">Email, if you'd like a reply</label>
  <input id="feedback-email" name="email" type="email" />
  <input type="hidden" name="page" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send feedback</button>
  <p id="feedback-status" role="status"></p>
</form>

<script>
  const form = document.getElementById("feedback");
  const status = document.getElementById("feedback-status");
  form.elements.page.value = location.origin + location.pathname;

  form.addEventListener("submit", async (event) => {
    event.preventDefault();
    const button = form.querySelector("button");
    button.disabled = true;
    status.textContent = "Sending";
    try {
      const response = await fetch(form.action, {
        method: "POST",
        headers: { Accept: "application/json" },
        body: new FormData(form),
      });
      const result = await response.json();
      if (result.ok) {
        form.replaceChildren(Object.assign(document.createElement("p"), { textContent: "Thanks. The team reads every note." }));
        return;
      }
      const fields = result.error.fields ?? {};
      status.textContent = fields.rating?.[0] ?? fields.comment?.[0] ?? fields.email?.[0] ?? result.error.message;
    } catch {
      status.textContent = "Couldn't send it. Try again in a moment.";
    }
    button.disabled = false;
  });
</script>
  • Ganti frm_xxxxxxxxxxxxxxxx dengan ID formulir Anda dari dashboard.
  • rating adalah grup radio berisi lima nilai. Ikiform menyimpannya sebagai angka, jadi rata-rata tidak perlu parsing.
  • email bersifat opsional. Orang menulis lebih jujur saat tidak harus menyebutkan identitas, dan mereka yang ingin dibalas akan mengisinya.
  • Input tersembunyi _gotcha adalah honeypot. Orang tidak pernah melihatnya; bot yang mengisi setiap input menandai dirinya sendiri sebagai spam.
  • page mencatat halaman yang dibahas oleh jawaban. Bagian berikutnya menjelaskan mengapa Anda mengirimnya sendiri.
Versi sisi server mengirim dengan secret key, sehingga Ikiform melewati Allowed domains dan pemeriksaan manusianya. Semua kiriman lalu datang dari IP server Anda, dan batas Standard 5 per menit per pengunjung menghitung semua pengunjung Anda sebagai satu. Pilih rate limit Relaxed atau Custom untuk formulir yang Anda kirim lewat server, dan simpan IKIFORM_SECRET_KEY di environment variable khusus server.

Panduan framework di dokumentasi membahas penyiapan lebih dalam: Next.js, Astro, SvelteKit, Nuxt, React, Vue, dan HTML biasa. Template formulir feedback menghasilkan field yang sama sebagai HTML, React, dan server action; template laporan bug dan survei mencakup formulir yang lebih panjang.

Definisikan field-nya

Tempel definisi di tab Fields formulir dan Ikiform menegakkannya di setiap kiriman, dari halaman mana pun. Coba di bawah: preview menjalankan validator Ikiform di browser Anda, jadi skor 0 atau email yang salah format menampilkan 422 yang akan Anda terima.

Pratinjau

Menjalankan validator Ikiform di browser Anda. Tidak ada yang dikirim.

Seberapa berguna halaman ini?

Diisi oleh script dengan alamat halaman, tanpa query string.

rating menerima bilangan bulat dari 1 sampai max-nya, di sini 5. Nilainya bisa sampai 10, tetapi lima pilihan lebih cepat dijawab.
FieldTipeAlasan
ratingrating, maks 5Satu klik. Disimpan sebagai angka, jadi Anda bisa menghitung rata-ratanya per halaman
commenttextarea, hingga 4.000 karakterAlasan di balik skor
emailemail, opsionalBalas orang yang bertanya. Menjadi reply-to di notifikasi
pageurl, opsionalHalaman yang dibahas oleh jawaban

Setelah field didefinisikan, nama lain apa pun dalam kiriman ditolak sebagai Unknown field. Jika nanti Anda mengirim konteks tambahan, seperti versi aplikasi atau nama paket, tambahkan field untuknya terlebih dahulu. ID field menggunakan snake_case huruf kecil.

Ketahui halaman yang dibahas

Skor tanpa halaman sulit ditindaklanjuti. Ikiform mencatat metadata browser di setiap kiriman, tetapi salah satu nilainya kurang berguna dari kelihatannya:

NilaiAsalnyaYang Anda dapat
meta.user_agentDicatat oleh IkiformBrowser dan sistem operasi, dari kiriman browser
meta.originDicatat oleh IkiformOrigin situs Anda, seperti https://example.com
meta.referrerDicatat oleh IkiformBiasanya hanya origin. Browser memakai kebijakan strict-origin-when-cross-origin secara default, yang membuang path saat mengirim ke situs lain
meta.countryDicatat oleh IkiformKode negara dua huruf
pageDikirim oleh formulir AndaPath lengkap, jadi Anda tahu halaman mana yang dibahas oleh jawaban

Itulah sebabnya setiap contoh di atas mengirim page sendiri. Versi HTML dan SPA membaca location; versi server membaca alamat yang sudah diketahui framework-nya. Semuanya membuang query string, yang bisa berisi kata pencarian, ID pelacakan, atau token sekali pakai yang tidak ingin Anda simpan.

Versi server mengirim dari server Anda, jadi meta.user_agent adalah runtime server Anda, bukan browser pengunjung. Untuk feedback halaman, hal ini jarang penting. Untuk laporan bug, ini penting, dan panduan laporan bug meneruskan user agent browser sebagai field.

Di mana bertanya

Letak formulir menentukan apa yang Anda dengar. Formulir di footer setiap halaman mendapat sedikit opini yang kuat. Pertanyaan di akhir sebuah tugas mendapat jawaban yang stabil dan spesifik.

PenempatanCocok untukWaspadai
Akhir halaman dokumentasi atau artikelMenemukan halaman yang tidak menjawab pertanyaanVolume rendah per halaman. Baca per bagian, bukan per halaman
Setelah sebuah tugas di aplikasi Anda, seperti ekspor atau proyek pertamaRasanya sebuah alur tertentu, selagi masih segarTanyakan sekali per orang, bukan setiap kali mereka menyelesaikan tugasnya
Tombol mengambang di setiap layarApa saja, kapan saja. Lihat widget ReactTombol ini tidak boleh menutupi tombol Anda sendiri, banner cookie, atau gelembung chat
Tautan di emailSkor yang ingin Anda pantau dari waktu ke waktu, seperti NPSKlien email bukan halaman Anda, jadi formulirnya butuh landing page di situs Anda

Jaga formulir tetap kecil di mana pun letaknya. Tanyakan skor lebih dulu dan tampilkan kotak komentar bersamanya, bukan di langkah kedua. Langkah kedua kehilangan sebagian besar orang, dan skor tanpa alasan pun tetap berharga.

Sampaikan skor rendah ke orang yang tepat

Apa yang terjadi pada jawaban berdasarkan skornyajawabandisimpansetiap skor,setiap halamanwebhooksubmission.createdrelaycekrating3, 4 atau 5:tidak adalagitinjauanmingguanrata-rata perhalaman dariCSVchat timskor, halaman,komentarseseorangmembalasjika ada emailbertanda tanganekspor1 atau 2Apa yang terjadi pada jawaban berdasarkan skornyajawaban disimpansetiap skor, setiaphalamanwebhooksubmission.createdrelay cekrating3, 4 atau 5:tidak ada lagitinjauan mingguanrata-rata per halamandari CSVchat timskor,halaman,komentarseseorangmembalasjika adaemailbertanda tanganekspor1 atau 2
  1. Setiap jawaban disimpan, berapa pun skornya dan dari halaman mana pun asalnya.
  2. Ikiform mengirim webhook submission.created bertanda tangan ke relay Anda.
  3. Relay membaca rating-nya. Skor 3 sampai 5 tidak perlu ditindaklanjuti saat itu juga.
  4. Skor 1 atau 2 masuk ke chat tim Anda bersama halaman dan komentarnya.
  5. Jika pengunjung meninggalkan email, seseorang membalas di hari yang sama.
  6. Seminggu sekali, hasil ekspor menunjukkan rata-rata per halaman, dan di situlah tren terlihat.
Kirim peringatan hanya untuk skor buruk. Channel yang berbunyi untuk setiap 5 dari 5 akan di-mute dalam seminggu.

Email notifikasi dikirim ke maksimal 10 penerima terkonfirmasi per formulir dan datang untuk setiap jawaban. Itu cukup untuk beberapa jawaban sehari. Lebih dari itu, kirim skor rendah ke chat dengan relay seperti route Next.js ini; kode yang sama berjalan di Cloudflare Worker:

app/api/feedback-alerts/route.ts
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";

export async function POST(request: Request) {
  const payload = await request.text();
  try {
    const event = await verifyWebhook({
      payload,
      headers: request.headers,
      secret: process.env.IKIFORM_WEBHOOK_SECRET!,
    });
    if (event.type !== "submission.created") return new Response(null, { status: 204 });
    const { rating, comment, page, email } = event.data.fields;
    if (Number(rating) > 2) return new Response(null, { status: 204 });

    const lines = [
      `*${rating}/5* on ${page ?? event.data.meta.origin ?? "an unknown page"}`,
      comment ? `> ${String(comment).slice(0, 500)}` : "_No comment._",
      email ? `Reply to ${email}` : "Anonymous",
    ];
    const response = await fetch(process.env.SLACK_WEBHOOK_URL!, {
      method: "POST",
      headers: { "content-type": "application/json" },
      body: JSON.stringify({ text: lines.join("\n") }),
    });
    if (!response.ok) return new Response(`Slack answered ${response.status}`, { status: 502 });
    return new Response(null, { status: 204 });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
}
  • verifyWebhook memeriksa tanda tangan dan timestamp, jadi tidak ada orang lain yang bisa mengirim ke channel Anda lewat URL ini.
  • Skor di atas 2 menjawab 204 dan berhenti. Ikiform menganggap 2xx apa pun sebagai terkirim.
  • Panggilan Slack yang gagal menjawab 502, dan Ikiform mencoba ulang dengan webhook-id yang sama, jadi gangguan singkat tidak menghilangkan peringatan.
  • Nilai field adalah apa yang diketik pengunjung. Relay memotong komentar menjadi 500 karakter sebelum sampai ke chat.

Tambahkan endpoint di Webhooks dan salin secret whsec_-nya ke IKIFORM_WEBHOOK_SECRET. Satu workspace bisa memiliki 3 endpoint. Untuk rute tanpa kode, lihat Slack, Discord, dan Google Sheets. Untuk feedback yang perlu menjadi tiket, Linear dan GitHub Issues punya relay yang membuat satu tiket per kiriman.

Tidak ada integrasi sekali klik. Setiap alat dijangkau lewat webhook bertanda tangan, langsung atau melalui alat otomasi seperti Zapier atau n8n.

Tahan bot

Formulir feedback di setiap halaman berarti formulir publik di setiap halaman. Bot akan menemukannya, dan sebagian besar yang mereka kirim berupa tautan. Bawaan Ikiform menangani sebagian besarnya:

PerlindunganYang dihentikanSetup
HoneypotBot yang mengisi setiap inputInput tersembunyi _gotcha di contoh
Skor spamTiga tautan atau lebih (+2), frasa spam yang dikenal (+2), email sekali pakai (+2), pengulangan identik (+3). Pada skor 5, kiriman disimpan sebagai spamTidak ada
Rate limitSkrip yang mengirim berulang-ulangAktif secara default: Standard, 5 per menit per pengunjung, dan 300 per menit untuk seluruh formulir
Domain yang diizinkanKiriman dari situs lainTambahkan domain Anda di pengaturan formulir
Pemeriksaan manusiaBot yang menjalankan browser sungguhanAtur Spam check ke Ikiform. Kiriman fetch dari browser kemudian butuh token dari challenge()

Spam mendapat jawaban sukses yang sama dengan kiriman asli, tidak mengirim email atau webhook, dan tidak dihitung dalam pemakaian. Pengunjung asli yang menempel tiga tautan di komentar bisa memicu aturan tautan bersama aturan pengulangan, jadi sesekali lihat filter Spam. Menandai jawaban sebagai bukan spam akan mengirim webhook-nya saat itu. Dokumentasi spam menjelaskan setiap pemeriksaan.

Baca jawabannya

Baca setiap komentar di minggu-minggu pertama. Setelah itu, tampilan yang berguna adalah skor rata-rata per halaman, dari yang terendah, dengan komentarnya di sebelahnya.

Ekspor

Buka Submissions, pilih formulir feedback, pilih rentang tanggal, lalu Export CSV. Kolomnya adalah id, created_at, form, dan status, lalu satu kolom per field, jadi dengan field di atas rating ada di kolom E dan page di kolom H. Satu ekspor memuat hingga 100.000 baris; panduan ekspor membahas API untuk jumlah yang lebih besar.

Impor file ke Google Sheets dan tempel ini di sheet kosong. Hasilnya mendaftar setiap halaman dengan skor rata-rata dan jumlah jawabannya, dari yang terburuk:

Google Sheets
=QUERY(A2:H, "select H, avg(E), count(E) where D = 'received' and E is not null group by H order by avg(E) asc label avg(E) 'average', count(E) 'answers'", 0)
  1. Abaikan halaman yang hanya punya satu atau dua jawaban. Satu pengunjung yang marah bukanlah tren.
  2. Baca komentar di tiga halaman dengan skor terendah. Perbaikannya biasanya ada di beberapa komentar pertama.
  3. Setelah Anda mengubah halaman, bandingkan rata-ratanya untuk minggu-minggu sebelum dan sesudahnya, bukan angka sepanjang masa.
Feedback tidak anonim bagi Ikiform meskipun tanpa email: setiap jawaban mencatat user agent, origin, referrer, dan negara, serta hash IP yang tidak pernah dikembalikan. Sebutkan apa yang Anda kumpulkan di pemberitahuan privasi Anda.

Pilih situasi Anda

Formulir di atas mencakup reaksi cepat di halaman mana pun. Halaman-halaman ini membahas feedback dengan tugas berbeda: bug yang perlu direproduksi, permintaan yang perlu ditimbang, skor yang perlu dipantau, atau pelanggan yang akan pergi.

Pastikan berfungsi

Periksa daftar ini sebelum memasang formulir di setiap halaman. Ikiform tidak punya paket gratis. Pengujian gratis: workspace tanpa paket menerima 50 kiriman uji per bulan dari localhost. Untuk go live, pilih Pro mulai $6/bln untuk 500 kiriman, atau bayar sekali: 10.000 kiriman seharga $49 atau 50.000 kiriman seharga $149, dengan kredit yang tidak pernah kedaluwarsa. Lihat harga.

  1. Di Allowed domains formulir, tambahkan domain situs Anda, ditambah localhost selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
  2. Pilih skor, tulis komentar, lalu kirim. Baris terima kasih menggantikan formulir, atau browser mendarat di halaman redirect Anda untuk versi HTML biasa.
  3. Buka Submissions di dashboard. Jawabannya menampilkan rating sebagai angka dan page dengan path lengkap.
  4. Kirim skor 6 dengan curl atau konsol browser. Ikiform menjawab 422 dengan menyebut rating.
  5. Cek inbox setiap penerima notifikasi. Masing-masing mendapat email berisi field, dan Reply terkirim ke pengirim formulir jika formulir punya field email.
  6. Kirim skor 1. Relay Anda meneruskannya ke chat tim, dan pengiriman di Webhooks menunjukkan succeeded.
  7. Kirim dengan honeypot terisi, _gotcha=bot. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.
  8. Tidak ada yang masuk? Ubah filter status di dashboard ke Spam. Spam mendapat jawaban sukses yang sama dengan kiriman asli.

Pemecahan masalah

MasalahYang harus dilakukan
403 origin_not_allowed, atau setiap kiriman masuk ke spamDomain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan.
422 dengan Rating must be at most 5Formulir mengirim skor yang lebih tinggi dari max field. Ubah nilai radio atau naikkan max di definisi, hingga 10.
422 dengan Unknown fieldFormulir mengirim nama yang tidak ada di definisi, sering kali input tersembunyi yang baru. Tambahkan field dengan ID itu, atau hapus inputnya.
page kosongScript yang mengisinya tidak berjalan, atau berjalan sebelum formulirnya ada. Letakkan script setelah formulir, atau atur page saat submit seperti pada contoh SPA.
meta.referrer hanya menampilkan domain AndaMemang begitu. Secara default browser hanya mengirim origin pada kiriman lintas situs. Gunakan field page sebagai gantinya.
Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datangKiriman itu disimpan sebagai spam. Spam tidak mengirim apa pun. Buka di filter Spam untuk melihat alasannya, dan tandai sebagai bukan spam untuk mengirim email dan webhook-nya.
429 rate_limitedSatu pengunjung mengirim melebihi rate limit formulir. Standard mengizinkan 5 per menit per pengunjung. Tunggu sesuai Retry-After, atau pilih Relaxed atau Custom untuk formulir yang mengirim dari satu IP bersama.
402 test_limit_reachedWorkspace belum punya paket dan sudah memakai 50 uji gratis dari localhost bulan ini. Pilih paket, atau pakai Send test di dashboard.

Pertanyaan

Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.