Formulir feedback untuk website atau aplikasi

Formulir feedback untuk website atau aplikasi6 menit baca

Kumpulkan permintaan fitur yang bisa Anda hitung, urutkan, dan tanggapi

Formulir permintaan fitur yang menanyakan masalahnya alih-alih solusinya, menyimpan permintaan per tema, menghitung orang bukan baris, dan mengirim email saat fiturnya rilis.

Preet SutharPendiri, Ikiform

Tanyakan apa yang ingin dilakukan orang itu dan bagaimana mereka melakukannya sekarang, bukan fitur apa yang mereka inginkan, dan wajibkan email agar Anda bisa memberi tahu saat fiturnya rilis. Simpan setiap permintaan di tabel lewat webhook, beri tag tema, dan urutkan tema berdasarkan berapa banyak orang berbeda yang terhambat. Saat sebuah tema rilis, kirim email ke semua yang memintanya.

Apa yang berbeda dari permintaan fitur

Laporan bug selesai saat diperbaiki. Permintaan fitur adalah titik data: satu dari banyak orang yang menggambarkan celah yang sama dengan kata-kata berbeda. Ada tiga konsekuensinya:

  • Orang menggambarkan solusi. "Tambahkan tombol CSV" mungkin berarti "akuntan saya butuh invoice bulan lalu". Tanyakan tugasnya, dan Anda bisa memilih perbaikan yang lebih baik dari yang diminta.
  • Kebutuhan yang sama datang berkali-kali. Ikiform menyimpan setiap kiriman dan tidak menggabungkan pengulangan, dan dua orang jarang memakai kata yang sama. Anda sendiri yang mengelompokkan permintaan per tema dan menghitung orang yang berbeda.
  • Nilainya ada di tindak lanjut. Memberi tahu seseorang "Anda meminta, kami membangunnya" adalah alasan terbaik untuk bertanya. Itu butuh email di setiap permintaan, jadi formulir ini mewajibkannya.
Cara permintaan fitur menjadi tema yang dihitung dan email peluncuranpermintaandikirimmasalah,area,dampak,emailbarisditabelAndadikunciIDkirimancocokdengantema?Andaberitagtiapminggujumlahtema +1orangberbeda,yangterhambatdulutemarilisemailsemuayangmemintatemabarumulaidarisatuorangwebhookyabuildtidakCara permintaan fitur menjadi tema yang dihitung dan email peluncuranpermintaandikirimmasalah, area, dampak,emailbaris di tabelAndadikunci ID kirimancocok dengantema?Anda beri tagtiap minggujumlah tema + 1orang berbeda, yangterhambat dulutema rilisemail semua yangmemintatema barumulai darisatu orangwebhookyabuildtidak
  1. Seseorang menjelaskan apa yang ingin dilakukannya, memilih area dan dampak, lalu meninggalkan email.
  2. Relay webhook memasukkan permintaan ke database Anda, sekali per ID kiriman.
  3. Setiap minggu Anda memberi tag tema pada permintaan baru, secara manual atau dengan pola.
  4. Jika cocok dengan tema yang ada, tema itu kini punya satu orang lagi di belakangnya.
  5. Jika tidak, permintaan itu memulai tema baru.
  6. Saat sebuah tema rilis, Anda memilih setiap email di dalamnya dan mengirim satu pesan.
Peringkatnya adalah jumlah orang per tema, bukan jumlah permintaan mentah. Satu pelanggan yang meminta lima kali tetap satu pelanggan.

Tanyakan masalahnya

Pratinjau

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

Seberapa penting hal ini?

Kami akan menulis saat fitur ini rilis, atau jika kami punya pertanyaan.

problem punya minimum 30 karakter, yang mengubah "dark mode dong" menjadi kalimat yang berisi alasan.
FieldAlasan ada di sini
problemTugas yang ingin dicapai, dengan kata-kata mereka. Sejauh ini field paling berguna
workaroundMenunjukkan seberapa menyakitkan masalahnya. "Saya menyalinnya ke spreadsheet secara manual" adalah sinyal kuat
areaPemilahan awal yang kasar, jadi Anda memberi tag di dalam penagihan, bukan di semua hal
impactMemisahkan pelanggan yang terhambat dari yang sekadar penasaran, ditulis sebagai dampak yang bisa dinilai orang
emailWajib. Tanpanya Anda tidak bisa menindaklanjuti atau mengajukan pertanyaan

Jangan sertakan field prioritas atau voting. Semua orang menandai permintaannya sendiri sebagai prioritas tinggi, dan jumlah orang per tema adalah voting yang lebih baik daripada tombol apa pun.

Formulirnya

Formulir ini tidak butuh script: ia mengirim lalu me-redirect. Atur Redirect after submit ke halaman yang menjelaskan apa yang terjadi selanjutnya. Untuk versi yang tetap di halaman dalam framework Anda, ambil kode formulir dari pilar dan ganti dengan field-field ini.

feature-request.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="problem">What are you trying to do?</label>
  <textarea id="problem" name="problem" rows="5" required minlength="30"
    placeholder="Send last month's invoices to our accountant in one go"></textarea>
  <label for="workaround">How do you do it today?</label>
  <textarea id="workaround" name="workaround" rows="3"></textarea>
  <label for="area">Which part of the product?</label>
  <select id="area" name="area" required>
    <option value="billing">Billing and invoices</option>
    <option value="reports">Reports</option>
    <option value="team">Team and permissions</option>
    <option value="integrations">Integrations and API</option>
    <option value="other">Something else</option>
  </select>
  <fieldset>
    <legend>How much does it matter?</legend>
    <label><input type="radio" name="impact" value="blocking" required /> It stops us using the product for something</label>
    <label><input type="radio" name="impact" value="slow" /> It costs us time every week</label>
    <label><input type="radio" name="impact" value="nice" /> It would be nice</label>
  </fieldset>
  <label for="email">Email</label>
  <input id="email" name="email" type="email" required />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send request</button>
</form>

Simpan permintaan lewat webhook

Dashboard dan ekspor CSV cukup untuk beberapa puluh permintaan pertama. Begitu Anda memberi tag tema dan menghitung orang setiap minggu, tabel lebih mudah. Buat satu di Postgres:

schema.sql
create table feature_requests (
  submission_id text primary key,
  area text not null,
  impact text not null,
  problem text not null,
  workaround text,
  email text not null,
  theme text,
  created_at timestamptz not null
);

Lalu tambahkan endpoint webhook di Ikiform yang mengarah ke route ini. Route ini berjalan di host Node mana pun dengan paket pg, dan server Anda sendiri membahas pola yang sama lebih dalam:

app/api/feature-requests/route.ts
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";
import { Pool } from "pg";

const pool = new Pool({ connectionString: process.env.DATABASE_URL });

const INSERT = `insert into feature_requests (submission_id, area, impact, problem, workaround, email, created_at)
values ($1, $2, $3, $4, $5, lower($6), $7)
on conflict (submission_id) do nothing`;

export async function POST(request: Request) {
  const payload = await request.text();
  let event;
  try {
    event = await verifyWebhook({
      payload,
      headers: request.headers,
      secret: process.env.IKIFORM_WEBHOOK_SECRET!,
    });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
  if (event.type !== "submission.created") return new Response(null, { status: 204 });

  const { problem, workaround, area, impact, email } = event.data.fields;
  await pool.query(INSERT, [
    event.data.submission_id,
    area,
    impact,
    problem,
    workaround ?? null,
    email,
    event.data.created_at,
  ]);
  return new Response(null, { status: 204 });
}
  • verifyWebhook menolak apa pun yang tidak ditandatangani dengan secret whsec_ endpoint Anda.
  • on conflict (submission_id) do nothing membuat percobaan ulang aman. Ikiform mengirim ulang pengiriman yang gagal dengan kiriman yang sama, dan insert kedua tidak berpengaruh apa-apa.
  • Error database akan melempar exception, route menjawab 500, dan Ikiform mencoba ulang nanti. Anda tidak kehilangan permintaan saat database di-restart.
  • Email diubah menjadi huruf kecil saat masuk, sehingga penghitungan orang yang berbeda berfungsi.
Ikiform tidak menggabungkan atau menolak kiriman berulang berdasarkan email. Pengulangan identik dalam 24 jam hanya menambah skor spam. Lakukan deduplikasi di tempat daftar itu disimpan, atau saat Anda mengekspor.

Beri tag dan urutkan

Beri tag permintaan baru

Seminggu sekali, baca baris yang belum diberi tag dan beri masing-masing sebuah tema. Pola menangani yang jelas; baca sisanya sendiri, karena permintaan yang menarik tidak cocok dengan pola.

tag.sql
update feature_requests
set theme = 'invoice-export'
where theme is null
  and area = 'billing'
  and problem ilike any (array['%export%', '%accountant%', '%download%']);

Urutkan tema

Query ini mengurutkan tema berdasarkan berapa banyak permintaan yang menyatakan terhambat, lalu berdasarkan berapa banyak orang berbeda yang meminta:

ranking.sql
select coalesce(theme, 'untagged') as theme,
       count(*) as requests,
       count(distinct email) as people,
       count(*) filter (where impact = 'blocking') as blocking
from feature_requests
group by 1
order by blocking desc, people desc;
  1. Baca teks problem dari tiga tema teratas secara lengkap sebelum Anda mendesain apa pun.
  2. Perhatikan cara-cara yang dipakai untuk mengakalinya. Sering kali satu perubahan kecil menghilangkan bagian terburuknya.
  3. Timbang peringkat itu dengan rencana Anda; peringkat menunjukkan permintaan, bukan apa yang tepat untuk dibangun.

Tindak lanjuti

Saat sebuah tema rilis, ambil semua orang yang memintanya:

notify.sql
select distinct email
from feature_requests
where theme = 'invoice-export';

Kirim satu email singkat dari alat email Anda atau inbox Anda sendiri, sebutkan apa yang rilis dan sertakan tautannya. Ikiform tidak mengirim email ke orang yang mengisi formulir. Email notifikasi hanya dikirim ke Anda dan tim Anda, jadi tidak ada autoresponder, email konfirmasi, atau double opt-in. Kirim semua itu dari alat email Anda, dipicu oleh webhook. Hal yang sama berlaku di sini: email peluncuran datang dari Anda, bukan dari Ikiform.

Pastikan berfungsi

  1. Kirim permintaan dengan masalah sepanjang 10 karakter. Ikiform menjawab 422 dengan menyebut problem.
  2. Kirim permintaan sungguhan. Permintaan itu muncul di Submissions dan sebagai baris di feature_requests.
  3. Di Webhooks, kirim ulang pengirimannya. Tabel tetap punya satu baris untuk kiriman itu.
  4. Kirim dua kali dengan email yang sama dalam huruf besar-kecil berbeda. Query peringkat menghitungnya sebagai satu orang.

Hal yang sering menjebak

  • Papan feedback publik, seperti Canny, menambahkan voting dan halaman status publik. Jika Anda ingin pelanggan melihat permintaan satu sama lain, itu alat yang lebih baik; penyiapan ini menjaga permintaan tetap privat.
  • Permintaan yang berisi beberapa tautan bisa dinilai sebagai spam. Periksa filter Spam setiap minggu selama volumenya masih rendah.
  • Jika nanti Anda menambahkan opsi area, tambahkan ke definisi terlebih dahulu. Nilai yang tidak terdaftar akan ditolak.
  • Simpan yang Anda butuhkan dan tidak lebih. Tabel permintaan berisi email adalah data pribadi; sebutkan di pemberitahuan privasi Anda dan hapus baris yang tidak lagi Anda butuhkan.

Pemecahan masalah

MasalahYang harus dilakukan
Baris tidak muncul di tabelBuka endpoint di Webhooks. 400 berarti secret-nya salah; 500 dengan error database berarti insert gagal dan Ikiform sedang mencoba ulang.
422 validation_failedKiriman tidak cocok dengan definisi field formulir. error.fields menyebutkan setiap field dan alasannya. Samakan name input dengan ID field.
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.

Pertanyaan

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