A form builder with conditional logic, payments and direct writes into databases and CRMs, aimed at forms that do something rather than just collect answers.
Build me a form builder that replaces Fillout — and know why this is ALMOST. Forms with logic are a fortnight. What you are paying for is **writing a response straight into other systems** — a database product, a CRM, a spreadsheet — without maintaining an integration. Each of those is an adapter with authentication, field mapping, rate limits and a schema that changes underneath you. That maintenance is the recurring cost and the reason for the verdict. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode - One payment provider, hosted checkout - Caddy in front THE DATA MODEL - forms: id, slug, name, version, definition_json, theme_json, status, published_at - form_versions: id, form_id, version, definition_json, published_at — a submission records the version it answered, so an edit never rewrites what somebody said - submissions: id, form_id, form_version, token, status, started_at, submitted_at, ip_hash, referrer_host, country, payment_id - answers: id, submission_id, field_key, value_text, value_num, value_json - files: id, submission_id, field_key, path, sha256, mime_detected, bytes, scan_status - destinations: id, form_id, kind, config_encrypted, mapping_json, is_active - deliveries: id, submission_id, destination_id, status, attempts, external_id, response_excerpt, next_attempt_at, at - events: id, submission_id, kind, field_key, at — append-only, and where drop-off comes from WRITING INTO OTHER SYSTEMS, THE PART THAT IS THE FEE - A destination is an adapter with one interface: describe the target's fields, validate a mapping, write a record, and report what happened - The mapping is explicit — this question goes to that field — validated against the target's live schema when it is saved and again before the first write. A silent mismatch means answers landing in the wrong column for a week - Idempotent by submission id, so a retry never creates a duplicate record downstream. This is the single most important property, because retries will happen - Retries with exponential backoff and a dead-letter list with a one-button replay - Every attempt recorded with the response. A destination that quietly stopped working is the failure mode here, so alert on consecutive failures rather than waiting for somebody to notice - Credentials encrypted at rest, and the adapter has a fixture and a test. Build the two you need, not twelve you do not THE FORM - Pages, fields, and conditional logic as an explicit expression tree over earlier answers — never evaluated code, with one evaluator used by the server and the browser so what is shown and what is accepted cannot disagree - Calculated fields with a dependency graph, so a cycle is rejected at save time - Field kinds: text, long text, number, email, phone, url, date, dropdown, choice, checkboxes, matrix, ranking, rating, address, signature, file upload, payment, hidden. Each with a parser, a validator, an accessible template and a CSV form - Validated on publish: an unreachable page, an unknown reference or a jump past a required field is an error before anybody sees it FILLING IT IN - Every page a real POST, so back and forward work and a refresh loses nothing - Progress saved per page and resumable by a token - Works with JavaScript disabled apart from live calculations - Accessible: labels tied to inputs, errors announced, a logical tab order, visible focus UPLOADS AND PAYMENTS - Streamed to disk with a hard limit as bytes arrive, type from content, an allow-list per field, EXIF stripped, served through signed expiring links - Hosted checkout, and the amount computed on the server from the answers — never taken from the browser, which is the classic way a payment form is abused - Marked paid only from a verified webhook, idempotent by event id THE REST - Notifications and autoresponders, conditional, with a per-recipient daily cap - Results table, per-question summaries, and drop-off per page — which is how a long form gets shorter - Export CSV and JSON, complete, including partials OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, ENCRYPTION_KEY, HASH_SALT, SMTP_URL, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET - Migrations on boot, each once; nightly backup off the machine, restore script - Health endpoint reporting delivery failures per destination WHAT MATTERS MOST Idempotent delivery and validated mappings. A form that occasionally writes a duplicate record, or writes into the wrong field after somebody renamed a column, is worse than one that just collects answers.
What you lose
- Connectors that write a response into Airtable, Notion, a CRM or a spreadsheet without you maintaining an integration
- Conditional logic and calculated fields configured by clicking rather than by coding
- Payment collection inside the form, with the Stripe work already done
If you would rather not build
- Typeform, for the polished version
- A schema-driven form, which is what the prompt builds
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $15/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Formbricks
$0Self-hosted forms and surveys with logic and a dashboard.
formbricks/formbricksfree · open source
Why this verdict
our own opinion · changed only by a person
60/100
Verdict kinda at 60. Logic and payments are a weekend; the long tail of connectors is what you would keep paying for.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Fillout
answered from the record above
Is Fillout free?
No — the plan we track is $15 a month. Starter at $15/month billed monthly, around $12 annually, for 1,000 responses.
Can you replace Fillout by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 60 out of 100, build time a weekend. Read what you lose before you decide.
How much does Fillout cost?
$15 a month on Starter — $180 a year. Recorded 9 Aug 2026.
What do you lose by replacing Fillout?
Connectors that write a response into Airtable, Notion, a CRM or a spreadsheet without you maintaining an integration; Conditional logic and calculated fields configured by clicking rather than by coding; Payment collection inside the form, with the Stripe work already done. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Fillout?
Yes: Formbricks, Formio. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

