Forms
Build public data-capture forms for lead generation, support intake, surveys, feedback, or any other use. Every form has a unique public URL you can share directly or embed on your website.
URL: /forms
Required permission: forms.view
What you can do
Capture leads: forms can automatically create a Contact (and link it to a Deal if you like) from each submission.
Route support intake: forms can create a Ticket from each submission, pre-filling subject, body, and priority from the submitted values.
Track submissions: every form has its own submissions inspector where you can see the full captured payload, the visitor's IP, and the linked record (if any).
Trigger automations: any concorbit Automation workflow can be wired to "when a form submission is created" as its trigger.
The form list
From the sidebar, click Forms. The list shows every form on your tenant with:
Name: click to open the builder.
On submit: what happens when someone submits (none, create contact, create ticket, create deal).
Status: Active forms accept submissions; Draft forms 404 publicly.
Submissions: running count; click to open the submissions inspector.
Public URL: the shareable link; click Copy to put it on your clipboard.
Click New form in the top-right to start a new one.
Building a form
The builder has two sides.
Click New form on the Forms index to start. You'll get a picker:
Start from a template
Eight shipping templates cover the common shapes, pre-configured with fields, mappings, and submit actions so you're 90% done before you start:
| Template | What it does |
|---|---|
| Contact us | name + email + message → create Contact + autoreply to sender |
| Support request | name + email + priority + description → open Ticket + link Contact + autoreply |
| Quote request | name + email + company + project + budget → create Deal on default pipeline + link Contact + autoreply |
| Newsletter signup | email-only → create Contact (lifecycle=lead) |
| NPS survey | 0-10 rating + comment → saves submission only |
| Event registration | name + email + dietary → create Contact + confirmation email |
| Customer feedback | rating + comment + optional email → saves submission only |
| GDPR data request | name + email + request type + details → open a high-priority Ticket + autoreply |
Click any template card and you jump straight into the builder with everything filled in: edit labels, add fields, tune the action pipeline. Your tenant can also save its own templates via Save as template in the builder header; those appear in the picker marked "yours".
Start from scratch
Give your form a name + slug and click Create empty form: the builder opens with no fields and no actions, ready to configure.
Builder: three sections
The builder stacks three cards vertically:
1. Form details
Name: internal label; visitors don't see it.
Slug: the last bit of the public URL (
/f/your-slug). Lowercase letters / numbers / dashes only.Description: appears under the form title on the public page.
Submit button label: defaults to "Submit".
Thank-you message: shown inline on success (unless a Redirect action is configured).
Active: tick to accept submissions. Untick to take the form offline.
Honeypot: leave on; defends against bots.
2. Fields
Field types: text, email, textarea, phone, number, select, radio, checkbox, hidden, URL, date, rating, plus three layout-only types: section heading, divider, HTML block. Per-field you set label, key, type, placeholder, help text, options (select/radio), required flag. Use ▲/▼ to reorder.
Field → target-record mapping is not set at the field level. It's configured per-action in the Submit actions section below, which lets the same field feed multiple records (e.g. the visitor's email seeds both the Contact and the autoreply recipient).
Multi-column layouts
Every field has a Width picker: Full / Half / Third / Quarter / Two-thirds / Three-quarters. Fields with the same Row group number render side-by-side at their chosen widths. Example: two fields in row group 10 with Half + Half → they share a row 50/50. Three with Third each → thirds.
Row group is a plain integer: give any two fields the same number and they'll merge onto one row. Different numbers keep them on separate rows.
Conditional logic (show-only-when)
Any field can be made to only show when another field meets a rule:
Depends on: pick another field
Operator: equals, not equals, contains, does not contain, is empty, is not empty
Value: the comparison value (not needed for is-empty / is-not-empty)
A hidden field also skips server-side validation, so you can mark a conditional field required without breaking the paths where it's hidden. Example: "Yes I want to be contacted" select, with a Message textarea that's conditional-required only when the answer is Yes.
Layout-only field types
Some fields exist for structure, not data:
Section heading: renders the field label as an H2. No input. Great for grouping.
Divider: horizontal line. No input.
HTML block: static HTML content (pulled from help_text / default_value). Good for inline instructions / links / disclaimers.
These don't appear in the submission payload and don't have mapping options; they're just visual.
Rating (stars)
A 1-5 star picker. Stored as an integer in the submission. Click a star to select; click it again to clear.
3. Submit actions
The biggest change in v2: a form can now have any number of ordered actions that fire on submit. Add as many as you need:
| Action | Config |
|---|---|
| Create contact | Map fields to first_name / last_name / email / phone |
| Create ticket | Map fields to subject / body / priority + optional contact mapping |
| Create deal | Map fields to title / value_amount + contact mapping; pick a pipeline |
| Send autoreply | Choose the email field to send to + optional name field + optional custom message |
| Notify team | Add one or more internal recipient emails |
| POST to webhook | URL + method; submission payload is sent as JSON (10s timeout) |
| Redirect | URL to send the visitor to on successful submit |
Every action has:
Label: optional admin-only name (e.g. "Alert ops team")
Active: pause without deleting
Continue if this action fails: decide whether a failure halts subsequent actions (default: yes)
Actions run in sort order. Use ▲/▼ to reorder.
The public form
Your form lives at the URL shown in the Public URL banner on the builder page. Click Copy to put it on your clipboard, or Open ↗ to preview.
The page renders the form on a clean background with no concorbit navigation; it's a page a visitor can land on directly. On a successful submit it shows your thank-you message; on validation errors each invalid field highlights in red with the specific issue.
Sharing options:
Direct link: paste the public URL into emails, social, or chat.
Embed on your site: for now, use
<a href="...">or an<iframe src="...">. A first-class embed snippet is planned for a follow-up release.
Viewing submissions
Click the submissions count on a form (or Submissions in the builder header) to open the inspector. The table shows every submission newest-first, with each field as its own column. Click a row to open a single submission:
Full payload by field (even if the form has been edited since)
Submission timestamp + visitor IP
Linked record panel: if the form creates a Contact / Ticket / Deal, a direct link to that record
Wiring an automation
Forms pair cleanly with the Automation module. For example, fire an internal Slack notification whenever a support form is submitted, or send a welcome email to a new lead. Build it in Automation → New workflow:
Trigger type: "When a record is created"
Trigger model: "Form submission"
Add whatever actions you need: send email, send webhook, create ticket, assign to, etc.
Merge-field tokens on the trigger context expose the submission data as {{ form_submission.data.field_key }}, e.g. {{ form_submission.data.email }} for an email field keyed email.
Limits + planned improvements
Today's build covers the common 90%; the rest is on the follow-up list:
No drag-and-drop for field + action reorder yet; use the ▲/▼ buttons.
No file uploads or signature fields yet.
No multi-step / pages yet: one long page. (Conditional logic covers most "hide irrelevant fields" use cases.)
No embed snippet generator: use a link or iframe for now; first-class web-builder embed lands with the web builder release.
No CAPTCHA option: honeypot defends against most bot traffic.
No form-level analytics (views, completion rate).
No CSV export of submissions yet.
Tips
Keep forms short: one clear ask per form beats a sprawling questionnaire.
Use hidden fields for context you want captured invisibly (campaign tag, referrer, utm parameters). Populate them via a query string in the URL.
For lead-capture forms, map Email to
Contact — Emailand Name toContact — First nameat minimum; that's all you need to start building your CRM from the form.The Field key survives rename of the label, so name it something sensible from day one (
business_namerather thanfield_3) so downstream automations read cleanly.