LTT Booked documentation

Version 1.8.1 · All documentation · Product page

LTT Booked takes appointments on your WordPress site and keeps them in sync with Google Calendar in both directions. This guide covers setup, daily work and the answers to common questions. Menu paths are written as Bookings → Settings → General.

Requirements

  • WordPress 6.0 or newer, PHP 7.4 or newer.
  • HTTPS, strongly recommended. With HTTPS Google sends instant change notifications; without it changes are checked every 5 minutes.
  • The WordPress time zone set to a city, not a fixed offset (Settings → General → Timezone, for example “New York”), so daylight saving time is handled correctly.
  • For Google sync: a Google account and a free Google Cloud project.
  • For deposits: a Stripe account.
  • For reliable emails: a mailbox on your own domain and an SMTP plugin.

Install, update, remove

Install

  1. Make a backup of the site.
  2. Go to Plugins → Add New Plugin → Upload Plugin, choose ltt-booked.zip and click Install Now.
  3. Click Activate Plugin. A Bookings menu appears.
  4. Open Bookings → Appointments. A “Getting started” checklist shows the four setup steps and disappears when they are done.

On first activation the plugin creates one staff member, seven sample services and default form fields and emails. Edit or delete them as you like.

Update

  1. Do not deactivate or delete the current version. Make a backup.
  2. Plugins → Add New Plugin → Upload Plugin, choose the new zip, Install Now.
  3. WordPress shows “This plugin is already installed”. Click Replace current with uploaded.
  4. If you use a cache plugin, purge it, and reload admin pages.

Bookings, services, staff, Google connections, settings, email texts and customer photos are kept. New database fields are added automatically.

Remove

  • Deactivate stops the plugin; nothing is deleted.
  • Delete removes the plugin files but keeps all data, so a reinstall continues where you stopped.
  • To erase everything, add define( 'SYNCBOOK_DELETE_DATA', true ); to wp-config.php before deleting. Events already in Google Calendar stay there.

Quick start

  1. Booking page. Create a page, add a Shortcode block with [ltt-booked] and publish it. The plugin remembers this page for links in emails.
  2. Services. Bookings → Services: set duration, break after (travel or preparation), price and who provides each service.
  3. Hours. Bookings → Staff & Calendars: set weekly hours, for example 09:00-13:00, 14:00-18:00. Leave a day empty for a day off.
  4. Google Calendar. Connect it as described below.
  5. Sender. Bookings → Settings → Emails → Sender & reminders: your business name and an address on your own domain.
  6. Test. Book a slot yourself, check the email and the “[Pending]” event in Google, approve it, then cancel it.

Shortcode options

ShortcodeEffect
[ltt-booked]Booking form with all active services
[ltt-booked service="1,2"]Only services with ID 1 and 2
[ltt-booked staff="3"]Only staff member with ID 3
[ltt-booked title="Book now"]A heading above the form

Connect Google Calendar

This is done once and takes about 10 minutes. Use the Google account whose calendar should receive the bookings.

In Google Cloud

  1. Open console.cloud.google.com and create a project, for example “Website bookings”.
  2. APIs & Services → Library → Google Calendar API → Enable.
  3. Google Auth Platform → Branding: app name, support email, Audience External, contact email. Save.
  4. Google Auth Platform → Audience → Publish app. In Testing mode Google revokes access after 7 days. Verification is not needed for your own app.
  5. Google Auth Platform → Clients → Create client, type Web application. Add the redirect URI shown in Bookings → Settings → Google Calendar (it ends with /wp-json/syncbook/v1/google/callback).
  6. Copy the Client ID and Client secret.

In WordPress

  1. Bookings → Settings → Google Calendar: paste the Client ID and secret, save.
  2. Bookings → Staff & Calendars → open the staff member → Connect Google Calendar.
  3. Google may say “Google hasn’t verified this app”. Click Advanced → Go to your site. This is normal for your own app.
  4. Allow access. Back on the staff page, choose Write bookings to (usually the main calendar) and Block busy times from (one or more calendars). Save.

Each employee can connect their own Google Calendar without a WordPress login: copy the link “Or send this link to the employee” from their staff page and send it to them. One Google Cloud project serves the whole site.

How the two-way sync works

You do thisResult
A customer books on the siteAn event “[Pending] Service – Customer” appears in Google
You remove “[Pending]” from the event titleThe booking is confirmed; the customer gets “Appointment confirmed”
You drag the event to another timeThe booking moves; the customer gets “Appointment moved”
You delete the eventThe booking is cancelled; customer and admin are notified
You create any busy eventThat time disappears from the booking form
You create an all-day eventThe whole day is closed
You mark an event as FreeThe time stays bookable
  • With HTTPS, changes from Google arrive within seconds. Otherwise the plugin checks every 5 minutes; Sync now on the staff page checks immediately.
  • Only events created by the plugin move or cancel bookings. Your own events only block time.
  • Moving a booking event to a different calendar counts as deleting it, and the booking is cancelled.
  • Customers never see your event titles, only that a time is taken.
  • If Google is unavailable for a moment, writes are retried every 5 minutes. The list shows “Will retry”.

Services, staff and hours

Services

Each service has a name, short description, duration, break after, price (0 hides it), deposit, colour, the staff who provide it and an Active switch. Drag the ⋮⋮ handle in Bookings → Services to change the order customers see. A service with nobody assigned is not shown.

Staff members

Each staff member has weekly hours, days off, services, an email for notifications and an optional Google Calendar. Days off are one date YYYY-MM-DD or a range YYYY-MM-DD..YYYY-MM-DD per line. When several people provide a service, customers can pick one or choose “Any available”; the plugin then assigns the person with the fewest bookings that day.

How free times are built

  • Start times are generated inside working hours every Time step. With Time step 0 the step equals duration plus break (90 + 30 gives 11:30, 13:30, 15:30).
  • A time is offered only if the whole appointment fits in working hours and the appointment plus its break overlaps nothing busy.
  • Minimum notice (default 2 hours) and Booking window (default 60 days) limit how soon and how far ahead customers can book.
  • Right before saving, the plugin checks Google again and locks the staff member’s calendar, so two customers cannot take the same time.

What customers see

  1. Date and time. A month calendar with free days highlighted, then free start times for the chosen day.
  2. Service. Only services that fit that time. With Several services on, customers can tick more than one.
  3. Specialist, only when more than one person is free and Specialist choice is on.
  4. Your details. Name, email, phone and your own fields, with a summary of price, deposit and balance.
  5. Request appointment or Continue to deposit payment, then a thank-you message and an email.

Prefer the service first? Bookings → Settings → General → Order of steps. With several services, the appointment lasts as long as the longest one, prices and deposits add up, and only staff who provide every chosen service are offered.

Every customer email has a private Manage your appointment link: view the booking, add photos or links, pay a pending deposit or cancel (until the cancellation deadline). Customers cannot reschedule online; they cancel and book again, or contact you.

Managing appointments

Calendar and list

  • Bookings → Appointments shows Week, Month or List. Pending requests have a yellow dashed border; grey hatching is time busy in Google.
  • Click a booking for details and Approve, Cancel or Open.
  • Drag a booking to another time (week) or day (month). You confirm the move and choose whether to email the customer. Conflicts are shown with a “Move anyway” option.
  • Double-click an empty time in the week view to add an appointment, for example for a phone booking.
  • Keyboard: ← and → move between weeks or months, T jumps to today.

Approve or cancel without logging in

Every booking has a private staff link: in the Google event description (“Approve or cancel”) and behind the Approve and Cancel buttons in the “New appointment” email. It opens a phone-friendly page with the details and two buttons. Opening the link changes nothing; only pressing a button does. Do not forward these links to customers.

The appointment page

Shows every detail and answer, the photos, payment and Google status. Buttons: Approve, Cancel, Mark completed, Restore (cancelled future bookings), Refund deposit, Delete all photos, Delete. Under Change time or staff you can move the booking and leave internal notes.

StatusMeaningBlocks time
Awaiting depositThe customer is paying; time held for 30 minutesUntil the hold expires
Pending approvalWaiting for you; “[Pending]” in GoogleYes
ConfirmedApprovedYes
CancelledBy you, the customer, Google or an expired holdNo
CompletedMarked done after the visit—

Customer photos and links

  • Customers can add up to 10 photos (JPG, PNG, WEBP, HEIC, up to 15 MB each; compressed in the browser) and up to 20 product links, when booking or later from the manage page.
  • You see them in the admin, the calendar popover, the “New appointment” email, the Google event and the staff page.
  • Photos are stored on your own hosting in wp-content/uploads/ltt-booked-private/, outside the Media Library, and open only through private signed links.
  • Delete one photo with ×, all photos of a booking with Delete all photos, or in bulk in Bookings → Settings → Customer photos.
  • Automatic cleanup runs once a day: for cancelled appointments right away, after 7 days to 5 years, or never (default 30 days); after the visit, after 7 days to 5 years, or never (default never). Photos of upcoming appointments are never deleted automatically.

Deposits with Stripe

  1. Stripe Dashboard → Developers → API keys: copy the Secret key. Start with a test key sk_test_….
  2. Bookings → Settings → Deposits (Stripe): turn on “Require an online deposit”, set the default (percent or fixed amount; default 20%), currency and the key.
  3. Recommended: add a webhook for /wp-json/syncbook/v1/stripe/webhook with the events checkout.session.completed, checkout.session.async_payment_succeeded and checkout.session.expired, and paste its signing secret.
  4. Test with card 4242 4242 4242 4242, then switch to the live key.
  • The time is held for 30 minutes while the customer pays. Unpaid holds are released without emails.
  • Each service can override the default: no deposit, percent, fixed amount or full price.
  • Cancelling does not refund automatically. Use Refund deposit on the appointment page.
  • Deposits below 0.50 are not charged (Stripe minimum).

Emails

Bookings → Settings → Emails lists every message with a switch, a visual editor, variable buttons, a live preview, Send test and Restore original text.

EmailSent toWhen
Request receivedCustomerAfter booking, when approval is manual
Appointment confirmedCustomerWhen approved, or right away with automatic confirmation; includes a calendar file
Appointment movedCustomerWhen the time changes in the admin or in Google
Appointment cancelledCustomerWhen cancelled by anyone
ReminderCustomerN hours before a confirmed appointment (default 24; 0 = off)
New appointmentYou and the staff memberFor every new booking, with Approve and Cancel buttons
Cancelled by customer / in GoogleYou and the staff memberWhen the customer cancels or the event is deleted in Google

Common variables: {customer_first_name}, {service}, {date}, {time}, {staff_line}, {payment_line}, {manage_url}, {fields_table}, {site_name}.

Emails arrive from “WordPress”? Set From name and From email in Bookings → Settings → Emails → Sender & reminders. Use a mailbox on your own domain; the page shows what customers will see. For the best delivery, connect that mailbox through an SMTP plugin.

Settings reference

Setting (General)DefaultMeaning
Confirm bookings automaticallyOffOff: every request waits for approval
Minimum notice2 hoursNo bookings closer to the start than this
Booking window60 daysHow far ahead customers can book
Time step00 = duration + break; otherwise a start every N minutes
Order of stepsDate and time firstOr service first
Several servicesOnSeveral services in one appointment
Specialist choiceOnShow the Specialist step when several people provide a service
Customer cancellationOn, 24 hoursOnline cancellation until N hours before
Accent colour#f9d400Buttons and highlights in the form and emails
Setting (Google Calendar)DefaultMeaning
Event title{service} – {customer_name}Title of booking events
Prefix for unconfirmed[Pending]Removing it in Google approves the booking
All-day eventsOnTreat all-day events as busy
Customer invitationOffAdd the customer as an event guest; private links are then left out of the description
Changes made in GoogleOnEmail the customer when a booking is moved or deleted in Google

Form fields live in Bookings → Settings → Booking form: drag to reorder, click to edit. Types: Text, Paragraph, Dropdown, Checkboxes, Single checkbox, Phone, Product links, Photos. A field with the key address becomes the location of the Google event.

For dependable timing on a quiet site, add a server cron job every 5 minutes: wget -q -O - https://your-site.com/wp-cron.php >/dev/null 2>&1.

Troubleshooting

SymptomWhat to check
No free dates in the formWeekly hours and days off; the service is active and assigned; minimum notice and booking window; busy or all-day events in Google; the service fits inside the working interval; the WordPress time zone
Bookings do not appear in GoogleGreen dot on the staff page; click Sync now; Settings → Tools & log; bookings awaiting a deposit appear only after payment
Changes in Google do not reach the siteOnly booking events move or cancel bookings; without HTTPS wait up to 5 minutes or click Sync now; add a server cron job; edit the calendar set in “Write bookings to”
Google disconnects after a weekThe Google Cloud app is in Testing mode. Publish it, then reconnect
redirect_uri_mismatchThe redirect URI in Google Cloud must match the one in Settings → Google Calendar exactly
Emails do not arrive or come from “WordPress”Settings → Tools & log → Test email; set From name and From email; use an SMTP plugin; check that the email is switched on
Deposit paid, still “Awaiting deposit”Set up the Stripe webhook and signing secret
Photos do not uploadImages only, up to 10 per booking and 15 MB each; the hosting upload limit
Old times still showPurge the page cache. Availability itself is never cached

The REST API must be reachable for visitors. Security plugins that block /wp-json/ break the booking form and the Google connection.

FAQ

Can customers book without an account?

Yes. They enter a name, email and phone; no WordPress account is created.

How do I approve a booking?

In the admin calendar or list, on the appointment page, by removing “[Pending]” from the Google event title, or with the Approve button in the “New appointment” email.

How do I stop approving every booking?

Bookings → Settings → General → turn on “Confirm bookings automatically”.

Can customers reschedule themselves?

Not directly. They can cancel online until the deadline and book again, or contact you.

Does every employee need a Google Cloud project?

No. One Client ID and secret serve the whole site; each employee signs in through their own connection link.

Will customers see my personal events?

No. They only see that a time is not available.

Can I book for a customer who called?

Yes. Use Add appointment or double-click an empty time in the week view. You can skip the customer email and even book over a busy time.

Does the plugin work without Google Calendar?

Yes. Bookings, emails, the admin calendar and deposits work; only syncing and Google busy times are missing.

Can I take full payment instead of a deposit?

Yes. Set the service’s deposit to Full price.

I deleted the plugin by mistake. Are my bookings gone?

No. Data stays in the database unless SYNCBOOK_DELETE_DATA was set. Install the plugin again.

Still need help?

Write to info@lesst3.com or use the Support page. Include your WordPress and PHP versions and what you see on the screen; a screenshot helps.