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.
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.
- Seseorang menjelaskan apa yang ingin dilakukannya, memilih area dan dampak, lalu meninggalkan email.
- Relay webhook memasukkan permintaan ke database Anda, sekali per ID kiriman.
- Setiap minggu Anda memberi tag tema pada permintaan baru, secara manual atau dengan pola.
- Jika cocok dengan tema yang ada, tema itu kini punya satu orang lagi di belakangnya.
- Jika tidak, permintaan itu memulai tema baru.
- Saat sebuah tema rilis, Anda memilih setiap email di dalamnya dan mengirim satu pesan.
Tanyakan masalahnya
Pratinjau
Menjalankan validator Ikiform di browser Anda. Tidak ada yang dikirim.
problem punya minimum 30 karakter, yang mengubah "dark mode dong" menjadi kalimat yang berisi alasan.| Field | Alasan ada di sini |
|---|---|
problem | Tugas yang ingin dicapai, dengan kata-kata mereka. Sejauh ini field paling berguna |
workaround | Menunjukkan seberapa menyakitkan masalahnya. "Saya menyalinnya ke spreadsheet secara manual" adalah sinyal kuat |
area | Pemilahan awal yang kasar, jadi Anda memberi tag di dalam penagihan, bukan di semua hal |
impact | Memisahkan pelanggan yang terhambat dari yang sekadar penasaran, ditulis sebagai dampak yang bisa dinilai orang |
email | Wajib. 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.
<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:
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:
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 });
}verifyWebhookmenolak apa pun yang tidak ditandatangani dengan secretwhsec_endpoint Anda.on conflict (submission_id) do nothingmembuat 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.
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.
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:
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;- Baca teks
problemdari tiga tema teratas secara lengkap sebelum Anda mendesain apa pun. - Perhatikan cara-cara yang dipakai untuk mengakalinya. Sering kali satu perubahan kecil menghilangkan bagian terburuknya.
- 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:
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
- Kirim permintaan dengan masalah sepanjang 10 karakter. Ikiform menjawab
422dengan menyebutproblem. - Kirim permintaan sungguhan. Permintaan itu muncul di Submissions dan sebagai baris di
feature_requests. - Di Webhooks, kirim ulang pengirimannya. Tabel tetap punya satu baris untuk kiriman itu.
- 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
| Masalah | Yang harus dilakukan |
|---|---|
| Baris tidak muncul di tabel | Buka endpoint di Webhooks. 400 berarti secret-nya salah; 500 dengan error database berarti insert gagal dan Ikiform sedang mencoba ulang. |
422 validation_failed | Kiriman 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 datang | Kiriman 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
Apa yang ingin dilakukan orang itu, bagaimana mereka melakukannya sekarang, bagian produk mana yang terkait, seberapa penting hal itu, dan email. Menanyakan masalahnya alih-alih fiturnya memberi Anda ruang untuk menemukan perbaikan yang lebih baik.
Anggap itu wajar dan hitung orangnya, bukan barisnya. Beri tag tema pada setiap permintaan dan urutkan tema berdasarkan email yang berbeda. Ikiform menyimpan setiap kiriman dan tidak menggabungkan pengulangan.
Tidak dengan formulir saja. Formulir menjaga permintaan tetap privat; papan publik seperti Canny menambahkan voting. Menghitung orang berbeda per tema memberi Anda padanan yang privat.
Simpan email bersama setiap permintaan, pilih setiap email di tema yang sudah rilis, dan kirim satu pesan dari alat email Anda. Ikiform sendiri tidak mengirim email ke pengirim formulir.
Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.