Hosts publish their hours. Visitors book one time.

Meet Me is a meeting scheduler we are building on this Drupal site. A host says what can be booked with them (meeting types) and when (schedules that turn into slots); a visitor picks a type, then a time; every booker is filed as a contact in the CRM. Everything below is sample data, so book, cancel and try to double-book freely.

  • 3 kinds of schedule
  • 3 meeting types
  • 1 CRM contact per booker
meetme…/availability/38
DH

Intro call

with Demo host (sample host)

30 min Video call
  • Time
  • Details
  • Booked
Day
Open times

Times in America/Los_Angeles

Your details

A replica of a slot page that books into sample data in your browser. The real slot pages are one click away on the calendar.

Book as a visitor

No account needed: a name and an email are enough. These pages are public, and every booking made on them sends two emails and creates or finds a CRM contact.

Slot page and booking form

/availability/{id}

One window of time. Pick a meeting type, then a time: the slot is cut into times of that type's length, and a time any booking of the host overlaps is gone.

Team calendar

/agenda/team

The public page of the contrib module Booking Calendar, for a 30-minute Discovery call. Its hours also arrive here as slots, through the third kind of schedule.

Your booking

/booking/{id}/manage/{token}

The link in the confirmation email: the booking, its meeting type and host, and a button to cancel. There is no account to log in to.

Offer time as a host

Every account can host. Log in as the demo host with drush @ddev.meetme uli --name=host, then set up what can be booked and when.

Add availability

/availability/schedule/add

Three kinds of schedule: Regular hours (a week table with closed dates), Repeating session (every other Tuesday, first Monday) and hours from a Booking Calendar. Each one makes slots eight weeks ahead.

Every booker lands in the CRM

The glue is our module crm_meeting. Administrators can follow a booking from the form to the contact it was filed under; log in with drush @ddev.meetme uli.


  • 10:02:07

    10:02:07

    A type, then a time

    The visitor picks a meeting type and one of its open times, and types a name and an email.



  • 10:02:11

    10:02:11

    Re-checked under the host's lock

    One booking per host at a time, so two visitors cannot take the same time.



  • 10:02:11

    10:02:11

    Filed under a contact

    The contact the booker's account is mapped to, else a person with that email, else a new person. An existing contact is never changed from the public form.



  • 10:02:12

    10:02:12

    Two emails

    The booker gets their manage link, the host gets the booking.



  • later

    later

    Canceled from the link

    The time opens again and both are emailed. The booking stays on the contact's Meetings table.


A contact and its meetings

/crm/contact/4

Test Booker, with the Meetings table: time, meeting type, host and status of every booking filed under it.

Every booking

/admin/content/bookings

All bookings of all hosts, each with the contact it was filed under.

Every meeting type

/admin/content/meeting-types

Intro call, Office hours and Consultation, by host. A type that was ever booked cannot be deleted, only turned off.

Team calendar builder

/admin/config/services/booking-calendar

Booking Calendar's own settings for the Team calendar: weekly hours, blocked dates and the Discovery call type, which schedule 4 turns into slots here.

What the scheduler enforces, and where it does not yet

The rules from the mantra_booking README, as they stand today. The gaps are on our list.

Rules the scheduler enforces, and known gaps
Rule Status What people see
A slot is cut into times of the chosen meeting type's length. Enforced An hour-long type in 09:00–12:00 offers 09:00, 10:00 and 11:00.
A time closes when any confirmed booking of the host overlaps it. Enforced Of any type, in any slot: a 30-minute booking at 09:30 closes the 09:00 hour.
A host's slots never overlap. Enforced The slot form refuses to save; the schedule generator leaves the time out and reports it.
A host cannot book their own slot. Enforced The slot page tells them to share it instead.
Dragging a slot on the calendar is checked for overlaps. Known gap Not yet: the drag saves through FullCalendar and skips the slot form's check.
Times are shown in the visitor's own time zone. Known gap Not yet: visitors see the site's zone, America/Los_Angeles.
An hour-long meeting can start every 30 minutes. Known gap Not yet: times step by the meeting type's own length.

Shipped so far

Four weeks of work on mantra_booking, its two submodules and crm_meeting.


  • Oct 1

    Oct 1

    Site installed

    Slots, a booking form, two emails, and every booker filed in the CRM by crm_meeting.



  • Oct 2

    Oct 2

    Meeting types

    Name, length, location and description per host. A slot offers some or all of them; the visitor picks a type, then a time.



  • Oct 2

    Oct 2

    Schedules that make slots

    Regular hours and, in mantra_booking_recur, repeating sessions on Recurring Dates. Changing the hours regenerates the unbooked slots; a booked one is never moved.



  • Oct 5

    Oct 5

    Hours from Booking Calendar

    mantra_booking_calendar reads a Booking Calendar's hours and its bookings, so a time booked on either side is gone on both.



  • Oct 28

    Oct 28

    This page

    Built in Drupal Canvas from the Singularity theme's components, through the same canvas_tools operations the drupal-meetme MCP server offers an agent.


Up next

The open items from testing, as the questions that led to them.

Why does a host have to share a new link every week?
Because a slot is one window of time, and its page is /availability/{id}. The plan: a booking handle on each account and one page per host, /meet/{handle}, listing all their upcoming times. Slot pages get readable aliases along the way.
Can a host edit their week on the calendar itself?
Not well yet. First the overlap check for dragged slots, then dragging across the week to add time, dragging edges to resize, and copying last week.
Is the booking form ready for real visitors?
Not yet. Before real use it needs spam protection (each submission sends emails and creates a contact), minimum notice and buffers between meetings, and a calendar invite in the confirmation.
Where does a contact's meeting history go?
Into a Meetings tab of its own beside Summary, Relationships and Comments, rather than a table at the bottom of the contact page.
And after that?
Group sessions with a capacity, intake questions per meeting type, reminders, rescheduling, and later sync with the host's own calendar, payment and teams.

Book a time, then try to take it twice.

One demo host, three meeting types, three schedules and a handful of bookers in the CRM: all sample data, so nothing you do here reaches anyone.