Feedback-Formular für eine Website oder App6 Min. Lesezeit
Feature-Wünsche sammeln, die du zählen, gewichten und beantworten kannst
Ein Formular für Feature-Wünsche, das nach dem Problem statt nach der Lösung fragt, Wünsche nach Thema speichert, Personen statt Zeilen zählt und sie beim Release anschreibt.
Frag, was die Person erreichen will und wie sie es heute macht, nicht welches Feature sie möchte, und mach die E-Mail zur Pflicht, damit du ihr Bescheid geben kannst, wenn es erscheint. Speichere jeden Wunsch per Webhook in einer Tabelle, ordne Wünsche Themen zu und gewichte Themen danach, wie viele verschiedene Personen blockiert sind. Wenn ein Thema erscheint, schreib allen, die danach gefragt haben.
Was an Feature-Wünschen anders ist
Ein Bug-Report ist erledigt, wenn der Fehler behoben ist. Ein Feature-Wunsch ist ein Datenpunkt: einer von vielen Menschen, die dieselbe Lücke mit anderen Worten beschreiben. Daraus folgen drei Dinge:
- Leute beschreiben Lösungen. „Fügt einen CSV-Button hinzu“ kann heißen „meine Steuerberaterin braucht die Rechnungen vom letzten Monat“. Frag nach der Aufgabe, dann kannst du eine bessere Lösung wählen als die gewünschte.
- Derselbe Bedarf kommt viele Male an. Ikiform speichert jeden Post und führt Wiederholungen nicht zusammen, und zwei Leute benutzen ohnehin selten dieselben Worte. Du gruppierst Wünsche selbst nach Thema und zählst verschiedene Personen.
- Der Wert liegt in der Rückmeldung. Jemandem zu sagen „du hast gefragt, wir haben es gebaut“ ist der beste Grund, überhaupt zu fragen. Dafür braucht jeder Wunsch eine E-Mail, deshalb ist sie in diesem Formular Pflicht.
- Jemand beschreibt, was er erreichen will, wählt einen Bereich und eine Auswirkung und hinterlässt eine E-Mail.
- Ein Webhook-Relay fügt den Wunsch in deine Datenbank ein, einmal pro Einsendungs-ID.
- Jede Woche ordnest du neue Wünsche einem Thema zu, von Hand oder mit einem Muster.
- Passt er zu einem bestehenden Thema, steht hinter diesem Thema jetzt eine Person mehr.
- Wenn nicht, beginnt er ein neues Thema.
- Wenn ein Thema erscheint, wählst du jede E-Mail darin aus und schickst eine Nachricht.
Nach dem Problem fragen
Vorschau
Führt den Validator von Ikiform in deinem Browser aus. Es wird nichts gesendet.
problem hat ein Minimum von 30 Zeichen, was aus „dark mode pls“ einen Satz mit einer Begründung macht.| Feld | Warum es da ist |
|---|---|
problem | Die Aufgabe, in ihren eigenen Worten. Mit Abstand das nützlichste Feld |
workaround | Zeigt dir, wie schmerzhaft es ist. „Ich kopiere es von Hand in eine Tabelle“ ist ein starkes Signal |
area | Eine grobe erste Sortierung, damit du innerhalb der Abrechnung zuordnest, nicht über alles hinweg |
impact | Trennt blockierte Kunden von neugierigen, formuliert als Ergebnisse, die Leute beurteilen können |
email | Pflicht. Ohne sie kannst du keine Rückmeldung geben und keine Frage stellen |
Lass ein Prioritäts- oder Abstimmungsfeld weg. Jeder markiert seinen eigenen Wunsch als hohe Priorität, und die Zahl der Personen pro Thema ist eine bessere Abstimmung als jeder Button.
Das Formular
Das Formular braucht kein Skript: Es sendet und leitet weiter. Setze Redirect after submit auf eine Seite, die sagt, was als Nächstes passiert. Für eine Version, die in deinem Framework auf der Seite bleibt, nimm den Formularcode der Hauptanleitung und setze diese Felder ein.
<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>Wünsche per Webhook speichern
Dashboard und CSV-Export reichen für die ersten paar Dutzend Wünsche. Sobald du jede Woche Themen zuordnest und Personen zählst, ist eine Tabelle einfacher. Leg eine in Postgres an:
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
);Füge dann in Ikiform einen Webhook-Endpunkt hinzu, der auf diese Route zeigt. Sie läuft auf jedem Node-Host mit dem Paket pg, und dein eigener Server behandelt dasselbe Muster ausführlicher:
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 });
}verifyWebhooklehnt alles ab, was nicht mit demwhsec_-Secret deines Endpunkts signiert ist.on conflict (submission_id) do nothingmacht Wiederholungen sicher. Ikiform sendet eine fehlgeschlagene Zustellung mit derselben Einsendung erneut, und das zweite Insert bewirkt nichts.- Ein Datenbankfehler wirft eine Exception, die Route antwortet mit
500, und Ikiform versucht es später erneut. Bei einem Neustart der Datenbank gehen dir keine Wünsche verloren. - Die E-Mail wird beim Eintreffen in Kleinbuchstaben umgewandelt, damit das Zählen verschiedener Personen funktioniert.
Zuordnen und gewichten
Neue Wünsche zuordnen
Lies einmal pro Woche die Zeilen ohne Thema und gib jeder eins. Muster erledigen die offensichtlichen; den Rest liest du selbst, denn die interessanten Wünsche passen zu keinem Muster.
update feature_requests
set theme = 'invoice-export'
where theme is null
and area = 'billing'
and problem ilike any (array['%export%', '%accountant%', '%download%']);Themen gewichten
Das hier ordnet Themen danach, wie viele Wünsche angeben, blockiert zu sein, und dann danach, wie viele verschiedene Personen gefragt haben:
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;- Lies die
problem-Texte der drei wichtigsten Themen vollständig, bevor du irgendetwas entwirfst. - Sieh dir die Workarounds an. Oft beseitigt eine kleine Änderung das Schlimmste.
- Wäge die Rangfolge gegen deinen Plan ab; sie zeigt Nachfrage, nicht, was richtig zu bauen ist.
Rückmeldung geben
Wenn ein Thema erscheint, hol dir alle, die danach gefragt haben:
select distinct email
from feature_requests
where theme = 'invoice-export';Schick eine kurze E-Mail aus deinem E-Mail-Tool oder deinem eigenen Posteingang, die sagt, was erschienen ist, und darauf verlinkt. Ikiform schreibt der Person, die das Formular ausfüllt, keine E-Mail. Benachrichtigungs-E-Mails gehen nur an dich und dein Team, es gibt also keinen Autoresponder, keine Bestätigungs-E-Mail und kein Double Opt-in. Verschick diese aus deinem E-Mail-Tool, ausgelöst durch einen Webhook. Dasselbe gilt hier: Die Launch-E-Mail kommt von dir, nicht von Ikiform.
Prüfen, ob es funktioniert
- Sende einen Wunsch mit einem Problem von 10 Zeichen. Ikiform antwortet mit
422und nenntproblem. - Sende einen echten Wunsch. Er erscheint unter Submissions und als Zeile in
feature_requests. - Sende die Zustellung unter Webhooks erneut. Die Tabelle hat für diese Einsendung weiterhin eine Zeile.
- Sende zweimal mit derselben E-Mail in unterschiedlicher Schreibweise. Die Rangfolge-Abfrage zählt eine Person.
Stolperfallen
- Ein öffentliches Feedback-Board wie Canny bietet Abstimmungen und eine öffentliche Statusseite. Sollen Kunden die Wünsche der anderen sehen, ist das das bessere Tool; dieses Setup hält Wünsche privat.
- Wünsche mit mehreren Links können als Spam gewertet werden. Prüf den Filter Spam wöchentlich, solange das Aufkommen gering ist.
- Fügst du später eine Option für
areahinzu, ergänze sie zuerst in der Definition. Ein nicht gelisteter Wert wird abgelehnt. - Speichere, was du brauchst, und nicht mehr. Eine Tabelle mit Wünschen und E-Mails enthält personenbezogene Daten; nenne das in deiner Datenschutzerklärung und lösche Zeilen, die du nicht mehr brauchst.
Fehlerbehebung
| Problem | Was zu tun ist |
|---|---|
| Zeilen fehlen in der Tabelle | Öffne den Endpunkt unter Webhooks. Ein 400 bedeutet, dass das Secret falsch ist; ein 500 mit einem Datenbankfehler bedeutet, dass das Insert fehlgeschlagen ist und Ikiform es erneut versucht. |
422 validation_failed | Der Post passt nicht zur Felddefinition des Formulars. error.fields nennt jedes Feld und den Grund. Gleiche den name des Eingabefelds an die Feld-ID an. |
| Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam an | Sie wurde als Spam gespeichert. Spam löst nichts aus. Öffne sie unter dem Filter Spam, um die Gründe zu sehen, und markiere sie als kein Spam, um ihre E-Mail und Webhooks zu senden. |
Fragen
Was die Person erreichen will, wie sie es heute macht, welchen Teil des Produkts es betrifft, wie wichtig es ist und eine E-Mail. Wer nach dem Problem statt nach dem Feature fragt, hat Raum für eine bessere Lösung.
Rechne damit und zähle Personen, nicht Zeilen. Ordne jeden Wunsch einem Thema zu und gewichte Themen nach verschiedenen E-Mails. Ikiform speichert jede Einsendung und führt Wiederholungen nicht zusammen.
Nicht mit einem Formular allein. Ein Formular hält Wünsche privat; ein öffentliches Board wie Canny bietet Abstimmungen. Verschiedene Personen pro Thema zu zählen, ist das private Gegenstück.
Bewahre die E-Mail bei jedem Wunsch auf, wähle jede E-Mail im umgesetzten Thema aus und schick eine Nachricht aus deinem E-Mail-Tool. Ikiform schreibt Einsendenden nicht selbst.
Hängst du bei einem Schritt fest oder willst eine Anleitung für deinen Fall? Schreib an hello@ikiform.com.