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š
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
- 09:00–09:30Client A standupBlocked
Client A calendar — You accepted it, so the time is gone.
- 11:00–12:00Team offsite — planningBookable
Client A calendar — Still unanswered in your inbox. The rule leaves the slot open.
- All dayDana’s birthdayBookable
Personal calendar — An all-day entry is a date marker, not a commitment.
- 13:00–14:30School pickup, then swimmingBlocked
Personal calendar — Blocked, and never named. A visitor sees a missing slot, not your afternoon.
- 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.
| Detail | Takes the slot? | What that means |
|---|---|---|
| A meeting you accepted | Blocked | On either client calendar. The slot stops being offered. |
| An invitation you have not answered | Bookable | Still bookable. An invite you never replied to should not quietly hold an hour. |
| A meeting you declined | Bookable | Declined means free, and the link treats it that way. |
| An all-day birthday or holiday | Bookable | Timed events on the same calendar still block — only the all-day entries are let through. |
| A personal appointment | Blocked | Blocked, and never described. Nothing about it reaches the page. |
| The next twelve hours | Blocked | Minimum notice, so nobody books you for tonight. Configurable; twelve hours is the default. |
| Anything outside your weekly hours | Blocked | The link only ever offers the hours you set, converted into whatever timezone the visitor is in. |
| A calendar CalendarPipe cannot read | Blocked | An 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.
- 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.
- 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.
- 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.
- 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
- Booking pages
Every setting on a page, the plan limits, and what the v1 leaves out.
- Gate functions
The rules themselves: how they are written, tested and run.
- Contracting across two companies
The sync half of the same situation — keeping two employers’ calendars from clashing.
- Hide event details when sharing a calendar
Why sharing availability and sharing contents are different asks.
- Block personal time on a work calendar automatically
Turning personal commitments into opaque busy blocks.
Sources
What the calendar providers and the underlying specifications actually say.