Skip to content

Releases: tom4cam/Custom-WP-Booking-Plugin

v1.5.4 — Site logo + Bookings tab first + Privacy/Terms pages

Choose a tag to compare

@tom4cam tom4cam released this 19 May 18:44

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

Choose a tag to compare

@tom4cam tom4cam released this 19 May 16:10

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; dbDelta runs 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 as caswell_phone user 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

Choose a tag to compare

@tom4cam tom4cam released this 06 May 00:19

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=…&note=… 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

Choose a tag to compare

@tom4cam tom4cam released this 05 May 23:39

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

Choose a tag to compare

@tom4cam tom4cam released this 05 May 22:53

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 in includes/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

Choose a tag to compare

@tom4cam tom4cam released this 02 May 13:14

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 value
  • caswell_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:

  1. Set the address in Settings → Caswell Booking → Business Info.
  2. Send yourself a test booking via the "+ New booking" admin button to verify the Location row appears in the email.
  3. Refresh the homepage to see the Location column in the footer.

v1.4.9 — Calendar event titles never blank

Choose a tag to compare

@tom4cam tom4cam released this 02 May 12:56

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

Choose a tag to compare

@tom4cam tom4cam released this 02 May 12:42

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

Choose a tag to compare

@tom4cam tom4cam released this 02 May 10:18

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 address
  • Reply-To — matched to From so client replies route correctly
  • Message-ID — uniquely identifies each message (some hosts spam-filter mail without one)
  • Date — explicit RFC 2822 timestamp
  • List-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:

  1. Run Settings → Tools → Email Delivery Test with your own email. Note any advisories in the result.
  2. Read Email Deliverability.
  3. Set up an SMTP provider via the WP Mail SMTP plugin (SendGrid recommended for new setups).
  4. Add SPF + DKIM + DMARC DNS records per the wiki.
  5. Re-run the Email Delivery Test to confirm a clean result.

v1.4.6 — Recurring conflict preview + 12-appointment cap

Choose a tag to compare

@tom4cam tom4cam released this 02 May 10:10

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.