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

# Meetings booked by contacts

> Kerux knows when a contact books a meeting, stops writing to them and tells you.

> [!NOTE]
>
> **Pro plan.** Tracking booked meetings (booking-tool webhooks, connected calendars and booking pages) is part of Pro and Agency (and the free trial). Anything you already have keeps working on every plan. See [Plans and billing](/help/account/billing.md).

When a contact books a call with you, nobody should keep sending them follow-ups. Connect your calendar (or your booking tool) and Kerux sees every new meeting, finds the contact it is with, and does what your campaign says: stop the contact, tell you on Slack, tag them, start an onboarding campaign.

## 1. Connect where meetings arrive

**Your calendar (recommended).** Calendly, Cal.com, HubSpot meetings and most booking tools write the booking into your Google or Outlook calendar, so this one connection covers them all.

**1. Open Connected calendars**

Click **Meetings** in the menu, then **Connected calendars**.

**2. Connect your calendar**

Click **Connect Google Calendar** and sign in with Google: it's free and needs no email inbox (see [Google Calendar](/help/integration-guides/google-calendar.md)). If the inbox is already connected for email, click **Turn on calendar** on its row instead (or, in **Connect accounts** > **Email inboxes**, **Manage** > **Connect calendar**). Outlook shows **Coming soon**: for now, connect your Outlook inbox and turn its calendar on.

**3. Check it**

The account shows under **Your calendars** with **On**. If it says **Needs permission**, click **Give permission** and allow calendar access on the sign-in page.

![Calendar on an inbox](https://mintcdn.com/kerux-f37add41/B5KYabzijnLOqqaq/images/inbox-calendar.png?fit=max\&auto=format\&n=B5KYabzijnLOqqaq\&q=85\&s=862c53bb873c0bbe64b9d76633b09aa7)

An inbox you already connected: its calendar is the same connection, at no extra cost. A Google Calendar you connect here is free, works in the free trial too, and is only a calendar (it never sends email). Kerux looks at it every few minutes, so a new meeting shows within about 5 minutes. Only Google and Outlook accounts have a calendar Kerux can read (not other IMAP inboxes). A meeting with nobody else on it (an all-day reminder, an out-of-office) is never counted.

**A booking tool's own webhook.** Click **Meetings** in the menu, then **Booking tools**. Pick your tool and click **Add a booking tool**. It appears as a row; click **Manage** to open its panel, copy the URL (**Copy URL**) and paste it into the tool's webhook settings; the panel says where and which events to send. Keep that URL secret: anyone with it can send bookings. Once a booking arrives, its row says **Receiving** and when the last one came in (**Waiting for a booking** and **Nothing received yet.** until then). A booking moved to another time shows as **Meeting moved** (some tools send a move as a cancellation and a new booking, which shows as such); a cancelled one as **Meeting cancelled**.

Where to paste the URL in each tool:

| Tool | Where | Events to pick |
| - | - | - |
| **Calendly** | Integrations > Webhooks | invitee.created, invitee.canceled |
| **Cal.com** | Settings > Developer > Webhooks | Booking created, rescheduled, cancelled |
| **Chili Piper** | Command Center > Integrations > Webhooks: one **Custom Webhook** each, then **Enabled** | New Meeting, Meeting Update, Canceled Meeting |
| **OnceHub** | gear icon > Account Integrations > APIs & Webhooks > **Create Webhook** | Booking scheduled, rescheduled, canceled |
| **Reclaim.ai** | Team Settings > Webhook Settings > **+ New**, then add the webhook to each Scheduling Link (Business plan) | Sent for every booking, move and cancellation |
| **SavvyCal** | Settings > Integrations > Webhooks (**+**) | event.created, event.rescheduled, event.canceled |
| **TidyCal** | Integrations > Automations > Webhooks | booking created, rescheduled, cancelled |
| **Zcal** | Integrations > Webhooks > **Connect** (your account or your team) | created, rescheduled, cancelled |
| **Koalendar** | Booking Page Editor > **After Booking**: the webhook URL, on each booking page, then save | Sent for every booking, move and cancellation |

Kerux reads each tool's bookings the way that tool's own webhook documentation describes them. Some tools don't send every detail: Reclaim.ai and Koalendar send no video call link Kerux can read (so `{{meeting.link}}` is empty for their meetings, give it a default as shown below), and Chili Piper sends no name for the person who booked (Kerux still finds the contact by their email).

**Another booking tool.** Pick **Another booking tool** when your tool (or an automation) can send its own JSON. It must send `event` (`meeting.booked`, `meeting.rescheduled` or `meeting.cancelled`), `id` (the same for the booking and its cancellation), `email`, `name`, `title`, `start`, `end` and `link`. Send `start` and `end` as full dates with a time zone (for example `2026-11-10T15:00:00Z`); a date Kerux can't read leaves the time empty.

* **Zapier or Make**: for tools that only connect through them (for example Acuity Scheduling, Setmore, SimplyBook.me or Zoho Bookings), make a Zap (or scenario) with the tool's "new booking" trigger and a **Webhooks by Zapier > POST** step (in Make, **HTTP > Make a request**, method POST, body type JSON) to the Kerux URL, with the fields above. Make a second one for cancellations with `event` set to `meeting.cancelled`.
* **HubSpot workflows** (HubSpot Meetings): add the **Send a webhook** action (method POST, the Kerux URL), tick **Customize request body** and add the keys above (a static `event` value, the contact's email and the meeting's properties).
* **HighLevel (LeadConnector) calendars**: a workflow with the **Appointment Booked** or **Appointment Status** trigger and the **Custom Webhook** action (POST, JSON body with the keys above).
* **YouCanBookMe**: in the booking page's notifications, add a webhook on "booking made" and on "booking cancelled" and write the JSON payload with YouCanBookMe's shorthand codes.

**Tools that only write to your calendar.** Google Calendar appointment schedules, Microsoft Bookings, Zoom Scheduler, HubSpot Meetings, Motion, Vimcal, Apollo, Outreach, Pipedrive Scheduler and most other schedulers put the meeting in your Google or Outlook calendar: **Connect calendar** (above) covers them with no extra setup.

## 2. Tell each campaign what to do: the "Always on" box

A meeting can happen at any step, so it doesn't go in the flow. It goes in the **Always on** box: a small box on the canvas of the campaign's **Builder**, to the left of the whole flow (also of any branch that goes left) and a little lower than the start box, not connected to any step (on a phone, a short strip above the flow). Click a line in it to open its panel. Each box's actions run top to bottom, drawn as small steps joined by a line; the **+** under them adds the next one. Click **Always on** at the top of the box to fold it to one small pill with the number of boxes (it stays folded for everyone, also after a reload), and again to open it.

To tell another app (your chat tool, a CRM, Zapier or Make), add **Send to another app (webhook)** and pick the address (**Pick an address**). Owners and admins add addresses in **Integrations > Developers**, under **Webhooks** (the panel's link **Add an address in Developers** opens it; see [Webhooks](/help/developers/webhooks.md)); Kerux sends the event, signed, with the contact and what happened.

![The Always on box on the canvas](https://mintcdn.com/kerux-f37add41/hxXnH5J2aAMkPLq4/images/always-on.png?fit=max\&auto=format\&n=hxXnH5J2aAMkPLq4\&q=85\&s=17020eb2394d13ef46d29f80dc1e2c16)

* Every new campaign already has two boxes: **When a meeting is booked** and **When the contact replies**, each with **Remove from campaign**. Delete or change them like any other box.
* Campaigns made before that show a ready **When a meeting is booked** box once: click **Add it** (or **No thanks**).
* **When the contact replies** is the campaign's **Stop when the contact replies** setting (the **Replies** switch in **Settings**): turning one on or off changes the other. Deleting this box only turns it off.
* To make your own, click **+ Always on** at the bottom of the box (or **+ Add > Always on: when...**), pick the event (a meeting booked, possible or cancelled, a reply, an invitation accepted, sent or withdrawn, a reaction to a LinkedIn message, an email opened or a link clicked), then pick an action under **Add an action**: **Remove from campaign**, **Reply with AI** (only under **When the contact replies**), **Slack message**, **Add tags**, **Notify the team**, **Send to another campaign**, **Set a contact field** or **Send to another app (webhook)**. A new **When a meeting is booked** box starts with **Remove from campaign**.
* Boxes are saved at once and work on a running campaign without pausing it. Nothing already sent is repeated.
* On the canvas a box stays small: it shows its event and actions, and how many runs failed, if any. Click a box to open its panel, where you change it, turn it off or delete it, and find the **Run log** link.
* In a day sequence the boxes show above the timeline but can't be changed there.

Slack messages and notifications can use the meeting's details: `{{meeting.start}}` (in your workspace's timezone, for example 2026-11-10 10:00 (America/New\_York)), `{{meeting.title}}` and `{{meeting.link}}` (the video call link, when there is one). A message never goes out with an empty variable, so give the link a default text, `{{meeting.link | default: "the link is in the invite"}}`, or write `{{meeting.link | optional}}` to leave it out when there is none (an empty default like `default: ""` still counts as empty). See [Variables](/help/campaigns/variables.md).

Boxes also accept other events (the contact replies, accepts the invitation...), the same as [Rules](/help/integrations/rules.md), which stay available for workspace-wide rules.

## Reply with AI

Click the **When the contact replies** box, pick **Reply with AI** under **Add an action**, and Kerux writes an answer to each reply, with your instructions (for example "friendly and short, offer a 15-minute call"):

* **Draft for me to approve** (the default): the answer waits in the **Inbox** as a **Suggested reply** with **Send it** and **Edit first**. Nothing goes out until you send it.
* **Send automatically**: only when the AI is very sure, for positive, meeting, "not now" and referral replies, at most once a day per conversation, never twice in a row, never with links, emails or phone numbers, and within the LinkedIn account's limits. Anything else stays a draft.
* **Wait before replying: from 3 to 5 minutes** (with **Send automatically**): an automatic answer never goes out at once. Kerux waits a random time in this range (you pick it, from 1 to 240 minutes), and only inside the campaign's sending hours (its **Settings** tab): a reply that arrives outside those hours is answered a few minutes after the hours start again. While it waits, the answer shows in the conversation in the **Inbox** with **Sends automatically at** and the date and time, and **Send now**, **Edit** and **Cancel** under it (see [Use the inbox](/help/inbox/use-the-inbox.md#an-automatic-answer-waiting-to-go-out)). **Send now** skips the wait and the sending hours but still checks the answer again and keeps to the account's daily limits.
* Right before it goes out, Kerux checks again. It isn't sent (and you see why under it in the **Inbox**) if the contact wrote again (Kerux answers their newest message instead), someone already answered, the contact left the campaign or is on the blocklist or the do-not-contact list, you turned the box off or switched it to drafts, or the text had an empty variable, a link, an email or a phone number. In most of these cases the text stays as a **Suggested reply** you can still send (not when someone already answered or the contact is on the blocklist or the do-not-contact list).
* If the LinkedIn account can't send just then (its daily limit is used up, it's paused or disconnected), the answer waits for the next chance and goes out then; it's never marked as failed for that. After 4 days without a chance, it's kept as a draft and you get a notice.
* **Not interested** and **stop writing to me** are never answered: the contact's owner (or whoever created the campaign) gets a notification in Kerux instead. Tick **Also tell the contact's owner in Kerux** to be told about every answer.
* Under **Answer these replies**, pick which reply types it answers: **Positive**, **Wants a meeting**, **Question**, **Not now**, **Referral**, **Out of office** and **Other** (all of them unless you untick some). For those types the box decides, instead of the campaign's **What to do with each reply** setting.
* The contact's history says **AI reply drafted (Written by AI)**, **AI reply scheduled (Written by AI)** when an automatic answer is waiting, **AI reply sent (Written by AI)** once it really went out, or why it waits or wasn't sent, for example **AI reply waiting: outside the campaign's sending hours**, **AI reply waiting: the LinkedIn account's limit is used for now**, **AI reply not sent: the contact wrote again** or **AI reply not sent: canceled by Ana**. **AI reply: Ana pressed Send now** shows who sent one early.

The answer is written while Kerux reads the reply's type, with your team's monthly AI credits (see [Billing](/help/account/billing.md)). When this month's AI credits are used up, the AI writes no answer (see below for the notice and the ready draft you still get); tick **Also tell the contact's owner in Kerux** so someone still hears about each reply.

When it can't answer (your AI credits for the month are used up, the AI doesn't answer, it has nothing to say) or an automatic answer is kept as a draft by one of the limits above, you always get a notice in **My tasks** saying why, with **Buy AI credits**, **Review the draft** or **Write it yourself**. For a meeting request or a positive reply it leaves a short ready draft in the contact's language; it never sends that one by itself.

The answer also uses your [business profile](/help/account/business-profile.md): your offer, your proof, the words to avoid and the tone of your selling style.

The reply's text from the contact is read as data, never as instructions.

## 3. Sure or possible: who booked?

People often book with another email than the one you have. Kerux tells two cases apart:

* **Sure**: the attendee's email is the contact's email (or an email you confirmed before, or one saved in an email field of the contact). The box runs right away.
* **Possible**: no exact email, but strong signs point to a contact. Examples:
  * "Mariano Pérez" books from [mariano@newco.com](mailto:mariano@newco.com) and your contact is Mariano Pérez García: **same name**.
  * "Ana Ruiz" books from [ana@acme.com](mailto:ana@acme.com) and your contact Ana Ruiz works at acme.com: **same name** and **email at their company's domain** (the domain never counts for gmail.com, outlook.com and other personal mailboxes, and alone it isn't enough).
  * The event is called "Call with Ana Ruiz": **their name in the meeting title**.
  * Only one contact got your Calendly link in the last 14 days and an unknown email books: **got your booking link recently**.
  * The same email is on two contacts: both are shown, **same email (on several contacts)**.

A possible meeting never stops anyone by itself. It waits at the top of **My tasks** (under **Home**, and on **Home** under **Your tasks**) as **Possible meeting: confirm contact?**, with the event, who booked and up to three matching contacts with their reasons. The campaign's builder and the contact page also show a link to it.

![Possible meeting card](https://mintcdn.com/kerux-f37add41/hxXnH5J2aAMkPLq4/images/possible-meeting.png?fit=max\&auto=format\&n=hxXnH5J2aAMkPLq4\&q=85\&s=bffbb0554a58614997003d27b4d673a5)

* **Yes, it's** and the contact's name (for example **Yes, it's Ana Ruiz**): that email is saved on the contact (next time it's sure) and the meeting counts as booked: the campaign's box runs.
* **Different person**: search for the right contact (name, company or email) and click **It's this contact**.
* **Not a contact**: nothing happens.

Unconfirmed cards close by themselves when the meeting date passes and stay in the history. A box set to **When a possible meeting needs confirmation** can tell you on Slack, in Kerux or in another app (webhook); it can't remove anyone.

## 4. What you see

* The contact's history shows **Booked a meeting**, **Meeting moved** or **Meeting cancelled**, with the title and time.
* You get a notification in Kerux when a contact books or cancels, or when a possible meeting needs you (the person who connected the calendar or booking tool; otherwise the workspace's owners and admins).
* A cancelled meeting is noted and you're told, but the contact is not put back into the campaign (you decide).
* **Analytics** shows **Meetings booked** for the workspace and a **Meetings** column per campaign.
* To start a campaign when someone books (an onboarding), use the [Kerux trigger](/help/campaigns/kerux-triggers.md) **Meeting booked**. The template **Meeting booked: notify me in Slack** does it in one click.

## Remind the contact before the meeting

Fewer no-shows: a short reminder some hours before the call, by email, [WhatsApp](/help/getting-started/connect-whatsapp.md) or LinkedIn.

**1. Make a reminder campaign**

Create a campaign with the step that sends the reminder (**Send email**, **Send WhatsApp** or a LinkedIn **Message**), for example: `Hi {{contact.first_name}}, see you {{meeting.weekday}} at {{meeting.time}} ({{meeting.timezone}}): {{meeting.link | default: "the link is in the invite"}}`. Add **Notify the team** or a Slack step too if you want a note yourself.

**2. Start it from Meeting starts soon**

On the start box, **+ Add** under **Trigger** > **Kerux event** > **Meeting starts soon**, and pick how long before: 15 minutes to 3 days (24 hours by default).

**3. Fit the sending hours**

In the campaign's **Settings**, set the sending days and hours so the reminder can leave in time (a reminder for a Monday 9:00 call sent 24 hours before needs Sunday in the sending days).

What Kerux does for you:

* **The meeting's own time.** `{{meeting.start}}`, `{{meeting.date}}`, `{{meeting.time}}` and `{{meeting.weekday}}` are in your workspace's time zone, right across summer time changes ("24 hours before" is always 24 real hours).
* **Cancelled: no reminder.** If the meeting is cancelled (or the contact is taken off it) before the reminder leaves, it isn't sent. The contact's history says **Meeting reminder not sent: the meeting was cancelled**.
* **Moved: a new reminder.** The reminder for the old time stops and a new one goes out before the new time, with the new time in it.
* **Never twice, never late.** Each meeting time is reminded once (even if the campaign doesn't allow re-entry), and nothing is sent once the meeting has started: a reminder still waiting for the sending hours then is dropped with **the meeting had already started**.
* **Booked at the last minute.** A meeting booked after its reminder time (booked 2 hours ahead for a 24-hour reminder) gets no reminder, unless you tick **Also remind meetings booked after that time**; then it goes out right away.
* Only meetings with a sure contact (or one you confirmed) are reminded; all-day events are not.

To be reminded **yourself**, see [Kerux on your phone](/help/getting-started/phone-app.md): **Remind me before meetings with contacts** (30 minutes by default) shows in **My tasks** and, with notifications on, on your phone.

## Privacy

Kerux keeps only the meeting's time, title, video link and the email of the contact it matched (for a possible meeting, also the name and email of the person who booked, so you can say who it is). Never the description, the location or anyone else's email. **Disconnect calendar** deletes the meetings it brought; removing a booking tool's URL does the same.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.