Back to gAppointments – Appointment booking for Gravity Forms
gAppointments – Appointment booking for Gravity Forms changelog
Release notes for every version we have on record, newest first.
Latest 1.25 · 2 Oct 2026
28 versions
Since Oct 2018
2026 11 versions
1.25 Latest 2 Oct 2026 3 fixed1 changed
Fixed
- The appointment date and time arrived in notification emails, confirmations and the entry list as raw serialized data, for example a:3:{s:4:"date";s:10:"2026-09-30";s:4:"time" s:11:"15:00-18:00";s:4:"cost";s:1:"0";} instead of the booked date. This affected forms with AJAX enabled on Gravity Forms 2.9 and later. Gravity Forms 2.9 changed AJAX-enabled forms to submit through admin-ajax.php, whic...
- Entries already saved with a serialized date now display correctly without being re-saved. The entry detail screen, the entries list and notification merge tags all recover the stored booking and format it. Emails that were already sent cannot be corrected retroactively.
- A multiple-slot booking submitted with no slots selected could store an empty array in the entry, which then appeared as serialized data for the same reason as above. The value is now always converted to text before it is saved.
Changed
- Note: Appointments themselves were never affected. The appointment record, availability and the double-booking checks all read the submitted values directly, so only the entry value and the text in notification emails were wrong. No booking data was lost.
1.24 12 Sep 2026 6 improved17 fixed10 security
Improved
- The booking script is now also enqueued directly by the calendar field, so forms rendered by page builders or loaded after the page still work. A gappointments_load_scripts_everywhere filter can force it onto every page for AJAX-injected forms.
- The public calendar AJAX endpoints (service/provider selection, month navigation, time slots) no longer require a nonce. The nonce added no protection on these read-only, logged-out endpoints and broke booking pages served from full-page cache after the nonce expired.
- Blank email and phone values are now skipped when matching earlier bookings, so a client who leaves the phone field empty is never matched against unrelated appointments that also have no phone number stored.
- Removed a runtime PHP configuration change (max execution time) from the booking submission path.
- Added the Text Domain plugin header and corrected translation calls that could never be translated, so the plugin can now be translated properly.
- Front-end and admin asset version raised to 1.3.1. main.js changed in 1.20 and admin.js in 1.22 without a version bump, so browsers could keep serving the old cached files.
Fixed
- Clicking Cancel, Confirm or Reschedule in the front-end appointments list opened no modal and scrolled the page to the top instead. Since 1.21, main.js is only enqueued from gform_enqueue_form_scripts(), which fires on pages containing a booking form. The [ga_appointments] and [ga_provider_appointments] shortcode pages have no booking form, so main.js never loaded and the modal handlers were mi...
- Prevent Double Bookings did not block a client from re-booking a time slot they already held. The client's email was escaped once for raw SQL interpolation and then escaped again by $wpdb->prepare(), so the query looked for a literal backslash before every dot. Every email address contains a dot, so the check never matched. The serialized length pattern also used [1-9]+, which missed any email...
- A trashed provider retained front-end provider access to client contact details and to cancelling or confirming bookings. Provider lookups now match published providers only.
- Editing an appointment in the admin could shrink a long custom-slot booking (for example 08:00-18:00) to the first duration in the list, freeing the slot for double booking. The stored start time and duration are now always available in the dropdowns, so re-saving an appointment keeps its existing times.
- A single-service form whose service field was hidden could not be submitted after 1.20/1.23, because the "Select a service" placeholder left the field empty. The placeholder is now only shown when more than one service exists. The provider placeholder likewise no longer overrides a valid "No preference" (0) choice.
- Confirming a Cancel, Confirm or Reschedule from the appointment list pages always returned "Something went wrong." The server required a security token that the front end never sent. The same missing token broke loading the Reschedule calendar, saving a provider's work schedule from the front end, and deleting a service category in the admin. All four now send the token the server expects.
- Per-form gAppointments settings (booking category, review page, form translations) never saved, because the settings page did not render its security token. Once that was fixed, saving would also have erased every form translation; translations now save correctly and are kept if missing from the request.
- Changing an appointment's start time in the admin did not update its end time, so an appointment moved from 09:00 to 14:00 was stored as 14:00 to 10:00. The end time is now recalculated on save (see the custom-slot note above for the safeguard against shrinking long slots).
- WordPress 6.7+ "translation loading for the gappointments domain was triggered too early" notice logged on every request.
- Booking a service with "Multiple slots selection" enabled ended in a critical error on PHP 8. The bulk booking routine referenced an undefined constant, so the appointments were created but the confirmation and notification emails never ran. Multi-slot bookings now complete normally.
- Submitting a booking form with unexpected field values (an array where a date or time was expected) caused a critical error on the public form. All submitted calendar values are now type-checked before use.
- The Reschedule window offered days the appointment's own provider does not work, because it was built from the global schedule instead of that provider's. It now shows the same availability the booking validation enforces.
- Editing an appointment in the admin no longer leaves the end time stale when only the Duration is changed. The stored start time and duration are also kept in the dropdowns, so re-saving a long custom-slot booking (for example 08:00-18:00) cannot shrink it.
- Services with no providers assigned showed "Select a provider" with only "No preference" available, which could block submission on forms where the provider is required. The placeholder is no longer added when there is nothing to choose.
- Appointment list bulk actions (Confirm, Cancel, Resend Notifications) acted on any submitted post ID. They are now limited to appointments the current user may edit.
- Several plugin files could be loaded twice under different paths, which could cause a "class already in use" critical error. All internal includes now use one consistent path.
- The Activity screen printed two of its headings in the wrong place.
Security
- Fixed an SQL injection vulnerability in the date-only double booking check and the per-client max bookings check, reachable from the public booking form. All three client matching queries now pass the submitted email and phone to the database as prepared parameters. Updating is strongly recommended.
- Fixed a reflected XSS vulnerability. When a booking failed validation the form re-rendered the submitted date, time and cost values into hidden inputs without escaping, so a crafted request could run script in the visitor's (or a logged-in admin's) browser. All echoed field values are now escaped.
- The admin appointment status-change action (used on the Appointments list) required only that the caller be logged in with edit_posts and had no CSRF token. A Contributor, or any site the admin visited, could cancel or confirm any booking. It now verifies a nonce and requires edit rights on the specific appointment.
- Front-end cancel, reschedule and "set to pending" actions, and the reschedule calendar loader, could be triggered cross-site because their nonces were optional or missing. The nonces are now created, sent and required. Loading another client's reschedule calendar, or reading another appointment's date/time, is now blocked by an ownership check.
- Client-chosen reschedule dates and times were saved without checking availability, so a client could move a booking to a closed day or an already-full slot. Reschedules are now validated against the calendar the same way a new booking is.
- Google Calendar sync no longer disables TLS certificate verification, and no longer trusts a post ID returned in calendar data to decide which post to write (which could overwrite an unrelated page). The sync debug log now redacts OAuth tokens and escapes event text before an admin views it.
- The provider title lookup AJAX action is now registered explicitly for logged-in users with edit rights, instead of being auto-exposed to logged-out visitors.
- The "add to calendar" download link accepted any ID and is now limited to the signed in client's own appointment.
- Colour and translation settings are sanitised before being saved and printed.
- Email template fields in the settings screens are escaped correctly for use inside HTML attributes.
1.23 9 Sep 2026 3 fixed
Fixed
- Provider dropdown did not show "Select a provider" placeholder when the first service in the list had only one provider. The placeholder was gated on count( $providers ) > 1, so a single-provider service silently pre-selected that provider on page load even though no service had been chosen yet. The count check is removed; the placeholder now appears whenever no explicit provider value is present.
- After changing service, the provider dropdown did not show "Select a provider." The AJAX handler passed the previously selected provider title as $value to get_providers_choices(), which caused the empty( $value ) guard to fail and suppressed the placeholder. A service change is now always treated as a fresh selection; the provider dropdown resets to the placeholder regardless of what was selec...
- The same count > 1 condition affected the service dropdown. A form containing only one service also skipped the "Select a service" placeholder. Fixed consistently with the provider change above.
1.22 4 Sep 2026 3 new
New
- Custom slot rows with no availability days checked now display an inline warning in the service admin screen so the problem is visible before saving.
- A pre-save confirmation dialog counts how many custom slot rows have no days selected and asks the admin to confirm before those rows are silently dropped.
- If any slots are dropped on save, a dismissible admin notice reports the count immediately on the redirect back to the service screen.
1.21 4 Sep 2026 1 fixed
Fixed
- The gform_gravityforms script dependency added to main.js in 1.16 was registered on the global wp_enqueue_scripts hook. On sites using Gravity Forms conditional logic, this caused the calendar field to initialise before gf_global was ready, breaking field visibility rules. main.js is now registered on wp_enqueue_scripts and enqueued only inside gform_enqueue_form_scripts so it loads at the corr...
1.20 4 Sep 2026 2 fixed
Fixed
- A JavaScript TypeError ("Cannot read properties of undefined, reading 'htmlEntitiesEncode'") occurred when a service or provider field was absent from the form. jQuery .val() returns undefined on an empty set; all four call sites now use a safeEncode() wrapper that returns an empty string instead.
- When a form contained more than one service or more than one provider, the dropdown rendered with the first real option pre-selected. Gravity Forms treated this as a valid selection, so the "Service was not selected" validator passed even though the user had not consciously chosen a value. A blank placeholder option ("Select a service" / "Select a provider") is now inserted as the default when...
1.19 4 Sep 2026 1 fixed
Fixed
- In date-only booking mode (Available Appointment Times set to Dates), today's date was always blocked even when no lead time was configured. The availability check called date_slot_passed(), which compared the current time against midnight of the selected date, so any check run after midnight would mark today as passed. The fix skips the time-passed check entirely for date-only mode; lead time...
1.18 17 Aug 2026 3 improved4 fixed
Improved
- Service and provider lookups are now handled by a single shared resolver that matches on the exact title, falls back to the previous slug behaviour, handles HTML-encoded titles, and caches results for one hour. Previously five separate copies of this lookup existed with three different behaviours.
- A service that cannot be found now reports "Service not found" rather than "Service was not selected", so it is distinguishable from a service excluded by the form's service category. Both messages remain editable under the gAppointments translation settings.
- Service validation failures are now written to the Gravity Forms debug log with the form ID, the submitted value and the reason for the failure.
Fixed
- "Service was not selected" on submission even though the correct service was chosen. The submission validator looked services up by URL slug instead of by title, so any service that had been renamed, duplicated or recreated after publishing could no longer be resolved. The dropdown still rendered and submitted the correct value, so the form appeared entirely correct.
- The same slug-instead-of-title lookup affected provider validation and the calendar provider AJAX request.
- Google Calendar sync passed an unrecognised query parameter when looking up a service by title. It was ignored, and the most recently published service was returned regardless of title, so sync could attach events to the wrong service.
- The front-end total script shipped in 1.16 and 1.17 did not actually contain the 1.16 changes its changelog described. The per-form cost lookup and the removal of the debug console.log() are now present in the build.
1.17 14 Aug 2026 2 improved1 fixed
Improved
- GF version notice now carries the is-dismissible class so admins can hide it with the standard WordPress X button.
- GA_GF_TESTED_UP_TO raised to 3.0.2.5 following end-to-end runtime verification on GF 3.0.2.5: calendar renders, provider and service selection, slot generation, and form submission all confirmed working.
Fixed
- Provider and service selection AJAX calls were returning 403 / -1 (silent failure). A nonce introduced in 1.15 (ga_calendar_nonce) was never passed to the front-end wp_localize_script calls for ga_calendar_services_obj and ga_calendar_providers_obj, nor included in the jQuery.post data payloads in main.js. Selecting a provider or a service silently discarded and the calendar never populated.
1.16 12 Aug 2026 4 improved3 fixed
Improved
- Price recalculation now uses the Gravity Forms products module (gform.products), with the legacy gformInitPriceFields() call retained as a fallback for Gravity Forms 2.9 and older.
- Added a Gravity Forms version check. An admin notice now warns when the active Gravity Forms version falls outside the tested range instead of failing silently.
- Added Requires at least and Requires PHP plugin headers.
- Removed a debug console.log() left in the front-end total script.
Fixed
- Gravity Forms 3.0 compatibility - booking cost was not added to the Total field, causing submissions to fail with "Submitted value () does not match expected value".
- Total.js and main.js now declare gform_gravityforms as a script dependency, fixing a load order race under Gravity Forms 3.0 asynchronous script loading.
- Appointment cost is now read per form, so pages containing more than one booking form calculate their totals independently.
1.15 1 Apr 2026 1 improved3 fixed1 security
Improved
- Improved general instability issues
Fixed
- Google Calendar Sync Not Working
- Calendar Navigation Bug
- Time Slot Ordering
Security
- Security improvements: Updated Use of exec()
2023 2 versions
1.14.1 7 Dec 2023 2 fixed
Fixed
- Providers and services selecting issue.
- Form submitting issue.
1.11 19 Jun 2023 1 improved
Improved
- Updated HTML entity encode.
Undated 4 versions
1.14 1 new1 fixed1 security
New
- Added custom sorting functionality for services and providers.
Fixed
- Invalid appointment name fix.
Security
- Security improvements.
1.13.1 1 fixed
Fixed
- Fixed service selecting crash.
1.13 1 improved
Improved
- Improved compatibility with PHP 8.2.
1.12 1 improved
Improved
- Google Calendar Authorize access update.
2022 2 versions
1.10.0 16 Aug 2022 1 improved
Improved
- WordPress 6.0 - design adaptation.
1.9.7 2 Mar 2022 1 fixed
Fixed
- "Forms" --> "Settings" --> "gAppointments" --> "Form booking category" (function gf_get_field_type_postid).
2021 1 version
1.9.6 13 May 2021 5 new1 improved12 fixed
New
- Ability to dynamically change the calendar service without resetting the provider selection during a booking
- "Payment Order Details" appointment field will only return entries from the form in which the appointment was booked
- New appointment time-end shortcode added in "Date & Time" translations
- New hook that allows to override Google Calendar event description during calendar synchronization
- New hook that allows to define additional custom hints for Google Calendar event description
Improved
- Automated "Custom" service type appointment slot sorting
Fixed
- Time slot capacity pop-up not displayed when available slot capacity is reduced to one
- "Custom" service type creation validation issues
- Conflicts with some WordPress themes and theme builders
- Failure loading the calendar widget when service/provider title contained special characters
- Calendar errors returning incorrect text messages
- Processing payment detection and handling issues during new appointment creation
- Unnecessary insertions of emptys spaces after calendar field merge tag
- Conflict with Advanced Custom Fields PRO and Advanced Custom Fields Gravity Forms add-ons
- Issues assigned new appointments to the global provider
- Google Calendar access token issues within provider syncronization setup
- "jQuery(...).chosen is not a function" front-end error
- Review page issues with all date appointment slots
2020 4 versions
1.9.5.2 18 Nov 2020 1 improved9 fixed
Improved
- Show calendar month of first available appointment
Fixed
- Appointment values saved incorrectly when a service is assigned to multiple providers
- Inconsistencies in Google Calendar two-way sync comparison functionality
- Possible undefined index error message after form submission
- Cannot change provider to global provider in entry edits
- Submission validation bug when calendar field is hidden
- Possibility that a notification with undefined values is sent
- Submission issue due to duplicate get provider options method
- Submission issue when multiple bookings and prevent double bookings options are enabled
- Issue displaying Gravity Forms entries
1.9.5.1 22 Oct 2020 4 fixed
Fixed
- Appointments availability issue: capacity not reduced after new appointment booking
- Issues with payment request authorization and capture
- Payment issues due to Gravity Forms conditional logic
- Script function incompatibilities
1.9.5 6 Oct 2020 5 new6 improved12 fixed
New
- Max bound option in Google Calendar settings (allows to define how far into future events should be fetched from Google Calendar)
- Added Synchronization mode option to provider page
- Added option to provider and Calendar settings pages (allows to set a global or server-based availability)
- Added a review page option in Gravity Forms settings (allows to show a review page before a form submission)
- Appointment booking date can now be edited in Gravity Forms entries
Improved
- Improved how appointment entry data is processed and saved (Compatibility improvements with 3rd party integration services, i.e. Zapier, ActiveCampaign. And other Gravity Forms add-ons, i.e. Stripe, Paypal)
- "Communication" with Google Calendar API
- Added support for Google Calendar recurring events
- Two field column sorting in appointments list page
- Improved compatibility with Gravity Forms entry export feature
- Validations in edit provider page
Fixed
- Performance issues and slowdowns caused by translation functions
- Various duplicate query calls in booking form field pages
- Extreme performance issues related to Google Calendar two-way sync
- Google Calendar One-way sync functionality not working as defined
- Canceled/Re-confirmed appointments do not re-appear/disappear in the booking calendar
- Google Calendar pending and confirmed event colors do not change dynamically
- Search functionality in Appointments page not working
- Possible issues with WordPress redirects
- New appointment submission issues when service capacity is set to 1
- Appointment cancellation issues due to time zone value
- Appointments list page display incompatibilities on mobile devices
- Spelling mistake in notification email calendar links
1.9.4 11 Jun 2020 3 new2 improved
New
- Appointments page now have an option in "Bulk actions" - "Resend Email Notifications"
- Appointments page can be sorted by chosen columns
- Each provider now have a field "location", it can be synced with appointments in google calendar
Improved
- New provider can prevent duplicate title
- Appointments page now have available options in "Bulk actions" - "Cancel", "Confirm" appointments
2019 2 versions
1.9.3 24 Oct 2019 1 new3 improved5 fixed
New
- Clients can reschedule their appointments from the front-end
Improved
- Made some changes to work with thrive architect.
- Added ability to complete appointments after X hours instead of instant completion
- Extended cancellation functionality to allow cancelling until X hours before teh appointment
Fixed
- Fixed an issue with ICS generation
- Default google calendar for appointments with no provider regardless of settings
- Assets unreachable
- Appointment date not being picked p in notifications upon submitting a form entry
- Email being picked up instead of phone number
1.9.2 17 Jul 2019 6 improved6 fixed
Improved
- Added %appointment_duration% merge tag to certain appointment notifications
- Added the ability to override appointment email template, see the documentation for details
- Provider and Service fields are now being sent as names instead of ids when exporting gravity forms entries
- Added ability to paginate appointments in shortcodes, see the documentation for details.
- Added ability to add a description to appointments when generating calendar links (ical)
- Documentation is being moved to an online source instead of local ()
Fixed
- Fixed google calendar api authentication not working in some cases
- Some calendar appearance colors not affecting front-end calendar
- Removed deprecated function usages
- Fixed an issue where appointment date was not being sent in initial gforms notification
- Custom time slots with the same starting hour being removed when saving service.
- Bad available time slot calculation on certain cases
2018 2 versions
1.9.1 21 Dec 2018 1 new
New
- Google Calendar synchronization.
1.9 8 Oct 2018 1 new3 improved3 fixed
New
- Outlook event generator.
Improved
- Updated CMB2 library
- New filters and hooks in ga_appointments_shortcode.
- New filters and hooks in ga_provider_appointments_shortcode.
Fixed
- Email time always at 12:00AM
- Booking problem when submitting removed slots.
- Calendar is required when not marked as required.
