Formerize docs

Build, test, and publish a form.

Design your form, publish it, and receive responses without building a backend.

Quickstart

  1. Sign in and create a form with a Contact, Sales inquiry, or Waitlist template.
  2. Change the fields, styling, and confirmation message in the builder.
  3. Valid draft changes save automatically. If saving fails, keep the editor open and use Retry.
  4. Preview the form as a visitor. Preview responses are not saved or emailed.
  5. Check the notification setting, then publish. Live entries are saved in the Dashboard and emailed to the verified owner when notifications are enabled.
  6. Use the Dashboard to copy the generated HTML for your site or share the hosted form link.

Expected result: keep a draft while you are testing. Publish only when the owner email and live destination are correct.

Drafts, previews, and live forms

StateWhat it meansNext step
DraftThe form is editable and not live.Test it or continue editing.
PreviewA local preview of your draft. It does not save responses or send email.Check the fields and completion message.
PublishedEntries from the hosted link or installed HTML are live.Check entries and delivery history in the Dashboard.
PausedThe link stays the same, but new responses are not accepted.Resume the last published form from Share.

Forms with email notifications enabled need email delivery configured before publishing. With notifications off, responses are still saved in the Dashboard.

Open Share to pause, resume, or delete a form. Resuming does not publish unfinished edits. Already accepted responses continue through delivery after a pause.

Deleting a form permanently removes its retained responses and webhook setup. Delivered copies cannot be recalled, and an in-flight delivery may finish.

Install a published form

Keep the copied snippet together. Required checkbox groups include a small script immediately after the form to check that at least one option is selected. If your site removes or blocks scripts, use the hosted link for inline validation. The API validates entries in either case.

Open the form in the Dashboard after it is published. Copy the dashboard-generated HTML into your site, or use the hosted link as the destination you share. Do not hand-write a different set of input names: the installed fields must match the published form.

Expected result: a live submission gets an acceptance response from Formerize. Acceptance does not mean that an email has been delivered.

Check delivery

Open Submissions in the Dashboard. Each response shows its email status alongside it.

New forms start with email notifications off. In Submissions, enter your verified account email and select Enable emails to receive notifications. One recipient is supported. Responses are saved either way, and configured webhooks continue. Turning emails off does not recall queued messages; turning them on does not send earlier responses.

Responses appear newest first, 50 at a time. Select Load older responses to see more, or Refresh to check new entries and email status. Questions keep the labels used when each response was submitted.

CSV and JSON downloads include all retained pages. CSV has one row per response and uses stable field keys for answer columns, including fields removed from later forms. Multi-select answers are JSON arrays inside a cell. JSON includes unchanged values, original question labels, and current email status.

Responses received after the export starts are excluded. Responses deleted or expired before their batch is read are omitted. Export audit metadata remains for 30 days; Formerize does not store an extra copy of the export.

CSV quotes and escapes cells and prefixes formula-like answers as text. This changes those CSV values. Spreadsheet applications can interpret imported files differently, especially after saving them again. Use JSON when exact values matter. See OWASP's CSV guidance.

Open a response to delete it. Deletion removes its answers and pending delivery records, but cannot recall delivered copies or stop a request already in flight. Usage is not refunded. A deletion receipt containing IDs, the hashed retry key when present, and timestamps remains for 30 days; it contains no answers. During that window, the same retry key returns 410 submission_deleted.

EvidenceWhat it proves
Accepted entryFormerize accepted the visitor’s entry. It is not proof of email delivery.
Provider resultThe email provider accepted the delivery request or reported a failure.
Mail-server eventA delivered, bounced, or complained event is evidence reported after the provider sends the message.

Receive entries with webhooks

  1. Open Webhooks in the Dashboard. Choose a form and add your public HTTPS endpoint.
  2. Copy the signing secret into your server's secret storage. It is shown once. The endpoint starts disabled.
  3. Verify requests as described below. Click Send test webhook and check its result in the delivery history.
  4. Enable the endpoint when you are ready. New accepted entries will trigger delivery.

Each request is JSON with id, type: "submission.accepted", created_at, the public form_id, submission_id, and data: { version: 1, fields: {…} }.

Test requests use type: "webhook.test" and sample data. They use the same signatures and delivery history, including before you enable an endpoint. They do not create submissions, send emails, or consume your submission allowance. Handle test events separately from real entries.

Read the raw request body before parsing JSON. Verify Formerize-Signature against v1= followed by the lowercase hexadecimal HMAC-SHA256 of Formerize-Timestamp + "." + raw_body, using the exact signing secret as the HMAC key. Use a constant-time comparison and reject timestamps more than five minutes from your server's clock.

After signature verification, check that Formerize-Event-Id equals the body's id. Store that event ID with your processing result to prevent duplicate actions. Retries keep the same event ID and body, but use a fresh timestamp and signature.

Return a 2xx response after durably accepting the event. Process slow work separately. Formerize retries temporary failures; redirects and most 4xx responses fail permanently. Recent delivery status and HTTP codes appear in Webhooks.

Disabling or removing an endpoint cancels pending deliveries. A request already in flight may finish. Entries accepted while an endpoint is disabled are not replayed when you enable it. To change a URL or recover a lost signing secret, remove the endpoint and add it again.

Fix common problems

ProblemWhat to do
Missing or invalid fieldComplete the required field named by the form, then submit again.
Temporarily rate limitedWait a moment, then retry the same form.
Form quota reachedThe form is not accepting entries. Contact the form owner.
Delivery failed, bounced, or complainedThe owner should open delivery history and use the reported state to check the destination mailbox.
Hosted form is unavailableAsk the owner to check that the form is still published and that the link is correct.

For agents and developers

Use the canonical Agent Skill for the supported workflow and safety rules. The agent start guide is a shorter setup path. The machine-readable API contract is OpenAPI.

After the owner creates a management key, store it as FORMERIZE_API_KEY without printing it. Then connect the local client the owner asked to use:

Codex

codex mcp add formerize --url https://api.formerize.lansford.dev/mcp --bearer-token-env-var FORMERIZE_API_KEY

Claude Code

claude mcp add-json --scope local formerize '{"type":"http","url":"https://api.formerize.lansford.dev/mcp","headers":{"Authorization":"Bearer ${FORMERIZE_API_KEY}"}}'

These commands change local client configuration. The MCP server exposes get_workspace, list_forms, create_form, get_form, update_form, and list_deliveries. It cannot publish forms, read response content, or manage keys. The signed-in owner must review and publish a draft in the Dashboard.

Human templates are also available at Contact forms, Lead forms, and Waitlists.