Docs & Guides
How to do everything
Step-by-step guides for building, sharing, and connecting your forms — from AI generation to webhooks and signature verification.
Building a form
From your Dashboard, click New form to open the builder. Give your form a title and an optional description (shown under the title on the live form).
- Click + Add field to add a question, + Add text block for a paragraph of copy, or + Add heading for a section title.
- Open each field to set its label, type, help text, placeholder, and whether it's required.
- Reorder fields with the ↑ / ↓ buttons, or remove them with Remove.
- Click Save draft at any time, then Save & publish when you're ready to go live.
[text](https://url).Generate with AI
In a hurry? In the builder sidebar, find Generate with AI, describe what you want to collect (for example, "a customer feedback form for a coffee shop"), and click Generate fields.
Claude drafts a complete set of fields with sensible types. This replaces the current fields, so generate first, then fine-tune by hand.
Field types
Pick the type that matches the answer you want:
- Short / long text — names, comments
- Email, Phone, URL — validated formats
- Number — with optional min/max
- Date / Time — native pickers
- Dropdown / Single / Multiple choice — your options
- Single checkbox — yes/no or consent
- Rating — 1–N scale
- Slider — pick a number on a range (min/max/step)
- NPS — 0–10 Net Promoter scale
- Multi-select dropdown — choose several from a list
- Ranking — order options with up/down controls
- Image choice — pick an option by its picture
- Matrix / grid — one choice per row across columns
- Address — full mailing address in one field
- File upload — see below (paid plans)
- Signature — drawn signature
- Hidden field — capture a value from the URL (see below)
- Heading / Paragraph — display-only content
- Image — embed a picture at a size you choose
- Page break — splits the form into steps
Conditional logic (show / hide)
Any field can appear only when an earlier answer matches a condition. In the field editor, tick Only show this field if…, then choose a controlling field, an operator (equals / does not equal), and a value.
Multi-page forms
Break a long form into steps with a progress bar. In the builder, click + Add page break wherever a new page should start. Everything before the first break is page 1, the next group is page 2, and so on.
- Respondents move between pages with Back / Next buttons.
- Required fields are validated before each page advances.
- Question numbering and conditional logic continue working across pages.
Logic jumps
On multi-page forms, send respondents down different paths based on an answer. In the builder's Logic jumps card, add a rule:
- Choose a field, an operator (equals / does not equal), and a value.
- Pick the page to jump to — or Submit to skip to the end.
Rules are evaluated when the respondent clicks Next; the first matching rule for a field on that page wins. Add page breaks first — logic jumps need more than one page.
Answer piping
Reuse an earlier answer later in the form by typing its pipe token. Each field shows its token in the editor header, like {{f_ab12cd}}.
Drop that token into any later label, description, help text, heading, paragraph, the form description, or the thank-you message — for example, Thanks, {{f_ab12cd}}! — and it's replaced with the respondent's answer in real time.
Hidden fields & URL prefill
Hidden fields capture data without showing anything to the respondent — perfect for tracking parameters like utm_source. Add a Hidden field, set its Prefill key (URL) (e.g. utm_source), and optionally a default value.
Any field can be prefilled from the link. Give it a prefill key, then append it to your form URL as a query parameter:
https://…/f/your-form-id?utm_source=newsletter&email=jane@acme.comFields without a custom prefill key can still be set using their internal field ID as the parameter name.
Calculated fields
Add a Calculation block to show a live number computed from other answers — totals, scores, pricing. Write a formula using field tokens and arithmetic:
{{f_quantity}} * {{f_price}}Supported operators are + - * / ( ). The result updates as the respondent types; non-numeric answers count as 0. The builder lists the tokens for your numeric fields.
Quiz / scoring
Turn any form into a scored quiz. In the builder's Quiz / scoring card, tick Score this form as a quiz, then set a correct answer and points on each question (single choice, dropdown, checkbox, or short text).
- Optionally show the score to the respondent on completion.
- Set a pass score to show a pass/fail result.
Theming
In the builder's Theme card, customize the look of your form:
- Font — default, classic serif, modern sans, or mono.
- Accent color — recolors buttons, ratings, and progress.
- Custom CSS — an advanced escape hatch for fine-tuning, applied to your live form and preview.
Save & resume
For longer forms, enable Let respondents save & resume under Settings. Answers are saved in the respondent's browser as they go and restored automatically if they come back later — with a one-click Start over option. The saved draft is cleared once they submit.
File uploads
Add a File upload field to collect documents and images. Uploads are stored privately and are visible only to your workspace.
- Allowance depends on your plan (number of files per response and total storage) — see Pricing.
- Per-file limit is 10 MB; documents and images only.
Preview & publish
Click ◳ Preview in new tab to interact with your form exactly as a respondent would — nothing is saved in preview. When ready, click Save & publish to make it live. Unpublish takes it offline again.
Sending invites
After publishing, use the Send invites panel to email the form link directly. Enter addresses one per line (or comma-separated) and add an optional note — recipients get an email with a button to open the form.
Email notifications
There are two kinds of email, both configured in the builder:
- Notify you on each response — tick Email me when someone responds in the Save & publish panel. Sent to your account email with a copy of the answers.
- Confirm to the respondent — under Settings, tick Send a confirmation email to the respondent. This requires an Email field on the form; it sends them a copy of their answers plus your optional message.
- Extra recipients — under Settings, add more email addresses to notify on each response, optionally only when an answer matches a condition (e.g. route "Sales" enquiries to your sales inbox).
Closing a form
Under Settings you can stop accepting responses automatically:
- Close on — a date/time after which the form closes.
- Max responses — close after N submissions.
- Closed message — what visitors see once it's closed.
You can also set a Submit button label, a Thank-you message, or a Redirect URL to send people to your own page after submitting.
Responses & CSV export
Open a form's Responses to see every submission in a table with per-question analytics. From there you can:
- See analytics at the top — total views, completions, completion rate, and (for multi-page forms) drop-off by step.
- Search across all answers and tags with the search box.
- Click view on any row to open the full per-response detail page, where you can add tags for triage or Print / Save as PDF.
- Delete individual responses, or all of them at once.
- Click Export CSV to download everything as a spreadsheet.
Spam protection
Every published form is protected automatically — no setup required:
- Honeypot — a hidden field invisible to real people. Submissions that fill it are silently discarded.
- Rate limiting — rapid repeat submissions from the same source are throttled with a brief cooldown.
Webhooks
Webhooks send each submission to a URL you control in real time — perfect for connecting Zapier, Make, or your own backend.
Set one up
- In the builder, open the Webhooks card and click + Add webhook.
- Paste your endpoint URL (must start with
https://). - Optionally add a signing secret to verify requests (see below), then save the form.
Payload
On every submission we send a POST with a JSON body:
{
"event": "form.submission",
"form": { "id": "…", "title": "Contact us" },
"submission": { "id": "…", "created_at": "2026-06-19T12:00:00Z" },
"data": { "f_abc123": "Jane", "f_def456": "jane@acme.com" },
"answers": [
{ "id": "f_abc123", "label": "Name", "type": "text", "value": "Jane" },
{ "id": "f_def456", "label": "Email", "type": "email", "value": "jane@acme.com" }
]
}data is the raw answer map keyed by field ID; answers is the same answers with human-readable labels and display values, in field order.
Headers
X-Filluply-Event— alwaysform.submissionX-Filluply-Timestamp— the submission time (ISO 8601)X-Filluply-Signature— present only when you set a secret
Verifying the signature
If you set a secret, we sign <timestamp>.<rawBody> with HMAC-SHA256 and send it as X-Filluply-Signature: sha256=<hex>. Recompute it on your server and compare:
import crypto from "node:crypto";
function verify(req, secret) {
const ts = req.headers["x-filluply-timestamp"];
const body = req.rawBody; // the exact bytes you received
const sent = req.headers["x-filluply-signature"];
const expected =
"sha256=" +
crypto.createHmac("sha256", secret)
.update(`${ts}.${body}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(sent), Buffer.from(expected)
);
}Delivery behavior
- Delivery is best-effort with a 5-second timeout per endpoint.
- A slow or failing endpoint never blocks or fails the respondent's submission.
- You can add multiple endpoints to one form.
Still stuck? Email info@somexai.com and we'll help.