Docs

Install, embed, and verify what happens after submit.

Create forms that match your site, collect submissions reliably, and wire up After Submit actions — webhooks, Slack (Incoming Webhooks), and email — without blocking the person who just submitted.

1. Quick start

  1. In the dashboard, create a form and add fields (name, email, message, etc.).
  2. Publish the form when you are ready for real or public traffic. Draft and archived forms reject public submissions.
  3. Open Install (or the install section on the form) and copy the embed snippet or hosted POST URL.
  4. Paste the embed on your site or point your HTML form at the submission URL, then submit a test entry from your site or use Preview in the dashboard.
  5. Check Submissions and the form's After submit section to confirm the submission and any actions ran.

2. Embed options

Formlyx does not use an iframe for the JS embed. The script renders into your page so your CSS and layout stay in control.

JS embed (container + script)

Add a container with data-form-id, load embed.js from your Formlyx app host. Replace YOUR_APP_URL and FORM_ID with values from Install.

Minimal embed
<div id="formlyx-root" data-form-id="FORM_ID"></div>
<script src="https://YOUR_APP_URL/embed.js" defer></script>

Plain HTML form → Formlyx

You can POST a standard HTML form to your form's submission endpoint POST …/f/FORM_ID. Field name attributes must match your Formlyx field names. Use the exact action URL from the install screen (API base + /f/<formId>).

Hosted HTML form
<form method="POST" action="https://YOUR_API_BASE/f/FORM_ID">
  <input name="name" />
  <input name="email" type="email" />
  <textarea name="message"></textarea>
  <button type="submit">Send</button>
</form>

Native styling and data-class-* hooks

For the JS embed, you can pass data-class-* attributes on the root (for example data-class-input, data-class-button) so your app supplies Tailwind or design-system classes. You can also theme with CSS variables on the container — see the marketing homepage embed examples.

Embed with host-controlled classes
<div
  id="formlyx-root"
  data-form-id="FORM_ID"
  data-theme="unstyled"
  data-class-input="w-full rounded-lg border border-neutral-300 px-3 py-2"
  data-class-button="inline-flex rounded-full bg-indigo-600 px-5 py-2 text-white"
></div>
<script src="https://YOUR_APP_URL/embed.js" defer></script>

3. Publishing

  • Draft — form is editable; public submissions and embed traffic are blocked.
  • Published — public POSTs and embeds accept submissions (subject to your plan and limits).
  • Archived — treated like non-live; public submissions are not accepted.

After Submit actions only run when a submission is successfully created. Live traffic needs a published form.

4. After Submit actions

After submit controls what happens when someone submits your form: notifications, outbound webhooks, and Slack messages. Failures are logged; they do not undo a successful submission for the person filling out the form.

  • Email notification — each form has a notification email in form settings. Configure it in the form editor; sends run after the submission is stored.
  • Send to API — POST JSON to your endpoint (webhook).
  • Send to Slack — POST a Slack-compatible message body using an Incoming Webhook URL you paste in the dashboard. This is not Slack OAuth or a native Slack app install.

Configure actions on the form page under After submit. You can enable or disable each action, send a test delivery, and optionally attach rules so an action only runs when field values match.

5. Send to API (webhooks)

When a submission matches your action rules, Formlyx sends an HTTP POST with a JSON body to your URL.

Standard payload (form.submission.created)
{
  "event": "form.submission.created",
  "formId": "FORM_ID",
  "submissionId": "SUBMISSION_ID",
  "submittedAt": "2026-04-30T20:00:00.000Z",
  "data": {
    "name": "Jane Example",
    "email": "jane@example.com",
    "message": "I want early access"
  }
}

Optional signing secret. If you configure a secret on the action, Formlyx adds X-Formlyx-Signature: sha256=<hex> where the hex is an HMAC-SHA256 of the raw JSON body. Verify on your server before trusting the payload.

Failures never block the submitter. If your endpoint errors or times out, the submission is still accepted; the delivery is marked failed and you can inspect and retry from the dashboard.

6. Notify Slack (Incoming Webhooks)

Slack delivery uses a Slack Incoming Webhook URL you create in Slack (Incoming Webhooks on a Slack app). Formlyx is not performing Slack OAuth and is not installing a Slack app into your workspace on your behalf.

Add a Send to Slack action and paste the webhook URL. Formlyx POSTs JSON shaped like:

Slack message payload (shape)
{
  "text": "New Formlyx submission for Contact\n\nname: Jane Example\nemail: jane@example.com\nmessage: Hello"
}

You can point a Send to Slack action at a webhook.site URL first to confirm the text body before wiring a real Slack Incoming Webhook.

7. Testing webhooks

  1. Open webhook.site and copy your unique URL.
  2. In Formlyx, add Send to API with that URL, publish the form, and submit from the public form or your site.
  3. On webhook.site, open the request and confirm JSON includes event set to form.submission.created.
  4. Add a second receiver URL (or a new webhook.site bin), create Send to Slack, submit again, and confirm the body contains { "text": "..." } without the standard Formlyx event field.

8. Delivery logs and retry

  • Each action shows Recent deliveries under After submit — HTTP status, event type, time, and short error text when something fails.
  • The Submissions list includes a compact Actions indicator; open a submission to see per-delivery detail and payload previews (secrets are never shown).
  • Failed webhook or Slack deliveries can be retried without asking the visitor to submit again. Retries create a new delivery row linked to the previous attempt.

9. Troubleshooting

I used Send test but no “real” submission event

The Send test button sends a synthetic payload with form.webhook.test. Public and dashboard test submissions that create a stored submission use form.submission.created for webhook actions. Compare event types in Recent deliveries.

I submitted from Preview — what happened?

Dashboard Preview calls the authenticated test submission endpoint. When the form is published, those sends are stored as test submissions: they appear in Submissions, trigger email and After Submit actions like a normal submission, and do not count against monthly usage the same way live traffic does. If the form is not published, Preview explains that live test submission is turned off.

Slack did not receive a message

Confirm the Incoming Webhook URL is still valid, the Send to Slack action is enabled, and your field rules (if any) allow the action to run. Inspect Recent deliveries for HTTP status and errors.

Webhook failed

Check the response status and error snippet in Recent deliveries or the submission detail view. Fix your endpoint (accept POST JSON, return 2xx if appropriate), then use Retry.

Nothing fired after submit

Ensure the form is published, the action is enabled, and any per-action rules still match the submitted field values. If rules exclude an action, no delivery row is created for that action.

Docs — Formlyx — Formlyx