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

# Manage bookings

> Every booking made through your meeting links in one table: join the call, reschedule, reassign the host, cancel, or mark a no-show.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

By the end of this page you can find any booking made through your meeting links and, from the same row, join the call, reschedule it, reassign its host, cancel it, or mark a no-show.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Meetings<span className="pl-path__sep">→</span>Bookings</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Bookings <code>read-meeting-links</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-meeting-links</code> to add one, <code>update-meeting-links</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* A booking has to exist first. It is created when someone books through one of your meeting links, not from this page.
* **Reschedule**, **Reassign host**, **Cancel booking**, **Mark as no-show**, **Undo no-show** and **Send recovery email** all need the `update-meeting-links` permission on top of the view access above. A Viewer has read access to meeting links but not update, so the row menu only ever offers them **Join call** and **Copy manage link**. The server checks the same permission, so a hidden action is a blocked action, not a missing button.

## Steps

<Steps>
  <Step title="Open Bookings">
    Go to <UiPath>Meetings → Bookings</UiPath>. Four tabs sit across the top: **Upcoming**, **Past**,
    **Canceled**, **No-shows**. They are not four independent statuses, they are a server filter on two
    fields. A booking is stored as confirmed, canceled or a no-show; Upcoming and Past are the same
    confirmed bookings split by whether their start time has passed, while Canceled and No-shows each
    hold one of the other two stored statuses. That split is also why the same booking can never sit in
    two tabs at once.

    Three filters sit below the tabs: **Meeting link**, **Host** and **Search by email**. Search by
    email narrows the table to invitees whose address contains what you type. Picking a meeting link
    clears whatever host you had selected and narrows the **Host** list to that link's own hosts; leave
    it on **All meeting links** and the list covers every host across every link instead.

    <Screenshot id="meetings/bookings--upcoming" url="/bookings" alt="The Bookings page on its default Upcoming tab, with the Meeting link, Host and Search by email filters above a table of upcoming bookings from more than one meeting link" caption="Upcoming is the tab you land on. Dates and times render in your own browser's timezone, which is not necessarily the one the invitee booked in." />
  </Step>

  <Step title="Read a row">
    Each row shows the **Invitee** (name and email), the **Meeting** it was booked through,
    **Date & time**, the **Host**, and a **Status** chip. The chip reads the booking itself, not the
    tab you are on: a confirmed booking that has not finished yet gets a filled **Upcoming** chip, a
    confirmed one that has finished gets an outlined **Completed** chip, and the other two carry
    **Canceled** and **No-show**.

    Those two clocks are not the same clock. The tabs split on the start time, the chip flips on the end
    time, so a meeting that is running right now sits under Past with an Upcoming chip on it.

    <Screenshot id="meetings/bookings--tabs" url="/bookings" alt="The Past tab of the Bookings table, its rows carrying the outlined Completed status chip instead of the filled Upcoming one" caption="Completed bookings look different on purpose, an outlined chip instead of a filled one. This is also the only tab where Mark as no-show shows up in the row menu." />
  </Step>

  <Step title="Join, reschedule or reassign an upcoming booking">
    Open the menu at the end of a row, under **Actions**. What it offers depends on the booking:

    * **Join call** opens the video link in a new tab. It only appears on a confirmed booking that has
      a video link and has not finished yet.
    * **Reschedule** opens a dialog with a **Select a date & time** calendar embedded in it: pick a date
      from the link's own available days, then a time slot, with a timezone selector above defaulting
      to your own. Picking a slot surfaces a confirmation line before anything moves, and only
      **Confirm new time** actually submits it.
    * **Reassign host** only appears on a **Round robin** link's booking, never on a **Collective**
      one. Its dialog lists every host on that link's roster under **New host**, each with a
      **Calendar ready** or **No calendar** chip; the chip is informational, a host with no calendar is
      still selectable. Only the booking's current host is greyed out, marked **(current)**. Pick
      someone and confirm with **Reassign**.

    <Screenshot id="meetings/bookings--reschedule" frame="bare" alt="The Reschedule booking dialog, headed with the invitee's name and current time, then a Select a date & time calendar: a month grid on the left and, on the right, a panel telling you to choose a date before any times appear" caption="No date is picked yet, so there are no times to show. Choosing one loads that day's slots, and choosing a slot adds a confirmation line below the calendar." />
  </Step>

  <Step title="Cancel, or follow up on one that fell through">
    **Cancel booking** is the last item in the menu and only shows on a confirmed booking that has not
    finished yet. It opens a dialog with a **Reason (optional)** field and a line saying the invitee
    will be notified by email, including that reason if you typed one. The dialog's own confirm button
    is also called **Cancel booking**, so the way out without canceling anything is **Keep booking**.
    Confirming releases the time slot. There is no undo: nothing in the menu reopens a canceled
    booking.

    Once the meeting is over, **Reschedule** and **Cancel booking** drop out of the menu and **Mark as
    no-show** appears. It does not email the invitee by itself, but on a meeting link set up for
    automatic no-show recovery the recovery email goes out at that moment. The booking then moves to
    No-shows, where **Undo no-show** turns it back into a confirmed booking and emails nobody.

    A canceled or no-show booking offers **Send recovery email**, a short follow-up that apologizes for
    the miss and gives the invitee a link to pick a new time. **Copy manage link** appears on any
    booking that has one, and copies the invitee's own self-serve link for rescheduling or canceling,
    so you can hand it to them directly.
  </Step>
</Steps>

## What happens next

<Check>
  Canceling, rescheduling, reassigning and marking or undoing a no-show all reload the table on the
  spot. A canceled booking leaves Upcoming for Canceled, a rescheduled one keeps its new time under
  Upcoming, and a no-show flips into the No-shows tab. **Send recovery email** and **Copy manage link**
  change nothing in the table, so they just confirm with a toast.
</Check>

Canceling emails the invitee and every host on the booking, and rescheduling does the same while
releasing the original slot for someone else to take.

<Note>
  Reassigning sends the invitee nothing from us: the only email we send goes to the new host. The
  invitee's calendar does not stay quiet, though. The old host's copy of the event is deleted, which
  makes that calendar send its attendees, the invitee included, its own cancellation, and a fresh event
  is then created on the new host's calendar with the invitee on it again. If the swap matters to them,
  say so yourself rather than leaving two calendar messages to explain it.
</Note>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Mark as no-show isn't in the row menu">
    The meeting has to be over, not just started. A booking that is still running counts as upcoming
    even though the Past tab lists it, so it offers **Cancel booking** instead. A booking already
    canceled or already marked a no-show has neither.
  </Accordion>

  <Accordion title="Reassign host isn't in the row menu">
    It is built for round robin links only, where a booking can move from one host to another. A
    collective link puts every host on the same booking, so there is no single host to reassign, and the
    option never appears for one.
  </Accordion>

  <Accordion title="Reschedule or Reassign host fails right after I confirm">
    The server checks again as it saves, and can still refuse. Rescheduling fails if the time you picked
    is no longer free, or if the host who has to be there is busy then; reassigning fails if the host you
    picked is busy or is no longer on the link's roster. Both also refuse once the meeting has started,
    even though the row still offers them until it ends. You get an error naming the problem, or a
    generic failure message if the server did not say more, and nothing is changed. Neither dialog
    closes: the reschedule one clears the date and slot you had chosen so you pick a fresh one, and the
    reassign one leaves your host selected so you can try another.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="What invitees see" icon="calendar-check" href="/en/meetings/what-invitees-see">
    The portal, calendar and confirmation your invitee sees, plus the self-service page behind Copy manage link.
  </Card>

  <Card title="Hosts: round robin vs collective" icon="users" href="/en/meetings/hosts-round-robin-and-collective">
    How bookings are shared between hosts, and why a collective link never offers Reassign host.
  </Card>

  <Card title="Lead stages and the funnel view" icon="funnel" href="/en/leads/lead-stages-and-funnel-view">
    The six fixed stages a lead moves through, and the drag-and-drop funnel board.
  </Card>
</CardGroup>
