Booking and webhooks
A public page for booking meetings, meeting types with prices, notifications and outgoing webhooks with signatures and retries.
Booking is a public page where people book a meeting with you, like cal.com, right inside your Rivo. In the dashboard it's the Booking section with tabs for meetings, meeting types, schedule and settings.
What the guest sees
The /book/<meeting-type> page on your instance (e.g. https://name.me.rivo.day/book/intro): the guest picks a meeting type if there are several, a day and a time in their own time zone, enters a name, email and Telegram and answers your questions. After booking they get a confirmation with a calendar file and a Google Meet link. The guest can cancel or reschedule from the link in the confirmation.
To embed booking into your website, add the script (data-slug is the meeting type's address):
<script src="https://name.me.rivo.day/book/embed.js" data-slug="intro" data-mode="popup"></script>
In popup mode any element with the data-oc-book attribute opens the booking window; in inline mode the form goes into a data-oc-book-inline container.
Every booking creates a lead in your network automatically, and you get a Telegram notification and a push.
Meeting types
A type has a duration, buffers before and after, a minimum notice, a location (Google Meet, phone or custom), questions for the guest, "requires confirmation" and a price: amount, currency (three-letter code) and a note. An empty price means the meeting is free or "on request".
Webhooks
A webhook sends booking events to your website or CRM. The address and secret are set in Settings → Services and notifications → Booking: BOOKING_WEBHOOK_URL and BOOKING_WEBHOOK_SECRET.
| Event | When |
|---|---|
booking.created | a new booking |
booking.cancelled | a booking was cancelled |
booking.rescheduled | a meeting was moved |
booking.types_updated | meeting types changed (a burst of edits within a couple of seconds is one event with the latest version) |
Booking events carry the meeting data: id, status, start and end, type, guest (name, email, Telegram, time zone), source.
Delivery. Success is any 2xx response within 5 seconds. Otherwise it retries after 10 seconds, 1 minute and 10 minutes; after four failures the event is marked undelivered, and the booking screen shows a banner about undelivered webhooks with a retry button. The delivery log is kept for 30 days.
Headers:
X-Delivery-Id— the same across all retries: use it to drop duplicates;X-Delivery-Attempt— the attempt number;X-Signature: sha256=<hex>— HMAC-SHA256 of the raw request body keyed withBOOKING_WEBHOOK_SECRET. No secret — no header.
In the Cloud the webhook address must be HTTPS and public, with no redirects.
Public booking endpoints work without a token, at most 30 requests a minute from one address. They're described in your instance's OpenAPI, see API tokens and OpenAPI.

