# Cal.com scheduling

Let respondents choose and book a Cal.com appointment without leaving your form.

## Cal.com scheduling

Add a native Schedule appointment question, connect Cal.com, and let respondents book an available slot inside the form.

> ℹ️ **Available on every plan**
> <p>Cal.com scheduling is available on Free, Pro, and Business plans.</p>

<h2 id="native-workflow">What native scheduling means</h2>

<p>
  Schedule appointment is a formbase question, not an iframe. It uses your form's theme and language, participates in conditional logic, and
  records confirmed booking details with the submission. Cal.com supplies event types, availability, calendar invitations, and meeting
  links.
</p>

<ul>
  <li>Show or hide scheduling based on earlier answers.</li>
  <li>Require every visible Schedule appointment question to be booked before submission.</li>
  <li>Prefill attendee name and email from earlier questions.</li>
  <li>Show available dates and times in the respondent's time zone.</li>
  <li>Include booking details in submission views, PDFs, notifications, exports, and integrations.</li>
</ul>

<h2 id="connect">Connect Cal.com</h2>

<p>
  You can also connect accounts from <strong>Workspace → Integrations → Scheduling → Cal.com</strong>. Connections belong to the workspace,
  so workspace members can reuse them on other forms and connect additional Cal.com accounts.
</p>

<h2 id="configure">Configure the question</h2>

<p>
  If no fields are mapped, respondents enter their name and email in the scheduling question. When fields are mapped, their answers flow
  into booking details automatically.
</p>

<h2 id="respondent-experience">Respondent experience</h2>

<ol>
  <li>
    The respondent picks a date, then an available time. Times show in the time zone their browser reports; they can pick another from the{' '}
    <strong>Time zone</strong> list, and the booking uses the one they chose.
  </li>
  <li>
    They confirm attendee name and email, then press <strong>Book</strong>.
  </li>
  <li>Cal.com creates the booking and sends its normal confirmation and calendar invitation.</li>
  <li>
    formbase shows the booking back to them as <strong>What</strong>, <strong>When</strong>, <strong>Who</strong>, and{' '}
    <strong>Where</strong>, with the meeting link.
  </li>
  <li>
    Before submitting, they can press <strong>Cancel booking</strong> and choose another time.
  </li>
</ol>

> ℹ️ **Booking happens before form submission**
> <p>
>     Cal.com confirms the appointment when the respondent clicks Book. The booking then attaches to the form submission when they submit the
>     form. Until then the appointment exists on the host's calendar even if the respondent walks away. On a public link, formbase releases it
>     again when the form is still not submitted 24 hours after booking; on a request, when the request is cancelled or expires. It is also
>     released when you delete the submission or the form.
>   </p>

<p>
  If a time is taken by someone else between listing and booking, the respondent is told so and sees the times that are still free. If a
  booking attempt fails halfway, formbase cancels the calendar entry it created rather than leave the host with a booking the form does not
  know about, and a second device cannot book the same question twice.
</p>

<h2 id="logic">Use scheduling with logic</h2>

<p>
  Logic can show or hide Schedule appointment like any other question. Example: ask whether a lead has budget and authority; reveal booking
  only when both answers qualify.
</p>

<p>
  A visible Schedule appointment question must have a confirmed booking before submission. A hidden one does not block submission. Once a
  respondent books, the answers that decide whether the question shows are locked, so a later answer cannot hide the booking by accident; to
  change one, they cancel the booking first. If the question is hidden when the form is submitted anyway, for example because a branching
  rule skipped its page, that booking is cancelled on Cal.com, so the host's calendar matches the submission.
</p>

<h2 id="publish-checks">Publish checks</h2>

<p>Publishing is blocked while a Schedule appointment question is missing either half of its setup:</p>

<ul>
  <li>
    <strong>Connect Cal.com before publishing forms that schedule appointments.</strong> — an event type is selected but no account is.
  </li>
  <li>
    <strong>Select a scheduler event type before publishing this Schedule appointment question.</strong> — an account is selected but no
    event type is.
  </li>
  <li>
    <strong>Complete setup for this Schedule appointment question before publishing.</strong> — neither is selected.
  </li>
</ul>

<p>
  Each message points at the question that caused it. In the editor, the same three states show on the question as{' '}
  <strong>Not connected</strong>, <strong>Event missing</strong>, and <strong>Configured</strong> badges.
</p>

<p>
  An event type that needs more than a name, an email and a time cannot be booked from a form. Event types that require confirmation, recur,
  have seats, cost money, or ask required booking questions are listed as <strong>Not bookable from a form</strong> and cannot be selected;
  a form that still points at one is blocked from publishing until you choose another event type.
</p>

<h2 id="after-booking">After submission</h2>

<p>
  Booking details appear under the Schedule appointment question in the submission table and detail view, with the date and time in your own
  language. They are also available to notification emails, generated PDFs, CSV/Excel exports, webhooks, and mapped integrations. Webhooks,
  Zapier, n8n, Make, request callbacks and the API receive the booking as data: start and end time, time zone, attendee, meeting link,
  Cal.com booking id and status. See <a href="/developers/webhooks-reference#bookings-and-payments">Bookings and payments</a>.
</p>

<p>
  formbase keeps listening after submission. When the respondent or the host reschedules or cancels through Cal.com, or the host rejects the
  booking or marks a no-show, the booking on the submission is updated: its status changes, and the text shown for it starts with{' '}
  <strong>Rescheduled</strong>, <strong>Cancelled</strong>, <strong>Rejected</strong>, or <strong>No-show</strong>. The table, exports, the
  API and regenerated PDFs show the current state. Integrations are not sent again: the submission itself did not change.
</p>

<p>
  Deleting a submission, or the whole form, cancels its appointments on Cal.com so the host does not keep a slot for answers that no longer
  exist.
</p>

> ⚠️ **Edit after submission is disabled**
> <p>
>     Forms containing Payment, Signature, or Schedule appointment questions cannot let respondents edit answers after submission. formbase
>     turns that setting off during publish so external payment, signature, and booking records cannot drift from submitted answers.
>   </p>

<h2 id="connection-health">Connection health</h2>

<p>
  A daily job refreshes Cal.com OAuth tokens before they expire. A temporary Cal.com outage is retried the next day and changes nothing. If
  access is revoked, the connection is marked expired: the question shows a <strong>Disconnected</strong> badge, booking stops working for
  respondents, and the person who connected the account gets an email naming each published form that books through it. Reconnect Cal.com
  from Workspace → Integrations → Scheduling, then reselect the account and confirm the event type on each affected question.
</p>

<p>
  Disconnecting a Cal.com account from Workspace → Integrations lists the published forms that schedule appointments through it. Those forms
  stop accepting bookings, and their owner is emailed. Reconnecting the same Cal.com account restores them: the questions keep the account,
  so there is nothing to select again.
</p>

<h2 id="next-steps">Next steps</h2>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Conditional logic](/building-forms/conditional-logic) — Reveal booking only for qualifying answers
  - [Question types](/building-forms/field-types) — See every question available in formbase
  - [Integration health](/integrations/health-monitoring) — Reconnect expired OAuth accounts
  - [Submission inbox](/submissions-analytics/submission-inbox) — View booking details with submissions
</div>
