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.
On this page
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
- Make a backup of the site.
- Go to Plugins → Add New Plugin → Upload Plugin, choose
ltt-booked.zipand click Install Now. - Click Activate Plugin. A Bookings menu appears.
- 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
- Do not deactivate or delete the current version. Make a backup.
- Plugins → Add New Plugin → Upload Plugin, choose the new zip, Install Now.
- WordPress shows “This plugin is already installed”. Click Replace current with uploaded.
- 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 );towp-config.phpbefore deleting. Events already in Google Calendar stay there.
Quick start
- Booking page. Create a page, add a Shortcode block with
[ltt-booked]and publish it. The plugin remembers this page for links in emails. - Services. Bookings → Services: set duration, break after (travel or preparation), price and who provides each service.
- 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. - Google Calendar. Connect it as described below.
- Sender. Bookings → Settings → Emails → Sender & reminders: your business name and an address on your own domain.
- Test. Book a slot yourself, check the email and the “[Pending]” event in Google, approve it, then cancel it.
Shortcode options
| Shortcode | Effect |
|---|---|
[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
- Open console.cloud.google.com and create a project, for example “Website bookings”.
- APIs & Services → Library → Google Calendar API → Enable.
- Google Auth Platform → Branding: app name, support email, Audience External, contact email. Save.
- Google Auth Platform → Audience → Publish app. In Testing mode Google revokes access after 7 days. Verification is not needed for your own app.
- 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). - Copy the Client ID and Client secret.
In WordPress
- Bookings → Settings → Google Calendar: paste the Client ID and secret, save.
- Bookings → Staff & Calendars → open the staff member → Connect Google Calendar.
- Google may say “Google hasn’t verified this app”. Click Advanced → Go to your site. This is normal for your own app.
- 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 this | Result |
|---|---|
| A customer books on the site | An event “[Pending] Service – Customer” appears in Google |
| You remove “[Pending]” from the event title | The booking is confirmed; the customer gets “Appointment confirmed” |
| You drag the event to another time | The booking moves; the customer gets “Appointment moved” |
| You delete the event | The booking is cancelled; customer and admin are notified |
| You create any busy event | That time disappears from the booking form |
| You create an all-day event | The whole day is closed |
| You mark an event as Free | The 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
- Date and time. A month calendar with free days highlighted, then free start times for the chosen day.
- Service. Only services that fit that time. With Several services on, customers can tick more than one.
- Specialist, only when more than one person is free and Specialist choice is on.
- Your details. Name, email, phone and your own fields, with a summary of price, deposit and balance.
- 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.
| Status | Meaning | Blocks time |
|---|---|---|
| Awaiting deposit | The customer is paying; time held for 30 minutes | Until the hold expires |
| Pending approval | Waiting for you; “[Pending]” in Google | Yes |
| Confirmed | Approved | Yes |
| Cancelled | By you, the customer, Google or an expired hold | No |
| Completed | Marked 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
- Stripe Dashboard → Developers → API keys: copy the Secret key. Start with a test key
sk_test_…. - Bookings → Settings → Deposits (Stripe): turn on “Require an online deposit”, set the default (percent or fixed amount; default 20%), currency and the key.
- Recommended: add a webhook for
/wp-json/syncbook/v1/stripe/webhookwith the eventscheckout.session.completed,checkout.session.async_payment_succeededandcheckout.session.expired, and paste its signing secret. - 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.
| Sent to | When | |
|---|---|---|
| Request received | Customer | After booking, when approval is manual |
| Appointment confirmed | Customer | When approved, or right away with automatic confirmation; includes a calendar file |
| Appointment moved | Customer | When the time changes in the admin or in Google |
| Appointment cancelled | Customer | When cancelled by anyone |
| Reminder | Customer | N hours before a confirmed appointment (default 24; 0 = off) |
| New appointment | You and the staff member | For every new booking, with Approve and Cancel buttons |
| Cancelled by customer / in Google | You and the staff member | When 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) | Default | Meaning |
|---|---|---|
| Confirm bookings automatically | Off | Off: every request waits for approval |
| Minimum notice | 2 hours | No bookings closer to the start than this |
| Booking window | 60 days | How far ahead customers can book |
| Time step | 0 | 0 = duration + break; otherwise a start every N minutes |
| Order of steps | Date and time first | Or service first |
| Several services | On | Several services in one appointment |
| Specialist choice | On | Show the Specialist step when several people provide a service |
| Customer cancellation | On, 24 hours | Online cancellation until N hours before |
| Accent colour | #f9d400 | Buttons and highlights in the form and emails |
| Setting (Google Calendar) | Default | Meaning |
|---|---|---|
| Event title | {service} – {customer_name} | Title of booking events |
| Prefix for unconfirmed | [Pending] | Removing it in Google approves the booking |
| All-day events | On | Treat all-day events as busy |
| Customer invitation | Off | Add the customer as an event guest; private links are then left out of the description |
| Changes made in Google | On | Email 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
| Symptom | What to check |
|---|---|
| No free dates in the form | Weekly 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 Google | Green 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 site | Only 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 week | The Google Cloud app is in Testing mode. Publish it, then reconnect |
| redirect_uri_mismatch | The 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 upload | Images only, up to 10 per booking and 15 MB each; the hosting upload limit |
| Old times still show | Purge 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.
