Typeform is a hosted form builder known for one-question-at-a-time forms that you share as a link or embed. Fillo renders forms as native components inside your app and handles validation, uploads, and responses behind them.
At a glance
| Typeform | Fillo | |
|---|---|---|
| Where it renders | Typeform page, or an iframe placed by the Embed SDK as inline, popup, slider, popover, or side tab | Native React or DOM components on your own route, or a Fillo-hosted page |
| Styling | Typeform themes. Embedded forms don't accept custom CSS (Typeform community) | Your CSS and components. The default stylesheet is optional |
| Form definition | Typeform builder, or the Create API | Fillo editor, or a typed defineForm() schema in your repo |
| File uploads | 10 MB per file, kept with the Typeform response (File Upload question) | 500 MB per file by default, configurable up to 5,000 MB, sent from the browser to your Google Drive, Box, S3, or R2 |
| Logic | Branching, scores, and calculations | Visibility rules, page jumps, early completion, and numeric calculated fields |
| Payments | Stripe payment questions on paid plans | No payment field |
| Pricing | 100, 1,000, or 10,000 responses a month on Basic, Plus, or Business, shared across all forms (pricing). At the limit, forms go private until the next month or an upgrade (response limits) | Free includes 200 completed responses a month. Everything starts at €35 or $39 a month for 5,000, with 25,000 and 100,000 tiers. Going over the allowance never stops a form or adds a charge |
| Integrations | Webhooks, a Responses API, and app integrations | Signed webhooks, a Management API, native Slack, Notion, Google Sheets, HubSpot, and Discord destinations, plus Zapier and n8n apps |
When Fillo fits
- The form sits inside a signed-in product flow and should look like the rest of the app.
- Your own components render the fields, with no iframe between them and your page.
- The form definition lives in your repo and goes through code review.
- Respondents send files over 10 MB, and the files belong in your own storage.
- Each response should carry your app's user ID, verified by your server.
When Typeform is enough
- You collect payments inside the form. Fillo has no payment field.
- Different answers lead to different ending screens. A Fillo form has one completion screen or redirect, so answer-based routing happens in your app after submit.
Moving from Typeform
Fillo doesn't import Typeform forms or responses, so a move is a rebuild. Numeric calculations such as totals carry over as calculated fields.
- Export responses as CSV and file uploads as a .zip (Typeform export).
- Map each Typeform question to a stable Fillo field ID with the table below.
- Rebuild the form in the editor or as a
defineForm()schema. - Connect storage and reconnect every webhook and integration.
- Run the same test answers through both forms and compare what's stored.
- Replace one embed or link first, then the rest once deliveries look right.
| Typeform question | Fillo field | Check |
|---|---|---|
| Text and number questions | short_text, long_text, email, phone, number, date | Required state and value format |
| Choice questions | select, multi_select, or dropdown | Stable option IDs |
| One question per screen | One field per page, or related fields grouped on one page | Keyboard flow and mobile height |
| Branching and hidden fields | visibleIf, page next rules, hidden fields, and prefill | Every path and URL parameter |
| File upload | file_upload | Connected storage, file types, and size |
| Numeric calculation | calculated | Same operands and rounding |
| Several endings | One completion screen, then routing in your app | Where each path ends up |
Before you switch traffic, confirm:
- Responses and files are exported, with the question map stored beside them
- Every branch, prefill value, and validation rule matches the original
- Storage and each destination received a realistic test response
- The old embed or link is ready to restore if something breaks
Old Typeform responses stay in your export. They can't be imported as Fillo responses.
Related
- Embed a Fillo form: Render the form with React, the DOM package, or a hosted page.
- Logic: Rebuild branching with visibility rules and page jumps.
- Why iframe form embeds break: What changes when the form leaves the iframe.
- Plans and limits: Response, upload, and branding limits.