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

# Set up a form

> Build a Ravenna form with system and custom fields to collect structured information from requesters and route every ticket to the right team.

export const ArcadeEmbed = ({code, title = 'Demo', aspect = 56.25}) => {
  const arcadeIframeRef = useRef(null);
  useEffect(() => {
    function onArcadeIframeMessage(e) {
      if (e.origin !== 'https://demo.arcade.software' || !e.isTrusted) return;
      const arcadeIframe = arcadeIframeRef.current;
      if (!arcadeIframe || !arcadeIframe.contentWindow) return;
      if (e.data.event === 'arcade-init') {
        arcadeIframe.contentWindow.postMessage({
          event: 'register-popout-handler'
        }, '*');
      }
      if (e.data.event === 'arcade-popout-open') {
        arcadeIframe.style['position'] = 'fixed';
        arcadeIframe.style['z-index'] = '9999999';
      }
      if (e.data.event === 'arcade-popout-close') {
        arcadeIframe.style['position'] = 'absolute';
        arcadeIframe.style['z-index'] = 'auto';
      }
    }
    window.addEventListener('message', onArcadeIframeMessage);
    const arcadeIframe = arcadeIframeRef.current;
    if (arcadeIframe && arcadeIframe.contentWindow) {
      arcadeIframe.contentWindow.postMessage({
        event: 'register-popout-handler'
      }, '*');
    }
    return () => {
      if (arcadeIframe && arcadeIframe.contentWindow) {
        arcadeIframe.contentWindow.postMessage({
          event: 'unregister-popout-handler'
        }, '*');
      }
      window.removeEventListener('message', onArcadeIframeMessage);
    };
  }, []);
  const embedUrl = `https://demo.arcade.software/${code}?embed&embed_mobile=tab&embed_desktop=inline`;
  return <div style={{
    position: 'relative',
    paddingBottom: `calc(${aspect}% + 41px)`,
    height: 0,
    width: '100%'
  }}>
      <iframe ref={arcadeIframeRef} src={embedUrl} title={title} frameBorder="0" loading="lazy" allowFullScreen allow="clipboard-write" style={{
    position: 'absolute',
    top: 0,
    left: 0,
    width: '100%',
    height: '100%',
    colorScheme: 'light'
  }} />
    </div>;
};

A form is a template for one kind of request. It captures exactly what your team needs to act, using system fields like requester, description, and priority, plus custom fields for the details only your team cares about. The payoff is that requests arrive complete instead of starting a round of clarifying questions.

**Time:** about 15 minutes.

<Tabs>
  <Tab title="Interactive walkthrough">
    <ArcadeEmbed code="P53SiU23YEk5yiVUoJ2w" title="Setting up a form" aspect={62.55} />
  </Tab>

  <Tab title="Step-by-step">
    <Steps>
      <Step title="Go to Forms">
        Click **Forms** in the left sidebar.

        <Frame>
          ![The Forms page listing existing forms](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/1.png)
        </Frame>
      </Step>

      <Step title="Create a form">
        Click the box to create a new form.

        <Frame>
          ![The new form button on the Forms page](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/2.png)
        </Frame>
      </Step>

      <Step title="Fill in the details">
        * **Icon** to represent the form
        * **Name** it the way a requester would describe the problem, not the way your team describes the fix. Employees see this name in Slack and in the Portal.
        * **Description** explaining when to use it

        This example creates an *MFA reset* form.

        <Frame>
          ![The form details dialog with icon, name, and description fields](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/3.webp)
        </Frame>
      </Step>

      <Step title="Open the form">
        Click the card, or choose Edit from the three-dot menu.

        <Frame>
          ![Opening a form from its card](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/4.png)
        </Frame>
      </Step>

      <Step title="Add fields">
        Every form needs at least one field. For **MFA reset**, add:

        * A custom Select field asking whether the user is fully locked out
        * A custom Text field confirming the email address to reset

        <Frame>
          ![The form builder with a select field and a text field added](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/5.webp)
        </Frame>

        <Tip>
          Ask only for what changes your response. Every optional field is a field a requester will skip and a field your team will have to read past.
        </Tip>

        <Callout icon="link" color="#6B7280">Learn more about [custom fields](/documentation/tickets/forms/custom-fields) and [ticket attributes](/documentation/tickets/forms/attributes)</Callout>
      </Step>

      <Step title="Set default ticket options">
        Open the **Defaults** tab.

        <Frame>
          ![The Defaults tab showing priority, tags, assignee, and channel defaults](https://d1kzozfjh72w00.cloudfront.net/documentation/screenshots/guides/getting-started/request-types/7.png)
        </Frame>

        Defaults apply to every ticket created from this form:

        * **Priority**
        * **Tags**
        * **Assignee**, to set ownership on arrival
        * **Channel**, to publish the ticket into a public channel

        In this example the tag and channel defaults mean every MFA reset posts a ticket mirror in the public channel and arrives tagged **MFA**.
      </Step>

      <Step title="Publish it">
        New forms start in **Draft** so you can finish configuring them before anyone sees them. When you are ready, use the Publish toggle in the form header.

        You manage the full Draft, Published, and Archived lifecycle and the form's audience from the same page.

        <Callout icon="link" color="#6B7280">Learn more about [form lifecycle and audience settings](/documentation/tickets/forms/overview#form-lifecycle)</Callout>
      </Step>
    </Steps>
  </Tab>
</Tabs>

## Where forms show up

Once published, the same form is available everywhere requests come from:

* In Slack, through the Ravenna app or a shared form link
* In the [Portal](/documentation/platform/portal), on the **Start new request** tab if you feature it
* Filled in conversationally by an [AI agent](/documentation/automate/agents/customize#conversational-form-filling), so a requester never has to open a form at all
* As a [public link](/documentation/tickets/forms/overview#share-forms-publicly) requiring no login, for contractors and vendors

## Next

A submitted form is a trigger. Now make something happen when one arrives.

<Card title="Set up your first workflow" icon="arrow-right" href="/guides/day-one/set-up-first-workflow">
  Automate what happens after this form is submitted, without writing any code.
</Card>


## Related topics

- [Set up categories](/guides/day-one/set-up-categories.md)
- [Day one](/guides/day-one/overview.md)
- [Admin](/documentation/platform/admin.md)
- [Set up an AI agent](/guides/day-one/set-up-agent.md)
- [Set up your first workflow](/guides/day-one/set-up-first-workflow.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.