Medispa booking
Change the treatment booking calendar, its deposit and pay-in-clinic options, and the clinic details shown beside it.
Three places in Shopify hold these values. Wording and store-wide amounts are theme settings. Per-treatment values are product metafields. Clinic addresses and hours are metaobject entries. Sesami owns availability, and you cannot edit it in Shopify.
Change clinic details
Go to Content > Metaobjects > Medispa locations. Each entry holds:
| Field | Shown where |
|---|---|
display_name | Clinic tab label and the treatment name shown to the shopper |
address | Clinic details panel beside the calendar |
display_phone_number | Clinic details panel |
phone_number | The number the panel dials |
store_hours | Opening hours in the clinic details panel |
Adding an entry adds a clinic tab to the calendar. The calendar matches a treatment to a clinic by looking for the clinic's handle inside the product handle. A new clinic only appears against treatments whose handles contain its handle.
Change deposit and pay-in-clinic amounts
Store-wide defaults are in Customize, gear icon, Medispa Deposit.
| Setting | What it does |
|---|---|
| Deposit Amount | Fallback deposit, in dollars |
| Pay In Store Label Price | Fallback price shown on the pay-in-clinic button, in dollars |
| Cart Message | Message shown against a deposit line in the cart |
| Remaining Amount Line Item Label | Label for the balance owed, default Remaining Amount |
| Remaining Amount Line Item Value | Accepts {remaining_amount} |
| Timezone | Used for slot times, set to Asia/Hong_Kong |
These are fallbacks. A value set on the treatment replaces them. Set those under Products > [product] > Metafields.
| Metafield | Effect |
|---|---|
custom.pay_in_store_amount | The pay-in-clinic price for this treatment |
custom.enable_pay_in_store | Shows or hides the pay-in-clinic option |
custom.enable_checkout | Shows or hides the pay-a-deposit-now option. Leave it unset to keep the deposit option on |
custom.klaviyo_booking_form_id_desktop | Desktop booking form for this treatment |
custom.klaviyo_booking_form_id_mobile | Mobile booking form for this treatment |
One page-level override exists. Setting custom.pay_in_store on a landing page turns the pay-in-clinic option on or off
for every treatment on that page, whatever each product's custom.enable_pay_in_store says. A value of false still
counts as an override. To give control back to each product, delete the metafield from the page.
Enter every price in these settings in dollars, not cents.
Change booking form wording and routing
Customize, gear icon, Medispa holds the Klaviyo form IDs used when a treatment has none of its own. It also holds Medispa Booking Form Submit URL, a Zapier webhook that receives a copy of each Klaviyo booking form submission. Clearing that URL stops the copies. The form itself keeps working.
Medispa - Terms & Conditions Popup holds the title and description for the terms popup.
Business rules
A treatment only shows a calendar if it has the sesami-service tag. Without the tag, the page shows an ordinary
product with a normal add to cart button.
The deposit option needs a selling plan from the Downpay app. If the product has no Downpay selling plan, the shopper cannot pay a deposit and only the pay-in-clinic option works.
For any cart line whose vendor contains medispa, the theme recalculates the remaining balance. If you change a
product's vendor to something without medispa in it, the recalculation stops.
The calendar waits for the Sesami script before it shows anything. If Sesami is blocked or slow, the shopper sees an empty space and no error message.
Verify the change
- Open the treatment's page in a private window.
- Confirm the clinic tabs match the metaobject entries you expect.
- Pick a day and a time slot, and confirm both payment options show the amounts you set.
- Take one booking through to the cart. Check the deposit line, the remaining amount label and the cart message.
- If you changed a Klaviyo form ID, submit the form once and confirm the entry reaches Klaviyo.
If step 2 or 3 fails, see Booking calendar issues.
Developer map
| Concern | Source |
|---|---|
| Config passed to the calendar | snippets/medispa-calendar-config.liquid |
| Where the calendar mounts | snippets/medispa-calendar-placeholder.liquid |
| Calendar behaviour | src/components/medispa-calendar/CalendarRoot.tsx |
| Payment option logic | src/components/medispa-calendar/CalendarConfirm.tsx |
| Shared state | src/components/medispa-calendar/calendar-atoms.ts |
| Config and slot types | src/@types/calendar.ts |
| Deposit selling plan lookup | sections/product-calendar-config.liquid |
| Remaining balance rule | src/entrypoints/mini-cart/internals/line-item-rules/remaining-amount-recalculation-rule.ts |
| How it fits together | Architecture: Medispa booking |