{"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-09-21T13:37:51","modified_gmt":"2026-09-21T13:37:51","slug":"circumflex-booking","status":"publish","type":"plugin","link":"https:\/\/cl.wordpress.org\/plugins\/circumflex-booking\/","author":23538565,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.8","stable_tag":"1.6.8","tested":"7.1.1","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-09-21 13:37:51","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":60,"downloads":1267,"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","revision":3635761},"1.1.0":{"tag":"1.1.0","author":"sutregutt","date":"2026-08-05 22:28:40","revision":3635897},"1.2.10":{"tag":"1.2.10","author":"sutregutt","date":"2026-08-14 19:39:28","revision":3647876},"1.2.8":{"tag":"1.2.8","author":"sutregutt","date":"2026-08-06 22:56:03","revision":3637084},"1.2.9":{"tag":"1.2.9","author":"sutregutt","date":"2026-08-14 17:54:30","revision":3647789},"1.3.2":{"tag":"1.3.2","author":"sutregutt","date":"2026-08-18 20:37:42","revision":3653511},"1.3.3":{"tag":"1.3.3","author":"sutregutt","date":"2026-08-19 03:48:27","revision":3653810},"1.3.4":{"tag":"1.3.4","author":"sutregutt","date":"2026-08-19 17:36:28","revision":3655110},"1.3.5":{"tag":"1.3.5","author":"sutregutt","date":"2026-08-19 20:15:50","revision":3655303},"1.5.19":{"tag":"1.5.19","author":"sutregutt","date":"2026-09-09 22:15:11","revision":3689061},"1.6.0":{"tag":"1.6.0","author":"sutregutt","date":"2026-09-16 23:14:24","revision":3699330},"1.6.8":{"tag":"1.6.8","author":"sutregutt","date":"2026-09-21 13:37:51","revision":3705682}},"upgrade_notice":{"1.6.8":"<p>Shortens standard appointment booking by one step without changing stored\nservices, schedules, bookings, or add-on workflows.<\/p>"},"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.6.8","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","attributes":{"entry":{"type":"string","default":""}},"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","1.5.19","1.6.0","1.6.8"],"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":3689061,"resolution":"5","location":"assets","locale":"","width":1238,"height":2259},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3635761,"resolution":"6","location":"assets","locale":"","width":611,"height":1246}},"screenshots":{"1":"Customers start by choosing the configured number of services.","2":"Calendar and list views show available times.","3":"The dashboard summarizes pending and upcoming work.","4":"Staff review, approve, or reject a booking.","5":"Weekly hours, exceptions, and blocks control availability.","6":"Notification previews show HTML and plain text."}},"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":"Customers start by choosing the configured number of services."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-2.png?rev=3635761","caption":"Calendar and list views show available times."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-3.png?rev=3635761","caption":"The dashboard summarizes pending and upcoming work."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-4.png?rev=3635761","caption":"Staff review, approve, or reject a booking."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-5.png?rev=3689061","caption":"Weekly hours, exceptions, and blocks control availability."},{"src":"https:\/\/ps.w.org\/circumflex-booking\/assets\/screenshot-6.png?rev=3635761","caption":"Notification previews show HTML and plain text."}],"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>Adapt booking with free add-ons<\/h4>\n\n<p>Circumflex Booking is the shared foundation. Its built-in setup is designed for\nappointments, treatments and consultations. Separately installed add-ons\nspecialize it for another purpose. Core remains required, and one booking setup\nis active on each WordPress site.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/circumflex-booking-airspace\/\">Circumflex Booking Airspace<\/a>\nreserves flight-training areas, schedules quiet periods and spreads activity.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/circumflex-booking-meeting-rooms\/\">Circumflex Booking Meeting Rooms<\/a>\nhelps people find and reserve rooms by location, capacity, facilities and\nexact start and end time.<\/li>\n<\/ul>\n\n<p>Need another kind of booking? <a href=\"mailto:support@circumflex.no\">Tell us how it should work<\/a>.<\/p>\n\n<h4>Customer booking<\/h4>\n\n<ul>\n<li>Let customers choose one service or combine several, according to the\nstandard-profile setting.<\/li>\n<li>Present related choices in optional expandable groups with one shared\ndescription and either one or several allowed choices, while ungrouped\nservices remain direct choices.<\/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.<\/li>\n<li>Show the chosen treatment, practitioner, date, and time together with contact\ndetails on one final step, with direct actions to change a choice.<\/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>Choose appointments or a validated add-on workflow without changing stored\nservices, resources, hours, or bookings. Returning from an add-on to the Core\ndefault is kept behind a deliberate, confirmed control.<\/li>\n<li>Configure services, optional expandable groups with shared customer\ninformation and a one-or-several choice rule, durations, buffers, prices,\ndeadlines, displayed duration, drag-and-drop order, and whether buffers must\nfit opening hours.<\/li>\n<li>Configure practitioners and assignments; inactive, unused catalog items can\nbe permanently deleted while booking-linked history remains protected.<\/li>\n<li>Add date exceptions below the weekly schedule, with one checkbox to close or\nadd extra opening hours for either the selected practitioner or every\npractitioner across an inclusive date period; manual blocks remain available.<\/li>\n<li>Review bookings across all services in a day\/week time grid with resource\ntracks, continuous publicly bookable periods and visibly distinct Pro-held\nonline capacity; month view remains a compact booking overview.<\/li>\n<li>Optionally let linked practitioners decide only requests assigned to them.<\/li>\n<li>Configure and preview email identity and templates.<\/li>\n<li>Use WordPress privacy tools, retention, diagnostics, configuration transfer,\nand the 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\nWordPress 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 included functionality is available without payment or a license key.\nPayments and recurring bookings are outside scope. Email uses <code>wp_mail()<\/code>; a\nseparate SMTP plugin is recommended.<\/p>\n\n<h4>Optional Pro add-on<\/h4>\n\n<p>The free plugin works on its own with account-free booking, email verification,\nmanual approval, email confirmations and reminders, and WordPress.org updates.<\/p>\n\n<p>Circumflex Booking Pro is an optional add-on. It can add:<\/p>\n\n<ul>\n<li>Optional sign-in and access rules through Microsoft, Google or another provider.<\/li>\n<li>Automatic approval and completion for selected booking types.<\/li>\n<li>SMS confirmations and reminders in addition to email. Sendberry is supported\ntoday and requires its own subscription; ask about other providers.<\/li>\n<li>Telegram or browser notifications for responsible staff.<\/li>\n<li>Follow-up, feedback requests and anonymous booking-process insight.<\/li>\n<li>Email support and official Pro updates with an active subscription.<\/li>\n<\/ul>\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. Contact details, free text, customer tokens, and\nidentifying notification and audit data are removed. WordPress privacy export\nand erasure are supported. Erasing an active booking keeps 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 and contains no booking or customer data. The plugin does\nnot load analytics; site owners configure analytics and consent.<\/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. Treat the link as a secret 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=\"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<p>Changes since public 1.5.19 are documented in <code>changelog.txt<\/code>.<\/p>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>Remove the repeated review screen from standard appointment booking while\nretaining a compact, editable summary on the final contact step.<\/li>\n<li>Keep all authoritative availability, conflict, access, consent, verification,\nand abuse checks in place when the request is sent.<\/li>\n<li>Use a clear final action for either booking an automatically confirmed\nappointment or sending a request for approval.<\/li>\n<\/ul>","raw_excerpt":"Flexible appointment booking with manual approval, service selection, and email notifications.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/345894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=345894"}],"author":[{"embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sutregutt"}],"wp:attachment":[{"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=345894"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=345894"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=345894"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=345894"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=345894"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=345894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}