Fillout

fillout.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

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.

Promptfree, for everyone, and the only version there is
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

PlanBilled monthlyBilled yearlyLast 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

$0

Self-hosted forms and surveys with logic and a dashboard.

formbricks/formbricksfree · open source

Formio

$0

A JSON-schema form engine with a renderer and an API server.

formio/formiofree · 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

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

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

All 19 in Forms

Not sending yet

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

Esc