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.

EventWhen
booking.createda new booking
booking.cancelleda booking was cancelled
booking.rescheduleda meeting was moved
booking.types_updatedmeeting 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 with BOOKING_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.