01form.setTitle('FormTs')
TypeScript-powered form builder

Create Smart Forms
That Calculate & Think

The only form builder that combines visual design with TypeScript power. Build dynamic forms with real-time calculations, conditional logic, and complex business rules - with or without code.

  • No credit card required
  • Free forever plan
  • 5-minute setup
form.ts
🌐 Website — Instant Quote
 
5pages
5 pages
120
 
 
$ 1,920.00
📦 Ready in ~3 weeks
💡 Pick 3 features to unlock a 10% bundle discount
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
export function instantQuoteForm(form: FormTs) {
// Everything that differs per project type lives in one place
const website = {
title: '🌐 Website — Instant Quote',
base: 1200, sliderId: 'pages', included: 1, perUnit: 180, weeksPer: 5,
features: [
{ id: 'seo', name: '🔍 SEO', price: 300 },
{ id: 'cms', name: '📝 CMS', price: 450 },
{ id: 'blog', name: '✍️ Blog', price: 250 },
{ id: 'booking', name: '📅 Booking', price: 600 },
{ id: 'multilang', name: '🌍 Multilingual', price: 400 }
],
extrasLabel: '🎨 Design package',
extras: [
{ id: 'template', name: 'Template — included', price: 0 },
{ id: 'custom', name: 'Custom design (+$800)', price: 800 },
{ id: 'brand', name: 'Full brand kit (+$1,500)', price: 1500 }
]
};
 
const shop = {
title: '🛒 Online Store — Instant Quote',
base: 2800, sliderId: 'products', included: 0, perUnit: 4, weeksPer: 100,
features: [
{ id: 'subscriptions', name: '🔁 Subscriptions', price: 700 },
{ id: 'reviews', name: '⭐ Reviews', price: 300 },
{ id: 'discounts', name: '🏷️ Discount codes', price: 250 },
{ id: 'inventory', name: '📦 Inventory sync', price: 650 },
{ id: 'loyalty', name: '💎 Loyalty program', price: 500 }
],
extrasLabel: '🚚 Shipping setup',
extras: [
{ id: 'manual', name: 'Manual labels — included', price: 0 },
{ id: 'courier', name: 'Courier API (+$350)', price: 350 },
{ id: 'fulfillment', name: 'Full fulfillment (+$900)', price: 900 }
]
};
 
const app = {
title: '📱 Web App — Instant Quote',
base: 4500, sliderId: 'screens', included: 3, perUnit: 220, weeksPer: 6,
features: [
{ id: 'auth', name: '🔐 User accounts', price: 600 },
{ id: 'push', name: '🔔 Notifications', price: 450 },
{ id: 'payments', name: '💳 Payments', price: 550 },
{ id: 'analytics', name: '📊 Analytics', price: 350 },
{ id: 'ai', name: '🤖 AI assistant', price: 900 }
],
extrasLabel: '📲 Platforms',
extras: [
{ id: 'web', name: 'Web only — included', price: 0 },
{ id: 'pwa', name: '+ Mobile PWA (+$700)', price: 700 },
{ id: 'native', name: '+ Native wrapper (+$1,200)', price: 1200 }
]
};
 
const pages = form.addPages('steps', { heightMode: 'tallest-page' });
 
// Step 1 — what are we building and how big is it?
const project = pages.addPage('project', { mobileBreakpoint: 430 });
 
const projectType = () => project.radioButton('projectType')?.value() ?? 'website';
 
const cfg = () => {
const t = projectType();
return t === 'shop' ? shop : t === 'app' ? app : website;
};
 
// Even the title reacts to your answers
form.setTitle(() => cfg().title);
 
project.addRow(row => {
row.addRadioButton('projectType', {
label: 'What are you building?',
defaultValue: 'website',
isRequired: true,
orientation: 'horizontal',
options: [
{ id: 'website', name: '🌐 Website' },
{ id: 'shop', name: '🛒 Online Store' },
{ id: 'app', name: '📱 Web App' }
]
});
});
 
// One slider per project type — only the relevant one is visible
project.addRow(row => {
row.addSlider('pages', {
label: 'How many pages?', unit: 'pages',
min: 1, max: 20, defaultValue: 5,
isVisible: () => projectType() === 'website'
});
});
 
project.addRow(row => {
row.addSlider('products', {
label: 'How many products?', unit: 'products',
min: 10, max: 500, step: 10, defaultValue: 50,
isVisible: () => projectType() === 'shop'
});
});
 
project.addRow(row => {
row.addSlider('screens', {
label: 'How many screens?', unit: 'screens',
min: 3, max: 30, defaultValue: 8,
isVisible: () => projectType() === 'app'
});
});
 
// Step 2 — features and extras (options follow the project type)
const details = pages.addPage('details', { mobileBreakpoint: 430 });
 
details.addRow(row => {
row.addSuggestionChips('features', {
label: 'Pick your features',
suggestions: () => cfg().features.map(f => ({ id: f.id, name: f.name }))
});
});
 
details.addRow(row => {
row.addDropdown('extra', {
label: () => cfg().extrasLabel,
placeholder: 'Choose an option…',
options: () => cfg().extras.map(e => ({ id: e.id, name: e.name }))
});
});
 
// Step 3 — kickoff, timing and contact details
const kickoff = pages.addPage('kickoff', { mobileBreakpoint: 430 });
 
kickoff.addRow(row => {
row.addDatepicker('startDate', {
label: '🗓️ Preferred kickoff date',
minDate: () => new Date().toISOString().slice(0, 10),
tooltip: 'We can start as early as today'
});
});
 
kickoff.addRow(row => {
row.addCheckbox('rush', {
label: '⚡ Rush delivery (+25%)',
tooltip: 'Cut the timeline in half'
});
});
 
kickoff.addRow(row => {
row.addTextbox('fullName', {
label: '👤 Your name',
placeholder: 'Ada Lovelace',
isRequired: true
});
 
row.addEmail('email', {
label: '📧 Email for the quote',
placeholder: 'ada@example.com',
isRequired: true
});
});
 
// The pricing engine — plain TypeScript, recalculates on every change
const quote = form.computedValue(() => {
const c = cfg();
const units = project.slider(c.sliderId)?.value() ?? c.included;
const selected = details.suggestionChips('features')?.value() ?? [];
const extraId = details.dropdown('extra')?.value() ?? '';
const rush = kickoff.checkbox('rush')?.value() ?? false;
 
let price = c.base + Math.max(0, units - c.included) * c.perUnit;
for (const f of c.features) if (selected.includes(f.id)) price += f.price;
price += c.extras.find(e => e.id === extraId)?.price ?? 0;
if (rush) price *= 1.25;
 
// 3+ features unlock a 10% bundle discount
const picked = c.features.filter(f => selected.includes(f.id)).length;
const hasBundle = picked >= 3;
const finalPrice = hasBundle ? price * 0.9 : price;
 
const baseWeeks = 2 + Math.ceil(units / c.weeksPer) + Math.ceil(picked / 2);
const weeks = rush ? Math.max(1, Math.ceil(baseWeeks / 2)) : baseWeeks;
 
return { price, finalPrice, hasBundle, weeks, picked, savings: price - finalPrice };
});
 
// Live summary lives OUTSIDE the pages — always visible while you navigate
form.addRow(row => {
row.addPriceDisplay('estimate', {
label: 'Your estimate',
variant: 'large',
computedValue: () => quote().finalPrice,
originalPrice: () => quote().hasBundle ? quote().price : null
}, '3fr');
 
row.addTextPanel('delivery', {
label: 'Timeline',
computedValue: () => {
const q = quote();
const weeksLabel = `~${q.weeks} week${q.weeks > 1 ? 's' : ''}`;
const start = kickoff.datepicker('startDate')?.value();
if (!start) return `📦 Ready in ${weeksLabel}`;
 
const launch = new Date(start);
launch.setDate(launch.getDate() + q.weeks * 7);
const day = launch.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
return `🚀 ${weeksLabel} — launch ≈ ${day}`;
}
}, '2fr');
});
 
// The form talks back — nudges you toward the discount
form.addRow(row => {
row.addTextPanel('hint', {
computedValue: () => {
const q = quote();
if (q.hasBundle) return `🎉 Bundle discount unlocked — you save $${q.savings.toFixed(0)}!`;
const left = 3 - q.picked;
return left === 3
? '💡 Pick 3 features to unlock a 10% bundle discount'
: `💡 Only ${left} more feature${left > 1 ? 's' : ''} to a 10% discount!`;
},
customStyles: () => quote().hasBundle
? { color: '#047857', background: '#ecfdf5', padding: '12px 16px', borderRadius: '10px', fontWeight: '600' }
: { color: '#1d4ed8', background: '#eff6ff', padding: '12px 16px', borderRadius: '10px', fontWeight: '500' }
});
});
 
form.configureSubmitButton({ label: 'Get My Quote' });
 
form.configureCompletionScreen({
type: 'text',
title: '🎉 Quote on its way!',
message: 'We will get back to you within one business day.'
});
}
 
02form.addSection('how-it-works')

How Does It Work?

FormTs is a code-based form builder. Write TypeScript (or let AI write it for you), see your form update in real-time, then share it with the world.

1

Write Code or Ask AI

Describe your form in TypeScript or plain English. Our AI assistant turns your ideas into working code instantly.

2

See It Live

Watch your form update in real-time as you type. Test calculations, logic, and validation before publishing.

3

Share or Embed

Get a shareable link or embed the form on your website with a simple code snippet. Works everywhere.

editor-demo.mp4
03form.addSection('industries')

Built for Your Industry

See how FormTs powers intelligent forms across different industries. Click any industry to explore a live example.

E-commerce & Retail

Product configurators with dynamic pricing, order forms with shipping calculations, wholesale quote generators.

HR & Operations

Employee onboarding with role-based fields, PTO calculators, expense reports with automatic approvals.

Education & Training

Course registration with prerequisite checking, graded quizzes with instant scoring, student feedback forms with analytics.

Events & Bookings

Event registration with capacity limits, appointment scheduling with availability checks, workshop signups with tiered pricing.

Marketing & Research

Survey forms with branching logic, lead scoring calculators, market research with weighted responses, ROI calculators for campaigns.

Live Form Preview

Loading form preview...
04form.addSection('ai-follow-ups')

Forms That Ask the Right Questions

Stop guessing what to ask. Enable AI Follow-up and let your forms conduct intelligent interviews - automatically generating personalized questions based on each user's previous responses.

1

User fills your form

Start with your base questions

2

AI analyzes answers

Understands context & gaps

3

Smart follow-ups appear

Personalized to their answers

Complete picture

Rich, qualified data

ai-interviewer.mp4

Conversational Experience

Forms feel like a natural dialogue, not a checklist. Users engage more and provide better answers.

Deeper Insights

AI knows when to dig deeper. Get the context and details that static forms miss.

You Set the Rules

Define what information matters. AI follows your instructions and asks relevant follow-ups.

pdf-builder.ts
// Configure PDF generation for this form
form.configurePdf('quote', pdf => {
    pdf.configure({
        header: { title: 'Quote #1234' },
        footer: { showPageNumbers: true },
        allowUserDownload: true
    });

    pdf.addSection('Customer Details', section => {
        section.addRow(row => {
            row.addField('Name', name.value());
            row.addField('Email', email.value());
        });
    });

    pdf.addSection('Quote Summary', section => {
        section.addTable(
            ['Item', 'Qty', 'Price'],
            items().map(i => [i.name, i.qty, i.price])
        );
        section.addRow(row => {
            row.addField('Total', `${total()}`);
        });
    });
});
05form.configurePdf('quote')

Generate Professional
PDFs from Form Data

Turn every form submission into a polished, branded PDF document. Perfect for quotes, invoices, contracts, reports, and certificates - all generated automatically from your form data.

  • Auto-generate PDFs when forms are submitted
  • Custom headers, footers, and page numbers
  • Tables, sections, and formatted fields
  • Let users download their own PDF copy
06form.addSection('why-code')

Why Code? Because AI Changed Everything

You might think "code is for developers." That was true — until AI arrived. Today, code isn't a barrier. It's your superpower.

AI Speaks Code Fluently

AI models are trained on millions of code examples. They understand TypeScript better than any drag-and-drop interface. Just describe what you need — AI writes the code for you.

No-Code Has Limits. Code Doesn't.

Every no-code tool eventually hits a wall. "You can't do that here." With code, there are no walls. Any calculation, any logic, any workflow — if you can describe it, you can build it.

Iterate at the Speed of Thought

Want to change something? Just tell AI. No clicking through menus, no hunting for settings. Describe the change, see it instantly. Code makes iteration effortless.

You're in Control, Forever

Your forms are defined in clean, readable TypeScript. No vendor lock-in, no proprietary formats. You own your logic — copy it, version it, take it anywhere.

Don't fear code. Let AI write it for you.
You bring the ideas. We handle the rest.

07form.addSection('your-workflow')

Choose Your Way to Build

Whether you're a developer who loves code or a business user who prefers plain English, FormTs adapts to your workflow.

AI-Powered Builder

Describe your form in plain English. Our AI understands complex requirements and generates the TypeScript code for you - no programming knowledge needed.

  • Natural language to working form
  • Handles complex logic automatically
  • Learn by seeing generated code

TypeScript Code Editor

Write forms using our intuitive TypeScript API with full IntelliSense support. Perfect for developers who want complete control.

  • Full programming flexibility
  • Type-safe with error checking
  • Reusable components & logic
ai-assistant.mp4
08form.addSection('templates')

Start From a Template

Hundreds of ready-made forms for every use case. Pick one, customize it in minutes, and make it yours.

250+ templates

Understand Your Customers & Teams

Ready-made feedback templates for every touchpoint. From NPS surveys to employee engagement - start collecting actionable insights in minutes.

  • NPS, CSAT & Customer Effort Score surveys
  • Employee engagement & exit interviews
  • Product feedback & feature voting
09form.addSection('embed')

Embed in Seconds

No complex setup. No developer required. Just two simple steps to add a powerful, interactive form to any website.

1Add to your page's <head>
<script type="module" src="https://formts.com/widget.js"></script>
2Place the widget anywhere on your page
<formts-widget link-id="your-form-link-id"></formts-widget>
Lightweight (~100KB)
Loads async, no page blocking
Consistent look everywhere
10form.addSection('integrations')

Connect to Your Entire Stack

Every form submission triggers instant webhooks. Connect FormTs to thousands of apps and automate your entire workflow.

Form Submission
Instant Webhook
Your Apps

Works seamlessly with

Zapier

Connect to 5,000+ apps without writing code

n8n

Build complex workflows with visual automation

Make (Integromat)

Create powerful scenarios and automations

Custom Webhooks

Send data directly to your API endpoints

11form.addSection('faq')

Frequently Asked Questions

Do I need to know how to code?

No! Our AI assistant can build forms from your plain English descriptions. However, knowing TypeScript gives you more control and flexibility.

What makes FormTs different?

FormTs is the only form builder that combines visual design with real programming power. Create forms with complex calculations, dynamic logic, and business rules that other builders can't handle.

What kind of calculations can I create?

Any calculation you can imagine! From simple additions to complex financial formulas, tax calculations, scoring algorithms, and multi-step conditional computations.

How do I embed forms on my website?

It's incredibly easy! Just add our script to your page and place a single HTML tag where you want the form. Works on any website - WordPress, Wix, Shopify, custom sites, or any platform that allows custom HTML.

How much does it cost?

The free plan is free forever: unlimited forms, all field types, advanced logic, and 100 submissions per month. Forms that don't collect submissions - like calculators - are always free. The Pro plan adds 1,000 submissions, webhooks, API access, and white-labeling.

Do I own my form code and data?

Yes, completely. Your forms are plain, readable TypeScript - copy the code and take it anywhere, anytime. No proprietary formats, no vendor lock-in. Your submission data can be reviewed and exported whenever you need it.

Can I build a calculator without collecting any data?

Absolutely. You can disable server submission entirely, so the form works as a pure client-side calculator - instant quotes, pricing estimates, ROI tools. Those forms are free forever, with no submission limits to worry about.

Ready to Build Smarter Forms?

Start building smarter forms that calculate, adapt, and think.