Appointment Booking Calendar – Dynamic Reservation

Opis

Dynamic Reservation brings a full appointment booking calendar into WordPress. Customers book online through a clean shortcode widget, while you manage everything from the WordPress admin.

👉 Website, free account & live demo: dynamicreservation.com

🚀 Key Features

  • Admin Dashboard Calendar – week & month view with bookings, blocked slots and live status
  • Confirm / Reject / Remove Bookings – manage reservation status directly in WordPress
  • Block Time – block individual slots, full days or recurring time ranges (daily / weekly / monthly) with optional notes and color labels (amber / red / blue / green / purple / slate)
  • Booking Shortcode [apboca_calendar] – embed the public booking calendar on any page, post or block
  • Live Design Settings – change surface, border, header and accent colors and see a live preview of the calendar, rendered locally inside WordPress
  • Multilingual – built-in translations for 10 languages (EN, DE, FR, ES, IT, PT, NL, PL, SV, TR)
  • Customer e-mails – automatic confirmation, rejection and cancellation e-mails
  • Auto-Updates – plugin updates are delivered through WordPress
  • No external CSS / JS dependencies – Tailwind is precompiled and shipped with the plugin (wp.org compliant)

⚙️ How it works

The public booking widget is embedded on your site through the [apboca_calendar] shortcode and is connected to your WordPress site via an Embed Token (API Key). All booking data is stored on the Dynamic Reservation backend. The WordPress admin screens do not embed any external page: the dashboard, the settings and the live calendar preview are rendered by the plugin itself and talk to the backend through server-side REST API requests only.

🔌 External services

This plugin is a client for the hosted booking service Dynamic Reservation. Reservations, blocked times and calendar settings are not stored in your WordPress database; they live on the Dynamic Reservation backend and are read and written through its REST API. Without an account and an Embed Token the plugin only offers a local demo mode.

Which service is used

Which API routes the plugin calls

All calls to the REST API are made server-side from PHP (wp_remote_*) and – except for login and password reset – authenticated with your Embed Token. The plugin only calls routes from a fixed allow-list:

  • /api/v1/reservations – list, create, confirm / reject (update) and remove bookings (GET, POST, PATCH, DELETE)
  • /api/v1/blocked-times – list, create, update and delete blocked time slots, including recurring series (GET, POST, PATCH, DELETE)
  • /api/v1/calendar-settings – read and save opening hours, slot length and blocked weekdays (GET, POST)
  • /api/v1/design – read and save colors, title, description and default view of the booking calendar (GET, POST)
  • /api/v1/billing, /api/v1/checkout, /api/v1/cancel, /api/v1/verify-session – show and manage your Dynamic Reservation subscription. Paid plans are checked out on a payment page of Stripe (privacy policy); the plugin never receives or stores card data.
  • /api/v1/admin/customers, /api/v1/customer-magic-link – list your customers and create or send their personal booking link („Send Booking Link”)
  • /api/v1/contact – the optional support contact form in the plugin settings
  • /api/wp-auth, /api/forgot-password – log in / register to connect your site, and reset your password

The public booking widget is loaded from https://dynamicreservation.com/embed/calendar in a frame on the pages where you place the [apboca_calendar] shortcode.

What is sent and when

  • Data sent: your Embed Token (API key), booking data (date, time and the contact details a visitor enters into the booking form), block-time entries, calendar and design settings, and – only when you use them – your login e-mail / password or a support message
  • When: when a visitor opens the booking widget or submits a booking, when an admin opens the plugin dashboard or settings, when a booking is confirmed / rejected / removed, when a block is created / deleted, and when settings are saved
  • Not sent: no data is sent before you connect the site; the demo mode works completely locally in your browser

Legal

You need a Dynamic Reservation account and an Embed Token to use the booking features. A free plan is available.

⭐ Organization

Dynamic Reservation is developed and maintained by vdux – a team creating innovative app solutions. Dynamic Reservation and our other apps are published in the vdux organization on GitHub. Have a look, leave a star ⭐ and follow the development:

👉 GitHub: github.com/vdux-org/apps

👉 Company: vdux.de

Reservation Booking Calendar

Zrzuty ekranu

Instalacja

  1. Upload the plugin folder to /wp-content/plugins/ or install it via the WordPress Plugins screen.
  2. Activate the plugin through the Plugins menu in WordPress.
  3. Go to D-Reservation Settings and paste your Embed Token (API Key) from https://dynamicreservation.com.
  4. Place the shortcode [apboca_calendar] on any page or post to display the booking calendar.
  5. Manage incoming bookings under D-Reservation Dashboard.

Najczęściej zadawane pytania

Do I need an account on dynamicreservation.com?

Yes. The plugin connects to the Dynamic Reservation hosted backend. You can sign up for a free account and receive an Embed Token to use the plugin.

Where is my booking data stored?

Bookings are stored on the Dynamic Reservation backend. The plugin reads and writes them through the public REST API using your Embed Token.

Can I change the look of the calendar?

Yes. Under D-Reservation Settings Design you can change surface, border, header, primary and hover colors, the border radius, the title and description and switch between week and month view. A live preview is shown next to the form.

Is the plugin translation-ready?

Yes. The text domain is appointment-booking-calendar-dynamic-reservation. The plugin ships with translations for English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Swedish and Turkish.

Does the plugin load any external CSS or JavaScript at runtime?

No. Tailwind CSS is precompiled and bundled inside the plugin, and the WordPress admin loads no external CSS, JavaScript, fonts or frames — the dashboard and the live calendar preview are rendered locally. Requests to https://dynamicreservation.com are made server-side from PHP. On the front end the booking widget itself is rendered in a frame from https://dynamicreservation.com, which is the hosted booking service this plugin is a client for.

Recenzje

Wtyczka nie ma jeszcze żadnej recenzji.

Kontrybutorzy i deweloperzy

„Appointment Booking Calendar – Dynamic Reservation” jest oprogramowaniem open source. Poniższe osoby miały wkład w rozwój wtyczki.

Zaangażowani

Rejestr zmian

1.2.34

  • wp.org compliance: the WordPress admin no longer embeds any external page. All four iframes that loaded content from dynamicreservation.com have been removed.
  • Live preview: the calendar preview in Design, Themes and Position is now rendered by the plugin itself (assets/preview.js). It reacts to colors, title, description, header, view mode and border radius exactly as before, is navigable, and loads nothing from an external site.
  • Demo mode: the demo dashboard is now the plugin’s own dashboard, driven by sample data stored in the browser (localStorage). Bookings, block times, recurring blocks and statistics all work locally; nothing is sent to or loaded from an external service.
  • Privacy: because no admin screen loads remote content anymore, opening the plugin’s screens no longer causes any browser request to an external host. All communication with the booking service happens server-side via PHP, only after the site has been connected.
  • Cleanup: removed the unused preview-iframe CSS, a leftover debug log, and corrected the text domain named in the FAQ.
  • Compat: „Tested up to” raised to WordPress 7.1.

1.2.33

  • Security: the AJAX API proxy no longer forwards the posted JSON body after a plain json_decode(). The posted string is sanitized on read, the decoded payload is sanitized recursively (keys via sanitize_key(), string values via sanitize_email() / sanitize_textarea_field(), numbers and booleans keep their type) and invalid JSON is rejected with a 400 response.
  • Security: the proxied endpoint is validated against an allow-list of the routes the plugin actually uses, its query string is rebuilt from sanitized key/value pairs, and the HTTP method is restricted to GET/POST/PATCH/DELETE.
  • Security: all remaining $_POST reads are unslashed and sanitized before use; toggles are compared against sanitized values, calendar hours and slot lengths are range-validated, blocked weekdays are cast to int and clamped to 1-7.
  • Security: login and registration now validate the email format and the password length/characters before the credentials are forwarded to the authentication API.
  • Compat: „Tested up to” raised to WordPress 7.0.

1.2.32

  • wp.org compliance: front-end embed CSS and JS are no longer emitted as inline <style> / <script> blocks. The static wrapper styles now live in assets/embed.css and are enqueued via wp_enqueue_style(); the full-bleed breakout runtime lives in assets/embed.js and is enqueued via wp_enqueue_script(), with per-shortcode config passed through wp_add_inline_script().
  • wp.org compliance: removed the legacy generic [dynamic_reservation] shortcode alias. Only the prefixed [apboca_calendar] tag is registered now, eliminating the only remaining non-prefixed identifier flagged by the wp.org reviewer.

1.2.31

  • Build/structure: renamed plugin source folder and main file to match the wp.org slug appointment-booking-calendar-dynamic-reservation. Resolves WordPress.WP.I18n.TextDomainMismatch warnings reported by the Plugin Check tool.
  • No functional changes for end users.

1.2.30

  • Settings: unified empty-state across Layout, Calendar, Connection and Subscription tabs when not connected.
  • Settings: each tab now shows the same banner with two CTAs — „Go to General” (login/register) and „Try Demo” (opens demo on the dashboard).
  • Connection tab: removed obsolete „Go to Dashboard” link; the connection status card is now hidden until the site is connected.
  • Translations: added new setup banner + button strings for all 10 supported languages.

1.2.29

  • Login form: added password reveal eye icon (admin login + register).
  • Login form: added „Forgot password?” link with reset email flow.
  • Translations: added forgot/reset/eye strings for all 10 supported languages.

1.2.28

  • Fix: Fullwidth-Modi überlaufen nicht mehr rechts aus dem Viewport. Die Breakout-Routine nutzt jetzt position: relative + left (rein visuelle Verschiebung ohne Layout-Seiteneffekte) statt negativer Margins, und misst den Wrapper selbst nach einem sauberen Reset. Damit ist die Positionierung exakt: links bei 0, rechts bei clientWidth (ohne Scrollbar-Gutter).

1.2.27

  • Fix: Fullwidth-Modi („bricht aus dem Inhaltscontainer aus“ und „gesamter Bildschirm“) positionieren sich jetzt zuverlässig links bei 0 und füllen die Viewport-Breite. Die Breakout-Routine misst nun das Parent-Element (statt des Embeds selbst), wodurch die Positionierung unabhängig vom Theme-Layout (zentriert, links-ausgerichtet, mit Sidebar etc.) deterministisch wird. Zusätzliche Re-Runs nach Font-Load und mit kurzem Timeout fangen späte Layout-Shifts (Page-Builder Hydration, Sticky-Header) ab.
  • New: Welcome-Card und Demo-Banner im WP-Admin sind jetzt in 10 Sprachen verfügbar (en, de, fr, es, it, pt, nl, pl, sv, tr) — die Sprache wird automatisch aus der WordPress-Locale des Nutzers abgeleitet, ohne dass eine .mo-Datei nachgeladen werden muss.

1.2.26

  • Fix: “Volle Breite – bricht aus dem Inhaltscontainer aus” — the proportional scale slider no longer applies a transform: scale() in this mode, which had been shrinking the iframe to a tiny corner when the slider was below 100%. Scale is now disabled (forced to 100%) in both full-width modes; only height is configurable.
  • Fix: “Volle Breite – gesamter Bildschirm (Rand zu Rand)” — replaced the brittle JS measurement-based breakout with a deterministic CSS approach. The wrapper now uses width: var(--apboca-vw) + margin-left: calc(50% - var(--apboca-vw)/2), where --apboca-vw is set to the document’s clientWidth (excludes vertical scrollbar). This eliminates the right-edge overflow that used to appear when the breakout JS mismeasured the parent offset.
  • Fix: Live-Vorschau in den Plugin-Einstellungen verhält sich jetzt identisch zu „Volle Breite“ am Frontend (kein winziger Kalender beim Verstellen des Skalierungs-Sliders).

1.2.25

  • Fix: Welcome card — the “Start in Demo Mode” button now has at least 30px breathing room below it. Previously the spacing classes (pb-8, py-7) used in the markup were not part of the precompiled Tailwind bundle and therefore had no effect; spacing is now applied via inline styles so it cannot be silently dropped.

1.2.24

  • Fix: Frontend full-width breakout no longer triggers a horizontal scrollbar on the document. The runtime now sets overflow-x: clip on <html> / <body> so the calendar can extend to the viewport edge without enabling page-level horizontal scrolling.
  • Fix: Welcome card spacing — the “Start in Demo Mode” button now has additional bottom breathing room (≥25px between the button and the bottom edge of the WP admin content area).

1.2.23

  • Fix: Settings Layout Position — full-width modes now also tell the embedded calendar (SvelteKit) to render responsively via a responsive=1 URL flag. Previously the iFrame wrapper was stretched correctly but the calendar inside kept its internal max-width and stayed centered at 800px, making the breakout look like a no-op.
  • Fix: Settings Layout Position — the proportional scale slider now actually updates the iFrame Width (px) and iFrame Height (px) input values as it is dragged, instead of only scaling the preview visually.
  • Fix: Settings Layout Position — “Full width — breaks out of content container” now disables the Width (px) input and shows a 100% placeholder. Previously the field kept a meaningless number (e.g. 2000) which made the configuration confusing.
  • Fix: Settings Layout Position — saving from the Position sub-tab now lands the user back on the Position sub-tab after the redirect from options.php, instead of falling back to the Reservation sub-tab.
  • Feature: Dashboard before login — added a „Start in Demo Mode” CTA on the welcome card. Demo mode loads the public demo dashboard inside an iFrame so the user can explore time-blocking and the booking flow with sample data before registering. A clear amber banner reminds the user that bookings made in demo mode are not stored on the live site.

1.2.22

  • Fix: Backward compatibility — the original [dynamic_reservation] shortcode tag is registered again as an alias of [apboca_calendar], so existing pages continue to render the calendar after upgrading from 1.2.19 or earlier.
  • Fix: Frontend full-width breakout actually widens the calendar now. The previous build only applied a negative margin which shifted the element but left the width at the parent column width. The runtime now sets an explicit pixel width (document width minus optional 16px gutter) AFTER neutralising overflow:hidden/overflow:clip on every ancestor up to <body>, so the calendar reliably stretches across Elementor sections, Gutenberg groups, Divi rows etc.
  • Fix: Admin Dashboard month view — a single combined scrollable list now contains both blocked time entries and reservations. Previously only reservations were scrollable and blocked time entries were still truncated with a +N counter.

1.2.21

  • Fix: Admin Dashboard month view — scrollable list when a day has more than 3 bookings now actually scrolls (the previous build relied on an arbitrary Tailwind class that was not in the precompiled CSS bundle; replaced with inline max-height + overflow-y:auto).
  • Fix: Settings Layout Position live preview — “Full width — breaks out of content container” and “Full width — entire screen (edge to edge)” now correctly stretch the calendar iFrame across the simulated page frame instead of the iFrame staying constrained to the 720px content column.
  • Fix: Frontend full-width breakout now uses a JS-based runtime adjustment (measures the document width, applies negative margins relative to the actual element position and neutralises overflow:hidden on ancestor containers up to <body>) so the calendar reliably breaks out inside Elementor sections, Gutenberg groups, Divi rows and similar builders.

1.2.20

  • Fix: Renamed all generic dr_ / DR_ prefixes to the unique apboca_ / APBOCA_ prefix (functions, classes, defines, options, AJAX actions, settings group, nonces and the JS global) to comply with WordPress.org plugin naming guidelines.
  • Change: Booking shortcode tag is now [apboca_calendar].
  • Fix: Admin Dashboard month view — when a day contains more than 3 bookings, the list is now scrollable (vertical scroll inside the day cell) instead of being truncated with a +N counter.
  • Fix: Settings Layout Position — “Full width — breaks out of content container” and “Full width — entire screen (edge to edge)” now use the standard full-bleed CSS technique (margin-left: calc(50% - 50vw)) so the iFrame reliably escapes the content column on common page builders such as Elementor, Gutenberg and Divi.
  • Fix: When “Full width — entire screen (edge to edge)” is selected, Width (px) and Proportional Scale are now disabled (only iFrame Height stays editable), since width scaling is meaningless in edge-to-edge mode.

1.2.19

  • New: „Service Information” tab in Settings with links to Terms & Conditions, Privacy Policy, and Imprint.
  • New: Contact form to reach support directly from WordPress (rate-limited to 1 message per day).

1.2.17

  • Fix: WordPress dashboard calendar now actually opens in the configured Default View (Week / Month) from Settings Layout Admin.

1.2.16

  • Fix: „Remove all in series” now actually deletes every block in the recurring series via the v1 API endpoint used by the WordPress plugin (1.2.15 fixed only the web app).
  • Fix: Default Calendar View toggle (Week / Month) no longer overlaps the description text in Settings Layout.

1.2.15

  • Fix: „Remove all in series” now reliably cascades and deletes every block in a recurring series (daily / weekly / monthly).
  • New: Default Calendar View toggle (Week / Month) per area in Settings Layout (Booking & Admin sub-tabs).
  • UI: Calendar Settings – „Booking Description” is now a toggle switch (consistent with the rest of the settings).
  • Live preview: switching the default view in Layout updates the embedded preview iframe immediately.

1.2.13

  • WordPress.org compliance: removed in-plugin auto-updater (updates are delivered via WordPress.org).
  • Hardening: stricter input sanitization on AJAX endpoints (api proxy body, blocked dates, calendar settings).
  • Hardening: all template output is escaped (esc_attr / esc_html) to satisfy Plugin Check ERROR-level rules.
  • Compat: replaced date() with gmdate() to be timezone-safe.
  • Tested up to WordPress 6.9.

1.2.12

  • UI: Calendar Settings – renamed „Blocked weekdays” to „Block weekdays (recurring)” (DE: „Blocke beliebig Wochentage (wiederkehrend)”).
  • UI: Weekday tiles use a green default state and turn red when selected – matches the web app.
  • Fix: Surface and border color pickers in Design Settings now apply correctly to the embedded calendar preview.
  • Fix: Hover on day tiles in the WordPress dashboard week / month view no longer removes the tile border.

1.2.9

  • Fix: Block Time popup is translated into the WordPress user language (10 locales).
  • Fix: When the selected day already has bookings, the Block Time Advanced tab now shows a banner explaining that the entire day cannot be blocked, the all-day toggle is disabled and From/To dropdowns only list still-free hours.

1.2.8

  • Fix: Disable „Advanced / Block entire day” tab when the day already has bookings.
  • Fix: Reservation delete via SvelteKit /api/reservations endpoint uses delete({ count: "exact" }) for reliable RLS detection.

1.2.7

  • Month view: blocked day tiles now show the actual block label, note and chosen color.
  • Reservation Remove: surfaces backend errors instead of silently appearing to fail.

1.2.6

  • Block Time: recurring blocks (daily/weekly/monthly) now correctly create individual entries on every interval day via the public REST API.
  • Block Time: tile color palette (amber/red/blue/green/purple/slate) visible on day, week and month tiles.
  • Booking Details popup: new „Remove” button for confirmed/rejected bookings – confirmed bookings trigger a cancellation e-mail to the customer.

1.2.5

  • Fix: recurring blocks (daily/weekly/monthly) only blocking the start day in some timezones.
  • Block Time: color palette picker (amber/red/blue/green/purple/slate) for block tile border + background.
  • Remove Blocked Time popup: now displays the saved note text.

1.2.4

  • Block Time: validation for repeat „Until” date (required + must be on/after start).
  • Block Time: auto-fill „Until” with start +30 days when picking a repeat type.
  • Calendar tiles: show truncated note (max 15 chars) on blocked time entries.

1.2.3

  • Replaced Tailwind CDN with locally bundled, precompiled CSS (wp.org compliance – no external resources).
  • Block Time: optional note field (max 120 characters) in advanced mode.
  • Booking details popup: Close button right-aligned.

1.2.2

  • Admin dashboard visually aligned with the web app calendar.
  • Booking details popup matches web app structure (incl. note field).
  • Fixed missing borders on status cards and grey calendar wrapper.

1.2.0

  • Status card layout improvements.
  • Tailwind utility scoping for WP admin.

1.0.0

  • Initial release.
  • Admin dashboard with week/month calendar view.
  • Reservation management (confirm/reject).
  • Booking calendar shortcode.
  • Auto-update from GitHub releases.