doc-site
Runbooks

Booking calendar will not open

Book Now does nothing, the calendar shows no slots, or the wrong treatments appear.

Booking calendar will not open

Use this runbook when a Book Now button does nothing, when the calendar area stays empty, when every clinic shows no availability, or when the calendar lists the wrong treatments.

The calendar depends on a third-party SDK whose load order the theme cannot control. Start by checking whether the Sesami SDK loaded.

Diagnose

1. Check the SDK loaded

In the browser console on the MediSpa page:

typeof window.SesamiSDK;

undefined means Sesami's script never ran, and React never mounted. That is the most common cause of an empty calendar area. Go to Repair, case A.

2. Check the configuration exists

window.theme?.medispaCalendarConfig;

undefined means the Liquid config snippet did not render on this page. Go to Repair, case B.

If it exists, check its contents:

const c = window.theme.medispaCalendarConfig;
console.log(c.products.map((p) => p.name));
console.log(Object.keys(c.clinics));
console.log(c.shopId, c.timezone);

Empty products means the page has no treatments configured. Empty clinics means the medispa_locations metaobject returned nothing.

3. Check the mount point exists

document.querySelector('.medispa-calendar--placeholder');

null means snippets/medispa-calendar-placeholder.liquid did not render. The calendar has nowhere to mount.

4. Check the button is bound

document.querySelectorAll('.js-action[data-action="open-calendar"]').length;

0 means the buttons on this page do not use the selector the binding code looks for.

If buttons exist but clicking does nothing, confirm the bundle loaded:

grep -rn "vite-tag' with 'medispa-booking-actions.ts'" sections/ snippets/ layout/

5. Check whether a script is being blocked

MediSpa layouts hold back a long list of third-party scripts using Yett. Read the blocklist for the layout this template uses:

grep -n "YETT_BLACKLIST" -A 15 layout/theme.medispa-redesign.liquid

Sesami is not on any blocklist today. If a pattern has been added that matches Sesami's CDN, the SDK will never load until the customer interacts with the page, because snippets/yett-unblock.liquid only releases blocked scripts on the first touch, keypress or click.

6. Separate no availability from no connection

Open the network panel and filter for Sesami requests while changing the month.

Requests returning data with no bookable slots means the clinic has no availability in that window. That is a Sesami configuration question, not a theme bug.

No requests at all means the SDK is present but never queried, which points back to step 2.

Failing requests belong to Sesami.

Repair

Case A: the SDK never loaded

Confirm the Sesami app is still installed and its script tag is present in the page source.

If the app is installed and the script is in the source but did not execute, check the Yett blocklist for the layout (step 5). Remove the matching pattern, or accept that the calendar mounts after first interaction.

If the app is not installed or its script tag is absent, escalate to whoever administers Sesami. No change in this repository will fix it.

Case B: the configuration is missing

The page template is missing the config snippet. Confirm the template renders both:

grep -rn "medispa-calendar-config\|medispa-calendar-placeholder" sections/ snippets/ layout/

Both must render for the calendar to work. The config supplies the data and the placeholder supplies the mount point.

Case C: the wrong treatments appear

Each Services Overview section carries its own treatment list, and a Book Now button opens the list belonging to the section that contains it.

The binding code walks up from the button looking for a script[data-medispa-products-fragment] element. A button placed outside its section, for example in a sticky bar, finds the wrong fragment or none at all.

Move the button inside the correct section, or give the page a single Services Overview section.

Case D: clinics are missing

Check the medispa_locations metaobject in Shopify Admin, under Content, Metaobjects. Every entry there becomes a clinic tab.

Adding a clinic here does not create availability. Sesami needs the same clinic configured, or the new tab shows an empty calendar. Instructions are in MediSpa booking.

Case E: the deposit charges the full price

The calendar resolves a Downpay selling plan at add-to-cart time by fetching the product's selling plan groups and looking for deposit_selling_plan. When that lookup fails, the calendar adds the line with no selling plan, and checkout charges the full price.

Check the product has the Downpay selling plan attached in Shopify Admin. Turn on ?ba_debug=* and look for the "Could not find deposit_selling_plan" error.

Verify

  1. Open a MediSpa treatment page in a private window.
  2. Click Book Now. The calendar opens with every clinic as a tab.
  3. Pick a day and a time slot.
  4. Reach the confirmation step and check the deposit and Pay In Clinic amounts.
  5. Confirm the booking. Check the cart line carries Date, Time, Timezone and a _reservation_token property in /cart.js.

A cart line without _reservation_token is a treatment purchase with no appointment held. Treat it as a failure even if everything on screen looked right.

Escalate

ProblemOwner
No availability, failing SDK requests, reservations not heldSesami
Booking form not appearing or not submittingKlaviyo
Form submitted but nothing downstream received itZapier Zap owner
Deposit taken but no appointment in the clinic systemSesami, with the reservation token from the order

Background is in MediSpa booking.

On this page