Title: Freequency Booking Widget for TidyCal
Author: Freequency UK
Published: <strong>October 27, 2026</strong>
Last modified: October 27, 2026

---

Search plugins

![](https://ps.w.org/freequency-booking-widget/assets/banner-772x250.png?rev=3767754)

![](https://ps.w.org/freequency-booking-widget/assets/icon.svg?rev=3767754)

# Freequency Booking Widget for TidyCal

 By [Freequency UK](https://profiles.wordpress.org/freequencyuk/)

[Download](https://downloads.wordpress.org/plugin/freequency-booking-widget.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/freequency-booking-widget/#description)
 * [Reviews](https://wordpress.org/plugins/freequency-booking-widget/#reviews)
 *  [Installation](https://wordpress.org/plugins/freequency-booking-widget/#installation)
 * [Development](https://wordpress.org/plugins/freequency-booking-widget/#developers)

 [Support](https://wordpress.org/support/plugin/freequency-booking-widget/)

## Description

Features:

 * Multiple labelled TidyCal booking calendars with a dropdown selector.
 * Accepts a TidyCal HTTPS URL, booking path or official embed snippet.
 * Copyable #booking/link-id links for WordPress buttons and content.
 * A [fqc_tc_widget] shortcode with a direct booking fallback.
 * Configurable title, floating button label, colour and position.
 * An option to hide the floating button and use content links only.
 * Native modal dialog, focus containment and restoration, labelled controls, loading
   announcements, a close button and Escape in the parent controls.
 * Vanilla JavaScript with one calendar frame at a time; no jQuery dependency.
 * Freequency Booking Widget for TidyCal loads the TidyCal service only when a visitor
   opens the widget.
 * A translation template in languages/freequency-booking-widget.pot.

### Notice

This plugin is an independent integration maintained by Freequency UK. It is not
affiliated with, endorsed by or an official product of TidyCal or AppSumo. The booking
service and its branding belong to their respective owners. Historical authorship
and GPL attribution are preserved in NOTICE.txt.

### Usage

_Example configuration:_

Label: `Piano lessons`
 Link ID: `piano` TidyCal URL: `https://tidycal.com/yourusername/
piano-lesson`

_Acceptable booking inputs:_

 * `https://tidycal.com/yourusername/piano-lesson`
 * `yourusername/piano-lesson`
 * `<div class="tidycal-embed" data-path="yourusername/piano-lesson"></div>`

Invalid, incomplete, duplicate or over-limit submissions preserve the entire previous
configuration and display errors. Correct the entries and save again.

Only the validated path is stored. Script elements and other embed attributes are
discarded. Name/email prefills, arbitrary URLs, query strings, fragments and custom
embed options are not supported in this release.

Link URLs for ordinary WordPress text links or buttons on the current page:
 #booking#
booking/piano

These links always open the widget. An empty booking ID reuses the visitor’s current
selection, or starts with the configured default. Specific links select their calendar
even if the dialog is already open. Unknown IDs open the default and announce that
the requested booking is unavailable. Non-booking anchors, external links and modified
clicks retain their normal behaviour.

A page URL ending in #booking/piano also opens that booking on arrival.

For a progressive-enhancement link, use:
 [fqc_tc_widget booking=”piano” label=”
Book a piano lesson”]

If booking is omitted, the shortcode uses the configured default. If label is omitted,
it uses the saved booking label. An unknown ID produces no link. Shortcode and floating-
button links go directly to TidyCal when JavaScript or native dialog support is 
unavailable. Hash-only content links require JavaScript. When the widget is disabled,
shortcode links remain ordinary TidyCal links.

Changing the dropdown replaces the frame and resets unfinished forms. Closing and
reopening the same loaded calendar preserves its state until navigation, reload 
or selection of another calendar. No visitor state is stored in this plugin’s database,
cookies or local storage. At most one booking frame is kept.

### Accessibility

The native HTML dialog makes the background inert and contains keyboard focus, including
access to the embedded calendar. Focus returns to the opening link. Controls have
visible labels, keyboard focus indicators and adequate target sizes. The button 
text colour is calculated for WCAG AA contrast. Interface text is translatable; 
labels supplied by the administrator are content.

Escape is handled in the widget controls and by the browser’s native dialog cancel
behaviour. Keyboard events inside TidyCal’s cross-origin iframe cannot be intercepted
by the plugin, so do not depend on Escape there. Shift+Tab can return from the frame
to the selector and close button. The Close control stays at the top of the scrollable
dialog. A direct TidyCal link is always available.

The plugin does not claim to control the accessibility of the external booking interface.
It cannot inspect or alter the cross-origin frame’s contents.

### Security and performance

Settings use the WordPress Settings API, its nonce protection and the manage_options
capability. Inputs are validated and outputs escaped. Embed snippets are parsed 
using WordPress’s HTML Tag Processor; scripts are not stored. Only canonical https://
tidycal.com booking URLs are constructed. Settings are per-site on multisite installations.
Uninstall removes this plugin’s settings on all sites, in bounded batches, and leaves
other plugins alone.

Only small local assets are enqueued on public pages when the plugin is enabled 
and at least one booking is configured. Admin assets load on its settings page only.
No AJAX, REST endpoint, custom database table, cron job, subscription API, polling
loop or author telemetry is used. The official TidyCal SDK is reused if another 
component has already loaded it. Frames and their resize listeners are disposed 
when switching bookings or abandoning an unfinished load. A failed load provides
a retry action and direct booking link.

Generated HTML contains no public nonces or user-specific data and can be page cached.
Clear page/CDN caches after settings changes. If a script optimiser delays all JavaScript
until interaction, exclude the fqc-tc-widget handle when initial hash links must
open immediately. Strict CSP installations must allow the local WordPress configuration/
colour output, scripts from `https://asset-tidycal.b-cdn.net` and frames from `https://
tidycal.com`.

No automatic opening timer is included. Opening on arrival occurs only when the 
visitor follows an explicit booking hash link.

Plugin updates use the standard WordPress.org mechanism. There is no private update
server or custom update checker.

### External services and privacy

TidyCal: [https://tidycal.com](https://tidycal.com)
 Official embed script: [https://asset-tidycal.b-cdn.net/js/embed.js](https://asset-tidycal.b-cdn.net/js/embed.js)
Privacy: [https://tidycal.com/privacy-policy](https://tidycal.com/privacy-policy)
Terms: [https://tidycal.com/tos](https://tidycal.com/tos)

After the widget opens, the browser sends ordinary request information such as IP
address and user agent to TidyCal and its CDN. The chosen booking path is sent to
TidyCal, and booking information is entered directly into its frame. TidyCal may
load further resources, cookies or payment integrations under its own policies. 
This plugin does not record bookings or communicate with external services. Sites
that require consent before third-party loading must arrange that consent before
opening this widget; it is not a consent management tool.

### Translation

Text domain: `freequency-booking-widget`
 Internal code prefix: `fqc_tc_widget` 
Shortcode: `fqc_tc_widget` Template: `languages/freequency-booking-widget.pot` WordPress.
org language packs load automatically. For a custom translation, place the compiled`
freequency-booking-widget-xx_XX.mo` file (and its editable .po companion) in `wp-
content/languages/plugins/`, substituting the required locale code. No manual translation
loader is required. All plugin interface strings, including browser messages, use
this text domain. Booking labels, titles and shortcode labels entered by administrators
are not automatic translations; use content in the intended site language.

### Notice

Maintained by Freequency UK [dev@freequency.uk](https://wordpress.org/plugins/freequency-booking-widget/dev@freequency.uk?output_format=md).
A substantially rewritten fork of earlier booking-widget code by Daniel van der 
Velden / The Viking Webdesign. Original project details and source are preserved
in NOTICE.txt.

### Licence

GPL version 2 or later. Full source and licence text are included.
 Author: Freequency
UK [dev@freequency.uk](https://wordpress.org/plugins/freequency-booking-widget/dev@freequency.uk?output_format=md).
Original project credit: Daniel van der Velden / The Viking Webdesign. See NOTICE.
txt for the dated fork and modification statement.

## Screenshots

[⌊Plugin settings⌉⌊Plugin settings⌉[

Plugin settings

[⌊Open booking widget with loaded TidyCal booking page⌉⌊Open booking widget with
loaded TidyCal booking page⌉[

Open booking widget with loaded TidyCal booking page

## Installation

 1. In WordPress, go to Plugins > Add New Plugin > Upload Plugin.
 2. Upload freequency-booking-widget-1.0.0.zip, install it and activate Freequency 
    Booking Widget for TidyCal.
 3. Go to Settings > Freequency Booking Widget for TidyCal.
 4. Click Add booking. Enter a label, a unique link ID and a TidyCal booking URL, path
    or embed snippet. Repeat for additional bookings, then save.
 5. Select a default booking, configure appearance and explicitly enable the widget.
    Enabling it permits the documented TidyCal service requests. Save.
 6. Deactivate any earlier booking-widget plugin to avoid duplicate widgets.

The theme must call wp_footer().

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Freequency Booking Widget for TidyCal” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ Freequency UK ](https://profiles.wordpress.org/freequencyuk/)

[Translate “Freequency Booking Widget for TidyCal” into your language.](https://translate.wordpress.org/projects/wp-plugins/freequency-booking-widget)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/freequency-booking-widget/),
check out the [SVN repository](https://plugins.svn.wordpress.org/freequency-booking-widget/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/freequency-booking-widget/)
by [RSS](https://plugins.trac.wordpress.org/log/freequency-booking-widget/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * First public release as Freequency Booking Widget for TidyCal.
 * Multiple bookings, content links, lazy loading and accessible dialog controls.
 * WordPress.org metadata, automatic translations and service documentation.
 * Invalid settings preserve the previous configuration.
 * Independent per-site settings cache on multisite.

## Meta

 *  Version **1.0.0**
 *  Last updated **5 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.3 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [appointments](https://wordpress.org/plugins/tags/appointments/)[booking](https://wordpress.org/plugins/tags/booking/)
   [calendar](https://wordpress.org/plugins/tags/calendar/)[tidycal](https://wordpress.org/plugins/tags/tidycal/)
   [widget](https://wordpress.org/plugins/tags/widget/)
 *  [Advanced View](https://wordpress.org/plugins/freequency-booking-widget/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/freequency-booking-widget/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/freequency-booking-widget/reviews/)

## Contributors

 *   [ Freequency UK ](https://profiles.wordpress.org/freequencyuk/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/freequency-booking-widget/)