Skip to main content
A customer chooses a haircut time, gives their name, and the agent records the appointment. Your spreadsheet automatically marks that time as unavailable. This example is for one barber, Diego, with one 30-minute appointment at each time, in Mexico City time. You need only two tabs: You do not need to make up slot IDs. Select Date and Time together in the booking action’s duplicate protection settings. Visito checks both values before adding a row.

1. Make the two tabs

Create a Google spreadsheet named Hairdresser Demo — Availability and Bookings. Rename its first tab Availability, and add a second tab named Bookings. In Availability, put these headers in A1:C1:
In Bookings, put these headers in A1:C1:
Leave Bookings empty below its headers. The agent will add a row after a customer confirms an appointment. The Bookings tab starts with just Date, Time and Customer.

Add your available times

In both tabs, select A2:B1000 → Format → Number → Plain text before entering dates and times. Use YYYY-MM-DD for dates and HH:mm for times. For example, 2026-10-05 and 10:00. Keeping the same format in both tabs makes matching predictable. Enter these rows in Availability. The last column will be a formula: Use future dates when trying this yourself. Each Date + Time pair must appear only once in Availability. You can also paste the availability template and bookings headers into A1 of their respective tabs. Create both tabs before pasting the availability formulas. Keep row 1 for headers, without merged cells or a title above them.

2. Let the sheet calculate availability

In Availability!C2, enter:
Fill the formula down through C9. For each appointment, it counts booking rows with both the same Date and the same Time:
  • No booking yet: Available = 1.
  • A booking exists: Available = 0.
Availability has only three columns; the formula checks Date and Time in Bookings. The $2:$1000 ranges stay fixed when you fill down. A2 and B2 change to the current row. If your sheet uses semicolons in formulas, replace the commas with semicolons. Do not type over the Available formulas. The formula reduces availability; the action’s duplicate check prevents Visito from adding the same Date + Time twice. No separate “decrease availability” action is necessary.

3. Make a test copy

In Google Sheets, use File → Make a copy and name it Hairdresser Demo — TEST. Copy both tabs, including their formulas, and leave its Bookings tab empty. This must be a separate spreadsheet file, with the same headers and formats. Playground writes go to this copy. Keep the main file and test file clearly distinguishable in Google Picker.

4. Create “Check haircut availability”

Go to Configuration → Actions → Google Sheets. Connect your Google account in Integrations first if necessary; the spreadsheet selection happens inside the action.
  1. Choose your Google connection.
  2. Choose the main spreadsheet through Choose spreadsheet and Google Picker.
  3. Select Availability.
  4. Select Date, Time and Available, then continue.
Google Picker separates the main workbook from the test copy. The main spreadsheet, Availability tab and three selected columns. Set these permissions and types: Available is detected as Sheet-generated. Its write controls are disabled. Read-only permissions for all three availability columns. On the final step, name the action Check haircut availability. Choose the intended business scope and explain its purpose:
Check available 30-minute men’s haircuts with Diego in Mexico City time. Read before offering or booking an appointment. Offer only rows where Available is 1. Copy Date (YYYY-MM-DD) and Time (HH:mm) exactly from the chosen row to Book a haircut. Never invent appointments or prices. After a verified booking, read again to check that the chosen slot is now 0.
A clear purpose tells the agent when to consult the sheet. Save the action. This action cannot see customer names because those belong to the other tab.

5. Create “Book a haircut”

Create a second Google Sheets action. Select the same main spreadsheet, the Bookings tab, and all three columns. Select Date, Time and Customer in the Bookings tab. An empty tab may suggest Text for every column. Change Date to Date manually. Leave Read off so the agent cannot retrieve other customers’ names. The booking action can create three values, with no read or update permissions. On the final step:
  1. Name it Book a haircut.
  2. Under Prevent duplicate rows, select Use existing columns together.
  3. Check Date and Time. Leave Customer unchecked: another name must not allow a second booking of the same time.
  4. Date and Time become required automatically. Also mark Customer as required.
  5. Choose Hairdresser Demo — TEST → Bookings as the test target.
  6. Use the same business scope as the availability action.
Date and Time together prevent duplicates; all three booking values are required. The booking action uses the separate TEST workbook in Playground. Use a purpose like this:
Record one haircut only after the customer chooses a time and gives their name. First use Check haircut availability and require Available = 1. Copy Date and Time exactly from that available row. Customer is the supplied name. Ask only for missing customer information. After a verified write, say the appointment is recorded and check availability again. If that Date and Time already exist, offer another time. Never change values to bypass a conflict. Never retry an unverified write or claim it succeeded.
Save and review the mode. For the controlled Webchat test below, deliberately make both actions Active and use a disposable main workbook. The two Google Sheets actions, with their separate operations.

6. Test the customer conversation

Why Webchat for this example? The read-only action uses the main file in Playground, while the booking action writes to the test file. Used together there, they would not demonstrate the main file’s availability decreasing. Webchat with Active actions uses the main file for both. Playground can execute Sheets actions. For an isolated end-to-end Playground test, configure a separate read action against the test dataset too. Do not point tests at real customer bookings. Start a new Webchat conversation:
  1. “I’d like a men’s haircut with Diego on October 5, 2026. What morning times are available?”
  2. “10:00 AM works for me. Can you book it?”
  3. The agent should ask for your name before writing.
  4. “My name is Alex Demo. Please book the 10:00 AM haircut with Diego on October 5.”
The agent checks availability and asks only for the missing name. The appointment is recorded after the action completes. Check both tabs, not just the reply. You should see exactly one row in Bookings and 0 for that appointment in Availability: One booking row with Date, Time and Customer, without an ID. The matching appointment changes from available to unavailable. Then ask: “Could my friend Sam Demo also book that same 10:00 AM slot?” The agent should offer other times and leave the booking count unchanged. An occupied time is not offered again; other available times are suggested. The screenshots show a controlled local test. Its planner was disabled to isolate tool execution; this is not a customer setup step or proof that production routing has been tested. A handoff may occur before the response agent receives its tools.

7. Inspect what happened

Open Actions → History and filter by Book a haircut. Open the test execution. Check Live, Completed, and Spreadsheet changes verified. The booking execution in Actions history. Open its details and inspect the submitted values and result. The request contains Date, Time and Customer through their internal column keys; no customer-supplied slot ID is needed. A verified result means the changed cells were read back successfully. It does not confirm a payment or a reservation in another booking system. Submitted values and the verified execution result. Use Open conversation to see the customer’s request, the agent’s reply and action activity together. Open the booking action’s details there to connect the execution to the message that triggered it. Conversation detail links the request and completed action. The same booking execution viewed from the conversation. The local sidebar shows a separate information-panel timeout in these screenshots. The booking itself is verified in the expanded message receipt and Actions history. A Google Sheets appointment does not create a reservation in Visito Commerce.

Keep the sheet simple and reliable

  • Add another day: add new Date and Time rows to Availability and fill down the formula. You do not need to create IDs or update a list of permitted slot IDs.
  • Use consistent times: 10:00 and 10 AM are different text values. The agent should copy the sheet’s values exactly.
  • Reset a disposable demo: clear the test booking row’s values in Bookings, keeping the headers. Availability returns to 1. Do not erase real bookings to reset a test.
  • More barbers: add a Barber column in both tabs, include it in the formula and select Date + Time + Barber as unique together. Date + Time alone represents one appointment across the whole tab.
  • Do not enable Update on the unique columns. This example does not implement rescheduling, cancellations, payments or multiple places per time.
The uniqueness rule blocks a duplicate combination within Visito writes. It does not validate that a new Date + Time exists in another tab, prevent someone from editing Google Sheets manually, or make this a full scheduling system. Keep the availability-check instructions, review your business rules, and never automatically retry an unverified write.