{"id":345894,"date":"2026-08-05T19:16:48","date_gmt":"2026-08-05T19:16:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/circumflex-booking\/"},"modified":"2026-08-19T20:15:50","modified_gmt":"2026-08-19T20:15:50","slug":"circumflex-booking","status":"publish","type":"plugin","link":"https:\/\/pan.wordpress.org\/plugins\/circumflex-booking\/","author":23538565,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.5","stable_tag":"1.3.5","tested":"7.0.4","requires":"6.8","requires_php":"8.3","requires_plugins":null,"header_name":"Circumflex Booking","header_author":"Circumflex AS","header_description":"Appointment booking with manual approval, flexible availability, and email notifications.","assets_banners_color":"eff6fc","last_updated":"2026-08-19 20:15:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/circumflex.no\/circumflex-booking\/","header_author_uri":"https:\/\/circumflex.no\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":266,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"sutregutt","date":"2026-08-05 19:16:27"},"1.1.0":{"tag":"1.1.0","author":"sutregutt","date":"2026-08-05 22:28:40"},"1.2.10":{"tag":"1.2.10","author":"sutregutt","date":"2026-08-14 19:39:28"},"1.2.8":{"tag":"1.2.8","author":"sutregutt","date":"2026-08-06 22:56:03"},"1.2.9":{"tag":"1.2.9","author":"sutregutt","date":"2026-08-14 17:54:30"},"1.3.2":{"tag":"1.3.2","author":"sutregutt","date":"2026-08-18 20:37:42"},"1.3.3":{"tag":"1.3.3","author":"sutregutt","date":"2026-08-19 03:48:27"},"1.3.4":{"tag":"1.3.4","author":"sutregutt","date":"2026-08-19 17:36:28"},"1.3.5":{"tag":"1.3.5","author":"sutregutt","date":"2026-08-19 20:15:50"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3635761,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3635761,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3635761,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3635761,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3635761,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"circumflex-booking\/booking":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"circumflex-booking\/booking","version":"1.3.5","title":"Booking form","category":"widgets","icon":"calendar-alt","description":"Display the Circumflex Booking appointment flow.","keywords":["booking","appointment","calendar"],"textdomain":"circumflex-booking","editorScript":"circumflex-booking-block-editor","supports":{"html":false,"multiple":true}}},"tagged_versions":["1.0.2","1.1.0","1.2.10","1.2.8","1.2.9","1.3.2","1.3.3","1.3.4","1.3.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3635761,"resolution":"1","location":"assets","locale":"","width":646,"height":767},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3635761,"resolution":"2","location":"assets","locale":"","width":646,"height":1289},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3635761,"resolution":"3","location":"assets","locale":"","width":1238,"height":1502},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3635761,"resolution":"4","location":"assets","locale":"","width":1238,"height":1068},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3635761,"resolution":"5","location":"assets","locale":"","width":1238,"height":1946},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3635761,"resolution":"6","location":"assets","locale":"","width":611,"height":1246}},"screenshots":{"1":"The customer booking flow starts with one or more services.","2":"Accessible calendar and list views show available and unavailable times.","3":"The booking dashboard summarizes pending and upcoming work.","4":"Staff can review a booking and approve or reject it with a message.","5":"Weekly hours, exceptions, extra openings, and blocks control availability.","6":"Notification previews show the responsive HTML email and plain-text version."}},"plugin_section":[],"plugin_tags":[8132,1279,269,416,268],"plugin_category":[40],"plugin_contributors":[274572],"plugin_business_model":[],"class_list":["post-345894","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-availability","plugin_tags-booking","plugin_tags-calendar","plugin_tags-scheduling","plugin_category-calendar-and-events","plugin_contributors-sutregutt","plugin_committers-sutregutt"],"banners":{"banner":"https:\/\/ps.w.org\/circumflex-booking\/assets\/banner-772x250.png?rev=3635761","banner_2x":"https:\/\/ps.w.org\/circumflex-booking\/assets\/banner-1544x500.png?rev=3635761","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/circumflex-booking\/assets\/icon.svg?rev=3635761","icon":"https:\/\/ps.w.org\/circumflex-booking\/assets\/icon.svg?rev=3635761","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-1.png?rev=3635761","caption":"The customer booking flow starts with one or more services."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-2.png?rev=3635761","caption":"Accessible calendar and list views show available and unavailable times."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-3.png?rev=3635761","caption":"The booking dashboard summarizes pending and upcoming work."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-4.png?rev=3635761","caption":"Staff can review a booking and approve or reject it with a message."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-5.png?rev=3635761","caption":"Weekly hours, exceptions, extra openings, and blocks control availability."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-6.png?rev=3635761","caption":"Notification previews show the responsive HTML email and plain-text version."}],"raw_content":"<!--section=description-->\n<p>Circumflex Booking is a self-hosted appointment booking plugin for treatments,\nconsultations, and other scheduled services. Customers request an available\ntime, and authorized staff approve or reject each request manually.<\/p>\n\n<h4>Customer booking<\/h4>\n\n<ul>\n<li>Let customers select one or more services in a single booking.<\/li>\n<li>Show a practitioner choice or \"first available\" when several practitioners\nqualify. The choice is hidden automatically when only one qualifies.<\/li>\n<li>Present available dates and start times in accessible calendar and list views.\nFull appointment intervals remain in accessible labels, and unavailable\nstarts are visually distinct and not selectable.<\/li>\n<li>Collect name, email address, phone number, and an optional practical comment.<\/li>\n<li>Reserve a requested time while the booking is pending, preventing another\ncustomer from taking it.<\/li>\n<li>Send customer and staff notifications for booking events and reminders.<\/li>\n<li>Give confirmed customers a private link to view the booking, request another\ntime, or cancel within the configured deadline.<\/li>\n<\/ul>\n\n<h4>Administration<\/h4>\n\n<ul>\n<li>Configure services, durations, preparation buffers, prices, booking and\ncancellation deadlines, whether customers see treatment minutes, and\ndrag-and-drop service order.<\/li>\n<li>Configure one or more practitioners and assign the services each can provide.<\/li>\n<li>Combine recurring weekly hours with closures, extra opening dates, and manual\nblocks.<\/li>\n<li>Review and process bookings in a filterable list or calendar with\nrole- and practitioner-scoped permissions.<\/li>\n<li>Optionally let linked practitioners decide only requests assigned to them.<\/li>\n<li>Configure email identity and templates, then preview the responsive HTML and\nplain-text versions.<\/li>\n<li>Use WordPress privacy tools, configurable retention, local diagnostics,\nconfiguration transfer, and a link to the WordPress-selected privacy policy.<\/li>\n<\/ul>\n\n<h4>Add the booking form anywhere<\/h4>\n\n<p>Circumflex Booking does not create or reserve a booking URL. Create or edit a\nnormal WordPress page and insert the Circumflex Booking block, the\n    [circumflex_booking] shortcode, or optional Elementor widget. Publish it and\nshare that page's URL with customers. Elementor, WooCommerce, and customer\naccounts are not required.<\/p>\n\n<p>All shipped functionality is available without payment or a license key.\nPayments, recurring bookings, and multiple locations are outside scope. Email\nuses <code>wp_mail()<\/code>; a separate SMTP plugin is recommended.<\/p>\n\n<h4>Optional Pro add-on<\/h4>\n\n<p>Circumflex Booking Pro is a separately installed commercial add-on for more\nautomation, controlled public online capacity, notification channels, follow-up,\nand anonymous booking statistics.\nThe free plugin remains fully usable without Pro, and installed Pro features do\nnot stop working if a license expires. The license controls only new Pro updates\nand commercial support.<\/p>\n\n<p><a href=\"https:\/\/circumflex.no\/en\/circumflex-booking\/pro\/#cfx-pro-compare-title\">Compare Free and Pro<\/a>.<\/p>\n\n<p>Booking and diagnostics stay on the site. Optional Cloudflare Turnstile is\ndisabled by default and disclosed below.<\/p>\n\n<h3>Privacy and External Services<\/h3>\n\n<p>The site's database stores customer contact details, optional practical\ncomment, services, practitioner, appointment time, and customer-notice\nsnapshot. Internal notes are visible only to authorized roles.<\/p>\n\n<p>By default, personal data is anonymized 365 days after a terminal status; the\nperiod is configurable. Anonymization removes contact details, free text,\ncustomer tokens, and identifying notification and audit data. Anonymous\nbooking facts may remain for statistics. WordPress privacy export and erasure\nare supported. Erasing an active booking does not release its reserved time.<\/p>\n\n<p>Authorized administrators can generate local diagnostics that omit personal\ndata, free text, tokens, secrets, IP addresses, and site URLs. Nothing is sent\nto Circumflex AS.<\/p>\n\n<h4>Cloudflare Turnstile<\/h4>\n\n<p><a href=\"https:\/\/developers.cloudflare.com\/turnstile\/\">Cloudflare Turnstile<\/a> is an\noptional anti-spam service. It is disabled by default and requires Cloudflare\nkeys plus explicit administrator activation.<\/p>\n\n<p>When enabled, the browser loads <code>https:\/\/challenges.cloudflare.com<\/code>. Cloudflare\nprocesses signals including IP address, TLS fingerprint, User-Agent, site key,\nand origin. WordPress sends the secret and response token to Siteverify but\ndoes not explicitly add the visitor IP. Bookings fail closed if verification\ncannot finish.<\/p>\n\n<p>Review Cloudflare's\n<a href=\"https:\/\/www.cloudflare.com\/turnstile-privacy-policy\/\">Turnstile Privacy Addendum<\/a>,\n<a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">Privacy Policy<\/a>, and\n<a href=\"https:\/\/www.cloudflare.com\/policies\/terms\/\">Terms<\/a> before enabling the service.\nThe site owner must reflect this processing in the site's privacy information.<\/p>\n\n<h3>Source Code<\/h3>\n\n<p>Source and build instructions are in the\n<a href=\"https:\/\/gitlab.slettene.com\/gvar\/circumflex-booking\">public GitLab repository<\/a>.<\/p>\n\n<h3>Support<\/h3>\n\n<p>Use the Support tab for help. Product information is at\n<a href=\"https:\/\/circumflex.no\/circumflex-booking\/\">circumflex.no\/circumflex-booking<\/a>.\nNever post customer data, private links, credentials, or health information.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Circumflex Booking.<\/li>\n<li>Add at least one service under Booking &gt; Services.<\/li>\n<li>Add a practitioner, assign services, and configure recurring hours under\nBooking &gt; Practitioners and Booking &gt; Availability.<\/li>\n<li>Review deadlines, notices, retention, recipients, and email templates under\nBooking &gt; Settings.<\/li>\n<li>Select the site's privacy policy under Settings &gt; Privacy.<\/li>\n<li>Create or edit a normal WordPress page, add the block, shortcode, or Elementor\nwidget, publish it, and share its URL.<\/li>\n<li>Check Tools &gt; Booking status, then make and process a test booking before\nopening the page to customers.<\/li>\n<\/ol>\n\n<p>The tested and supported database baseline is MySQL 8.0 or MariaDB 10.11 and\nnewer. Older versions may work, but they are not tested or supported. Use HTTPS\nand configure the site's mail or SMTP setup before accepting real bookings. The\ndatabase version alone does not deactivate the plugin.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20circumflex%20booking%20create%20a%20booking%20url%3F\"><h3>Does Circumflex Booking create a booking URL?<\/h3><\/dt>\n<dd><p>No. Add the block, <code>[circumflex_booking]<\/code> shortcode, or Elementor widget to a\nnormal page you create. Publish it and use that page's URL. All three use the\nsame booking flow and settings.<\/p><\/dd>\n<dt id=\"can%20analytics%20measure%20a%20successfully%20submitted%20booking%3F\"><h3>Can analytics measure a successfully submitted booking?<\/h3><\/dt>\n<dd><p>Yes. The receipt stays visible and the URL gains <code>booking-received=1<\/code>. For\nexact GA4 measurement, trigger Google Tag Manager on the Custom Event\n    circumflex_booking_received and send <code>generate_lead<\/code>. It fires once per\naccepted response, not on reload, a direct visit, or an error.<\/p>\n\n<p>The marker and event contain no booking or customer data. The plugin does not\nload analytics; site owners configure analytics and consent. Browser-history\npage views can also use the marker, but a refresh may be counted again.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20there%20is%20only%20one%20practitioner%3F\"><h3>What happens when there is only one practitioner?<\/h3><\/dt>\n<dd><p>The practitioner step is hidden when the selected services have exactly one\neligible practitioner. With several eligible practitioners, the customer can\nchoose one or ask for the first available.<\/p><\/dd>\n<dt id=\"are%20notification%20emails%20sent%20immediately%3F\"><h3>Are notification emails sent immediately?<\/h3><\/dt>\n<dd><p>An asynchronous worker starts as soon as a message is queued. WordPress cron\nremains as fallback and for retries. Inbox delivery depends on the site's\n    wp_mail() or SMTP setup.<\/p><\/dd>\n<dt id=\"can%20customers%20change%20or%20cancel%20an%20appointment%3F\"><h3>Can customers change or cancel an appointment?<\/h3><\/dt>\n<dd><p>Confirmed customers can receive a private link to request a new time or cancel\nbefore the deadline. New times require manual approval. Treat the link as a\nsecret access key.<\/p><\/dd>\n<dt id=\"can%20practitioners%20approve%20assigned%20requests%3F\"><h3>Can practitioners approve assigned requests?<\/h3><\/dt>\n<dd><p>Yes, when enabled. An active practitioner needs a notification email and linked\nPractitioner account. Access is limited to their own requests; managers retain\naccess to all requests.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20payments%20or%20recurring%20appointments%3F\"><h3>Does the plugin support payments or recurring appointments?<\/h3><\/dt>\n<dd><p>No. They are outside the plugin's scope.<\/p><\/dd>\n<dt id=\"why%20can%20an%20unavailable%20start%20be%20followed%20by%20an%20available%20start%20whose%20time%20range%20would%20overlap%3F\"><h3>Why can an unavailable start be followed by an available start whose time range would overlap?<\/h3><\/dt>\n<dd><p>The buttons are alternative start times, not calendar blocks. A start can be\nunavailable because it overlaps an earlier appointment or buffer, while a\nslightly later start is valid. The selected appointment's complete time range\nis still shown during review and confirmation.<\/p><\/dd>\n<dt id=\"should%20customers%20enter%20health%20information%20in%20the%20comment%20field%3F\"><h3>Should customers enter health information in the comment field?<\/h3><\/dt>\n<dd><p>Configure the warning beside the optional comment to tell customers not to\nsubmit health or other sensitive data that is not needed for scheduling.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20the%20plugin%20is%20deactivated%20or%20removed%3F\"><h3>What happens when the plugin is deactivated or removed?<\/h3><\/dt>\n<dd><p>Deactivation and normal uninstall preserve data. Permanent deletion requires an\nauthorized administrator to enable and confirm the uninstall deletion option.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Make date exceptions easier to manage with upcoming, past, and all views,\nchronological sorting, and past dates hidden by default.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Improve English and Norwegian wording across customer and administration\nscreens, including months with no available times.<\/li>\n<\/ul>\n\n<p>Older development history is available in <code>changelog.txt<\/code>.<\/p>","raw_excerpt":"Appointment booking with manual approval, flexible availability, multiple services and practitioners, and email notifications.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/345894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=345894"}],"author":[{"embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sutregutt"}],"wp:attachment":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=345894"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=345894"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=345894"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=345894"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=345894"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=345894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}