This is the implementation recipe for a Typeform you've already decided to move. Fillo doesn't read the Typeform URL or account, so start by writing down how the source form behaves.
For archive, effort, cutover, and rollback decisions, read Migrate from Typeform.
Write the map before the schema
For each Typeform question, record:
- its Typeform reference and visible label;
- the permanent Fillo field ID and option IDs;
- required state and validation;
- branches that read the answer;
- URL parameters, variables, or recalled values;
- file and integration dependencies;
- the ending reached from each path.
Export responses and files before changing the source. Keep that history outside Fillo.
Translate screens into pages
One Typeform screen can map to one Fillo page, but it doesn't have to. Keep one question per page when the pacing helps; group short related questions when another screen adds nothing.
import { defineForm, when } from "@usefillo/core";
export const feedback = defineForm({
id: "product-feedback",
title: "Product feedback",
pages: [
{
id: "score",
blocks: [
{
id: "rating",
kind: "linear_scale",
label: "How likely are you to recommend us?",
min: 0,
max: 10,
insightsMetric: "nps",
required: true,
},
],
next: [
{ when: [when("rating").lt(7)], to: "follow-up" },
{ when: [when("rating").gt(6)], to: "end" },
],
},
{
id: "follow-up",
blocks: [
{
id: "improvement",
kind: "long_text",
label: "What should we improve?",
},
],
},
],
settings: {
showProgress: true,
submitLabel: "Send feedback",
successTitle: "Feedback received",
},
});Keep field and option IDs tied to what they store. Editing a label later shouldn't rename historical answers or break a branch.
Translate behavior explicitly
| Typeform behavior | Fillo implementation |
|---|---|
| Branch to another question | Put related questions on pages and use page next rules |
| Show a question conditionally | Add visibleIf to the field schema |
| Recall an answer | Use answer piping in respondent-facing copy |
| Hidden field or URL parameter | Use a hidden field, URL prefill, or initialData |
| File question | Connect storage, then add file_upload |
| Several endings | Route to an application-owned result page or redesign around Fillo pages |
| Score, calculation, or payment | Calculate or collect it in a trusted external system |
Reconnect Sheets, Notion, Slack, Zapier, webhooks, email, and upload storage in Fillo. None of those settings come over from the Typeform.
Test matching cases
Run the same cases through both forms and compare:
- page and branch sequence;
- stored values and option IDs;
- required and invalid input;
- prefilled and hidden values;
- completion route;
- file access;
- response and destination payloads;
- desktop, narrow, keyboard, error, and success states.
Replace one Typeform link or embed first, and keep its old URL ready until the Fillo response and every required destination hold up under real traffic.
Try it
Start with a prompt and your coding agent builds the first form, staged for your review — or open the editor.
Related
- Job application example: Inspect explicit pages and progress in the live renderer.
- Typeform logic guide: Inventory source branching, calculations, and endings.
- Typeform response export: Preserve rows and files.
- Code-defined forms: Review stable IDs and sync rules.
- Logic: Implement visibility and page routing.