A Fillo quiz is a form with stable answer option IDs plus a scoring step your application owns. Fillo doesn't currently do arbitrary calculations, so keep the answer key out of the browser whenever the score has operational value.
Define the questions
const quiz = defineForm({
id: "product-basics-quiz",
title: "Product basics",
pages: [
{
id: "questions",
blocks: [
{
id: "storage",
kind: "select",
label: "Where do Fillo uploads go?",
required: true,
options: [
{ id: "customer", label: "Connected customer storage" },
{ id: "browser", label: "Browser local storage" },
{ id: "email", label: "An email attachment" },
],
},
{
id: "renderer",
kind: "select",
label: "What does the React renderer produce?",
required: true,
options: [
{ id: "native", label: "Native DOM" },
{ id: "image", label: "A static image" },
],
},
],
},
],
settings: { submitLabel: "Check answers", successTitle: "Answers received" },
});Score accepted responses
Build an answer key keyed by field and option ID. In a verified webhook consumer or backend job, compare the raw answers, persist the score in your own system, and serve any personalized result from your application. Don't ship a secret certification answer key in client code.
Use the response ID as your idempotency key. Webhooks can be retried, and scoring must never award credit twice.
Test the complete path
Submit one perfect, one partial, and one invalid attempt. Confirm required validation, raw option IDs, scoring, duplicate delivery handling, and the completion experience. If respondents need their score immediately, redirect to an application route that reads the stored result after the submission is accepted.
Try it
Start with a prompt and your coding agent builds the first form, staged for your review — or open the editor.
Related
- Approval vote example: See a live choice-based form before adding scoring.
- Logic: Branch pages based on earlier quiz answers.
- Webhooks: Score accepted responses in a durable consumer.
- Select field: Keep option IDs stable while labels evolve.