Releases: tom4cam/Custom-WP-Booking-Plugin
Release list
v1.5.4 — Site logo + Bookings tab first + Privacy/Terms pages
What's new
Branding
- New "Site Logo" picker on Settings → Caswell Booking → Business Info, using the WordPress media library. The logo renders on the home page nav, booking widget, confirmation + reminder emails, and the admin settings page header. When no logo is set, every surface keeps its current text/no-logo behavior.
Admin ergonomics
- The Bookings tab is now the leftmost tab in Settings → Caswell Booking, and it opens by default instead of Google Calendar.
Privacy Policy + Terms of Use
- Two new pages are auto-created on activate/upgrade with sensible default copy: Privacy Policy and Terms of Use. The default text is interpolated with your business name, practitioner name, service type, contact email, and governing-law state (Utah).
- Links to both pages now appear on:
- The home page footer
- The booking widget (below the cancellation note)
- Confirmation + reminder emails (footer)
- The account page footer
- Page content is stored as plain HTML, so editing in either the Block Editor or the Classic Editor is clean.
Data
- Four new options:
branding_logo_url,branding_logo_id,caswell_privacy_page_id,caswell_terms_page_id. All default empty. - No DB schema change. No new dependencies.
The default legal copy is a reasonable starting point but has not been reviewed by a lawyer. Please have an attorney review before relying on it for compliance purposes.
v1.5.3 — Required email/SMS consent at booking + signup
What's new
Booking form
- Phone number is now required.
- Two new required consent checkboxes — one for confirmation/reminder emails, one for confirmation/reminder text messages — must be ticked to book.
- The longer passive opt-in notice is replaced by the active checkboxes; the 24-hour cancellation note stays.
Account registration
- The post-booking quick-register form now collects phone (prefilled from the booking) and the same two consent checkboxes (prefilled checked, since the client just ticked them).
- The standalone account-page register form now collects phone and requires both consent checkboxes.
Admin
- Notifications → Consent Language: two new textareas let the owner edit the email and SMS consent wording. Default copy is TCPA-style.
{business_name}is interpolated from the configured business name (falls back to the site name).
Data
- Bookings: three new columns —
email_consent,sms_consent,consent_timestamp. Schema version bumps from 4 → 5;dbDeltaruns the migration on first page load after upgrade. - Registered users: three new meta keys —
_caswell_email_consent,_caswell_sms_consent,_caswell_consent_timestamp. Phone now also saved ascaswell_phoneuser meta. - Reschedule links: client isn't re-prompted. The new booking row inherits consent flags and timestamp from the original.
v1.5.2 — Venmo Pay button in confirmations + email button-color fix
What's new
One-tap Venmo payment in confirmations
When a client books and selects Venmo as the payment method, every touchpoint now offers a Pay with Venmo link with the amount and a memo pre-loaded:
- Confirmation email gains a third button beside Reschedule/Cancel: Pay $XX with Venmo (Venmo blue). Renders only when the booking is Venmo + unpaid; Square bookings and already-paid bookings see the original two-button layout.
- Confirmation SMS auto-appends a
Pay via Venmo: <url>line. - Booking-widget success page now uses the universal Venmo web URL too — the Pay button finally works on desktop browsers (it was previously the mobile-only
venmo://app scheme).
The link is a universal https://venmo.com/<user>?txn=pay&amount=…¬e=… URL. On mobile it auto-opens the Venmo app; on desktop it opens venmo.com directly. The memo includes the service, length, date/time, and client name so the practitioner can match payments to bookings in Venmo's feed (example: "Massage 60min — May 12, 10:00am — Jane S.").
"Visit Our Website" button now looks right in Gmail
The CTA at the bottom of the confirmation email used a CSS class that lived in a <style> block — Gmail and many other email clients strip those, so the button rendered as plain underlined blue text instead of a green pill. The styles are now inline; the button renders consistently across clients.
Upgrade notes
No action required. The Pay button auto-appears for any Venmo booking that has venmo_username and the relevant venmo_price_{length} configured (the existing settings — same plumbing v1.5.0 already used to charge via Venmo).
v1.5.1 — Buffer-time fix + configurable owner email
What's new
Buffer-time fix
The settings page used to fire a red "No slots will be bookable" error when buffer-time was greater than or equal to the shortest enabled session length. That message was wrong — slot generation handles this case correctly. With a 15-minute session length and a 15-minute buffer, slots are generated every 30 minutes (length + buffer), which is the intended behavior. The misleading error is gone.
Configurable owner email
The new-booking email to the owner was previously hardcoded to the WordPress admin email and always fired. Two new settings give you control:
- Send email to owner (Settings → SMS / Twilio → Owner Notifications) — toggle, defaults to on so existing installs see no behavior change.
- Owner Email Address — destination address. Leave blank to fall back to the WordPress admin email (the previous behavior).
The matching Send SMS to owner + Owner Phone Number pair was already there in v1.5.0 and is unchanged.
Upgrade notes
No action required. Existing installs auto-default to "owner email on" with the WordPress admin email as the destination — exactly the v1.5.0 behavior.
v1.5.0 — Configurable session lengths + blue shared-calendar events
What's new
Configurable session lengths
Settings → Sessions now offers eight options in 15-minute increments:
15, 30, 45, 60, 75, 90, 105, 120 minutes. Check the ones you want
to offer. The Pricing and Venmo/Square rows in the Business Info and
Venmo tabs auto-follow your enabled set, so you only see fields for
lengths you actually use. Disabling your current default-length
silently falls back to the lowest enabled length. No database
migration; existing 30/60/90 setups keep working unchanged.
Peacock shared-calendar events
Every appointment the plugin writes to the shared Google Calendar now
uses the blue event color (Google Calendar colorId 7) so the
practitioner's bookings stand out from other practitioners' events on
a shared studio calendar. Personal calendar events are unchanged.
Existing events keep whatever color they already have; only events
created from v1.5.0 onward are colored.
Internal
- PHPUnit + Brain Monkey test framework bootstrapped. Pure
session-length helpers live inincludes/session-lengths.php
with unit tests covering the canonical option list,
enabled-list filtering, and default-length resolution. - GitHub Actions runs the PHPUnit suite on every push to
main
and every PR (PHP 8.1 / 8.2 / 8.3).
Upgrade notes
No action required. Settings, bookings, and calendar events are all
preserved.
v1.4.10 — Business address in emails + theme footer
What's new
The studio address now flows from the Business Info tab into both confirmation/reminder emails and the public site footer.
Where it appears
- Confirmation email — new "Location" row in the details table
- Reminder email (week + day before) — same Location row
- Theme footer (Caswell Therapy theme 0.1.9+) — new "Location" column when the field is set
Where to set it
Settings → Caswell Booking → Business Info → Address. Multi-line textarea — paste the full address with the unit on its own line:
ADDRESS
Newlines render as <br> in HTML emails and the footer.
Implementation
Two helpers added:
caswell_business_address()— returns the trimmed plain-text valuecaswell_business_address_html()— escapes + converts newlines to<br>for safe email/HTML output
The theme reads via function_exists() so it gracefully renders nothing if the plugin is deactivated.
Install
WP Admin → Plugins → Add New → Upload Plugin → `caswell-booking-1.4.10.zip` → Replace.
For the theme update, also upload `caswell-theme-0.1.9.zip` via Appearance → Themes.
After install:
- Set the address in Settings → Caswell Booking → Business Info.
- Send yourself a test booking via the "+ New booking" admin button to verify the Location row appears in the email.
- Refresh the homepage to see the Location column in the footer.
v1.4.9 — Calendar event titles never blank
Bug fix: when the title template setting is empty (cleared field and saved), Google Calendar events were created with empty titles. The render helper now falls back to the canonical default {practitioner}: {client_short} ({duration} min) when the template is empty or whitespace, plus a final hand-built Ryan: Jane S. (60 min) safety net if a custom template still resolves to nothing.
Install
WP Admin → Plugins → Add New → Upload Plugin → caswell-booking-1.4.9.zip → Replace.
After install, you don't need to re-set the title template — the fallback fires whenever the template renders empty. New bookings will get the right title automatically. Existing past events with blank titles will need to be edited manually in Google Calendar.
v1.4.8 — Display timezone fix + UI cleanup
Fixes a timezone display bug + small UI cleanup
Display times were wrong (Bookings tab, emails, SMS)
A 6:00 PM booking was rendering as 12:00 PM in the Bookings table and in confirmation/reminder emails. Modern WordPress sets PHP's default timezone to UTC, so a bare `strtotime('2026-05-15 18:00:00')` returned the timestamp for 6pm UTC. Then `wp_date()` shifted that timestamp into the site timezone, double-shifting and producing the wrong wall-clock time.
The fix: a new `caswell_local_ts()` helper that parses DB datetimes as site-local wall-clock and returns the correct UTC Unix timestamp. Every spot that displays a stored datetime (bookings table, all email and SMS templates, account page, admin reschedule modal, etc.) now goes through it.
The Google Calendar event write path was already correct — it uses `DateTime` with an explicit timezone — so the events on Ryan's calendar already had the right time. Only display was affected.
Two confirmation emails when testing
The plugin sends a separate "[New Booking]" alert to the admin email so Ryan knows when bookings come in. When the admin email is the same as the client email (e.g. when Ryan tests by booking with his own email), he was getting both. Now skipped when the two addresses match — production unaffected since admin and client are different in real bookings.
DST ±1h shift buttons removed from Bookings tab
The reschedule modal already covers the same need (just edit the time directly), and the timezone fix above means DST shouldn't surprise the displayed times in the first place. The buttons added more visual noise than value.
Install
WP Admin → Plugins → Add New → Upload Plugin → `caswell-booking-1.4.8.zip` → Replace.
After upgrading, glance at the Bookings tab to confirm times look correct. Existing bookings haven't changed in the database — only the display layer.
v1.4.7 — Email deliverability hardening
Why
Confirmation and reminder emails landing in spam was the #1 friction point in user testing. This release ships every plugin-side improvement that makes a measurable difference, plus a wiki guide for the host-side configuration (SendGrid + SPF/DKIM/DMARC).
Plugin changes
Better headers on every outgoing email
All notifications now go out with:
From— your configured From addressReply-To— matched to From so client replies route correctlyMessage-ID— uniquely identifies each message (some hosts spam-filter mail without one)Date— explicit RFC 2822 timestampList-Unsubscribe: <mailto:From?subject=Unsubscribe>— Gmail and Outlook give cleaner inbox placement to messages that expose a one-click unsubscribe
Smarter Email Delivery Test
The diagnostic at Settings → Tools & Diagnostics → Email Delivery Test now flags two common deliverability landmines in its result:
- Free-provider From address (
@gmail.com,@yahoo.com, etc.) — DMARC enforcement makes these undeliverable from a custom domain. Use an address on the site domain instead. - Domain mismatch — From-address domain ≠ site domain. SPF/DKIM alignment is impossible across domains; receivers treat as spoofed.
Reminder emails now have a visible opt-out
A small "Reply with 'stop reminders'" link in the reminder footer. Combined with the List-Unsubscribe header, this materially improves Gmail's inbox placement for reminder messages (they're closer to "promotional" than confirmations are).
Docs
New wiki page: Email Deliverability — covers SMTP provider selection, full SendGrid walk-through with DNS records, SPF/DKIM/DMARC explained, and verification using the plugin's diagnostic.
Install
WP Admin → Plugins → Add New → Upload Plugin → choose caswell-booking-1.4.7.zip → Replace current with uploaded → Activate.
After install, do these in order:
- Run Settings → Tools → Email Delivery Test with your own email. Note any advisories in the result.
- Read Email Deliverability.
- Set up an SMTP provider via the WP Mail SMTP plugin (SendGrid recommended for new setups).
- Add SPF + DKIM + DMARC DNS records per the wiki.
- Re-run the Email Delivery Test to confirm a clean result.
v1.4.6 — Recurring conflict preview + 12-appointment cap
Recurring bookings now show conflicts before submission
When a client enables "Make this a recurring appointment" on the booking page, the form now displays a live availability preview of every projected appointment.
- Green box — every occurrence is available, ready to book.
- Amber box — at least one conflict; lists each date with ✓ / ✗.
The preview re-runs whenever the user changes the slot, frequency, count, or end date. Debounced 250ms with sequence tracking so stale responses don't overwrite fresh ones.
Hard cap of 12 appointments per series
- Form defaults to 12 occurrences (was 52). Field is
min=1 max=12. - Server enforces the cap regardless of what's posted.
- If an end date alone would yield more than 12, generation stops at 12 and the conflict box shows: "Your end date allows more, but recurring bookings are capped at 12 at a time."
- To go further, clients book another series after the last appointment.
Why
Without the preview, recurring bookings could fail server-side after pre-fill — frustrating UX. With the preview, the client knows up front exactly which dates have conflicts and can adjust before submitting.
Install
WP Admin → Plugins → Add New → Upload Plugin → choose caswell-booking-1.4.6.zip → Replace current with uploaded → Activate.
No DB migration required.