{"id":311437,"date":"2026-05-31T17:38:19","date_gmt":"2026-05-31T17:38:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kalendypro-booking\/"},"modified":"2026-05-31T17:37:46","modified_gmt":"2026-05-31T17:37:46","slug":"kalendypro-booking","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kalendypro-booking\/","author":20149683,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.4.8","stable_tag":"2.4.8","tested":"7.0","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"KalendyPro Booking","header_author":"KalendyPro","header_description":"Online booking and appointment management for KalendyPro, with shortcode, block, floating button and admin planning.","assets_banners_color":"fcfcfc","last_updated":"2026-05-31 17:37:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kalendypro.com","header_author_uri":"https:\/\/kalendypro.com\/wp-describ","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.4.8":{"tag":"2.4.8","author":"laubro","date":"2026-05-31 17:37:46"}},"upgrade_notice":{"2.4.8":"<p>WordPress.org review feedback: &quot;Powered by&quot; attribution is now opt-in (off by default), bundled JS\/CSS documented as source, admin JS global renamed to <code>KalendyProBookingAdmin<\/code>.<\/p>","2.4.5":"<p>WordPress.org compliance: bundled FullCalendar locally, hardened POST sanitization, nonce on filter form, dropped manual textdomain loader, shorter short description.<\/p>","2.4.4":"<p>WordPress.org compliance update: full English readme and plugin header, no more inline script tags, full i18n support. No functional change.<\/p>","2.4.2":"<p>Final consistency pass (WP\/PHP header, explicit Supabase declaration in External services, security note on the integration token, cleanup).<\/p>","2.4.0":"<p>Renamed to &quot;KalendyPro Booking&quot;, WordPress.org compliance (External services, Privacy).<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3555761,"resolution":"128x128","location":"assets","locale":"","width":256,"height":258},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3555761,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3555801,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3555801,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"kalendypro\/booking":{"name":"kalendypro\/booking","title":"KalendyPro Booking"}},"tagged_versions":["2.4.8"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3555761,"resolution":"1","location":"assets","locale":"","width":1024,"height":758},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3555761,"resolution":"2","location":"assets","locale":"","width":1024,"height":758},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3555761,"resolution":"3","location":"assets","locale":"","width":1024,"height":758},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3555761,"resolution":"4","location":"assets","locale":"","width":1024,"height":758},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3555761,"resolution":"5","location":"assets","locale":"","width":1024,"height":758},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3555761,"resolution":"6","location":"assets","locale":"","width":1024,"height":758},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3555761,"resolution":"7","location":"assets","locale":"","width":1024,"height":758}},"screenshots":[]},"plugin_section":[],"plugin_tags":[276,269,416,722,268],"plugin_category":[40],"plugin_contributors":[262497],"plugin_business_model":[],"class_list":["post-311437","plugin","type-plugin","status-publish","hentry","plugin_tags-appointment","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservation","plugin_tags-scheduling","plugin_category-calendar-and-events","plugin_contributors-laubro","plugin_committers-laubro"],"banners":{"banner":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/banner-772x250.png?rev=3555801","banner_2x":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/banner-1544x500.png?rev=3555801","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/icon-128x128.png?rev=3555761","icon_2x":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/icon-256x256.png?rev=3555761","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-1.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-2.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-3.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-4.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-5.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-6.png?rev=3555761","caption":""},{"src":"https:\/\/ps.w.org\/kalendypro-booking\/assets\/screenshot-7.png?rev=3555761","caption":""}],"raw_content":"<!--section=description-->\n<p><strong>KalendyPro Booking<\/strong> is the official WordPress plugin for the <strong>KalendyPro<\/strong> online appointment booking service (https:\/\/kalendypro.com). It lets your customers book directly from your WordPress site, and lets you manage your schedule, clients and reminders without leaving the WordPress admin.<\/p>\n\n<h4>Main features<\/h4>\n\n<ul>\n<li>Responsive booking module (shortcode <code>[kalendypro_booking]<\/code>, Gutenberg block, sticky floating button)<\/li>\n<li>Easy customization (color, position, height, floating or embedded mode)<\/li>\n<li>Mobile, tablet and desktop friendly<\/li>\n<li>Dashboard and interactive planning (Month \/ Week \/ Day) inside WordPress admin<\/li>\n<li>Create, edit, drag-and-drop and cancel appointments<\/li>\n<li>Full booking detail: client, service, employee, status, payment, notes<\/li>\n<li>Send an email or SMS reminder (depending on credits) in one click<\/li>\n<li>Mark as \"no-show\" and cancel<\/li>\n<li>New appointment notifications (badge on the KalendyPro menu)<\/li>\n<li>Secure connection to your KalendyPro account through a personal integration token<\/li>\n<\/ul>\n\n<h4>Why a KalendyPro account?<\/h4>\n\n<p>The plugin is an official client of the KalendyPro platform. All booking data (services, employees, availability, appointments, subscription, SMS credits) is stored and synchronized through your KalendyPro account. This also allows you to use the web app, the public directory and the other KalendyPro channels with the same data.<\/p>\n\n<h4>Integration token security<\/h4>\n\n<p>The plugin uses a personal integration token (starting with <code>kpro_<\/code>) to authenticate against your KalendyPro account. <strong>Never share your KalendyPro integration token<\/strong>: it grants full access to your appointments, clients and settings. It can be revoked at any time from your KalendyPro dashboard.<\/p>\n\n<h3>Shortcodes<\/h3>\n\n<ul>\n<li><code>[kalendypro_booking slug=\"your-slug\"]<\/code> \u2014 embedded booking module.<\/li>\n<li><code>[kalendypro_booking slug=\"your-slug\" mode=\"floating\" text=\"Book now\" color=\"#6366f1\" position=\"right\"]<\/code> \u2014 floating button.<\/li>\n<\/ul>\n\n<p>Parameters: <code>slug<\/code>, <code>professional_id<\/code>, <code>service<\/code>, <code>height<\/code>, <code>theme<\/code>, <code>lang<\/code>, <code>mode<\/code> (<code>standard<\/code> or <code>floating<\/code>), <code>text<\/code>, <code>color<\/code>, <code>position<\/code> (<code>right<\/code> or <code>left<\/code>), <code>icon<\/code>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to external services in order to function. The sections below describe which services are contacted, in which circumstances and what data is transmitted.<\/p>\n\n<h4>1. KalendyPro API (hosted on Supabase)<\/h4>\n\n<p>The plugin communicates with the KalendyPro API to synchronize the professional account and manage appointments. This API is exposed through the KalendyPro cloud infrastructure, hosted by <strong>Supabase<\/strong> in the European Union.<\/p>\n\n<ul>\n<li><strong>Services used<\/strong>: KalendyPro (https:\/\/kalendypro.com) and Supabase (https:\/\/supabase.com)<\/li>\n<li><strong>Endpoint<\/strong>: <code>https:\/\/weoghnhclddjvryvmdqj.supabase.co\/functions\/v1\/wp-api<\/code><\/li>\n<li><strong>When<\/strong>: on every load of a KalendyPro Booking admin page, when creating \/ editing \/ cancelling an appointment, when sending an email or SMS reminder, and every 90 seconds (new appointment polling) while an administrator is logged into wp-admin.<\/li>\n<li><strong>Data transmitted<\/strong>:\n\n<ul>\n<li>the API integration token (<code>kpro_\u2026<\/code>);<\/li>\n<li>the parameters required for synchronization (appointment id, dates, status, reminder content);<\/li>\n<li>when creating an appointment from admin: client name, email, phone and notes.<\/li>\n<\/ul><\/li>\n<li><strong>KalendyPro Privacy Policy<\/strong>: https:\/\/kalendypro.com\/privacy-wp<\/li>\n<li><strong>KalendyPro Terms of Service<\/strong>: https:\/\/kalendypro.com\/terms-wp<\/li>\n<li><strong>Supabase Privacy Policy<\/strong>: https:\/\/supabase.com\/privacy<\/li>\n<\/ul>\n\n<p>The API URL can be edited in the plugin Settings and overridden via the PHP constant <code>KALENDYPRO_DEFAULT_API_URL<\/code> or the <code>kalendypro_default_api_url<\/code> filter.<\/p>\n\n<h4>2. Client module (KalendyPro iframe)<\/h4>\n\n<p>The shortcode and the floating button load the client booking module from <code>https:\/\/kalendypro.com\/embed\/booking<\/code> inside an iframe. No visitor data is sent to KalendyPro until the visitor actually starts a booking.<\/p>\n\n<ul>\n<li><strong>Service<\/strong>: KalendyPro (client module)<\/li>\n<li><strong>URL<\/strong>: <code>https:\/\/kalendypro.com\/embed\/booking<\/code><\/li>\n<li><strong>Data transmitted<\/strong>: professional identifier (slug or UUID) passed as a URL parameter, and \u2014 only if the visitor confirms a booking \u2014 name, email, phone and notes entered in the form.<\/li>\n<li><strong>Privacy Policy<\/strong>: https:\/\/kalendypro.com\/privacy-wp<\/li>\n<li><strong>Terms of Service<\/strong>: https:\/\/kalendypro.com\/terms-wp<\/li>\n<\/ul>\n\n<h4>3. FullCalendar (bundled locally)<\/h4>\n\n<p>The <strong>Planning<\/strong> admin page uses the open-source FullCalendar library (MIT license). It is bundled inside the plugin (<code>assets\/vendor\/fullcalendar\/<\/code>) and loaded locally \u2014 no external CDN request is made.<\/p>\n\n<ul>\n<li><strong>License<\/strong>: https:\/\/github.com\/fullcalendar\/fullcalendar\/blob\/main\/LICENSE.md<\/li>\n<\/ul>\n\n<h3>Source code<\/h3>\n\n<p>The JavaScript and CSS files distributed with this plugin are provided in human-readable, non-minified form. No build step or bundler is used: the source files shipped inside the <code>assets\/<\/code> directory of the plugin package are the exact files served to the browser.<\/p>\n\n<ul>\n<li><code>assets\/admin.js<\/code> \/ <code>assets\/admin.css<\/code> \u2014 WordPress admin (dashboard, calendar, bookings).<\/li>\n<li><code>assets\/kalendypro-embed.js<\/code> \/ <code>assets\/kalendypro-embed.css<\/code> \u2014 embedded booking iframe loader.<\/li>\n<li><code>assets\/kalendypro-floating.js<\/code> \u2014 public floating button widget.<\/li>\n<li><code>assets\/vendor\/fullcalendar\/<\/code> \u2014 third-party FullCalendar library (MIT), bundled locally.<\/li>\n<\/ul>\n\n<p>If a build process is introduced in the future, the original source files and build instructions will be publicly documented in this readme.<\/p>\n\n<h3>Privacy<\/h3>\n\n<ul>\n<li>The plugin does not create any table in the WordPress database and does not store any visitor personal data on the WordPress side.<\/li>\n<li>Appointments, clients, services, employees and SMS credits are stored on the KalendyPro infrastructure (Supabase, European Union).<\/li>\n<li>Email \/ SMS reminders are sent from the KalendyPro infrastructure at your explicit request.<\/li>\n<li>The only options stored in the WordPress database are: base URL, API URL, integration token and floating button display preferences. <strong>The token is sensitive: never share it.<\/strong><\/li>\n<li>For any GDPR request (access, rectification, deletion), contact KalendyPro at https:\/\/kalendypro.com\/contact.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the ZIP via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or install the plugin from the WordPress.org directory.<\/li>\n<li>Activate <strong>KalendyPro Booking<\/strong>.<\/li>\n<li>Go to <strong>KalendyPro \u2192 Settings<\/strong>, paste the integration token generated from your KalendyPro professional dashboard (Dashboard \u2192 Integration \u2192 WordPress Plugin).<\/li>\n<li>Insert the shortcode <code>[kalendypro_booking slug=\"your-slug\"]<\/code> into a page, or use the <strong>KalendyPro Booking<\/strong> Gutenberg block.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20kalendypro%20account%3F\"><h3>Do I need a KalendyPro account?<\/h3><\/dt>\n<dd><p>Yes. Create your free account at https:\/\/kalendypro.com then generate an integration token from your dashboard.<\/p><\/dd>\n<dt id=\"what%20data%20is%20sent%20to%20kalendypro%3F\"><h3>What data is sent to KalendyPro?<\/h3><\/dt>\n<dd><p>See the <strong>External services<\/strong> section below.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20external%20javascript%3F\"><h3>Does the plugin work without external JavaScript?<\/h3><\/dt>\n<dd><p>The admin appointment management uses the open-source FullCalendar library (MIT license), bundled locally with the plugin. The visitor-facing client module runs inside an iframe.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20compatible%20with%20gutenberg%20%2F%20elementor%3F\"><h3>Is the plugin compatible with Gutenberg \/ Elementor?<\/h3><\/dt>\n<dd><p>Yes. A dedicated Gutenberg block is provided, and the shortcode can be used anywhere (Elementor, Divi, classic editor).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.4.8<\/h4>\n\n<ul>\n<li>WordPress.org review feedback:\n\n<ul>\n<li>The public floating widget no longer displays the \"Powered by KalendyPro\" attribution by default. A new opt-in option is available under <strong>KalendyPro \u2192 Settings \u2192 Front-end module \u2192 Attribution<\/strong> for administrators who explicitly wish to display it.<\/li>\n<li>Documented in the readme that all bundled JS\/CSS files are provided in human-readable, non-minified form (see the new <strong>Source code<\/strong> section).<\/li>\n<li>Renamed the localized JavaScript global from <code>KalendyProAdmin<\/code> to <code>KalendyProBookingAdmin<\/code> to use a more plugin-specific identifier. All internal references updated; no functional change.<\/li>\n<li>Confirmed that the official text domain is <code>kalendypro-booking<\/code> across all PHP files, JS strings and the readme.<\/li>\n<\/ul><\/li>\n<li>No regression on existing functionality.<\/li>\n<\/ul>\n\n<h4>2.4.5<\/h4>\n\n<ul>\n<li>WordPress.org compliance pass:\n\n<ul>\n<li>Bundled FullCalendar locally (no more jsDelivr \/ external CDN enqueue)<\/li>\n<li>Hardened POST sanitization in admin AJAX handlers (explicit per-field sanitization, no dynamic <code>$_POST[$f]<\/code>)<\/li>\n<li>Added nonce field and verification on the bookings filter form<\/li>\n<li>Removed manual <code>load_plugin_textdomain()<\/code> (translations are loaded automatically by WordPress.org since 4.6)<\/li>\n<li>Shortened short description (\u2264150 characters)<\/li>\n<li>Updated Author URI to dedicated plugin presentation page<\/li>\n<\/ul><\/li>\n<li>No functional change<\/li>\n<\/ul>\n\n<h4>2.4.4<\/h4>\n\n<ul>\n<li>WordPress.org compliance: full English readme, English plugin header, Contributors fixed to <code>laubro<\/code><\/li>\n<li>Removed inline <code>&lt;script&gt;<\/code> rendering in shortcode output; floating widget now auto-initializes via a data attribute and the enqueued script<\/li>\n<li>Wrapped all hardcoded admin\/front strings with translation functions (<code>kalendypro-booking<\/code> text domain)<\/li>\n<li>Localized JavaScript strings via <code>wp_localize_script<\/code><\/li>\n<li>Cleanup pass: removed unused dead code, harmonized comments<\/li>\n<\/ul>\n\n<h4>2.4.3<\/h4>\n\n<ul>\n<li>Stability fixes for the admin calendar and floating widget<\/li>\n<\/ul>\n\n<h4>2.4.2<\/h4>\n\n<ul>\n<li>Harmonized WordPress header: Requires at least 5.9, Requires PHP 7.4, Tested up to 6.9.4<\/li>\n<li>Rewrote the <strong>External services<\/strong> section to explicitly declare KalendyPro and Supabase<\/li>\n<li>Added a security note about the integration token (admin + readme)<\/li>\n<li>Fixed the documented constant name (<code>KALENDYPRO_DEFAULT_API_URL<\/code>)<\/li>\n<li>Cleanup: removed front-end <code>console.log<\/code>, harmonized comments and changelog<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>Documented the API endpoint as used in production (Supabase infrastructure, EU)<\/li>\n<li>No functional change<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Official rename: \"KalendyPro\" \u2192 \"KalendyPro Booking\"<\/li>\n<li>Full WordPress header and WordPress.org compliance<\/li>\n<li>Added the <strong>External services<\/strong> section to the readme<\/li>\n<li>Added the <strong>Privacy<\/strong> section<\/li>\n<li>Harmonized shortcode documentation<\/li>\n<li>API URL can be overridden via PHP constant <code>KALENDYPRO_DEFAULT_API_URL<\/code> or filter <code>kalendypro_default_api_url<\/code><\/li>\n<li>General cleanup, translations prepared (Text Domain <code>kalendypro-booking<\/code>)<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>Fixed status preservation when creating an appointment from the admin planning<\/li>\n<li>Fixed UUID error when editing without a selected employee\/service<\/li>\n<li>\"Month\" view set as default on the Planning page<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Fixed planning display (FullCalendar) and the \"New appointment\" button<\/li>\n<li>Fixed double rendering in floating mode (the embedded iframe no longer appears when the global floating button is active)<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Full detail panel for each appointment<\/li>\n<li>Direct actions: email reminder, SMS reminder, mark \"no-show\", cancel<\/li>\n<li>New appointment notifications (badge on the KalendyPro menu, 90s polling)<\/li>\n<li>Extended statuses: pending_confirmation, no_show<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Interactive calendar (FullCalendar) Month \/ Week \/ Day<\/li>\n<li>Create and move appointments directly from the planning<\/li>\n<li>Quick edit through a modal<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>API connection to the KalendyPro pro account<\/li>\n<li>Dashboard and bookings list in admin<\/li>\n<li>Floating button and Gutenberg block<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Full rewrite: native WordPress integration<\/li>\n<\/ul>","raw_excerpt":"Online booking and appointment management for KalendyPro: shortcode, Gutenberg block, floating button and full WordPress admin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/311437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=311437"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/laubro"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=311437"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=311437"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=311437"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=311437"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=311437"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=311437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}