Skip to content
Scheduling

Calendar conflicts — fixing double-bookings

When two jobs land on the same bay, the same tech, or overlapping windows. The 6 most-common causes and how to harden the schedule.

6 min read

Watch: How to prevent double-bookings in SalesThumb (0:57)

Double-bookings are usually a configuration issue, not a software bug. Here's the playbook for diagnosing and preventing them.

The 6 causes

  1. Same tech, overlapping appointments — a tech is double-booked at 10 AM. Almost always: shop has multiple booking surfaces (public page + manual entry + walk-in) and the conflict check only ran for one of them.
  2. Same bay, two services — two different services landed in Bay 2 from 10:00-11:30 because bay assignment is service-specific and the booking flow didn't respect bay capacity.
  3. Off-shift booking — a tech is scheduled at 8 AM but their shift starts at 9. Working hours weren't enforced.
  4. Google Calendar drift — tech blocked time in their personal Google Calendar, but SalesThumb's calendar integration is currently one-way (SalesThumb → Google/Apple/Outlook, via a subscription feed). Personal-calendar blocks don't flow back into SalesThumb today, so the scheduler has no way to know about them.
  5. Blackout not set — shop is closed July 4 but nobody added a blackout for it in SalesThumb, so the public booking page accepted appointments.
  6. Buffer time violation — install runs longer than estimated; next appointment was booked back-to-back without buffer.

Fix #1 — Trust the built-in conflict check, and know when it can be overridden

There's no per-surface toggle to enable — every booking path (public booking page, manual entry, walk-in, reschedule) runs the same server-side conflict check at submit time, not just at slot-display time, so a resource-level double-booking is blocked before it saves.

If a same-bay/same-tech conflict still lands, the most likely cause is a deliberate override, not the check being off. When a time is taken, the new-appointment form, Edit appointment, and the Reschedule window all name the appointment in the way and offer Book anyway. Every Book anyway from Edit or Reschedule is recorded in your audit log as a double-book, so you can see who chose it.

Canceled, no-show and completed appointments never count as a conflict. If a bay or tech will genuinely be free (the car ahead is almost done), you can also set the appointment's bay or installer to Unassigned, which never conflicts. See Using the calendar: Day/Week/Month views and rescheduling.

Fix #2 — Keep your bay list accurate

Settings → Installers & Bays. Make sure every physical bay your shop actually uses is listed and marked active — and mark old/decommissioned bays inactive.

SalesThumb can only conflict-check against bays it knows about; a bay that was never added, or one still marked active after you converted it to storage, is the most common root cause of a "same bay, two services" conflict.

Fix #3 — Set tech shifts

Employee Schedule (Calendar → Employees tab, or go directly to /app/staff-schedule). Add each tech's shift for the days they work.

The scheduler uses these shifts, not a generic hours field, to know when a tech is actually available — a tech with no shift entered for a day can still get booked, since there's nothing to check against.

Also: set unavailability for vacation days here, not in Google Calendar only.

Fix #4 — Set blackouts in advance

Settings → Sales Matrix, in the Estimate scheduler section. Add a blackout for at least:

  • Thanksgiving + Black Friday
  • Christmas Eve + Christmas Day
  • New Year's Eve + New Year's Day
  • Memorial Day
  • July 4
  • Labor Day
  • Any shop-specific closures (owner's birthday, anniversary)

Do this in January for the whole year. Block out shop holidays walks through it.

Fix #5 — Turn on a booking buffer (and pad durations where needed)

Settings → Online Booking → Scheduling rules → Buffer between bookings (none, 5, 10, 15, 30 minutes, or 1 hour) keeps that much open time around every booking on the same installer or bay, and the conflict check enforces it. It's one shop-wide number — there's no per-service buffer.

For a service that needs more slack than the shop-wide buffer, bake it into the duration itself at Settings → Services: if a 90-minute install actually needs 15 minutes of cleanup, photos, and walk-through after it, set the duration to 105.

It's blunt — the padding shows up in the customer's estimated time too — but the scheduler honors it.

Two related things that are *not* this:

  • Settings → Sales Matrix has an install-time buffer percentage (default 15%) that inflates the kiosk's "Est. time at the shop" figure shown to a customer. It's shop-wide, it's a presentation number, and it does not reserve calendar time.
  • Ceramic cure time isn't modeled at all. If a bay has to sit empty for 2-4 hours after a coating, block that time yourself — either in the service duration or as a manual calendar entry on that resource.

When a conflict slips through

If despite everything a double-booking lands:

  1. Open the conflicting appointments. Look at the booking source (public page, manual, walk-in, HQ).
  2. Check the timeline of when each was booked. The later booking should have failed conflict check — find out why.
  3. Reach out to the customer who needs to be rescheduled. Apologize, consider a goodwill discount.
  4. File a bug at hello@salesthumb.com with the customer/appointment IDs so we can audit.

Related

Need more help?

The in-app help widget routes directly to our team.

General product and business information, not legal, tax or financial advice.