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).

  1. Click + Add field to add a question, + Add text block for a paragraph of copy, or + Add heading for a section title.
  2. Open each field to set its label, type, help text, placeholder, and whether it's required.
  3. Reorder fields with the ↑ / ↓ buttons, or remove them with Remove.
  4. Click Save draft at any time, then Save & publish when you're ready to go live.
Tip
Anywhere you can type a label, help text, or footer, you can add links with Markdown syntax: [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.

Tip
Test it from Preview. The preview hides conditional fields by default — tick "Show all fields" to reveal them while designing.

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.

  1. Respondents move between pages with Back / Next buttons.
  2. Required fields are validated before each page advances.
  3. 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:

  1. Choose a field, an operator (equals / does not equal), and a value.
  2. 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.com

Fields 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.

Tip
Editing the background from the preview tab syncs back to the builder automatically.

Sharing & embedding

Once published, the builder shows a shareable link like https://filluply.com/f/your-form-id. Copy it anywhere.

To embed the form on your own website, paste the iframe snippet:

<iframe
  src="https://filluply.com/f/your-form-id"
  width="100%" height="700" style="border:0" title="Form">
</iframe>

The exact snippet (with your real form ID) is shown in the Embed on a website box after you publish.

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:

  1. 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.
  2. 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.
  3. 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

  1. In the builder, open the Webhooks card and click + Add webhook.
  2. Paste your endpoint URL (must start with https://).
  3. 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 — always form.submission
  • X-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)
  );
}
Tip
Always verify against the raw request body (before any JSON parsing/re-serialization), and reject requests whose timestamp is too old to prevent replays.

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.