The way to learn how to take demo bookings for SaaS is to put a slot picker on your own page, then let the system send the calendar invite and the reminders without your help. This works when your demo is a 1:1 session with a fixed length. It does not replace customer research, because a form captures intent and not the reason behind it.
I wrote this for a solo founder and a small SaaS team. The demo booking flow stopped being an engineering problem years ago. Your engineering hours belong in the product.
At a glance
These 7 decisions shape a demo funnelFunnelThe order of stages a buyer passes, from meeting you to paying you.Open the glossary.
| Funnel part | Decision | What it controls |
|---|---|---|
| Demo button | One button on the pricing page | Clicks that enter the funnel |
| Slot picker | Embedded on your own domain | People who stay on your page |
| Form | 4 to 6 fields | Bookings that become valid |
| Invite | Calendar event plus meeting link | Attendance |
| Reminder | 1 day and 2 hours before | Slots that stay used |
| No-show | Mark it, send 1 follow-up | Sessions you get back |
| Records | Source, service, status | Your demo-to-close report |
How to take demo bookings for SaaS in 6 steps
A SaaS demo funnel is short. There are 6 steps from the pricing page to a closed deal. The diagram marks the step where most people leave.

- A visitor reads your pricing page.
- She presses the schedule demo button.
- The slot picker opens on the same page.
- She picks a slot, fills the form, and confirms.
- The system sends a calendar invite with the meeting link.
- You run the session, then mark the result.
Step 3 is the largest drop-off point. People press the button, land on an unfamiliar page, and leave.
The pricing page button sets your volume
A demo button needs one job. Its job is to open the slot picker, not to open a contact form and not to open an email client.
Put the button next to the plan the reader is looking at. A team plan reader wants a demo. A free plan reader usually wants a sign-up button instead.
I break down a page built around a single action in this landing page example for Meta Ads. If you want my team to build that page, see our landing page service.
The slot picker belongs on your domain
The slot picker shows open times and takes the confirmation. Do not send people to another domain to see it. Each domain jump adds doubt.
The fast path is an embed widget. An embed widget is a small piece of code that places the provider slot picker inside your page. I recommend Termilo for this job. Rama Digital does not operate Termilo; PT Nafanesia Kebermanfaatan Indonesia in Bandung operates it.
The Termilo embed documentation describes one script tag that registers a custom element named <termilo-booking>. The element renders inside a Shadow DOM. Think of a Shadow DOM as a glass box: your site styles stay outside, and the widget styles stay inside.
The install looks like this, following the example in that page.
<div id="booking"></div>
<script
src="https://embed.termilo.id/widget.js"
data-termilo-tenant="studio-rapi"
data-termilo-mode="inline"
data-termilo-target="#booking"
async
></script>
Only data-termilo-tenant is required. The data-termilo-target attribute points at the box where the widget appears. The data-termilo-accent attribute recolours the buttons to match your brand.
One honest note. That page marks the embed network layer as a preview: the Worker routes for services, slots, and booking creation from the embed are not connected yet, so the widget runs on mock data today. The attribute contract, the custom element, and the event are stated as stable. Design your page now, and check the state of those routes before you announce demo slots in public.
Inline mode or modal mode
The same page describes 2 layout modes. Inline mode places the slot picker inside the page. Modal mode installs a trigger button that opens the picker as a full overlay, closed with the Esc key.

I pick inline for a page built for demos. I pick modal for a pricing page, because a price table is already long.
The widget also fires an event named termilo:booking after a booking is sent. It carries the booking code, the service name, and the start time. The event crosses the Shadow DOM boundary, so you can listen at document level and pass it to your analytics tool.
Five decisions before you paste the code
These 5 decisions shape the slots people see. Settle them first, then install.
| Decision | Safe starting choice | Cost of getting it wrong |
|---|---|---|
| Demo length | 30 minutes | A 60 minute session halves your daily slots |
| Buffer after | 10 minutes | Sessions touch and you start late |
| Who takes it | 1 person at first | Two hosts create calendar clashes |
| Time zone | Follow the booker | The prospect joins at the wrong hour |
| Required questions | 4 fields | A long form stops people mid-way |
A buffer is an automatic gap after a session. The Termilo services documentation states that the default buffer is 0 minutes, so you have to set it yourself.
Questions that belong on the form
A booking form is not a research form. Ask what changes how you prepare. Ask the rest during the session.
These 4 fields earn a place:
- Full name.
- Work email, not a free mailbox.
- Company name.
- One open question: what problem do you want to solve?
These 4 do not belong there:
- Budget. The answer is rarely honest before someone sees the product.
- Headcount. You can check that yourself from the company name.
- Personal phone number. Ask after the first session.
- How they heard about you. Campaign parameters in the URL already record it.
Calendar invites and meeting links
A valid booking has to become a calendar event on both sides at once. People forget a meeting that is not in their calendar.
If you use Google, the Termilo Google Calendar and Meet guide describes data moving in 2 directions. Termilo writes one calendar event per booking, and reads your busy or free windows to filter clashing slots. It asks for 2 permissions: read the free-busy window, and write the events it owns. It does not read the content of your other events.
The Google Meet link comes from that calendar event, not from a separate Meet connection. One Google connection produces both.
If you use Zoom, the Termilo Zoom guide describes a similar pattern with 1 important security rule. Only the join_url goes to the prospect. The host start URL and the meeting password stay encrypted and never reach the customer. That rule matters: a start URL grants host control, and host control must not circulate.
Both integrations share 4 connection states: connected, needs_reauth, disabled_by_user, and error. Check that state once a month. A connection that expires quietly produces bookings with no meeting link, and you find out while a prospect waits.
Reminders that protect the slot
A booked slot is not an attended slot.
I use 2 of them. One a day before, with a short line about the goal of the session. One 2 hours before, with the meeting link alone.
Each reminder needs a reschedule link. A link beats a reply, because the prospect can move the hour without waiting for you. The Termilo documentation states that a booking response returns a customer manage link used to read, cancel, or reschedule.
There is also a slot hold. A new booking starts in a held state and holds the slot for 10 minutes. That hold stops 2 people from taking the same hour while both are filling the form.
What to do after a no-show
Some prospects will not arrive. Treat that as data, not as an insult.
Mark the session, do not delete it. The Termilo booking lifecycle documentation lists 5 booking states: held, confirmed, completed, cancelled, and no_show. Three of them are terminal, so the booking stops there. A confirmed booking can move to completed, no_show, or cancelled.
Send 1 follow-up message, not 3. Keep it short: name the missed hour, say the calendar is still open, add a rebooking link. Stop if nothing comes back within 5 working days.
Records that make a demo-to-close report possible
You cannot report demo-to-close if the data collection starts later. Record from the first booking.
These 6 columns are enough:
- Booking source: public page or embed.
- Service booked, if you run more than 1 demo type.
- Start time in UTC, displayed again in the local zone.
- Final state: completed, cancelled, or no_show.
- Session owner, if your team is larger than 1 person.
- Commercial result: won, lost, or open.
Termilo tags a booking made through the embed with an embed source. That tag lets you compare the 2 surfaces with no extra analytics tool.
If the underlying concepts still feel new, I explain them slowly in what a booking system is and in how a booking system works.
A worked example with dummy data
Each number in this section is dummy data. These are not client results and not an industry benchmark.
Starting condition. An invoicing SaaS with 1 owner. The pricing page takes 1,000 visits in one sample month. The owner runs the demos alone, 30 minutes each, with a 10 minute buffer.
Input. One demo button on the pricing page. A modal slot picker. A form with 4 fields. Two automatic reminders.
Steps. The owner installs the widget on day 1. He opens 4 slots per working day. He marks each session on the same day it runs.
Observable output. Of 1,000 visits, 40 people press the button. Of those 40 clicks, 26 bookings become valid. Of those 26 bookings, 19 people attend. Of those 19 sessions, 4 close as won within 45 days.
Decision. The gap between 40 clicks and 26 bookings is the largest leak. The owner cuts the form from 6 fields to 4, then measures again next month. He does not buy more traffic first, because more visits into a leaking funnel only raises cost.
Checklist before you install
- Fix the demo length and the buffer, then write both in one place.
- Place 1 demo button on the pricing page with the length in the label.
- Embed the slot picker on your own domain, inline or modal.
- Hold the form to 4 required fields.
- Connect the calendar, then book 1 test slot in your own name.
- Confirm the invite carries a meeting link the prospect can open.
- Turn on 2 reminders and put a reschedule link in both.
- Mark the result of each session on the same day.
Limits you should accept
This flow does not repair a weak offer. If 30 people attend and nobody buys, the slot picker is not the problem.
This flow is also not a CRM. It records appointments and attendance.
I state no service price here, including Termilo pricing. Prices move, and a stale price is worse than no price. Read the provider pricing page on the day you decide.
Questions people ask
Should I build my own demo booking system? Not for the common case. Slot pickers, slot holds, calendar invites, and reminders already exist as products.
How long should a SaaS demo be? Start at 30 minutes. That length fits 1 main problem and 1 round of questions. Move to 45 minutes only when you run out of time often.
What is the difference between inline and modal? Inline mode places the slot picker inside the page. Modal mode adds a trigger button that opens the picker as a full overlay. Use inline on a demo page and modal on a pricing page.
How do I send the meeting link automatically? Connect your calendar to the booking system. A Google Meet link comes from the calendar event, while Zoom creates the meeting and shares the join_url with attendees.
What should I do about a no-show? Mark the session as a no-show, then send 1 follow-up message with a rebooking link. Stop if nothing comes back within 5 working days.
Which data must I record from day one? Record the booking source, the service, the start time, the final state, the session owner, and the commercial result.
Sources
I read these pages on 11 September 2026 and wrote only what they state.
- Termilo documentation, Embed page: custom element, inline and modal modes, booking event, and the preview note on the network layer.
- Termilo documentation, Google Calendar and Meet page: sync directions, 2 access scopes, and Meet links created through the calendar event.
- Termilo documentation, Zoom page: meeting creation, join_url for attendees, and the rule against sharing the host start URL.
- Termilo documentation, Booking lifecycle page: 5 booking states, terminal states, and the 10 minute slot hold.
- Termilo documentation, Services page: duration, a default buffer of 0 minutes, and location modes.




