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

# Connect your calendar so leads can book

> Connect Google Calendar, choose which calendars are checked for conflicts and where new bookings land.

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>;
};

When you finish, the times your meeting links offer are checked against your real
calendar, and every meeting someone books is added to the calendar you choose.

<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">Your avatar<span className="pl-path__sep">→</span>Profile Settings<span className="pl-path__sep">→</span>Calendar</span></div>
  </div>

  <div className="pl-availability__note">Google Calendar is always offered. The Microsoft button is behind a flag while the Microsoft app completes publisher verification.</div>
</div>

## Before you begin

* **A Google account holding the calendar you actually use.** You connect one
  account at a time, and you can add more afterwards.
* **Permission to see and change that calendar.** Google asks for both, because
  putting a booking on your calendar is a change.

<Note>
  A calendar connection belongs to you, not to the workspace. Every host on a
  meeting link connects their own, and yours follows you into every workspace you
  belong to.
</Note>

## Steps

<Steps>
  <Step title="Open your calendar connections">
    Go to <UiPath>Your avatar → Profile Settings → Calendar</UiPath>. The card is
    headed "Calendar connections", and until something is connected it reads
    **No calendar connected yet** above a single **Connect Google Calendar**
    button (1).

    Once you have an account, the same button sits under an **Add calendar
    account** heading at the bottom of the card.

    <Screenshot id="getting-started/connect-your-calendar--empty" url="/user/calendar" alt="The Calendar connections card with no accounts: a calendar icon, the heading 'No calendar connected yet', a line of explanation and a Connect Google Calendar button" caption="Connecting starts here even when the thing that needs a calendar is a meeting link somewhere else." marks={[{ n: 1, x: 50, y: 72 }]} />
  </Step>

  <Step title="Approve the calendar permission">
    **Connect Google Calendar** sends the whole page to Google. The app
    disappears for a moment and comes back. This is not a pop-up, so a pop-up
    blocker will not stop it.

    Sign in and approve the calendar access Google asks for. Google returns you
    to the page you left. The app then shows the outcome in the corner: connected,
    or a red failure carrying the reason. It never ends without a message.

    <Screenshot id="getting-started/connect-your-calendar--consent" frame="bare" alt="Google's own consent screen, asking for access to your Google Calendar" caption="Google's screen, not ours: the wording and layout are theirs and change without notice." />

    <Note>
      This image is a representative example rather than a capture of your own
      sign-in, because a real consent screen cannot be reproduced without showing
      a real account.
    </Note>
  </Step>

  <Step title="Check what came back">
    You land back on the page you started the connection from, with a
    **Calendar connected successfully** message in the corner.

    The account now has a card of its own: the address, a **Connected** chip (1),
    and a summary line saying how many calendars are being checked for conflicts
    and where bookings will be added (2).

    You can leave it as it is. Your primary Google calendar is ticked for
    conflict checking straight away. It also becomes the calendar bookings are
    added to, unless you already chose one on another account.

    <Screenshot
      id="getting-started/connect-your-calendar--connected"
      url="/user/calendar"
      alt="A connected calendar account card showing the Google address, a green Connected chip, the conflict and destination summary line, an Edit calendars button and a delete icon"
      caption="The summary line is the whole configuration in one sentence. Read it before you open anything."
      marks={[
    { n: 1, x: 41, y: 44 },
    { n: 2, x: 34, y: 56 }
  ]}
    />
  </Step>

  <Step title="Choose which calendars block your availability">
    **Edit calendars** opens a dialog headed "Select the calendars to check for
    conflicts". The list is read from Google each time you open it, not from what
    was stored. A calendar you were added to this morning is already there.

    Tick everything that holds real commitments. A bookable time is then withheld
    whenever you have an event marked *busy* on a ticked calendar. Events marked
    free, and calendars you leave unticked, are ignored.

    <Screenshot id="getting-started/connect-your-calendar--select-calendars" frame="bare" alt="The calendar selection dialog: a checkbox list of calendars with the primary one marked, a divider, and an 'Add booked meetings to' radio group below" caption="Two decisions in one dialog: what blocks your time, and where meetings land." />
  </Step>

  <Step title="Choose where bookings are added">
    Lower in the same dialog, **Add booked meetings to** picks one calendar.

    Only calendars you can write to appear here. A calendar shared with you
    read-only can still be checked for conflicts, but nothing can be created on
    it. If none of this account's calendars can be written to, the section
    says so instead of offering a choice. **Save** still works in that case, so
    your conflict selection is kept either way.

    You have one destination across every calendar account you connect, not one
    per account. Choosing it here clears it on the others.
  </Step>
</Steps>

## What happens next

<Check>
  The card reads **Connected**, and its summary line names both the number of
  calendars being checked and the calendar bookings will be added to.
</Check>

From then on, nothing else is needed from you:

* Times you are busy on a ticked calendar stop being offered on your meeting
  links.
* A booking creates an event on your destination calendar, and the video link for
  the call is created together with that event.
* On a link with more than one host, round robin puts one event on the assigned
  host's destination calendar; collective puts one event per host, each on that
  host's own destination.
* Your row in a meeting link's host list changes from **No calendar** to
  **Calendar connected**.

If you started from the **Connect** link beside **No calendar** on a meeting
link, the round trip through Google drops you back on that form rather than on
the calendar tab.

A booking never fails for want of a calendar. A link with nothing connected
behind it still takes bookings. It simply offers times without knowing when you
are busy, and creates no calendar event and no video link. Connecting is what
closes that gap, not what switches booking on.

Disconnecting asks you to confirm first. Existing bookings are left alone. Only
the conflict checking stops.

## Troubleshooting

<AccordionGroup>
  <Accordion title="A red 'Failed to connect calendar' message">
    The round trip ended without an account, and the words after the colon are
    the reason it ended. When there was nothing to quote, it reads "Unknown
    error".

    One reason carries its own instruction: "No refresh token received. Please
    revoke app access and try again." Do exactly that: remove the app's access
    from your Google account, then press **Connect Google Calendar** again.

    Nothing is half-connected either way. The account is only written once the
    round trip has everything it needs, so a failed attempt leaves your list of
    accounts as it was.
  </Accordion>

  <Accordion title="The card says Needs reconnection">
    That account's access was withdrawn on Google's side, and the refusal only
    surfaces the next time we ask for a fresh token. Until you fix it, that
    account's calendars are skipped: your availability is worked out from
    whatever is left, so times you are busy can be offered again.

    The card grows a **Reconnect** button, and opening **Edit calendars** shows
    "This account lost access to your calendar. Reconnect it to manage its
    calendars." with the same button. Both restart the connection you did above;
    your calendar selection survives it.
  </Accordion>

  <Accordion title="The agent still warns that the booking link has no calendar">
    That is expected, and nothing you did was wrong. The warning reads the
    calendar connected to the *meeting link itself*, which is a separate
    connection made on the link's own form: its **Connect calendar** button opens
    the meeting link, not this page. Connecting your personal calendar here does
    not clear it.

    Work through [Create a meeting link](/en/meetings/create-a-meeting-link) to
    deal with the link's own connection, and
    [Calendar connections](/en/workspaces-account/calendar-connections) for how
    the two relate.

    <Screenshot id="getting-started/connect-your-calendar--agent-nudge" alt="A warning banner above an AI agent's dashboard saying the booking link created for the agent is not connected to a calendar yet, with a Connect calendar button" caption="Where this warning lives once the signup celebration, which raises the same point, has been closed." />

    <Note>
      The warning appears only where the meetings feature is switched on. Where it
      is not, no booking link is created for the agent and the banner never shows.
    </Note>
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Calendar connections" icon="calendar" href="/en/workspaces-account/calendar-connections">
    Managing accounts after the first one: reconnecting, disconnecting, several at once.
  </Card>

  <Card title="Create a meeting link" icon="link" href="/en/meetings/create-a-meeting-link">
    The link your calendar sits behind, and the calendar setting on the link itself.
  </Card>

  <Card title="Hosts: round robin vs collective" icon="users" href="/en/meetings/hosts-round-robin-and-collective">
    Which host's calendar is checked, and whose calendar the event lands on.
  </Card>

  <Card title="Your first AI agent" icon="cpu" href="/en/getting-started/your-first-ai-agent">
    Where the booking link that needs a calendar came from.
  </Card>
</CardGroup>
