Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : July 5, 2026

CVE-2026-57638: Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution <= 2.1.0 Authenticated (Contributor+) Stored Cross-Site Scripting PoC, Patch Analysis & Rule

Severity Medium (CVSS 6.4)
CWE 79
Vulnerable Version 2.1.0
Patched Version 2.1.1
Disclosed June 25, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-57638:

This vulnerability is a Stored Cross-Site Scripting (XSS) in the Fluent Booking plugin for WordPress, affecting versions up to and including 2.1.0. The vulnerability resides in the block editor rendering handlers, specifically in functions that build shortcodes for calendar and booking management blocks. An authenticated attacker with contributor-level access can inject arbitrary JavaScript into pages that executes when any user views the compromised page. The CVSS score of 6.4 reflects the authenticated requirement but the high impact of persistent script execution.

Root Cause:
The root cause is insufficient input sanitization and output escaping in the fcalRenderBookingManagementBlock and fcalRenderBlock methods within /fluent-booking/app/Hooks/Handlers/BlockEditorHandler.php. In the vulnerable version, the fcalRenderBookingManagementBlock function (lines 321-335) passes user-controlled attributes like $title, $period, $noBookingsMessage, and $calendarIds directly into the do_shortcode call without proper escaping. The $title and $noBookingsMessage parameters are only sanitized with sanitize_text_field, which allows certain characters that can break out of the shortcode attribute context (e.g., double quotes). The $period parameter is also sanitized with sanitize_text_field instead of a more restrictive method. Similarly, fcalRenderBlock (lines 339-360) outputs CSS custom properties by directly concatenating $attributes[‘primary_color’], $attributes[‘date_round’], and $attributes[‘avatarStyle’] into a style tag, with only esc_attr applied to primary_color, but date_round and avatarStyle were previously unescaped and unsanitized. Additionally, $attributes[‘slotId’] and $attributes[‘hideHostInfo’] were used without type coercion or validation. The shortcode parameters for slotId, disableHost, theme, and eventHash lacked escaping before being passed to do_shortcode.

Exploitation:
To exploit this vulnerability, an attacker with contributor-level access creates or edits a post/page using the Gutenberg block editor. They add the Fluent Booking block (either the booking management block or the calendar block) and inject malicious JavaScript into the block’s attributes. For the booking management block, the attacker sets the ‘title’ or ‘noBookingsMessage’ attribute to a payload like ‘” onmouseover=”alert(document.cookie)”‘. When the block is rendered, the shortcode becomes [fluent_booking_lists title=”…” onmouseover=”…” …] which can execute JavaScript via event handlers. For the calendar block, the attacker sets ‘primary_color’, ‘date_round’, or ‘avatarStyle’ attributes to a value like ‘red;}alert(1)’, breaking out of the CSS context and injecting a script tag. The block editor saves these attributes as post meta, and the payload executes for any visitor viewing the page.

Patch Analysis:
The patch introduces multiple improvements. In fcalRenderBookingManagementBlock, $calendarIds are now cast to integers via array_map(‘intval’), $period uses sanitize_key instead of sanitize_text_field, and the entire shortcode is built using sprintf with esc_attr() on $title and $noBookingsMessage, and $period directly (safe due to sanitize_key). In fcalRenderBlock, the patch uses sanitize_hex_color for primary_color, a new custom sanitizeCssLength method for date_round and avatarStyle (validates CSS length patterns like ’10px’), and sanitize_key for theme. The slotId is cast to integer, hideHostInfo uses Arr::isTrue and is output as ‘yes’/’no’, eventHash uses sanitize_text_field, and a new $align parameter uses sanitize_html_class. The shortcode is built with sprintf and esc_attr on hash. These changes prevent injection by ensuring only safe values enter the output contexts.

Impact:
Successful exploitation allows the attacker to inject arbitrary JavaScript that executes in the context of any user viewing the affected page. This includes administrators, leading to privilege escalation through session hijacking (stealing cookies), actions performed on behalf of the admin (creating rogue admin accounts, installing malicious plugins), or data theft (accessing sensitive information displayed in the admin dashboard). The XSS is stored, meaning it persists across sessions and does not require re-exploitation. The attacker requires only contributor-level access, which is common in multi-author WordPress sites, making this a significant security risk.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/fluent-booking/app/Hooks/Handlers/BlockEditorHandler.php
+++ b/fluent-booking/app/Hooks/Handlers/BlockEditorHandler.php
@@ -321,11 +321,11 @@

     public function fcalRenderBookingManagementBlock($attributes)
     {
-        $calendarIds = Arr::get($attributes, 'calendarIds', []);
+        $calendarIds = array_map('intval', (array) Arr::get($attributes, 'calendarIds', []));

         $title = sanitize_text_field(Arr::get($attributes, 'title'));

-        $period = sanitize_text_field(Arr::get($attributes, 'period', 'all'));
+        $period = sanitize_key(Arr::get($attributes, 'period', 'all'));

         $perPage = intval(Arr::get($attributes, 'perPage', 10));

@@ -335,23 +335,43 @@

         $noBookingsMessage = sanitize_text_field(Arr::get($attributes, 'noBookingsMessage'));

-        return do_shortcode("[fluent_booking_lists title="$title" period=$period per_page=$perPage filter=$showFilter pagination=$showPagination no_bookings="$noBookingsMessage" calendar_ids=" . implode(',', $calendarIds) . "]");
+        $shortcode = sprintf(
+            '[fluent_booking_lists title="%s" period=%s per_page=%d filter=%s pagination=%s no_bookings="%s" calendar_ids=%s]',
+            esc_attr($title),
+            $period,
+            $perPage,
+            $showFilter,
+            $showPagination,
+            esc_attr($noBookingsMessage),
+            implode(',', $calendarIds)
+        );
+
+        return do_shortcode($shortcode);
     }

     public function fcalRenderBlock($attributes)
     {
-        $output = '<style>
-            :root {
-                --fcal_primary_color: ' . esc_attr($attributes['primary_color']) . ' !important;
-                --fcal_date_radius: ' . esc_attr($attributes['date_round']) . ' !important;
-                --fcal_avatar_radius: ' . esc_attr($attributes['avatarStyle']) . ' !important;
-            }
-        </style>';
+        $primaryColor = sanitize_hex_color(Arr::get($attributes, 'primary_color', ''));
+        $dateRadius   = self::sanitizeCssLength(Arr::get($attributes, 'date_round', ''));
+        $avatarRadius = self::sanitizeCssLength(Arr::get($attributes, 'avatarStyle', ''));
+
+        $output = '<style>:root {';
+        if ($primaryColor) {
+            $output .= '--fcal_primary_color: ' . $primaryColor . ' !important;';
+        }
+        if ($dateRadius) {
+            $output .= '--fcal_date_radius: ' . $dateRadius . ' !important;';
+        }
+        if ($avatarRadius) {
+            $output .= '--fcal_avatar_radius: ' . $avatarRadius . ' !important;';
+        }
+        $output .= '}</style>';

-        $slotId = (int) $attributes['slotId'];
-        $disableHost = $attributes['hideHostInfo'];
-        $theme = Arr::get($attributes, 'theme', 'light');
-        $eventHash = Arr::get($attributes, 'eventHash');
+        $slotId = (int) Arr::get($attributes, 'slotId');
+        $disableHost = Arr::isTrue($attributes, 'hideHostInfo') ? 'yes' : 'no';
+        $theme = sanitize_key(Arr::get($attributes, 'theme', 'light'));
+        $eventHash = sanitize_text_field(Arr::get($attributes, 'eventHash', ''));
+        $align = sanitize_html_class(Arr::get($attributes, 'align', ''));

         $slot = CalendarSlot::find($slotId);

@@ -360,14 +380,28 @@
             if (!$slot) {
                 return '';
             }
-            $slotId = $slot->id;
+            $slotId = (int) $slot->id;
+            $eventHash = (string) $slot->hash;
         }

-        $output .= '<div class="fluent-booking-calendar-block align' . Arr::get($attributes, 'align') . '">';
+        $output .= '<div class="fluent-booking-calendar-block align' . esc_attr($align) . '">';

-        $output .= do_shortcode("[fluent_booking id=$slotId disable_author=$disableHost theme=$theme hash=$eventHash]");
+        $output .= do_shortcode(sprintf(
+            '[fluent_booking id=%d disable_author=%s theme=%s hash=%s]',
+            $slotId,
+            $disableHost,
+            $theme,
+            esc_attr($eventHash)
+        ));

         $output .= '</div>';
         return $output;
     }
+
+    private static function sanitizeCssLength($value)
+    {
+        $value = trim((string) $value);
+
+        return preg_match('/^d{1,3}(.d+)?(px|%|em|rem)$/', $value) ? $value : '';
+    }
 }
--- a/fluent-booking/app/Hooks/Handlers/FrontEndHandler.php
+++ b/fluent-booking/app/Hooks/Handlers/FrontEndHandler.php
@@ -699,7 +699,7 @@

     public function ajaxScheduleMeeting()
     {
-        if (!$this->checkPublicAjaxRateLimit('schedule_meeting', 15)) {
+        if (!Helper::checkRateLimit('schedule_meeting', 15)) {
             wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
         }

@@ -949,7 +949,7 @@

     public function ajaxGetAvailableDates()
     {
-        if (!$this->checkPublicAjaxRateLimit('available_dates', 30)) {
+        if (!Helper::checkRateLimit('available_dates', 30)) {
             wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
         }

@@ -1131,7 +1131,7 @@

     public function ajaxHandleCancelMeeting()
     {
-        if (!$this->checkPublicAjaxRateLimit('cancel_meeting', 15)) {
+        if (!Helper::checkRateLimit('cancel_meeting', 15)) {
             wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
         }

@@ -1186,37 +1186,6 @@
         exit;
     }

-    /**
-     * Per-IP rate limit for public booking AJAX. Uses transients; 60s window.
-     *
-     * @param string $action Action name (e.g. schedule_meeting, available_dates, cancel_meeting).
-     * @param int    $limit  Max requests per window.
-     * @param int    $window Window in seconds.
-     * @return bool True if under limit (and count incremented), false if over limit.
-     */
-    private function checkPublicAjaxRateLimit($action, $limit, $window = 60)
-    {
-        $args = apply_filters('fluent_booking/public_ajax_ratelimit', [
-            'limit'  => $limit,
-            'window' => $window,
-        ], $action);
-
-        $limit  = max(1, (int) (isset($args['limit']) ? $args['limit'] : $limit));
-        $window = max(1, (int) (isset($args['window']) ? $args['window'] : $window));
-
-        $ip    = Helper::getIp();
-        $key   = 'fcal_ratelimit_' . $action . '_' . md5($ip);
-        $count = (int) get_transient($key);
-
-        if ($count >= $limit) {
-            return false;
-        }
-
-        set_transient($key, $count + 1, $window);
-
-        return true;
-    }
-
     private static function sanitize_mapped_data($settings)
     {
         $sanitizerMap = [
--- a/fluent-booking/app/Hooks/filters.php
+++ b/fluent-booking/app/Hooks/filters.php
@@ -1,5 +1,7 @@
 <?php

+defined('ABSPATH') || exit;
+
 use FluentBookingFrameworkSupportArr;
 use FluentBookingAppServicesCurrenciesHelper;
 use FluentBookingAppServicesDateTimeHelper;
--- a/fluent-booking/app/Hooks/includes.php
+++ b/fluent-booking/app/Hooks/includes.php
@@ -1,5 +1,7 @@
 <?php

+defined('ABSPATH') || exit;
+
 /*
  * Require any extra files here. For example::
  * require_once "shortcodes.php";
--- a/fluent-booking/app/Http/Controllers/SchedulesController.php
+++ b/fluent-booking/app/Http/Controllers/SchedulesController.php
@@ -515,6 +515,7 @@
             return $booking;
         }

+        // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
         throw (new ModelNotFoundException)->setModel(Booking::class, [$bookingId]);
     }

--- a/fluent-booking/app/Http/Policies/AvailabilityPolicy.php
+++ b/fluent-booking/app/Http/Policies/AvailabilityPolicy.php
@@ -23,9 +23,14 @@
             return true;
         }

-        if ($request->schedule_id) {
-            $availability = FluentBookingAppModelsAvailability::find($request->schedule_id);
-
+        // Resolve the schedule from the URL route only — request-body values
+        // must not be permitted to redirect the authorization target.
+        $urlParams = (array) $request->get_url_params();
+        $scheduleId = isset($urlParams['schedule_id']) ? (int) $urlParams['schedule_id'] : 0;
+
+        if ($scheduleId) {
+            $availability = FluentBookingAppModelsAvailability::find($scheduleId);
+
             if (!$availability) {
                 return false;
             }
--- a/fluent-booking/app/Http/Policies/CalendarEventPolicy.php
+++ b/fluent-booking/app/Http/Policies/CalendarEventPolicy.php
@@ -20,8 +20,14 @@
             return true;
         }

-        if ($request->event_id) {
-            $calendarEvent = CalendarSlot::find($request->event_id);
+        // Resolve event_id from the URL route only — request-body values
+        // must not be permitted to redirect the authorization target.
+        // The /bookings/ index route has no placeholder so guard the access.
+        $urlParams = (array) $request->get_url_params();
+        $eventId = isset($urlParams['event_id']) ? (int) $urlParams['event_id'] : 0;
+
+        if ($eventId) {
+            $calendarEvent = CalendarSlot::find($eventId);
             if (!$calendarEvent) {
                 return false;
             }
--- a/fluent-booking/app/Http/Policies/CalendarPolicy.php
+++ b/fluent-booking/app/Http/Policies/CalendarPolicy.php
@@ -21,14 +21,15 @@
             return true;
         }

-        $calendarId = $request->id ?: $request->calendar_id;
+        // Resolve IDs strictly from URL route params; request-body values
+        // must never be allowed to redirect the authorization target.
+        $calendarId = (int) $this->getRouteParam($request, 'id');
+        $eventId    = (int) $this->getRouteParam($request, 'event_id');

         if (!$calendarId) {
             return apply_filters('fluent_booking/verify_calendar_api', current_user_can('manage_options'), $request);
         }

-        $eventId = $request->event_id;
-
         if ($eventId && !CalendarSlot::where('calendar_id', $calendarId)->where('id', $eventId)->exists()) {
             return false;
         }
@@ -80,7 +81,7 @@
             return true;
         }

-        $calendarId = $request->id;
+        $calendarId = (int) $this->getRouteParam($request, 'id');

         $calendar = Calendar::find($calendarId);

@@ -102,15 +103,26 @@
             return true;
         }

-        $eventId = $request->event_id;
+        $eventId = (int) $this->getRouteParam($request, 'event_id');

         if (!$eventId || !PermissionManager::canUpdateCalendarEvent($eventId)) {
             return false;
         }

-        $sourceCalendarId = intval($request->id);
+        $sourceCalendarId = (int) $this->getRouteParam($request, 'id');
         $destinationCalendarId = intval($request->get('new_calendar_id')) ?: $sourceCalendarId;

         return PermissionManager::canWriteCalendar($destinationCalendarId);
     }
+
+    /**
+     * Read a URL-only route parameter safely. Some routes under this prefix
+     * (event-lists, root listing, create) have no path placeholder, so a
+     * direct array access would emit an undefined-array-key warning.
+     */
+    private function getRouteParam(Request $request, $key)
+    {
+        $params = (array) $request->get_url_params();
+        return isset($params[$key]) ? $params[$key] : null;
+    }
 }
--- a/fluent-booking/app/Http/Policies/MeetingPolicy.php
+++ b/fluent-booking/app/Http/Policies/MeetingPolicy.php
@@ -21,19 +21,23 @@
             return true;
         }

+        // Authorize only against the URL route parameter so request-body
+        // values cannot override the resource being acted on.
+        $bookingId = $this->getRouteBookingId($request);
+
         if ($request->method() == 'GET') {
             if (PermissionManager::userCan(['manage_own_calendar','read_all_bookings'])) {
                 return true;
             }

-            if ($request->id) {
-                $booking = Booking::find($request->id);
+            if ($bookingId) {
+                $booking = Booking::find($bookingId);
                 return $this->hasBookingAccess($booking);
             }
         }

-        if ($request->id) {
-            $booking = Booking::find($request->id);
+        if ($bookingId) {
+            $booking = Booking::find($bookingId);
             return $this->hasBookingAccess($booking);
         }

@@ -50,7 +54,13 @@
             return true;
         }

-        $booking = Booking::where('group_id', $request->group_id)->first();
+        $groupId = $this->getRouteParam($request, 'group_id');
+
+        if (!$groupId) {
+            return false;
+        }
+
+        $booking = Booking::where('group_id', $groupId)->first();

         return $this->hasBookingAccess($booking);
     }
@@ -71,15 +81,40 @@
             return true;
         }

-        if (!$request->id) {
+        $bookingId = $this->getRouteBookingId($request);
+
+        if (!$bookingId) {
             return false;
         }

-        $booking = Booking::find($request->id);
+        $booking = Booking::find($bookingId);

         return $this->hasBookingAccess($booking);
     }

+    /**
+     * Resolve the booking ID from the URL route parameter only.
+     *
+     * Why: merged request inputs let JSON body values shadow URL params,
+     * which previously allowed authorizing against an attacker-owned ID
+     * while the controller acted on the URL-targeted victim ID.
+     */
+    private function getRouteBookingId(Request $request)
+    {
+        return $this->getRouteParam($request, 'id');
+    }
+
+    /**
+     * Read a URL-only route parameter safely. Routes such as /schedules/
+     * and /schedules/export have no path placeholders, so a direct
+     * access would emit an undefined-array-key warning under PHP 8.
+     */
+    private function getRouteParam(Request $request, $key)
+    {
+        $params = (array) $request->get_url_params();
+        return isset($params[$key]) ? $params[$key] : null;
+    }
+
     private function hasBookingAccess($booking)
     {
         if (!$booking) {
--- a/fluent-booking/app/Http/Routes/routes.php
+++ b/fluent-booking/app/Http/Routes/routes.php
@@ -1,5 +1,7 @@
 <?php

+defined('ABSPATH') || exit;
+
 /**
  * @var $router FluentBookingFrameworkHttpRouter
  */
--- a/fluent-booking/app/Services/Helper.php
+++ b/fluent-booking/app/Services/Helper.php
@@ -2352,7 +2352,38 @@
         if ($ins) {
             return sanitize_text_field($ins);
         }
-
+
         return get_option('template');
     }
+
+    /**
+     * Per-IP fixed-window rate limiter for public AJAX/REST endpoints.
+     *
+     * @param string $action Action name (e.g. apply_coupon, schedule_meeting).
+     * @param int    $limit  Max requests per window.
+     * @param int    $window Window in seconds.
+     * @return bool True if under the limit (and the count was incremented),
+     *              false if over.
+     */
+    public static function checkRateLimit($action, $limit, $window = 60)
+    {
+        $args = apply_filters('fluent_booking/public_ajax_ratelimit', [
+            'limit'  => $limit,
+            'window' => $window,
+        ], $action);
+
+        $limit  = max(1, (int) (isset($args['limit']) ? $args['limit'] : $limit));
+        $window = max(1, (int) (isset($args['window']) ? $args['window'] : $window));
+
+        $key   = 'fcal_ratelimit_' . $action . '_' . md5(self::getIp());
+        $count = (int) get_transient($key);
+
+        if ($count >= $limit) {
+            return false;
+        }
+
+        set_transient($key, $count + 1, $window);
+
+        return true;
+    }
 }
--- a/fluent-booking/app/Services/Integrations/FluentCRM/FluentCrmInit.php
+++ b/fluent-booking/app/Services/Integrations/FluentCRM/FluentCrmInit.php
@@ -149,6 +149,7 @@
         $url = admin_url('admin.php?page=fluent-booking#/scheduled-events?email=' . rawurlencode($contact->email) . '&period=all&author=all');

         return '<p class="fcal_crm_view_all"><a style="color:#2271b1;padding:0 12px;text-decoration:underline" href="' . esc_url($url) . '">'
+            /* translators: %d: total number of meetings */
             . sprintf(esc_html__('View all meetings (%d)', 'fluent-booking'), (int) $total)
             . '</a></p>';
     }
--- a/fluent-booking/app/Services/Integrations/integrations.php
+++ b/fluent-booking/app/Services/Integrations/integrations.php
@@ -1,5 +1,7 @@
 <?php

+defined('ABSPATH') || exit;
+
 /*
  * Global Modules Intialization
  */
--- a/fluent-booking/app/Services/TransStrings.php
+++ b/fluent-booking/app/Services/TransStrings.php
@@ -1103,7 +1103,8 @@
             'Export CSV'                                                                       => __('Export CSV', 'fluent-booking'),
             'Export Guests'                                                                    => __('Export Guests', 'fluent-booking'),
             'Export limited'                                                                   => __('Export limited', 'fluent-booking'),
-            'Exported first %s of %s bookings. Use filters to narrow down.'                    => __('Exported first %s of %s bookings. Use filters to narrow down.', 'fluent-booking'),
+            /* translators: 1: exported count, 2: total count */
+            'Exported first %1$s of %2$s bookings. Use filters to narrow down.' => __('Exported first %1$s of %2$s bookings. Use filters to narrow down.', 'fluent-booking'),
             'Failed to generate CSV.'                                                          => __('Failed to generate CSV.', 'fluent-booking'),
             'From Email'                                                                       => __('From Email', 'fluent-booking'),
             'From Name'                                                                        => __('From Name', 'fluent-booking'),
--- a/fluent-booking/assets/Blocks/images/index.php
+++ b/fluent-booking/assets/Blocks/images/index.php
@@ -1,3 +0,0 @@
-<?php
-
-// Silence is golden
 No newline at end of file
--- a/fluent-booking/assets/public/index.php
+++ b/fluent-booking/assets/public/index.php
@@ -0,0 +1,3 @@
+<?php
+
+// Silence is golden
 No newline at end of file
--- a/fluent-booking/database/Migrations/BookingActivityMigrator.php
+++ b/fluent-booking/database/Migrations/BookingActivityMigrator.php
@@ -19,6 +19,7 @@
         $indexPrefix = $wpdb->prefix .'fcal_ba_';

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `booking_id` BIGINT UNSIGNED NOT NULL,
--- a/fluent-booking/database/Migrations/BookingHostMigrator.php
+++ b/fluent-booking/database/Migrations/BookingHostMigrator.php
@@ -14,6 +14,7 @@
         $table = $wpdb->prefix . static::$tableName;

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `booking_id` BIGINT(20) UNSIGNED NOT NULL,
--- a/fluent-booking/database/Migrations/BookingMetaMigrator.php
+++ b/fluent-booking/database/Migrations/BookingMetaMigrator.php
@@ -20,6 +20,7 @@
         $indexPrefix = $wpdb->prefix .'fcal_bmt_';

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `booking_id` BIGINT NULL,
--- a/fluent-booking/database/Migrations/BookingMigrator.php
+++ b/fluent-booking/database/Migrations/BookingMigrator.php
@@ -15,6 +15,7 @@
         $table = $wpdb->prefix . static::$tableName;

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/CalendarMigrator.php
+++ b/fluent-booking/database/Migrations/CalendarMigrator.php
@@ -15,6 +15,7 @@
         $table = $wpdb->prefix . static::$tableName;

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/CalendarSlotsMigrator.php
+++ b/fluent-booking/database/Migrations/CalendarSlotsMigrator.php
@@ -15,6 +15,7 @@
         $table = $wpdb->prefix . static::$tableName;

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/MetaMigrator.php
+++ b/fluent-booking/database/Migrations/MetaMigrator.php
@@ -19,6 +19,7 @@
         $indexPrefix = $wpdb->prefix .'fcal_mt_';

         if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
             $sql = "CREATE TABLE $table (
                 `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
                 `object_type` VARCHAR(50) NOT NULL,
--- a/fluent-booking/fluent-booking.php
+++ b/fluent-booking/fluent-booking.php
@@ -2,7 +2,7 @@
 /**
 Plugin Name: FluentBooking - Appointment Scheduling & Booking Solution
 Description: FluentBooking is the ultimate solution for booking appointments, meetings, webinars, events, sales calls, and more.
-Version: 2.1.0
+Version: 2.1.1
 Author: Appointment & Booking Solution Team - WPManageNinja
 Author URI: https://fluentbooking.com
 Plugin URI: https://fluentbooking.com/pricing/
@@ -19,10 +19,10 @@

 define('FLUENT_BOOKING_DIR', plugin_dir_path(__FILE__));
 define('FLUENT_BOOKING_URL', plugin_dir_url(__FILE__));
-define('FLUENT_BOOKING_VERSION', '2.1.0');
+define('FLUENT_BOOKING_VERSION', '2.1.1');
 define('FLUENT_BOOKING_DB_VERSION', '1.0.1');
-define('FLUENT_BOOKING_ASSETS_VERSION', '2.1.0');
-define('FLUENT_BOOKING_MIN_PRO_VERSION', '2.1.0');
+define('FLUENT_BOOKING_ASSETS_VERSION', '2.1.1');
+define('FLUENT_BOOKING_MIN_PRO_VERSION', '2.1.1');

 require __DIR__ . '/vendor/autoload.php';

--- a/fluent-booking/language/fluent-booking-de_DE.l10n.php
+++ b/fluent-booking/language/fluent-booking-de_DE.l10n.php
@@ -1,2 +1,2 @@
 <?php
-return ['project-id-version'=>'Fluent Booking','report-msgid-bugs-to'=>'','pot-creation-date'=>'2023-10-26 16:40+0000','po-revision-date'=>'2026-05-12 12:51+0000','last-translator'=>'','language-team'=>'German','language'=>'de_DE','plural-forms'=>'nplurals=2; plural=n != 1;','mime-version'=>'1.0','content-type'=>'text/plain; charset=UTF-8','content-transfer-encoding'=>'8bit','x-generator'=>'Loco https://localise.biz/','x-loco-version'=>'2.6.11; wp-6.6.2','x-domain'=>'fluent-booking','x-loco-fallback'=>'de_DE_formal','x-loco-template'=>'language/fluent-booking-de_DE_formal.po','x-loco-template-mode'=>'PO,JSON','messages'=>[' (Host phone number)'=>'(Telefonnummer des Organisators)',' ago'=>'zuvor',' Email'=>'E-Mail',' from now'=>'von jetzt an',' Name'=>'Name','%1$s meeting between %2$s and %3$s'=>'%1s Treffen zwischen %2s und %3s','%s already exists'=>'%s existiert bereits','%s field is required'=>'%s-Feld ist erforderlich','%s has been updated'=>'%s wurde aktualisiert','%s is required'=>'%s ist erforderlich','(Optional) The selected tags will be removed from the contact (if exist)'=>'(Optional) Die ausgewählten Tags werden aus dem Kontakt entfernt (falls vorhanden)','(Required Permission)'=>'(Erlaubnis erforderlich)','(Will Take Less Than a Minute!)'=>'(Dauert weniger als eine Minute!)','+ Add Another Limit'=>'+ Ein weiteres Limit hinzufügen','+ Add Another Reminder'=>'+ Eine weitere Erinnerung hinzufügen','+ Add more questions for invitees'=>'+ Weitere Fragen für Teilnehmer hinzufügen','+ Add new option'=>'+ Neue Option hinzufügen','+Add more questions for invitees'=>'+Weitere Fragen für die Teilnehmer hinzufügen','- Administrator (Owner)'=>'- Administrator (Eigentümer)','1 Day'=>'1 Tag','1 Hour'=>'1 Stunde','1 minute'=>'1 Minute','10 Minutes'=>'10 Minuten','10 minutes'=>'10 Minuten','105 Minutes'=>'105 Minuten','12 Hours'=>'12 Stunden','120 Minutes'=>'120 Minuten','12h'=>'12 Std.','15 Minutes'=>'15 Minuten','15 minutes'=>'15 Minuten','150 Minutes'=>'150 Minuten','180 Minutes'=>'180 Minuten','2 Days'=>'2 Tage','2 Hours'=>'2 Stunden','20 Minutes'=>'20 Minuten','240 Minutes'=>'240 Minuten','24h'=>'24 Std.','3 Hours'=>'3 Stunden','30 Minutes'=>'30 Minuten','40 Minutes'=>'40 Minuten','45 Minutes'=>'45 Minuten','480 Minutes'=>'480 Minuten','5 Minutes'=>'5 Minuten','5 minutes'=>'5 Minuten','50 Minutes'=>'50 Minuten','6 Hours'=>'6 Stunden','60 Minutes'=>'60 Minuten','75 Minutes'=>'75 Minuten','90 Minutes'=>'90 Minuten','A confirmation has been sent to your email address along with meeting location details.'=>'Eine Bestätigung wurde an Ihre E-Mail-Adresse geschickt, zusammen mit Angaben zum Veranstaltungsort.','A new appointment has been created on FluentBooking. %1$sView Booking Details%2$s'=>'Es wurde ein neuer Termin in FluentBooking erstellt. %1$sBuchungsdetails anzeigen%2$s','A particular user can have one calendar with multiple events. Please select a user who does not have a calendar yet'=>'Ein bestimmter Benutzer kann einen Kalender mit mehreren Ereignissen haben. Bitte wählen Sie einen Benutzer, der noch keinen Kalender hat','About'=>'Über','about this feature'=>'Über diese Funktion','Access Permissions for this user'=>'Zugriffsberechtigungen für diesen Benutzer','Action'=>'Aktion','Active'=>'Aktiv','Add'=>'Hinzufügen','Add a date override'=>'Einen Sondertag hinzufügen','Add another'=>'Einen weiteren hinzufügen','Add Another Conditional Group'=>'Eine weitere bedingte Gruppe hinzufügen','Add another location option'=>'Weitere Standortwahl hinzufügen','Add Calendar to Gutenberg Block'=>'Kalender zu Gutenberg-Block hinzufügen','Add date overrides'=>'Sondertag(e) hinzufügen','Add dates when your availability changes from your weekly hours'=>'Fügen Sie Daten hinzu, wenn sich Ihre Verfügbarkeit gegenüber Ihren wöchentlichen Arbeitszeiten ändert','Add guests'=>'Gäste hinzufügen','Add Host'=>'Gastgeber hinzufügen','Add Location'=>'Standort hinzufügen','Add More'=>'Mehr hinzufügen','Add more item'=>'Weitere Artikel hinzufügen','Add New'=>'Neu hinzufügen','Add New Availability Schedule'=>'Neuen Verfügbarkeitsplan hinzufügen','Add New Booking'=>'Neue Buchung hinzufügen','Add New Calendar Host'=>'Neuen Kalender-Organisator hinzufügen','Add New Host'=>'Neuen Organisator hinzufügen','Add New Integration'=>'Neue Integration hinzufügen','Add new option'=>'+Neue Option hinzufügen','Add New Schedule'=>'Neuen Zeitplan hinzufügen','Add New Team'=>'Neues Team hinzufügen','Add New Webhook'=>'Neuen Webhook hinzufügen','Add New Zoom User Account'=>'Neues Zoom-Benutzerkonto hinzufügen','Add One-off Event'=>'Einmal-Veranstaltung hinzufügen','Add Parameters'=>'Parameter hinzufügen','Add Question'=>'Frage hinzufügen','Add Shortcodes'=>'Shortcodes hinzufügen','Add Single Event'=>'Einzelnes Ereignis hinzufügen','Add Team'=>'Team hinzufügen','Add Team Member'=>'Team-Mitglied hinzufügen','Add to Block'=>'Zu Block hinzufügen','Add to calendar'=>'Zu Kalender hinzufügen','Additional Guests'=>'Zusätzliche Gäste','Additional Note'=>'Zusätzlicher Hinweis','Additional Recipients'=>'Zusätzliche Empfänger','Additional Settings'=>'Weitere Einstellungen','Address'=>'Adresse','Admin Email'=>'Admin-E-Mail','Administrator'=>'Administrator','Advanced Operators'=>'Fortgeschrittene Operatoren','Advanced Settings'=>'Erweiterte Einstellungen','After Event'=>'Nach dem Termin','All'=>'Alle','All Active Booking Forms'=>'Alle aktiven Buchungsformulare','All connected zoom accounts by you and your team members. You can review who connected their zoom account from Host Settings and manage from here for all of your team members.'=>'Alle verbundenen Zoom-Konten von Ihnen und Ihren Teammitgliedern. Sie können überprüfen, wer sein Zoom-Konto über die Host-Einstellungen verbunden hat und von hier aus alle Ihre Teammitglieder verwalten.','All Data'=>'Alle Daten','All dates are shown in'=>'Alle Daten werden angezeigt in','All Event Types'=>'Alle Veranstaltungsarten','All Events'=>'Alle Termine','All Meetings'=>'Alle Termine','All Schedules'=>'Alle Zeitpläne','Allow Multiple Booking'=>'Erlaube mehrfache Buchungen','Already assigned'=>'Bereits zugewiesen','Always'=>'Immer','Amber'=>'Bernstein','Amount'=>'Menge','API Error:'=>'API-Fehler:','Apple Calendar'=>'Apple Calendar','Apply'=>'Anwenden','Appointment could not be created'=>'Termin konnte nicht erstellt werden','Appointment could not be created because email is not given or invalid'=>'Termin konnte nicht erstellt werden, weil E-Mail nicht angegeben oder ungültig ist','Appointment Date & Time is required'=>'Datum und Uhrzeit des Termins sind erforderlich','Apr'=>'Apr.','April'=>'April','Are you sure to delete this Feed?'=>'Sind Sie sicher, dass Sie diesen Feed löschen wollen?','Are you sure to delete this webhook?'=>'Sind Sie sicher, dass Sie diesen Webhook löschen wollen?','Are you sure to delete this?'=>'Sind Sie sicher, dass Sie das löschen wollen?','Are you sure to disconnect this account?'=>'Sind Sie sicher, dass Sie die Verbindung zu diesem Konto trennen wollen?','Are you sure you want to delete this availability?'=>'Sind Sie sicher, dass Sie diese Verfügbarkeit löschen wollen?','Are you sure you want to delete this booking type? All the associate bookings and data will be deleted'=>'Sind Sie sicher, dass Sie diese Buchungsart löschen möchten? Alle zugehörigen Buchungen und Daten werden gelöscht','Are you sure you want to delete this booking?'=>'Sind Sie sicher, dass Sie diese Buchung löschen möchten?','Are you sure you want to delete this calendar? All the associate bookings and data will be deleted'=>'Sind Sie sicher, dass Sie diesen Kalender löschen möchten? Alle zugehörigen Buchungen und Daten werden gelöscht','Are you sure you want to disconnect this calendar? This action can't be undone.'=>'Sind Sie sicher, dass Sie die Verbindung zu diesem Kalender trennen möchten? Diese Aktion kann nicht rückgängig gemacht werden.','Are you sure you want to disconnect this integration?'=>'Sind Sie sicher, dass Sie diese Integration trennen wollen?','as group booking type'=>'als Buchungsart für Gruppen','Assign Member'=>'Mitglied zuweisen','Assignment'=>'Zuweisung','Associate your FluentCRM merge tags to the appropriate Fluent Form fields by selecting the appropriate form field from the list.'=>'Verknüpfen Sie Ihre FluentCRM-Seriennummern mit den entsprechenden Fluent Form-Feldern, indem Sie das entsprechende Formularfeld aus der Liste auswählen.','Attendee address'=>'Adresse des Teilnehmers','Attendee Cannot Cancel'=>'Teilnehmer kann nicht stornieren','Attendee Cannot Reschedule'=>'Teilnehmer kann nicht verschieben','Attendee Data'=>'Teilnehmerdaten','Attendee Phone Number'=>'Telefonnummer des Teilnehmers','Attendee phone number (with country code)'=>'Telefonnummer des Teilnehmers inkl. Ländercode','Attendee's Email'=>'E-Mail des teilnehmers','Attendee's Name'=>'Name des Teilnehmers','Attendee's Timezone'=>'Zeitzone des Teilnehmers','Aug'=>'Aug.','August'=>'August','Availability'=>'Verfügbarkeit','Available Durations'=>'Verfügbare Zeitspannen','Available Times'=>'Verfügbare Zeiten','Back'=>'Back','Back to dashboard'=>'Zurück zum Dashboard','Back to home'=>'Zurück zur Übersicht','Back to team'=>'Zurück zum Team','Before Event'=>'Vor dem Termin','beta'=>'beta','Book a meeting with me for %d minutes'=>'Buchen Sie einen Termin mit mir für %d Minuten','Book Now'=>'Jetzt buchen','Booked'=>'Gebucht','booked a new meeting at'=>'hat einen neuen Termin gebucht am','Booked At'=>'Gebucht am','Booked From'=>'Gebucht vom','Booking'=>'Buchung','Booking Calendar'=>'Buchungskalender','Booking Canceled'=>'Buchung abgesagt','Booking Cancellation URL'=>'URL für Buchungsstornierung','Booking Cancelled'=>'Termin abgesagt','Booking Cancelled by Attendee (email to Organizer)'=>'Termin abgesagt durch Teilnehmer (E-Mail an Organisator)','Booking Cancelled by Organizer (email to Attendee)'=>'Termin abgesagt durch Organisator (E-Mail an Teilnehmer)','Booking Completed'=>'Buchung abgeschlossen','Booking Confirmation Email to Attendee'=>'Terminbestätigungs-E-Mail an Teilnehmer','Booking Confirmation Email to Organizer (You)'=>'Terminbestätigungs-E-Mail an Organisator (Sie)','Booking Confirmed'=>'Buchung bestätigt','Booking Data'=>'Buchungsdaten','Booking Date'=>'Buchungsdatum','Booking Deleted Successfully!'=>'Buchung erfolgreich gelöscht!','Booking Details Admin URL'=>'Buchungsdaten Admin-URL','Booking Fee'=>'Buchungsgebühr','Booking Field'=>'Buchungsfeld','Booking form spot selectionNext'=>'Weiter','Booking has been confirmed'=>'Die Buchung wurde bestätigt','Booking has been confirmed by '=>'Die Buchung wurde bestätigt durch ','Booking has been created'=>'Die Buchung wurde erstellt','Booking has been created on FluentBooking'=>'Die Buchung wurde in FluentBooking erstellt','Booking has been rescheduled'=>'Die Buchung wurde verschoben','Booking hash is missing!'=>'Die Buchungsraute fehlt!','Booking ID'=>'Buchungs-ID','Booking Payment Items'=>'Zahlungsposten buchen','Booking Questions'=>'Buchungsfragen','Booking Rejected'=>'Die Buchung wurde abgelehnt','Booking request has been rejected by %s'=>'Die Buchung wurde von %s abgelehnt','Booking Reschedule URL'=>'URL für Buchungsverschiebung','Booking Rescheduled'=>'Die Buchung wurde verschoben','Booking Rescheduled by Attendee (email to Organizer)'=>'Vom Teilnehmer verschobener Termin (E-Mail an den Organisator)','Booking Rescheduled by Organizer (email to Attendee)'=>'Vom Organisator verschobener Termin (E-Mail an den Teilnehmer)','Booking Status'=>'Buchungsstatus','Booking Title'=>'Buchungs-Titel','Booking Trends'=>'Buchungs-Trends','Booking Type'=>'Buchungsart','Booking Types'=>'Buchungsarten','Booking URL'=>'Buchungs-URL','Bookings'=>'Buchungen','Burundian Franc'=>'Burundischer Franc','Caching Time'=>'Caching-Zeit','Calendar could not be found. Please try again'=>'Der Kalender konnte nicht gefunden werden. Bitte versuchen Sie es erneut','calendar day fullFriday'=>'Freitag','calendar day fullMonday'=>'Montag','calendar day fullSaturday'=>'Samstag','calendar day fullSunday'=>'Sonntag','calendar day fullThursday'=>'Donnerstag','calendar day fullTuesday'=>'Dienstag','calendar day fullWednesday'=>'Mittwoch','calendar day shortFri'=>'Fr','calendar day shortMon'=>'Mo','calendar day shortSat'=>'Sa','calendar day shortSun'=>'So','calendar day shortThu'=>'Do','calendar day shortTue'=>'Di','calendar day shortWed'=>'Mi','Calendar Deleted Successfully!'=>'Kalender erfolgreich gelöscht!','Calendar Description'=>'Beschreibung des Kalenders','Calendar Event has been deleted'=>'Kalenderereignis wurde gelöscht','Calendar Event not found'=>'Kalenderereignis nicht gefunden','calendar events are using this schedule'=>'Kalenderereignisse werden nach diesem Zeitplan durchgeführt','Calendar has been updated successfully'=>'Der Kalender wurde erfolgreich aktualisiert','Calendar ID'=>'Kalender-ID','Calendar imported successfully'=>'Kalender erfolgreich importiert','calendar month name fullApril'=>'April','calendar month name fullAugust'=>'August','calendar month name fullDecember'=>'Dezember','calendar month name fullFebruary'=>'Februar','calendar month name fullJanuary'=>'Januar','calendar month name fullJuly'=>'Juli','calendar month name fullJune'=>'Juni','calendar month name fullMarch'=>'März','calendar month name fullMay'=>'Mai','calendar month name fullNovember'=>'November','calendar month name fullOctober'=>'Oktober','calendar month name fullSeptember'=>'September','calendar month name shortApr'=>'Apr.','calendar month name shortAug'=>'Aug.','calendar month name shortDec'=>'Dez.','calendar month name shortFeb'=>'Feb.','calendar month name shortJan'=>'Jan.','calendar month name shortJul'=>'Jul.','calendar month name shortJun'=>'Jun.','calendar month name shortMar'=>'Mär.','calendar month name shortMay'=>'Mai','calendar month name shortNov'=>'Nov.','calendar month name shortOct'=>'Okt.','calendar month name shortSep'=>'Sep.','Calendar not found'=>'Kalender nicht gefunden','Calendar Settings'=>'Kalender-Einstellungen','Calendar start from'=>'Der Kalender beginnt am','Calendar Title'=>'Kalender-Titel','Calendar Type'=>'Kalender-Typ','Calendars'=>'Kalender','Can't delete: %s events depend on this schedule'=>'Kann nicht gelöscht werden: %s Ereignisse hängen von diesem Zeitplan ab','Cancel'=>'Abbrechen','Cancel Booking'=>'Termin absagen','Cancel Meeting'=>'Termin absagen','Cancellation'=>'Absage','Cancellation Reason'=>'Absagegrund','Cancelled'=>'Abgesagt','cancelled'=>'abgesagt','Cancelled Bookings'=>'Stornierte Buchungen','Card Last 4'=>'Karte Letzte 4','Central African Cfa Franc'=>'Zentralafrikanischer Cfa-Franc','Cfp Franc'=>'Cfp-Franc','Checkbox'=>'Checkbox','Checkbox Group'=>'Checkbox-Gruppe','Chilean Peso'=>'Chilenischer Peso','Click here'=>'Hier klicken','click here'=>'hier klicken','Click Here to Renew your License'=>'Klicken Sie hier, um Ihre Lizenz zu erneuern','click to upload'=>'Zum Uploaden klicken','Client ID'=>'Client-ID','Clone'=>'Klonen','Clone Calendar Event'=>'Klone Kalenderereignis','Clone Event'=>'Klone Ereignis','Clone from'=>'Klone von','Close'=>'Schließen','Comorian Franc'=>'Komorenfranke','Completed'=>'Abgeschlossen','completed'=>'abgeschlossen','Completed Bookings'=>'Abgeschlossene Buchungen','Conditional Logics is a Pro Feature'=>'Bedingte Logik ist ein Profi-Feature','Conferencing'=>'Konferenzen','Configuration required!'=>'Konfiguration erforderlich!','Configure Google Calendar/Meet to sync your events'=>'Konfigurieren Sie Google Calendar/Meet für die Synchronisierung Ihrer Termine','Configure Meeting Reminder to Attendee'=>'Terminerinnerung an Teilnehmer konfigurieren','Configure Meeting Reminder to Organizer (You)'=>'Terminerinnerung an Organisator (Sie) konfigurieren','Configure stripe to accept payments on your booking events and monetize your time slots'=>'Konfigurieren Sie Stripe, um Zahlungen für Ihre Buchungsereignisse zu akzeptieren und Ihre Zeitfenster zu monetarisieren','Configure times when you are available for bookings.'=>'Legen Sie die Zeiten fest, zu denen Sie für Buchungen verfügbar sind.','Configure your email settings for booking related emails'=>'Konfigurieren Sie Ihre E-Mail-Einstellungen für buchungsbezogene E-Mails','Confirm'=>'Bestätigen','Confirm Disconnect'=>'Trennen der Verbindung bestätigen','Confirm Payment'=>'Zahlung bestätigen','Confirm Reschedule'=>'Terminverschiebung bestätigen','Confirm, Disconnect'=>'Bestätigen, Verbindung trennen','Confirmation: '=>'Bestätigung','Congratulations!'=>'Herzlichen Glückwunsch!','Connect FluentCRM with Fluent Booking and subscribe a contact when a booking is created.'=>'Verbinden Sie FluentCRM mit Fluent Booking und abonnieren Sie einen Kontakt, wenn eine Buchung erstellt wird.','Connect with stripe'=>'Verbinden mit Stripe','Connect your favourite tools with your booking scheduled, completed or cancelled actions'=>'Verbinden Sie Ihre bevorzugten Tools mit Ihren geplanten, abgeschlossenen oder abgebrochenen Buchungen','Connect Your Zoom Account'=>'Verbinden Sie Ihr Zoom-Konto','Connect your Zoom account to create dynamic meeting in zoom for your bookings.'=>'Verbinden Sie Ihr Zoom-Konto, um dynamische Meetings in Zoom für Ihre Buchungen zu erstellen.','Connect your Zoom account to create meeting when a event is booked.'=>'Verbinden Sie Ihr Zoom-Konto, um ein Meeting zu erstellen, wenn eine Veranstaltung gebucht wird.','Connected Zoom Account Email:'=>'E-Mail des verbundenen Zoom-Kontos:','Connected Zoom Accounts'=>'Verknüpfte Zoom-Konten','Contact creation has been skipped because the contact already exists in the database'=>'Die Erstellung eines Kontakts wurde übersprungen, da der Kontakt bereits in der Datenbank vorhanden ist','Contact has been created in FluentCRM. Contact ID: '=>'Der Kontakt wurde in FluentCRM erstellt. Kontakt-ID: ','Contact has been updated in FluentCRM. Contact ID: '=>'Der Kontakt wurde in FluentCRM aktualisiert. Kontakt-ID: ','Contact Tags'=>'Kontakt-Tags','Contains'=>'Enthält','contains'=>'enthält','Continue'=>'Weiter','Continue to Payments'=>'Weiter zu Zahlungen','Copied to clipboard'=>'In die Zwischenablage kopiert','Copy'=>'Kopieren','Copy and use the shortcode Page/Post of your website'=>'Kopieren und verwenden Sie den Shortcode Page/Post Ihrer Website','Copy link'=>'Link kopieremn','Country'=>'Land','Create Booking'=>'Erzeuge Buchung','Create Booking Manually'=>'Erzeuge manuelle Buchung','Create events on'=>'Termine erstellen in Kalender','Create New Event Type'=>'Neuen Termin-Typ erstellen','create one!'=>'einen erstellen!','Create Your Availability'=>'Ihre Verfügbarkeit erstellen','Create Your First Booking Event'=>'Erstellen Sie Ihren ersten Buchungstermin','Currency'=>'Währung','Current DateTime:'=>'Aktuelle(s) Datum/Uhrzeit:','Custom'=>'Benutzerdefiniert','Custom Number'=>'Benutzerdefinierte Nummer','Customer Details'=>'Kunden-Details','Cyan'=>'Cyan','Daily'=>'Täglich','Dark'=>'Dunkel','Dashboard'=>'Dashboard','Data has been updated'=>'Die Daten wurden aktualisiert','Date'=>'Datum','Date & Time'=>'Datum & Uhrzeit','Date Overrides'=>'Sondertage','date time format switch12h'=>'12 Std.','date time format switch24h'=>'24 Std.','Date:'=>'Datum:','Day'=>'Tag','Days'=>'Tage','Days Before'=>'Tage vorher','Days into the future'=>'Tage in die Zukunft','Dec'=>'Dez.','December'=>'Dezember','Deep Lilac'=>'Tiefes Flieder','Default'=>'Standard','Default Country for Phone Field'=>'Standard-Land für die Telefonnummer','Default Duration'=>'Standard-Dauer	','Default Name that will be used to send email)'=>'Standardname, der für den Versand von E-Mails verwendet wird)','Default Reply to Email (Optional)'=>'Standardantwort an E-Mail (optional)','Default Reply to Name (Optional)'=>'Standardantwort an Name (optional)','Default schedule'=>'Standard-Zeitplan','Default Schedule cannot be deleted'=>'Standardzeitplan kann nicht gelöscht werden','Default Time Format'=>'Standard-Zeitformat','Delete'=>'Löschen','Delete Availability'=>'Verfügbarkeit löschen','Delete Booking Type'=>'Buchungsart löschen','Delete Calendar'=>'Kalender löschen','Delete Meeting'=>'Termin löschen','Delete this group'=>'Diese Gruppe löschen','Deleted User'=>'Gelöschter Benutzer','Deleted user'=>'Gelöschter Benutzer','Description'=>'Beschreibung','Disable'=>'Deaktivieren','Disable Landing Page Feature'=>'Landing Page-Funktion deaktivieren','Disabled'=>'Deaktiviert','Discard'=>'Verwerfen','Disconnect'=>'Trennen','Disconnect Calendar'=>'Kalender trennen','Disconnect Integration'=>'Integration trennen','Display Description on booking page'=>'Beschreibung auf der Buchungsseite anzeigen','Display Link on booking page'=>'Link auf der Buchungsseite anzeigen','Display Phone number on booking page'=>'Telefonnummer auf der Buchungsseite anzeigen','Display remaining spots on booking page'=>'Verbleibende Plätze auf der Buchungsseite anzeigen','Djiboutian Franc'=>'Dschibutischer Franc','do not contains'=>'enthält nicht','Don't have a license key?'=>'Sie haben keinen Lizenzschlüssel?','Duplicate'=>'Duplizieren','Edit'=>'Bearbeiten','Edit Availability'=>'Verfügbarkeit bearbeiten','Edit Location'=>'Standort bearbeiten','Edit Notification'=>'Benachrichtigung bearbeiten','Edit Team Member'=>'Team-Mitglied bearbeiten','Edit the schedule below so that you can apply to your event/booking types'=>'Bearbeiten Sie den Zeitplan unten, damit Sie ihn auf Ihre Veranstaltung/Buchungstypen anwenden können','Edit:'=>'Bearbeiten:','eg: 4'=>'z.B.: 4','Email'=>'E-Mail','Email Address'=>'E-Mail-Adresse','email as per your domain/SMTP settings'=>'E-Mail gemäß Ihren Domänen-/SMTP-Einstellungen','Email Body'=>'E-Mail-Text','Email Footer for Booking related emails (Optional)'=>'E-Mail-Fußzeile für buchungsbezogene E-Mails (optional)','Email Frequency?'=>'E-Mail Frequenz?','Email is required'=>'E-Mail ist erforderlich','Email is required for this appointment. Looks like this field does not have email field selected.'=>'E-Mail ist für diesen Termin erforderlich. Es sieht so aus, als ob für dieses Feld kein E-Mail-Feld ausgewählt wurde.','Email is required for this appointment. Please provide a valid email'=>'Für diesen Termin ist eine E-Mail erforderlich. Bitte geben Sie eine gültige E-Mail an','Email Notification'=>'E-Mail Benachrichtigung','Email Notification Settings'=>'Einstellungen für E-Mail-Benachrichtigungen','Email Notifications'=>'E-Mail-Benachrichtungen','Email Summary of Your Bookings (Last %d Day)'=>'E-Mail-Übersicht über Ihre Buchungen (letzte %d Tage)' . "" . '','Email, Start Time and timezone are required to create a booking'=>'E-Mail, Startzeit und Zeitzone sind erforderlich, um eine Buchung zu erstellen.','Emailing Settings'=>'E-Mail-Einstellungen','Emerald Green'=>'Smaragdgrün','Enable Booking Summary Notification'=>'Benachrichtigung über Buchungszusammenfassung aktivieren','Enable Double opt-in for new contacts'=>'Aktivieren Sie Double-Opt-In für neue Kontakte','Enable Force Subscribe if contact is not in subscribed status (Existing contact only)'=>'Aktivieren Sie das Erzwingen eines Abos, wenn der Kontakt nicht abonniert ist (nur bei bestehenden Kontakten)','Enable Landing Page'=>'Landing Page freigeben','Enable Landing Page Features for this calendar'=>'Landing Page-Funktionen für diesen Kalender aktivieren','Enable the calendars you want to check for conflicts to prevent double bookings.'=>'Aktivieren Sie die Kalender, die Sie auf Konflikte prüfen möchten, um Doppelbuchungen zu vermeiden.','Enable this event'=>'Aktivieren Sie dieses Ereignis','Enable this event as Paid and collect payment on booking'=>'Aktivieren Sie diese Veranstaltung als Bezahlt und ziehen Sie die Zahlung bei der Buchung ein','Enable This feed'=>'Diesen Feed aktivieren','Enable this notification email'=>'Enable this notification email','Enable this sms notification'=>'Aktivieren Sie diese SMS-Benachrichtigung','Enable this webhook feed'=>'Aktivieren Sie diesen Webhook-Feed','Enable/Disable Nextcloud Calendar to sync your events'=>'Aktivere/Deaktiviere Nextcloud Kalender Synchronistation','End'=>'Ende','End date'=>'Enddatum','Ends With'=>'Endet mit','ends with'=>'endet mit','Enter a value'=>'Einen Wert eingeben','Enter description for this person / calendar'=>'Beschreibung für diese Person / diesen Kalender eingeben','Enter Description here'=>'Beschreibung hier eingeben','Enter Details'=>'Details eingeben','Enter email addresses separated by commas'=>'E-Mail-Adressen durch Kommas getrennt eingeben','Enter Event Title'=>'Termintitel eingeben','Enter length in number'=>'Länge in Zahlen eingeben','Enter Name'=>'Name eingeben','Enter number with country code'=>'Nummer mit Landesvorwahl eingeben','Enter Schedule Title'=>'Terminplan-Titel eingeben','Enter the Host Phone Number'=>'Eingabe der Telefonnummer des Gastgebers','Enter Value'=>'Wert eingeben','Enter Your Client ID'=>'Geben Sie Ihre Kunden-ID ein','Enter Your name here'=>'Geben Sie hier Ihren Namen ein','Enter Your Redirect URI'=>'Geben Sie Ihre Weiterleitungs-URI ein','Enter Your Secret Key'=>'Geben Sie Ihren geheimen Schlüssel ein','Equal'=>'Ist gleich','equal'=>'ist gleich','Equal to Data Length'=>'Entspricht der Datenlänge','Event'=>'Termin','Event Cancel Reason'=>'Grund der Terminabsage','Event Date Time (UTC)'=>'Event Datum Uhrzeit (UTC)','Event Date Time (with attendee timezone)'=>'Veranstaltung Datum Uhrzeit (mit Zeitzone des Teilnehmers)','Event Date Time (with guest timezone)'=>'Veranstaltung Datum Uhrzeit (mit Zeitzone des Gastes)','Event Description'=>'Event-Beschreibung','Event Details'=>'Termin-Details','Event Guests'=>'Termin-Gast','Event ID'=>'Event-ID','Event Location Details (HTML)'=>'Details zum Veranstaltungsort (HTML)','Event Name'=>'Event-Name','Event Name *'=>'Terminname *','Event Reschedule Reason'=>'Grund für die Terminverschiebung','Event Settings'=>'Veranstaltungs-Einstellungen','Event Start Time (ex: 2 hours from now)'=>'Startzeit des Events (z.B.: in 2 Stunden ab jetzt)','Event Trigger'=>'Termin-Auslöser','Event Trigger For This Feed'=>'Ereignis-Auslöser für diesen Feed','Event trigger is required'=>'Ereignisauslöser ist erforderlich','Event Triggers'=>'Ereignisauslöser','Event Type'=>'Termin-Typ','ex: 60'=>'z.B.: 60','Export Hosts'=>'Organisator hinzufügen','Failed to create booking'=>'Buchung konnte nicht erstellt werden','Failed to load this integration. Please reload this page and try again.'=>'Diese Integration konnte nicht geladen werden. Bitte laden Sie diese Seite neu und versuchen Sie es erneut.','Feb'=>'Feb.','February'=>'Feber','Feed Name'=>'Feed-Name','Feed name is required'=>'Feed-Name ist erforderlich','Fetching License Information Please wait'=>'Lizenzinformationen werden abgerufen. Bitte warten','Field Name'=>'Feld-Name','Field Type'=>'Feldtyp','Field Value'=>'Feld-Wert','Fields has been updated'=>'Die Felder wurden aktualisiert','First Name'=>'Vorname','Fluent Booking'=>'Fluent Booking','FluentBooking Field'=>'FluentBooking-Feld','FluentCRM'=>'FluentCRM','FluentCRM API call was skipped because no valid email is available'=>'FluentCRM API-Aufruf übersprungen, da keine gültige E-Mail vorhanden','FluentCRM Field'=>'FluentCRM-Feld','FluentCRM is not configured yet! Please configure your FluentCRM api first'=>'FluentCRM ist noch nicht konfiguriert! Bitte konfigurieren Sie zuerst Ihre FluentCRM api','FluentCRM Lists'=>'FluentCRM-Listen','for how many spots left for available bookingspots left'=>'Zeitfenster übrig','for step by step guide to know how connect zoom account.'=>'für eine Schritt-für-Schritt-Anleitung, um zu erfahren, wie man ein Zoom-Konto verbindet.','for step by step guide to know how you can get api credentials from Zoom Account'=>'für eine Schritt-für-Schritt-Anleitung, um zu erfahren, wie Sie api-Anmeldeinformationen vom Zoom-Konto erhalten können','Form Field'=>'Formularfeld','fri'=>'Fr','Friday'=>'Freitag','From Email Address'=>'Von E-Mail Adresse','From Name'=>'Absendername','From Name for emails'=>'Absendername für E-Mails','Full Start & End Time (with guest timezone)'=>'Vollständige Start- und Endzeit (mit Zeitzone des Gastes)','Full Start & End Time (with host timezone)'=>'Vollständige Start- und Endzeit (mit Zeitzone des Organisators)','General Host Settings'=>'Allgemeine Organisator-Einstellungen','General Operators'=>'Allgemeine Operatoren','General Settings'=>'Allgemeine Einstellungen','Getting Started'=>'Erste Schritte','Global Settings'=>'Globale Einstellungen','Good for: coffee chats, 1:1 interviews, etc.'=>'Gut für: Kaffeegespräche, 1:1-Interviews usw.','Good for: webinars, online classes, etc.'=>'Gut für: Webinare, Online-Kurse, etc.','Google Calendar'=>'Google Kalender','Google Calendar / Meet'=>'Google Kalender / Google Meet','Google Meet'=>'Google Meet','Grant Team Members Access to FluentBookings for Calendar and Booking Management.'=>'Gewähren Sie Teammitgliedern Zugang zu FluentBookings für die Kalender- und Buchungsverwaltung.','Greater Than'=>'Größer als','greater than'=>'größer als','greater than or equal'=>'Größer als oder gleich','Greater than to Data Length'=>'Größer als bis zu Datenlänge','Group'=>'Gruppe','Group of invitees'=>'einer Gruppe von Teilnehmern','Guest Email'=>'Gast-E-Mail','Guest Fields'=>'Gast-Felder','Guest First Name'=>'Gast Vorname','Guest Full Name'=>'Gast Vollständiger Name','Guest Last Name'=>'Gast Nachname','Guest Main Phone Number (if provided)'=>'Haupttelefonnummer des Gastes (falls angegeben)','Guest Note'=>'Gast Notiz','Guest Timezone'=>'Gast Zeitzone','guests with'=>'Gäste mit','Guinean Franc'=>'Guineischer Franc','Have a new license Key?'=>'Haben Sie einen neuen Lizenzschlüssel?','Header Key'=>'Kopfzeilen-Schlüssel','Header Name'=>'Kopfzeilen-Name','Header Value'=>'Kopfzeilen-Wert','Hello There,'=>'Guten Tag,','here'=>'hier','Hidden'=>'Versteckt','Host'=>'Organisator','Host Data'=>'Organisator Daten','Host Email'=>'Organisator E-Mail','Host Name'=>'Organisator-Name','Host Name / Calendar Title'=>'Name des Organisators / Titel des Kalenders','Host Number'=>'Organisator-Nummer','Host Phone (with country code)'=>'Organisator-Telefon (mit Ländervorwahl)','Host Settings'=>'Organisator-Einstellungen','Host Timezone'=>'Organisator-Zeitzone','Hour'=>'Stunde','Hours'=>'Stunden','Hours Before'=>'Stunden vorher','How do you want to offer your availability for this event type?'=>'Wie möchten Sie Ihre Verfügbarkeit für diesen Veranstaltungstyp anbieten?','How often to send summary email?'=>'Wie oft soll die Zusammenfassung per E-Mail versendet werden?','HTML Response'=>'HTML-Antwort','https://fluentbooking.com'=>'https://fluentbooking.com','ID'=>'ID','If you enable this then this will run only once per customer otherwise, It will delete the existing automation flow and start new'=>'Wenn Sie dies aktivieren, wird die Automatisierung nur einmal pro Kunde ausgeführt, andernfalls wird der bestehende Automatisierungsablauf gelöscht und ein neuer gestartet.','In Person'=>'Persönlich','In Person (Attendee Address)'=>'Persönlich (Adresse des Teilnehmers)','In Person (Organizer Address)'=>'Persönlich (Adresse des Organisators)','In which day to send the email?'=>'An welchem Tag soll die E-Mail versendet werden?','Inactive'=>'Inaktiv','Indefinitely into the future'=>'Unbegrenzt in die Zukunft','Integration'=>'Integration','Integration successfully saved'=>'Integration erfolgreich gespeichert','Integrations'=>'Integrationen','Interest Group is a Pro Feature'=>'Die Interessengruppe ist eine Profi-Funktion','Internal Note'=>'Interne Notiz','Invalid column'=>'Ungültige Spalte','Invalid date range'=>'Ungültiger Datumsbereich','Invalid email address'=>'Ungültige E-Mail Adresse','Invalid group id or the event is not a group event'=>'Ungültige Gruppennummer oder das Ereignis ist kein Gruppenereignis','Invalid rescheduling request'=>'Ungültige Umplanungsanfrage','Invalid status'=>'Ungültiger Status','Invalid Vue Element'=>'Ungültiges Vue-Element','Invitee Address:'=>'Adresse des Teilnehmers:','Invitee Email'=>'Teilnehmer-E-Mail','Invitee Name'=>'Name des Teilnehmers','Invitee Timezone'=>'Zeitzone des Teilnehmers','Invitees can schedule...'=>'Teilnehmer können buchen innerhalb von...','Invitees can't schedule within...'=>'Teilnehmer können nicht buchen innerhalb von...','Invitees Information'=>'Teilnehmer­informationen','Item'=>'Posten','Item Name'=>'Posten Name','Jan'=>'Jän.','January'=>'Jänner','Japanese Yen'=>'Japanischer Yen','Jul'=>'Jul.','July'=>'Juli','Jun'=>'Jun.','June'=>'Juni','Label'=>'Bezeichnung','Label *'=>'Bezeichnung *','Label field is required'=>'Die Feld-Bezeichnung ist erforderlich','Landing Page'=>'Landing Page','Landing Page settings has been updated'=>'Die Einstellungen der Landing Page wurden aktualisiert','Landing page URL'=>'URL der Landing Page','Landing Page Visibility'=>'Sichtbarkeit der Landing Page','Last 3 months'=>'Letzte 3 Monate','Last month'=>'Letzter Monat','Last Name'=>'Nachname','Last week'=>'Letzte Woche','Latest Booked Meetings'=>'Zuletzt gebuchte Sitzungen','Latest Bookings'=>'Neueste Buchungen','Less Than'=>'Kleiner als','less than'=>'kleiner als','Less than last month'=>'Weniger als im Vormonat','less than or equal'=>'kleiner als oder gleich','Less than to Data length'=>'Weniger als bis Datenlänge','Let's see how many events are booked in the last %d days.'=>'Lasst uns sehen, wie viele Termine in den letzten %d Tagen gebucht wurden.','License'=>'Lizenz','License Key'=>'Lizenzschlüssel','License Management'=>'Lizenz-Management','Lime Green'=>'Limonengrün','Line Total'=>'Zeile Gesamt','Loading...'=>'Lädt...','Location'=>'Standort','Location *'=>'Standort *','Location Description'=>'Standort-Beschreibung','Location Description *'=>'Standort-Beschreibung*','Location Description is required'=>'Beschreibung des Standorts ist erforderlich','location options'=>'Standort-Optionen','Location Title'=>'Standort Titel','Location Title *'=>'Standorttitel *','Location Title is required'=>'Standorttitel ist erforderlich','Location Type is required'=>'Standort ist erforderlich','Looks like you did not connect FluentBooking with your Zoom Account yet!'=>'Sieht so aus, als hätten Sie FluentBooking noch nicht mit Ihrem Zoom-Konto verbunden!','Looks like your license has been expired'=>'Sieht aus, als ob Ihre Lizenz abgelaufen ist','Looks like your remote connection for this location is disabled. Please revise your location selection'=>'Es sieht so aus, als ob Ihre Fernverbindung für diesen Standort deaktiviert ist. Bitte überarbeiten Sie Ihre Standortauswahl','Malagasy Ariary'=>'Madagaskar-Ariarie','Manage All Availabilities'=>'Alle Verfügbarkeiten verwalten','Manage general settings for this calendar'=>'Verwalten der allgemeinen Einstellungen für diesen Kalender','Manage only own Calendar, Events, Bookings & Availability'=>'Nur eigene Kalender, Veranstaltungen, Buchungen und Verfügbarkeit verwalten','Manage Other Users Calendars'=>'Verwalten von Kalendern anderer Benutzer','Manage your settings related emails, notifications and other general settings'=>'Verwalten Sie Ihre Einstellungen für E-Mails, Benachrichtigungen und andere allgemeine Einstellungen','Map Primary Fields'=>'Primäre Felder zuordnen','Mar'=>'Mär.','March'=>'März','Mark As Completed'=>'Als erledigt markieren','Mark to Unavailable'=>'Als "Nicht verfügbar" markieren','Match all of'=>'Entspricht allen von','Match any Of'=>'Entspricht irgendeiner von','Match none of'=>'Entspricht keinen von','Match Type'=>'Typ der Entsprechung','Max invitees in a spot'=>'Maximal eingeladene Teilnehmer an einem Platz','May'=>'Mai','Meeting Activities'=>'Termin-Aktivitäten','Meeting At'=>'Treffen bei','meeting between'=>'Termin zwischen','Meeting Duration'=>'Termindauer','Meeting Duration *'=>'Termindauer*','Meeting has been cancelled'=>'Der Termin wurde abgesagt','Meeting has been cancelled by %s'=>'Der Termin wurde von %s abgesagt','Meeting Host'=>'Organisator der Sitzung','Meeting Information'=>'Termin-Informationen','Meeting Link is required'=>'Termin-Link ist erforderlich','Meeting Rescheduled'=>'Termin verschoben','Meeting Title'=>'Termin-Titel','Message'=>'Nachricht','Microsoft Office'=>'Microsoft Office','Minute'=>'Minute','Minutes'=>'Minuten','minutes'=>'Minuten','Minutes Before'=>'Minuten vorher','minutes meeting with'=>'-Minuten-Termin mit','mon'=>'Mo','Monday'=>'Montag','more'=>'mehr','More than last month'=>'Mehr als im Vormonat','My Meetings'=>'Meine Termine','My Schedules'=>'Meine Terminpläne','Name'=>'Name','Need to make a change?'=>'Sie müssen etwas ändern?','Nevermind'=>'Vergiss es','New Booking Confirmed Funnel'=>'Neuer Trichter zur Buchun

ModSecurity Protection Against This CVE

Here you will find our ModSecurity compatible rule to protect against this particular CVE.

ModSecurity
SecRule REQUEST_URI "@streq /wp-admin/admin-ajax.php" "id:20265763,phase:2,deny,status:403,chain,msg:'CVE-2026-57638 XSS via Fluent Booking block attributes',severity:'CRITICAL',tag:'CVE-2026-57638'"
SecRule ARGS_POST:action "@streq wp_ajax_fluent_booking_render_block" "chain"
SecRule ARGS_POST:attributes "@rx <script[^>]*>|<[^>]+on[a-zA-Z]+s*=|bjavascripts*:" "t:none,chain"
SecRule ARGS_POST:attributes "@rx <script" "t:none"

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School