> ## 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

> Public form submissions, and the records they create.

## Overview

A form submission **is** a record. Custral has no separate submissions table, so
completing a form runs the same record creation the API and the app do, against
the object the form is bound to.

One trigger today. `form.submitted` carries which form was completed, which
record it produced, and how the respondent reached it (`link`, `embed` or `app`).

<Warning>
  **One submission delivers two events.** Because the submission creates a
  record, [`record.created`](/dev/webhooks/events/record-created) fires as well
  as `form.submitted`, both carrying the same `recordId`.

  Subscribing to both, or to `*`, means a receiver that does not deduplicate
  processes each submission twice. Either subscribe to one of them, or branch on
  the `event` field.
</Warning>

## Related documentation

<CardGroup cols={2}>
  <Card title="Forms" icon="rectangle-list" href="/comms/forms/overview">
    Building a form and choosing the object its submissions land in.
  </Card>

  <Card title="Records" icon="table" href="/dev/webhooks/events/records">
    The record events that fire alongside this one.
  </Card>
</CardGroup>

## Triggers

<CardGroup cols={1}>
  <Card title="form.submitted" icon="clipboard-check" href="/dev/webhooks/events/form-submitted">
    Somebody completed a form. Carries which form, which record it created, and
    how they reached it.
  </Card>
</CardGroup>


## Related topics

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