Client booking link

One link for clients. Your real availability behind it.

A booking link is only as good as the calendar behind it. This one reads every calendar you keep — both clients’ and your own — and a rule you write decides which events take time off the table. Clients see open slots in their own timezone and nothing else: no titles, no other clients, no school run. They book, and a real calendar invitation arrives by email without anyone signing up for anything.

Jakub Beneš

Jakub Beneš

Founder, CalendarPipe · Updated September 6, 2026

One calendar on Free · unlimited on Pro · no card to start

A day, and what is left of it

One Tuesday, and the slots the link actually offers.

Your calendars

  1. 09:00–09:30Client A standupBlocked

    Client A calendar You accepted it, so the time is gone.

  2. 11:00–12:00Team offsite — planningBookable

    Client A calendar Still unanswered in your inbox. The rule leaves the slot open.

  3. All dayDana’s birthdayBookable

    Personal calendar An all-day entry is a date marker, not a commitment.

  4. 13:00–14:30School pickup, then swimmingBlocked

    Personal calendar Blocked, and never named. A visitor sees a missing slot, not your afternoon.

  5. 15:00–16:00Client B reviewBlocked

    Client B calendar Accepted on the other client’s calendar, and neither client learns the other exists.

What a visitor sees

09:00–17:00 · your working hours

  • 09:30
  • 10:00
  • 10:30
  • 11:00
  • 11:30
  • 12:00
  • 12:30
  • 14:30
  • 16:00
  • 16:30

30-minute slots, shown in the visitor’s own timezone. Nothing else reaches them — a blocked hour is missing from this list, not greyed out in it.

Why a booking link offers the wrong times

The invitation you never answered is holding an hour hostage
A standing invite sits on the client calendar, unanswered since March. To a booking tool an event is an event, so that hour is offered to nobody — and you look busier than you are, week after week.
Your personal calendar is not in the picture at all
The booking link reads the calendar you pointed it at. The school pickup lives somewhere else, so a client books straight over it, and you find out when the reminder fires.
An all-day entry swallows the whole day
A birthday, a public holiday, a “Q3 planning week” banner. None of them mean you are unavailable, and all of them can take a day off the table.
The fix on offer is to hand over the whole calendar
Connect everything and let the tool read it. Now a third party holds your personal calendar’s contents to answer a question that only ever needed a yes or a no.

The rules

The rules deciding what counts as busy, in full

One per calendar, small enough to read in one sitting.

Only accepted invitations block

In the app: Invitations you haven't answered or have declined stay bookable. Events you organize or accepted still block.

Client A calendar

Meetings you accepted or organised block. The offsite invite you never answered stays bookable.

Client B calendar

The same rule on the second client’s calendar, so both are consulted before a slot is offered.

function gate(event: GateEvent): GateResult | boolean {
  if ((event.responseStatus !== "declined") && (event.responseStatus !== "needsAction")) {
    return { pass: true };
  }
  return { pass: false };
}

All-day events don't block

In the app: Birthdays, holidays, and other all-day entries stay bookable. Timed events still block.

Personal calendar

Timed commitments block and are never described. Birthdays and holidays do not take the day.

function gate(event: GateEvent): GateResult | boolean {
  if ((event.isAllDay === false)) {
    return { pass: true };
  }
  return { pass: false };
}

What blocks

What takes time off the table, and what stays bookable

Availability starts from your weekly hours, and the rule on each busy calendar decides what carves into them. Every row below is that decision, not a default you have to accept.

Events and conditions on a CalendarPipe booking page, and whether each one makes a slot unavailable.
DetailTakes the slot?What that means
A meeting you acceptedBlockedOn either client calendar. The slot stops being offered.
An invitation you have not answeredBookableStill bookable. An invite you never replied to should not quietly hold an hour.
A meeting you declinedBookableDeclined means free, and the link treats it that way.
An all-day birthday or holidayBookableTimed events on the same calendar still block — only the all-day entries are let through.
A personal appointmentBlockedBlocked, and never described. Nothing about it reaches the page.
The next twelve hoursBlockedMinimum notice, so nobody books you for tonight. Configurable; twelve hours is the default.
Anything outside your weekly hoursBlockedThe link only ever offers the hours you set, converted into whatever timezone the visitor is in.
A calendar CalendarPipe cannot readBlockedAn expired connection blocks everything rather than guessing it is empty. The page offers no times at all until you fix it.

How to set up this booking page

About five minutes, most of it deciding what should block.

  1. 01

    Connect the calendars that matter

    Google, Outlook, Apple or a read-only ICS feed. Only you connect anything — no client installs or authorises a thing.

  2. 02

    Create the page and pick where bookings land

    Name it, choose the calendar confirmed bookings are written to, and set your weekly hours and the meeting lengths you offer.

  3. 03

    Add each busy calendar, with a rule

    By default every event on a busy calendar blocks. Narrow that with a template, the visual builder or code — and test it against your real events before you save it.

  4. 04

    Share the link

    The URL is unguessable and is not indexed. Visitors see free times in their own timezone, pick one, confirm their email, and get a real calendar invitation.

Common questions

Do my clients see what is on my calendar?

No. The page renders free slots only — busy time is never drawn at all, and no title, guest list or location leaves your calendar. A blocked hour is simply not offered, with nothing to say why.

Does the person booking need a CalendarPipe account?

No. They pick a time, confirm their email address with a short code, and receive a standard calendar invitation. Accepting it puts the meeting into whatever calendar app they already use — there is nothing to install and no account to create.

What stops a pending invitation from blocking my day?

The rule on that calendar. “Only accepted invitations block” leaves anything you have not answered, or have declined, bookable. It is the same gate function machinery that drives sync rules, so you can read exactly what it does before you run it.

Can one page cover two clients?

Yes — that is the setup on this page. Add each client calendar as a busy source and both are consulted before a slot is offered, without either client learning the other exists. The free plan checks one calendar per page; Pro removes that limit.

What happens if one of my calendars is unreachable?

The page offers no availability at all. Rather than guessing that a calendar it cannot read is empty, it fails closed until the connection is fixed — a booking page will never offer time it cannot verify is free.

Can someone reschedule a booking?

Not yet. Both of you get a cancellation link, so the booker cancels and picks a new time.

Put your own link behind this

Connect the calendars, decide what counts as busy, and share the link. The free plan covers one page reading one calendar; Pro is free for 14 days.

Keep reading