> ## Documentation Index
> Fetch the complete documentation index at: https://docs.custral.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Forms

> Build public forms whose submissions create records in your workspace.

## Overview

Forms let you collect information from people outside your workspace (bug reports, lead capture, intake questionnaires) and turn each submission into a record on an object. You build the form visually, publish it, and share a public link or embed it on your site. Every submission flows through the same pipeline as a record created by hand, so indexing, workflows, and permissions all apply.

## How it works

Each form is tied to a destination. When you create a form you pick one of two destinations:

* **Records**: submissions become records on an [object](/data/objects/overview). Choose an existing object or leave it empty to auto-create one.
* **Spreadsheet**: submissions land in a standalone spreadsheet; you define the fields in the editor.

The builder is organized into a left rail of **pages** and **endings**. Each page holds **fields** drawn from the destination object's [properties](/data/records/fields). Add a property to a page and it becomes a question. Optional **branching rules** route a submitter to a different page or ending based on their answers. **Endings** are what the submitter sees after the last page: a thank-you message, a redirect, or an embedded [meeting booking](/comms/scheduling/overview) calendar.

Publishing flips the form to **Active**. Each submission then creates a record the same way a manually created record would (under the form owner's identity), so any workflows on the object fire automatically.

<Note>
  This page is about public data-collection forms. To defer an email send to a later time, see [Email →
  Scheduling](/comms/email/scheduling).
</Note>

## Using it

<Steps>
  <Step title="Create a form">
    On the Forms screen, click **Create Form**, name it, and pick a destination (Records or Spreadsheet). For Records, select or auto-create the object.
  </Step>

  <Step title="Build pages and fields">
    In the editor, add pages and drop in object properties as fields. Set fields required as needed, add branching rules, and configure endings. Use **Preview** to test the flow.
  </Step>

  <Step title="Publish and share">
    Click **Publish**, then open **Share** to create a public link (`/forms/s/<token>`) or copy the embed code. Append `?embed=true` when embedding in an iframe.
  </Step>

  <Step title="Confirm submissions">
    Submit through the public link, then check the destination object. A new record appears named after the form.
  </Step>
</Steps>

## Troubleshooting

| Symptom                                                 | Likely cause                                                       | What to check                                                                             |
| ------------------------------------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| Public link shows "invalid or has expired"              | Form is not Active, or the share link was revoked / expired        | Publish the form; create a fresh link in the Share modal                                  |
| A question is missing on the public form                | The property isn't added to any page                               | Open the page in the editor and add the property as a field                               |
| Submission rejected as required                         | A required field (or required email) was left blank                | Fill required fields; check the **Collect email** toggle in Form Settings                 |
| "Too many submissions / requests"                       | IP rate limit hit (10 submits or 30 loads per minute)              | Wait a minute and retry                                                                   |
| Calendar ending shows a thank-you instead of a calendar | The linked scheduling page is inactive or has no active share link | Activate the [event type](/comms/scheduling/overview) and ensure its booking link is live |
| Submission didn't create a record                       | Destination object missing or workflow failure                     | Verify the form's object exists; check the destination object for the new record          |

<Note>
  When reporting an issue, include the request id shown in the error toast. It links the in-app error to the server
  logs.
</Note>

## Related

<CardGroup cols={2}>
  <Card title="Scheduling" icon="calendar" href="/comms/scheduling/overview">
    Embed a meeting-booking calendar as a form ending.
  </Card>

  <Card title="Records" icon="table" href="/data/records/overview">
    Where form submissions are stored.
  </Card>

  <Card title="Objects" icon="cube" href="/data/objects/overview">
    Form fields come from an object's properties.
  </Card>

  <Card title="Communications" icon="messages" href="/comms/overview">
    All inbound and outbound channels.
  </Card>
</CardGroup>


## Related topics

- [Form](/blocks/embedded/object/form.md)
- [Forms](/dev/webhooks/events/forms.md)
- [form.submitted](/dev/webhooks/events/form-submitted.md)
- [Formula](/data/properties/complex/formula.md)
- [Payload format](/dev/webhooks/payload.md)
