{"id":305017,"date":"2026-05-04T16:12:08","date_gmt":"2026-05-04T16:12:08","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/nivaj-appointment-hub\/"},"modified":"2026-05-04T16:11:51","modified_gmt":"2026-05-04T16:11:51","slug":"nivaj-appointment-hub","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/nivaj-appointment-hub\/","author":9702631,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Nivaj Appointment Hub","header_author":"Ajay Rajbanshi","header_description":"A flexible appointment booking system for WordPress. Define services, set weekly and date-specific availability, and let visitors book time slots with email notifications and optional webhooks.","assets_banners_color":"","last_updated":"2026-05-04 16:11:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/ajayrajbanshi","header_author_uri":"https:\/\/www.ajayrajbanshi.com.np","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ajayrajbanshi","date":"2026-05-04 16:11:51"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3522561,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3522561,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"nivaj-ah\/appointment-booking":{"name":"nivaj-ah\/appointment-booking","title":"Nivaj Ah Appointment Booking"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3522561,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3522561,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3522561,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3522561,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Service selection screen with images and descriptions.","2":"Date and time selection with horizontal day strip and grouped time slots.","3":"Customer details form with booking summary.","4":"Admin bookings list.","5":"Service (booking type) editor in admin."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[8132,269,416,1475,268],"plugin_category":[40],"plugin_contributors":[257088],"plugin_business_model":[],"class_list":["post-305017","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservations","plugin_tags-scheduling","plugin_category-calendar-and-events","plugin_contributors-ajayrajbanshi","plugin_committers-ajayrajbanshi"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/icon-128x128.png?rev=3522561","icon_2x":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/icon-256x256.png?rev=3522561","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/screenshot-1.png?rev=3522561","caption":"Service selection screen with images and descriptions."},{"src":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/screenshot-2.png?rev=3522561","caption":"Date and time selection with horizontal day strip and grouped time slots."},{"src":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/screenshot-3.png?rev=3522561","caption":"Customer details form with booking summary."},{"src":"https:\/\/ps.w.org\/nivaj-appointment-hub\/assets\/screenshot-4.png?rev=3522561","caption":"Admin bookings list."}],"raw_content":"<!--section=description-->\n<p>Nivaj Appointment Hub is a self-hosted appointment booking plugin for WordPress. Visitors pick a service, choose a date and time from your availability, and fill in their details \u2014 all without needing a third-party scheduling account. Bookings land in your WordPress admin and trigger configurable email notifications.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>Multiple bookable services with per-service duration, colour, location type (phone, in-person, video, custom), and image<\/li>\n<li>Weekly availability rules \u2014 set working hours for each day of the week per service<\/li>\n<li>Date-specific overrides \u2014 block dates (holidays) or open extra dates with custom hours<\/li>\n<li>Buffer times before\/after bookings to prevent back-to-back conflicts<\/li>\n<li>Daily booking cap per service (optional)<\/li>\n<li>Minimum booking notice and maximum advance-booking window<\/li>\n<li>Custom fields per service (text, textarea, select, checkbox, number, phone, URL)<\/li>\n<li>Email notifications on confirmation, cancellation, and admin alerts, plus reminder emails<\/li>\n<li>Shortcode <code>[nivaj_ah_booking]<\/code> and a Gutenberg block to embed the widget<\/li>\n<li>Optional floating \"Book Now\" popup button site-wide, with fullscreen mode<\/li>\n<li>CSV export of all bookings<\/li>\n<li>REST API endpoints under <code>\/wp-json\/nivaj-ah\/v1\/<\/code> for public booking actions<\/li>\n<li>Works with guest visitors \u2014 no account required to book<\/li>\n<\/ul>\n\n<h4>Booking flow<\/h4>\n\n<ol>\n<li>Visitor selects a service from the list.<\/li>\n<li>Visitor picks a date from the horizontal day strip (auto-advances past empty weeks).<\/li>\n<li>Visitor picks a time slot, grouped by Morning \/ Afternoon \/ Evening.<\/li>\n<li>Visitor fills in name, email, phone (optional), notes (optional), and any custom fields.<\/li>\n<li>Booking is confirmed on screen and via email.<\/li>\n<\/ol>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin stores personal data submitted by visitors when they book an appointment: name, email address, phone number (optional), any custom field values you have configured, IP address (transiently, for rate limiting), and the booking details themselves.<\/p>\n\n<p>Emails are sent through your site's mailer (<code>wp_mail()<\/code>) to the visitor's email address and the administrator email configured in Settings. No data is sent to external services by default.<\/p>\n\n<p>If the <strong>Webhook<\/strong> integration is enabled in Settings, booking events are POSTed to the URL you configure. Site administrators are responsible for ensuring that the destination complies with their privacy policy and applicable data protection law.<\/p>\n\n<p>Booking records are retained until manually deleted or until the plugin is uninstalled via the Plugins screen, which drops all plugin tables and options.<\/p>\n\n<h3>Development<\/h3>\n\n<p>Source code: https:\/\/github.com\/ajayrajbanshi\/nivaj-appointment-hub<\/p>\n\n<p>The compiled JavaScript and CSS files in <code>assets\/build\/<\/code> are generated from the human-readable source under <code>src\/<\/code> (React\/JSX components and SCSS) using <code>@wordpress\/scripts<\/code> (webpack).<\/p>\n\n<p>To build from source:<\/p>\n\n<pre><code>npm install\nnpm run build\n<\/code><\/pre>\n\n<p>This produces <code>assets\/build\/admin-app.{js,css}<\/code>, <code>assets\/build\/booking-widget.{js,css}<\/code>, and <code>assets\/build\/block-editor.js<\/code> from <code>src\/admin-app\/<\/code>, <code>src\/booking-widget\/<\/code>, and <code>src\/block-editor\/<\/code> respectively. To produce the wordpress.org distribution zip, run <code>npm run package<\/code>.<\/p>\n\n<p>No third-party libraries are bundled outside of <code>@wordpress\/*<\/code> packages provided by WordPress core (<code>wp-element<\/code>, <code>wp-components<\/code>, <code>wp-i18n<\/code>, <code>wp-api-fetch<\/code>, <code>wp-blocks<\/code>, <code>wp-block-editor<\/code>).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install from the WordPress.org plugin directory.<\/li>\n<li>Activate through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Go to <strong>Appointment Hub \u2192 Booking Types<\/strong> and create your first service.<\/li>\n<li>Set availability under <strong>Availability<\/strong> for each service.<\/li>\n<li>Configure general options under <strong>Settings<\/strong>.<\/li>\n<li>Embed the widget on a page using the shortcode <code>[nivaj_ah_booking]<\/code> or the \"Appointment Booking\" Gutenberg block. Optionally enable the floating popup button in Settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20require%20a%20third-party%20service%3F\"><h3>Does it require a third-party service?<\/h3><\/dt>\n<dd><p>No. All booking data is stored in your WordPress database. The plugin has no required external dependencies.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20to%20any%20external%20service%3F\"><h3>Does the plugin send data to any external service?<\/h3><\/dt>\n<dd><p>By default, no. The plugin sends email notifications using your site's own <code>wp_mail()<\/code> \u2014 same as every other WordPress plugin. No telemetry, no analytics, no remote calls.<\/p>\n\n<p>If you explicitly enable the <strong>Webhook<\/strong> integration in Settings and provide your own webhook URL, the plugin will POST booking events (booking created, cancelled, status changed) to that URL. The payload includes booking details such as customer name, email, phone, service, date, time, and status. This is entirely opt-in and configured by the site administrator. No data is sent anywhere unless you turn this on and provide a URL.<\/p><\/dd>\n<dt id=\"can%20visitors%20book%20without%20creating%20an%20account%3F\"><h3>Can visitors book without creating an account?<\/h3><\/dt>\n<dd><p>Yes. The public booking endpoints (<code>\/wp-json\/nivaj-ah\/v1\/bookings<\/code>) accept unauthenticated submissions from guests. Rate limiting (5 attempts per IP per minute) and strict input validation are applied to prevent abuse.<\/p><\/dd>\n<dt id=\"how%20is%20spam%20handled%3F\"><h3>How is spam handled?<\/h3><\/dt>\n<dd><p>The plugin enforces a rate limit of 5 booking attempts per IP per minute. For additional protection, use a site-wide spam plugin of your choice.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20email%20templates%3F\"><h3>Can I customise the email templates?<\/h3><\/dt>\n<dd><p>Yes. Subject lines for confirmation, reminder, cancellation, and admin alert emails are editable under Settings. Body templates are built from the booking data and respect your site's locale and time format settings.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multiple%20timezones%3F\"><h3>Does it support multiple timezones?<\/h3><\/dt>\n<dd><p>Yes. Availability is interpreted in the site timezone set under Settings. The booking widget displays slot times in the visitor's browser timezone.<\/p><\/dd>\n<dt id=\"can%20i%20pre-select%20a%20service%20or%20date%20via%20url%3F\"><h3>Can I pre-select a service or date via URL?<\/h3><\/dt>\n<dd><p>Yes. Append <code>?nivaj_ah_type=&lt;slug&gt;<\/code> or <code>?nivaj_ah_date=YYYY-MM-DD<\/code> (and optionally <code>nivaj_ah_name<\/code>, <code>nivaj_ah_email<\/code>, <code>nivaj_ah_phone<\/code>) to a page containing the widget to pre-fill those values.<\/p><\/dd>\n<dt id=\"how%20do%20i%20cancel%20a%20booking%3F\"><h3>How do I cancel a booking?<\/h3><\/dt>\n<dd><p>Administrators can cancel or change booking status from the admin Bookings screen.<\/p><\/dd>\n<dt id=\"where%20is%20booking%20data%20stored%3F\"><h3>Where is booking data stored?<\/h3><\/dt>\n<dd><p>In four custom database tables prefixed with <code>nivaj_ah_<\/code> (bookings, booking types, availability rules, date overrides). Deleting the plugin via the Plugins screen removes these tables and all plugin options.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Multiple bookable services with per-service duration, colour, location type, and image.<\/li>\n<li>Weekly availability rules and date-specific overrides per service.<\/li>\n<li>Buffer times before\/after bookings, daily booking caps, min notice, and advance-booking window.<\/li>\n<li>Custom fields per service (text, textarea, select, checkbox, number, phone, URL).<\/li>\n<li>Booking flow with combined date and time step, 7-day horizontal strip, and slots grouped by time of day.<\/li>\n<li>Email notifications for confirmation, cancellation, reminders, and admin alerts.<\/li>\n<li>Shortcode <code>[nivaj_ah_booking]<\/code> and a Gutenberg block to embed the widget.<\/li>\n<li>Optional floating \"Book Now\" popup button site-wide, with fullscreen mode.<\/li>\n<li>CSV export of bookings and dashboard analytics.<\/li>\n<li>Optional opt-in webhook integration for booking events.<\/li>\n<li>REST API endpoints under <code>\/wp-json\/nivaj-ah\/v1\/<\/code> for public booking actions.<\/li>\n<\/ul>","raw_excerpt":"A flexible appointment booking system for WordPress. Define services, set availability, and let visitors book time slots without leaving your site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/305017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=305017"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ajayrajbanshi"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=305017"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=305017"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=305017"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=305017"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=305017"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=305017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}