The form is the easy half: a schema, a public page with show-or-hide logic, a submissions table, CSV export and a webhook fit one agent session, much as Tally's does. What Fillout charges for sits around it: about 55 integrations, PDFs, calculations, scheduling, login forms and workflows. Rebuild the one or two you actually use, such as Airtable or a webhook, and a weekend covers it. A copy of every connector is a different product.
Before you buildCheck Fillout Free first: unlimited forms and seats, 1,000 responses a month, payments and PDF generation cost nothing. Tally's free plan is an alternative with similar limits.
Build me a form builder that writes to Airtable to replace Fillout. Requirements:
- Node.js 22 + TypeScript: a Fastify server and a React builder built with Vite. `npm start`
serves http://localhost:4720 with the builder at /admin and each form at /f/<slug>.
- Storage: better-sqlite3 in ./data/forms.db. A form is one JSON document checked with `zod`:
pages of fields (short text, long text, email, number, date, dropdown, multi-select, checkbox,
rating, file up to 20 MB), a required flag and an optional show-if rule per field (field,
operator, value, with AND/OR groups). Submissions get their own table; files go to ./data/uploads/.
- Public page: server-rendered with Eta, one page at a time with a progress bar, answers piped
into later labels as {{field}}, and a draft saved in localStorage so a visitor can resume.
- Rules: one shared function evaluates show-if rules in the browser and again on the server, which
rejects any answer to a hidden field. A honeypot field and 10 submissions per minute per IP.
- Builder: add, reorder and delete fields, edit labels and rules, preview, and a Publish switch;
every save keeps the previous version so I can revert.
- Sinks, one file each in src/sinks/: CSV download, a webhook with an HMAC signature header, an
email through nodemailer SMTP with a PDF of the answers (`pdf-lib`), and Airtable (AIRTABLE_TOKEN
in .env, base and table per form, a field-to-column map). Retry 3 times with backoff and list
failures in the admin so nothing is lost.
- Single owner behind a password from .env. No accounts, no telemetry, local-first: outbound
calls go to the sinks you configured.
- Out of scope: payments, scheduling forms, login forms, Notion and Salesforce sinks, teams.
- Done when a submission with a hidden-by-rule field filled in is rejected, and one valid
submission lands in the SQLite table, the Airtable row and the email with its PDF.
- README: the .env keys, how to create the Airtable token, and how to expose /f/ through a tunnel.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Fillout.
Add a CSV importer to the form builder in this folder. Requirements: - `npm run import-responses -- <form-slug> results.csv` reads the file from Results > download in Fillout and maps each column to a field by label; print unmatched columns before importing. - Create submissions with the original timestamp when the CSV has one, mark them as imported and never send them to sinks. - Skip rows already imported (hash of the row), so a second run changes nothing. - A dry-run flag prints counts only. Update the README with the export steps.
Add a Google Sheets sink to the form builder in this folder. Requirements: - A new file src/sinks/sheets.ts using `googleapis` and a service account JSON path in .env. - Per form: spreadsheet id, tab name and a field-to-column map; on the first submission write the header row if the tab is empty. - Append rows with `spreadsheets.values.append`, retry like the other sinks, and show failures in the admin. - The README explains sharing the sheet with the service account's email address.
Add a Stripe payment step to the form builder in this folder. Requirements: - Per form, an optional price: a fixed amount or a field with a number to multiply by a unit price. - After a valid submission, create a Stripe Checkout Session (STRIPE_SECRET_KEY in .env) and redirect to it; store the session id on the submission as "awaiting payment". - A webhook endpoint verifies the signature on `checkout.session.completed`, marks the submission paid once, and only then runs the sinks. - Unpaid submissions older than 24 hours are listed in the admin and never sent to sinks. - Update the README with Stripe test-mode steps.
Fillout's draw is that the answer lands where the work happens: a row in Airtable, a page in Notion, a line in Sheets, with unlimited seats on a flat fee. Teams pay when they pass 1,000 responses a month or need their own domain, custom code or partial submissions.
Estimate · A $5 VPS or a free tunnel, with SMTP and Airtable on their free tiers. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0/workspace | $0/workspace | Unlimited forms, questions and seats, 1,000 responses a month, 50+ field types, payments, scheduling, conditional logic, PDF generation, 20 MB files. |
| Starter | $19/workspace | $15/workspace | 2,000 responses a month, all question types, custom endings, login forms, redirect on completion. |
| Pro | $49/workspace | $40/workspace | 5,000 responses a month, removes all Fillout branding, custom share links, custom fonts and favicon, custom CSS. |
| Business | $89/workspace | $75/workspace | Unlimited responses (fair use), form analytics, custom domain, custom code, partial submissions, pre-fetch data, priority support, file uploads of 1 GB or more. |
| Team bundle | $300/workspace | — | Fillout's Business plan plus Zite apps and databases: 800+ credits a month, 1,000,000 records, 250,000 workflow runs a month, roles and granular permissions. |
| Enterprise | custom | — | Everything in the Team bundle plus SSO, unlimited workflow runs, audit logs, dedicated support and custom agreements. |
Free forever: unlimited forms and seats, 1,000 responses a month, payments, conditional logic and PDF generation.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Native connectors beyond Airtable and webhooks: Notion, Sheets, HubSpot, Salesforce, Slack and about 55 in all, Payment fields, scheduling forms and login forms.
About $19 a month on the Starter plan, $228 a year (checked 2026-10-19).
Native connectors beyond Airtable and webhooks: Notion, Sheets, HubSpot, Salesforce, Slack and about 55 in all; Payment fields, scheduling forms and login forms; Calculations, scoring and prefilled or hidden fields; Import tools for Typeform, Jotform, SurveyMonkey and Google Forms; A hosted form page with a template library and nothing to keep running. If any of those matter to you, keep paying.
Yes: OpnForm (open source), HeyForm (open source), Formbricks (open source).