{"id":329781,"date":"2026-07-06T13:25:41","date_gmt":"2026-07-06T13:25:41","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/meetify-appointment-booking-and-scheduling-links\/"},"modified":"2026-08-28T20:35:24","modified_gmt":"2026-08-28T20:35:24","slug":"amitry-booking","status":"publish","type":"plugin","link":"https:\/\/az.wordpress.org\/plugins\/amitry-booking\/","author":23468925,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.6.0","stable_tag":"0.6.0","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Appointment Scheduling, Booking Calendar and Personalized Booking Links - Amitry Booking","header_author":"Danyel \/ Amitry","header_description":"Personalized booking links with a step-by-step scheduling wizard. Send each client their own link, ready to be shared or encoded as a QR code.","assets_banners_color":"fcfcfd","last_updated":"2026-08-28 20:35:24","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/donate\/?hosted_button_id=D8JUQG5NJ4AXS","header_plugin_uri":"https:\/\/amitry.de\/amitry-booking","header_author_uri":"https:\/\/amitry.de\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":236,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.7":{"tag":"0.2.7","author":"amitry","date":"2026-07-06 13:25:09","revision":3597841},"0.4.1":{"tag":"0.4.1","author":"amitry","date":"2026-07-14 22:32:49","revision":3608102},"0.6.0":{"tag":"0.6.0","author":"amitry","date":"2026-08-28 20:35:24","revision":3670903}},"upgrade_notice":{"0.6.0":"<p>Adds a block, an Elementor widget, and a shortcode for putting booking on any page. No breaking changes.<\/p>","0.4.1":"<p>Adds a demo video and a donation link. No functional changes.<\/p>","0.4.0":"<p>Adds a second reminder email, fixes the calendar availability view on some servers, and makes the wizard follow your site language. No breaking changes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3599163,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3599163,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3608103,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3608103,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3670903,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/lead\\\/demobooking1\\\/\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"amitry-booking\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Anna Berger Consulting\",\"blogdescription\":\"Booking demo powered by Amitry Booking\",\"permalink_structure\":\"\\\/%postname%\\\/\",\"timezone_string\":\"Europe\\\/Berlin\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nrequire_once '\\\/wordpress\\\/wp-admin\\\/includes\\\/file.php';\\nrequire_once '\\\/wordpress\\\/wp-admin\\\/includes\\\/media.php';\\nrequire_once '\\\/wordpress\\\/wp-admin\\\/includes\\\/image.php';\\n\\nif ( ! class_exists( 'AMITRY_BOOKING_CPT' ) ) {\\n\\treturn;\\n}\\n\\nwp_set_current_user( 1 );\\n\\n\\\/**\\n * Draws a branded gradient JPEG. Used when the demo photo cannot be downloaded,\\n * so the preview never ends up with empty image placeholders.\\n *\\\/\\nfunction amitry_demo_generated_image( $title, $c1, $c2 ) {\\n\\tif ( ! function_exists( 'imagecreatetruecolor' ) ) {\\n\\t\\treturn 0;\\n\\t}\\n\\t$w  = 900;\\n\\t$h  = 600;\\n\\t$im = imagecreatetruecolor( $w, $h );\\n\\tfor ( $y = 0; $y < $h; $y++ ) {\\n\\t\\t$t   = $y \\\/ $h;\\n\\t\\t$col = imagecolorallocate(\\n\\t\\t\\t$im,\\n\\t\\t\\t(int) ( $c1[0] + ( $c2[0] - $c1[0] ) * $t ),\\n\\t\\t\\t(int) ( $c1[1] + ( $c2[1] - $c1[1] ) * $t ),\\n\\t\\t\\t(int) ( $c1[2] + ( $c2[2] - $c1[2] ) * $t )\\n\\t\\t);\\n\\t\\timagefilledrectangle( $im, 0, $y, $w, $y, $col );\\n\\t}\\n\\tob_start();\\n\\timagejpeg( $im, null, 82 );\\n\\t$data = ob_get_clean();\\n\\timagedestroy( $im );\\n\\n\\t$upload = wp_upload_bits( sanitize_title( $title ) . '.jpg', null, $data );\\n\\tif ( ! empty( $upload['error'] ) ) {\\n\\t\\treturn 0;\\n\\t}\\n\\t$attach_id = wp_insert_attachment(\\n\\t\\tarray(\\n\\t\\t\\t'post_mime_type' => 'image\\\/jpeg',\\n\\t\\t\\t'post_title'     => $title,\\n\\t\\t\\t'post_status'    => 'inherit',\\n\\t\\t),\\n\\t\\t$upload['file']\\n\\t);\\n\\tif ( ! $attach_id || is_wp_error( $attach_id ) ) {\\n\\t\\treturn 0;\\n\\t}\\n\\twp_update_attachment_metadata( $attach_id, wp_generate_attachment_metadata( $attach_id, $upload['file'] ) );\\n\\treturn (int) $attach_id;\\n}\\n\\n\\\/**\\n * Sideloads a demo photo, falling back to a generated image.\\n *\\\/\\nfunction amitry_demo_image( $url, $title, $c1, $c2 ) {\\n\\t$id = media_sideload_image( $url, 0, $title, 'id' );\\n\\tif ( is_wp_error( $id ) || ! $id ) {\\n\\t\\treturn amitry_demo_generated_image( $title, $c1, $c2 );\\n\\t}\\n\\treturn (int) $id;\\n}\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 1. Category\\n * ------------------------------------------------------------------ *\\\/\\n$cat_id = 0;\\n$term   = wp_insert_term( 'Consulting', AMITRY_BOOKING_Taxonomy::TAXONOMY );\\nif ( ! is_wp_error( $term ) ) {\\n\\t$cat_id = (int) $term['term_id'];\\n}\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 2. Host avatar\\n * ------------------------------------------------------------------ *\\\/\\n$host_name   = 'Anna Berger';\\n$avatar_id   = amitry_demo_image(\\n\\t'https:\\\/\\\/picsum.photos\\\/seed\\\/amitry-host\\\/400\\\/400.jpg',\\n\\t'Anna Berger',\\n\\tarray( 99, 102, 241 ),\\n\\tarray( 139, 92, 246 )\\n);\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 3. Services\\n * ------------------------------------------------------------------ *\\\/\\n$services = array(\\n\\tarray(\\n\\t\\t'title'  => 'Free intro call',\\n\\t\\t'desc'   => 'A relaxed 20 minutes to see whether we are a good fit. No slides, no pitch.',\\n\\t\\t'dur'    => '20 min',\\n\\t\\t'price'  => 'Free',\\n\\t\\t'loc'    => AMITRY_BOOKING_Service_Meta::LOC_PHONE,\\n\\t\\t'detail' => 'We call you on the number you leave.',\\n\\t\\t'img'    => 'https:\\\/\\\/picsum.photos\\\/seed\\\/amitry-intro\\\/900\\\/600.jpg',\\n\\t\\t'c1'     => array( 99, 102, 241 ),\\n\\t\\t'c2'     => array( 139, 92, 246 ),\\n\\t\\t'body'   => 'Hi, I am Anna. In this short call we look at where you are right now and whether I can help. You will get a clear next step either way.',\\n\\t),\\n\\tarray(\\n\\t\\t'title'  => 'Strategy session',\\n\\t\\t'desc'   => 'One focused hour on your biggest bottleneck, with a written summary afterwards.',\\n\\t\\t'dur'    => '60 min',\\n\\t\\t'price'  => 'from 199 EUR',\\n\\t\\t'loc'    => AMITRY_BOOKING_Service_Meta::LOC_VIDEO,\\n\\t\\t'detail' => 'You get the video link in the confirmation email.',\\n\\t\\t'img'    => 'https:\\\/\\\/picsum.photos\\\/seed\\\/amitry-strategy\\\/900\\\/600.jpg',\\n\\t\\t'c1'     => array( 16, 185, 129 ),\\n\\t\\t'c2'     => array( 5, 150, 105 ),\\n\\t\\t'body'   => 'We pick one problem and go deep. You leave with a plan you can act on the same week, plus a written summary in your inbox.',\\n\\t),\\n\\tarray(\\n\\t\\t'title'  => 'Website audit',\\n\\t\\t'desc'   => 'A full walkthrough of your site: speed, structure, and the things costing you customers.',\\n\\t\\t'dur'    => '90 min',\\n\\t\\t'price'  => 'from 349 EUR',\\n\\t\\t'loc'    => AMITRY_BOOKING_Service_Meta::LOC_VIDEO,\\n\\t\\t'detail' => 'You get the video link in the confirmation email.',\\n\\t\\t'img'    => 'https:\\\/\\\/picsum.photos\\\/seed\\\/amitry-audit\\\/900\\\/600.jpg',\\n\\t\\t'c1'     => array( 244, 114, 182 ),\\n\\t\\t'c2'     => array( 168, 85, 247 ),\\n\\t\\t'body'   => 'I go through your site with you, screen shared, and point out what to fix first. You get the recording and a prioritised list.',\\n\\t),\\n);\\n\\n$service_ids = array();\\n\\nforeach ( $services as $s ) {\\n\\t$service_id = wp_insert_post(\\n\\t\\tarray(\\n\\t\\t\\t'post_type'    => AMITRY_BOOKING_CPT::POST_TYPE_SERVICE,\\n\\t\\t\\t'post_title'   => $s['title'],\\n\\t\\t\\t'post_content' => $s['body'],\\n\\t\\t\\t'post_status'  => 'publish',\\n\\t\\t)\\n\\t);\\n\\tif ( ! $service_id || is_wp_error( $service_id ) ) {\\n\\t\\tcontinue;\\n\\t}\\n\\t$service_ids[] = (int) $service_id;\\n\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_SHORT_DESC, $s['desc'] );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_DURATION, $s['dur'] );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_PRICE, $s['price'] );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_LOCATION_TYPE, $s['loc'] );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_LOCATION_DETAIL, $s['detail'] );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_LOCATION_VISIBLE, 1 );\\n\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_HOST_NAME, $host_name );\\n\\tif ( $avatar_id ) {\\n\\t\\tupdate_post_meta( $service_id, AMITRY_BOOKING_Service_Meta::META_HOST_AVATAR, $avatar_id );\\n\\t}\\n\\tif ( $cat_id ) {\\n\\t\\twp_set_object_terms( $service_id, array( $cat_id ), AMITRY_BOOKING_Taxonomy::TAXONOMY );\\n\\t}\\n\\n\\t$img_id = amitry_demo_image( $s['img'], $s['title'], $s['c1'], $s['c2'] );\\n\\tif ( $img_id ) {\\n\\t\\tset_post_thumbnail( $service_id, $img_id );\\n\\t}\\n}\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 4. Availability: Mon to Fri, 09:00 to 17:00\\n * ------------------------------------------------------------------ *\\\/\\nglobal $wpdb;\\n$av_table = AMITRY_BOOKING_DB::availability_table();\\n$wpdb->query( \\\"DELETE FROM {$av_table}\\\" );\\nfor ( $d = 0; $d <= 4; $d++ ) {\\n\\t$wpdb->insert(\\n\\t\\t$av_table,\\n\\t\\tarray(\\n\\t\\t\\t'rule_type'       => 'weekly',\\n\\t\\t\\t'weekday'         => $d,\\n\\t\\t\\t'start_time'      => '09:00:00',\\n\\t\\t\\t'end_time'        => '17:00:00',\\n\\t\\t\\t'slot_length_min' => 30,\\n\\t\\t\\t'buffer_min'      => 0,\\n\\t\\t\\t'is_active'       => 1,\\n\\t\\t)\\n\\t);\\n}\\n\\n$settings                    = AMITRY_BOOKING_Availability::get_settings();\\n$settings['slot_length_min'] = 30;\\n$settings['buffer_min']      = 0;\\n$settings['lead_time_hours'] = 1;\\n$settings['window_days']     = 60;\\n$settings['timezone']        = 'Europe\\\/Berlin';\\n$settings['sender_name']     = $host_name;\\n$settings['reminder_enabled'] = 1;\\n$settings['reminder_hours']   = 24;\\n$settings['reminder_hours_2'] = 1;\\nupdate_option( AMITRY_BOOKING_Availability::OPTION_SETTINGS, $settings, false );\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 5. The personalized booking link\\n * ------------------------------------------------------------------ *\\\/\\n$lead_id = wp_insert_post(\\n\\tarray(\\n\\t\\t'post_type'   => AMITRY_BOOKING_CPT::POST_TYPE_LEAD,\\n\\t\\t'post_title'  => 'Sam Rivera (Northwind Studio)',\\n\\t\\t'post_status' => 'publish',\\n\\t)\\n);\\n\\nif ( $lead_id && ! is_wp_error( $lead_id ) ) {\\n\\tupdate_post_meta( $lead_id, AMITRY_BOOKING_Lead_Meta::META_TOKEN, 'demobooking1' );\\n\\tupdate_post_meta( $lead_id, AMITRY_BOOKING_Lead_Meta::META_RECIPIENT_NAME, 'Sam' );\\n\\tupdate_post_meta( $lead_id, AMITRY_BOOKING_Lead_Meta::META_RECIPIENT_COMPANY, 'Northwind Studio' );\\n\\tupdate_post_meta( $lead_id, AMITRY_BOOKING_Lead_Meta::META_RECIPIENT_NOTE, 'Great talking to you last week. Pick whatever time suits you best.' );\\n\\tupdate_post_meta( $lead_id, AMITRY_BOOKING_Lead_Meta::META_SCOPE_MODE, AMITRY_BOOKING_Lead_Meta::SCOPE_ALL );\\n\\n\\t\\\/* A second link, scoped to one service, so the admin list is not empty. *\\\/\\n\\t$lead2 = wp_insert_post(\\n\\t\\tarray(\\n\\t\\t\\t'post_type'   => AMITRY_BOOKING_CPT::POST_TYPE_LEAD,\\n\\t\\t\\t'post_title'  => 'Jamie Cole (Cole Design)',\\n\\t\\t\\t'post_status' => 'publish',\\n\\t\\t)\\n\\t);\\n\\tif ( $lead2 && ! is_wp_error( $lead2 ) && ! empty( $service_ids ) ) {\\n\\t\\tupdate_post_meta( $lead2, AMITRY_BOOKING_Lead_Meta::META_TOKEN, 'demobooking2' );\\n\\t\\tupdate_post_meta( $lead2, AMITRY_BOOKING_Lead_Meta::META_RECIPIENT_NAME, 'Jamie' );\\n\\t\\tupdate_post_meta( $lead2, AMITRY_BOOKING_Lead_Meta::META_SCOPE_MODE, AMITRY_BOOKING_Lead_Meta::SCOPE_SERVICES );\\n\\t\\tupdate_post_meta( $lead2, AMITRY_BOOKING_Lead_Meta::META_SCOPE_SERVICES, array( $service_ids[0] ) );\\n\\t}\\n}\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 6. A few demo bookings, so the calendar shows a real availability mix\\n * ------------------------------------------------------------------ *\\\/\\nif ( $lead_id && ! is_wp_error( $lead_id ) && ! empty( $service_ids ) ) {\\n\\t$bk_table = AMITRY_BOOKING_DB::bookings_table();\\n\\t$tz       = new DateTimeZone( 'Europe\\\/Berlin' );\\n\\t$day      = new DateTime( 'tomorrow', $tz );\\n\\t$plan     = array( 3, 9, 1 );\\n\\t$names    = array( 'Mia Torres', 'Leon Fischer', 'Priya Nair', 'Tom Baker', 'Lena Vogt' );\\n\\t$pi       = 0;\\n\\t$guard    = 0;\\n\\n\\twhile ( $pi < count( $plan ) && $guard < 21 ) {\\n\\t\\t$guard++;\\n\\t\\tif ( (int) $day->format( 'N' ) <= 5 ) {\\n\\t\\t\\tfor ( $i = 0; $i < $plan[ $pi ]; $i++ ) {\\n\\t\\t\\t\\t$start = clone $day;\\n\\t\\t\\t\\t$start->setTime( 9, 0 );\\n\\t\\t\\t\\t$start->modify( '+' . ( $i * 30 ) . ' minutes' );\\n\\t\\t\\t\\t$end = clone $start;\\n\\t\\t\\t\\t$end->modify( '+30 minutes' );\\n\\n\\t\\t\\t\\t$wpdb->insert(\\n\\t\\t\\t\\t\\t$bk_table,\\n\\t\\t\\t\\t\\tarray(\\n\\t\\t\\t\\t\\t\\t'lead_id'      => (int) $lead_id,\\n\\t\\t\\t\\t\\t\\t'service_id'   => (int) $service_ids[ $i % count( $service_ids ) ],\\n\\t\\t\\t\\t\\t\\t'category_id'  => (int) $cat_id,\\n\\t\\t\\t\\t\\t\\t'slot_start'   => $start->format( 'Y-m-d H:i:s' ),\\n\\t\\t\\t\\t\\t\\t'slot_end'     => $end->format( 'Y-m-d H:i:s' ),\\n\\t\\t\\t\\t\\t\\t'timezone'     => 'Europe\\\/Berlin',\\n\\t\\t\\t\\t\\t\\t'created_at'   => current_time( 'mysql' ),\\n\\t\\t\\t\\t\\t\\t'name'         => $names[ $i % count( $names ) ],\\n\\t\\t\\t\\t\\t\\t'email'        => 'demo' . $i . '@example.com',\\n\\t\\t\\t\\t\\t\\t'phone'        => '',\\n\\t\\t\\t\\t\\t\\t'company'      => '',\\n\\t\\t\\t\\t\\t\\t'message'      => '',\\n\\t\\t\\t\\t\\t\\t'meta'         => '',\\n\\t\\t\\t\\t\\t\\t'ip_hash'      => '',\\n\\t\\t\\t\\t\\t\\t'cancel_token' => wp_generate_password( 20, false, false ),\\n\\t\\t\\t\\t\\t\\t'status'       => 'confirmed',\\n\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t\\t$pi++;\\n\\t\\t}\\n\\t\\t$day->modify( '+1 day' );\\n\\t}\\n}\\n\\n\\\/* ------------------------------------------------------------------ *\\n * 7. Pretty permalinks, so \\\/lead\\\/{token}\\\/ resolves\\n * ------------------------------------------------------------------ *\\\/\\nflush_rewrite_rules( false );\\n\"}]}"}},"all_blocks":{"amitry-booking\/booking-section":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":2,"name":"amitry-booking\/booking-section","title":"Booking Section","category":"widgets","icon":"calendar-alt","description":"Show one of your booking links as a section, either as a call to action or with the booking wizard embedded.","keywords":["booking","appointment","calendar","schedule"],"textdomain":"amitry-booking","supports":{"html":false,"anchor":true,"align":["wide","full"]},"attributes":{"token":{"type":"string","default":""},"mode":{"type":"string","default":"button"},"title":{"type":"string","default":""},"text":{"type":"string","default":""},"label":{"type":"string","default":""},"imageId":{"type":"number","default":0},"imageUrl":{"type":"string","default":""},"parallax":{"type":"boolean","default":true},"overlay":{"type":"number","default":55},"height":{"type":"number","default":520},"align_":{"type":"string","default":"left"},"hideIntro":{"type":"boolean","default":false},"greeting":{"type":"boolean","default":true},"lightbox":{"type":"boolean","default":true}},"editorScript":"file:.\/index.js","style":"amitry-booking-embed"}},"tagged_versions":["0.2.7","0.4.1","0.6.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3608103,"resolution":"1","location":"assets","locale":"","width":1448,"height":1086},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3608103,"resolution":"2","location":"assets","locale":"","width":1448,"height":1086},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3608103,"resolution":"3","location":"assets","locale":"","width":1448,"height":1086},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3608103,"resolution":"4","location":"assets","locale":"","width":1448,"height":1086},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3608103,"resolution":"5","location":"assets","locale":"","width":1448,"height":1086},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3608103,"resolution":"6","location":"assets","locale":"","width":1448,"height":1086}},"screenshots":{"1":"Each client opens their own personalized booking link and is greeted by name.","2":"Step-by-step wizard: the visitor picks the service they need.","3":"The booking calendar, where visitors pick a date and time in their own time zone.","4":"Instant confirmation, with an email and calendar invite on the way.","5":"Creating a personalized booking link in the admin: scope it to services, set an expiry, and grab the QR code.","6":"All bookings collected in one place in the WordPress admin."}},"plugin_section":[262246],"plugin_tags":[276,8133,269,275,268],"plugin_category":[40,56],"plugin_contributors":[260954],"plugin_business_model":[],"class_list":["post-329781","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-appointment","plugin_tags-appointment-booking","plugin_tags-booking","plugin_tags-booking-calendar","plugin_tags-scheduling","plugin_category-calendar-and-events","plugin_category-social-and-sharing","plugin_contributors-amitry","plugin_committers-amitry"],"banners":{"banner":"https:\/\/ps.w.org\/amitry-booking\/assets\/banner-772x250.png?rev=3608103","banner_2x":"https:\/\/ps.w.org\/amitry-booking\/assets\/banner-1544x500.png?rev=3608103","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/amitry-booking\/assets\/icon-128x128.gif?rev=3599163","icon_2x":"https:\/\/ps.w.org\/amitry-booking\/assets\/icon-256x256.gif?rev=3599163","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-1.png?rev=3608103","caption":"Each client opens their own personalized booking link and is greeted by name."},{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-2.png?rev=3608103","caption":"Step-by-step wizard: the visitor picks the service they need."},{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-3.png?rev=3608103","caption":"The booking calendar, where visitors pick a date and time in their own time zone."},{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-4.png?rev=3608103","caption":"Instant confirmation, with an email and calendar invite on the way."},{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-5.png?rev=3608103","caption":"Creating a personalized booking link in the admin: scope it to services, set an expiry, and grab the QR code."},{"src":"https:\/\/ps.w.org\/amitry-booking\/assets\/screenshot-6.png?rev=3608103","caption":"All bookings collected in one place in the WordPress admin."}],"raw_content":"<!--section=description-->\n<p>Amitry Booking is a self-hosted appointment scheduling plugin for WordPress, built around personalized booking links. Instead of sending everyone to the same generic booking page, you give each client their own link that opens a clean, step-by-step booking calendar: they pick a service, choose a time, and confirm. Every booking and every detail stays in your own WordPress database.<\/p>\n\n<p>It works as a privacy-friendly, self-hosted alternative to cloud schedulers like Calendly, without sending your clients or their data to a third-party service.<\/p>\n\n<h4>See it in action<\/h4>\n\n<p>https:\/\/www.youtube.com\/watch?v=LeCsW_vO8TY<\/p>\n\n<h4>Put booking right on your page<\/h4>\n\n<p>A booking link does not have to live on its own page. Drop the \"Booking Section\" block into any page, use the Booking Section widget in Elementor, or paste the [amitry_booking] shortcode anywhere else, including the Classic Editor, widgets, and page builders that support shortcodes.<\/p>\n\n<p>You get two layouts. A call-to-action section with your own headline, text, and background image, where clicking the button opens the booking wizard in an overlay so the visitor never leaves your page. Or the wizard embedded straight into the page, so people can pick a time without a single click extra.<\/p>\n\n<p>Either way the booking link keeps working on its own too: open it directly, or scan its QR code, and you get the full booking page exactly as before.<\/p>\n\n<h4>A booking link for every client<\/h4>\n\n<p>Each personalized booking link is a unique, unguessable URL you can use two ways. Send it privately to one client, where it greets them by name and can show a personal note. Or turn it into a QR code for flyers, business cards, posters, and shop windows: the link is reusable, so the same QR code can be scanned and booked by many people.<\/p>\n\n<p>For each link you decide exactly what it shows: every service, only certain categories, or a hand-picked set of services. You can also give a link an expiry date.<\/p>\n\n<h4>Works across time zones, automatically<\/h4>\n\n<p>The booking calendar detects the visitor's time zone and shows every available slot in their own local time, with a time-zone switcher built in. A client in another country books in their own time, just like Calendly, while your appointments stay consistent in your business time zone.<\/p>\n\n<h4>Never double-booked<\/h4>\n\n<p>Amitry Booking treats your availability as one shared calendar. A slot booked through any link immediately disappears from every other link, and a race-safe check at booking time prevents two people from grabbing the same slot at once.<\/p>\n\n<h4>Everything included<\/h4>\n\n<ul>\n<li>Personalized booking links with unique token URLs, ready to share or turn into a QR code<\/li>\n<li>A QR code generator for every link (download as PNG or SVG)<\/li>\n<li>Step-by-step booking wizard: service, booking calendar, confirmation<\/li>\n<li>Automatic visitor time-zone detection with a manual switcher<\/li>\n<li>Booking calendar with an availability view, so each day shows at a glance how full it already is<\/li>\n<li>Per-link scope: show all services, chosen categories, or specific services, plus an optional expiry date<\/li>\n<li>Service catalog with featured image, host, description, duration hint, price hint, and location type (in person, phone, video, or on site)<\/li>\n<li>Availability rules: weekly hours, buffer time between appointments, how far ahead people can book, and minimum lead time<\/li>\n<li>Automatic confirmation emails with an iCal (.ics) calendar invite<\/li>\n<li>Up to two automatic reminder emails before each appointment, for example 24 hours and 1 hour before, to reduce no-shows<\/li>\n<li>Self-service reschedule and cancel links for customers<\/li>\n<li>Embed booking anywhere: a Gutenberg block, an Elementor widget, and the [amitry_booking] shortcode for everything else<\/li>\n<li>Two page layouts: a call-to-action section that opens the wizard in an overlay, or the wizard embedded directly in the page<\/li>\n<li>Background image with optional parallax, adjustable overlay and height, and an option to hide the personal greeting on public pages<\/li>\n<li>Export all bookings to CSV<\/li>\n<li>Translation ready, and ships with English and German<\/li>\n<\/ul>\n\n<h4>Your data stays yours<\/h4>\n\n<p>There are no external services and no third-party APIs. Every service, link, and booking is stored in dedicated tables in your own database, which makes Amitry Booking a good fit for GDPR and any site that wants to own its data.<\/p>\n\n<h4>A booking calendar that always looks right<\/h4>\n\n<p>The booking wizard renders on its own isolated page that does not load your theme's styles or scripts, so the booking calendar looks the way you designed it on every site, and stays fully responsive on phones, tablets, and desktops.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to \/wp-content\/plugins\/, or install it from the Plugins screen in your WordPress admin.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Open the new Amitry Booking menu in the admin sidebar.<\/li>\n<li>Create your services and set your availability first, then create a booking link and share its URL or QR code.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20amitry%20booking%20a%20calendly%20alternative%3F\"><h3>Is Amitry Booking a Calendly alternative?<\/h3><\/dt>\n<dd><p>Yes. It is a self-hosted, privacy-friendly alternative to cloud schedulers like Calendly. The booking calendar runs on your own site, and all appointment data stays in your WordPress database instead of on an external service.<\/p><\/dd>\n<dt id=\"does%20the%20booking%20calendar%20work%20across%20time%20zones%3F\"><h3>Does the booking calendar work across time zones?<\/h3><\/dt>\n<dd><p>Yes. The scheduling wizard detects the visitor's time zone automatically and shows every available slot in their local time. Visitors can also switch the time zone by hand. Your bookings are stored consistently, so your own calendar always reflects your business time zone.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20a%20booking%20link%20into%20a%20qr%20code%3F\"><h3>Can I turn a booking link into a QR code?<\/h3><\/dt>\n<dd><p>Yes. Every personalized booking link has a built-in QR code you can download as PNG or SVG and print on flyers, business cards, posters, or show on a screen. Because a link is reusable, the same QR code works for many people.<\/p><\/dd>\n<dt id=\"can%20i%20show%20different%20services%20to%20different%20people%3F\"><h3>Can I show different services to different people?<\/h3><\/dt>\n<dd><p>Yes. Each booking link can be scoped to all services, specific categories, or a hand-picked set of services, so every recipient sees only what is relevant to them. You can also set an expiry date per link.<\/p><\/dd>\n<dt id=\"can%20two%20people%20book%20the%20same%20slot%3F\"><h3>Can two people book the same slot?<\/h3><\/dt>\n<dd><p>No. Availability is treated as one shared calendar, so a slot booked through any link disappears from all of them, and a race-safe check at booking time stops two people from taking the same slot at the same moment.<\/p><\/dd>\n<dt id=\"where%20is%20the%20booking%20data%20stored%3F\"><h3>Where is the booking data stored?<\/h3><\/dt>\n<dd><p>In dedicated tables in your own WordPress database. Nothing is sent to external services, which keeps the plugin friendly to GDPR and privacy-conscious sites.<\/p><\/dd>\n<dt id=\"can%20customers%20reschedule%20or%20cancel%20themselves%3F\"><h3>Can customers reschedule or cancel themselves?<\/h3><\/dt>\n<dd><p>Yes. Confirmation emails include secure self-service reschedule and cancel links. When a customer reschedules, the new appointment is created first and the old one is only released once the new booking is confirmed.<\/p><\/dd>\n<dt id=\"will%20my%20theme%20break%20the%20booking%20calendar%3F\"><h3>Will my theme break the booking calendar?<\/h3><\/dt>\n<dd><p>No. The wizard renders in an isolated pipeline that does not load theme stylesheets or scripts, so the booking calendar stays consistent everywhere.<\/p><\/dd>\n<dt id=\"can%20i%20put%20booking%20on%20a%20normal%20page%3F\"><h3>Can I put booking on a normal page?<\/h3><\/dt>\n<dd><p>Yes, in three ways: the \"Booking Section\" block in the block editor, the Booking Section widget in Elementor, or the [amitry_booking] shortcode for the Classic Editor, widgets, and other page builders. All three offer the same two layouts, a call-to-action section or the embedded wizard, and the same settings.<\/p><\/dd>\n<dt id=\"does%20the%20visitor%20leave%20my%20page%20to%20book%3F\"><h3>Does the visitor leave my page to book?<\/h3><\/dt>\n<dd><p>No. By default the button opens the booking wizard in an overlay on top of your page, and the embedded layout keeps everything inline. You can turn the overlay off per section if you would rather send visitors to the booking page. Opening a booking link directly, or scanning its QR code, always shows the full booking page.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20personalized%20link%20on%20a%20public%20page%3F\"><h3>Can I use a personalized link on a public page?<\/h3><\/dt>\n<dd><p>Yes, and there is a setting for exactly that. Switch off \"Greet the recipient by name\" so a public page does not address every visitor with the same person's name. For public pages a link scoped to all services usually works best.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translation%20ready%3F\"><h3>Is the plugin translation ready?<\/h3><\/dt>\n<dd><p>Yes. All text uses standard WordPress translation functions, and the plugin ships with English and German. Other languages can be added through translate.wordpress.org.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>New: embed booking on any page with the \"Booking Section\" block, an Elementor widget, or the [amitry_booking] shortcode.<\/li>\n<li>New: two layouts to choose from, a call-to-action section with a background image and optional parallax, or the booking wizard embedded directly in the page.<\/li>\n<li>New: the call-to-action button opens the wizard in an overlay, so visitors book without leaving your page. Opening a booking link directly, for example from a QR code, still shows the full booking page.<\/li>\n<li>New: hide the personal greeting when a link is used on a public page, and optionally start the embedded wizard at the service list instead of the welcome screen.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Added a demo video and a donation link to the plugin page.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>New: an optional second reminder email, so you can remind customers twice, for example 24 hours and 1 hour before the appointment.<\/li>\n<li>New: add a category directly from the service editor.<\/li>\n<li>Improved: cleaner service editor layout and a clearer host field.<\/li>\n<li>Improved: the booking wizard now uses English source text with a bundled German translation, so it always follows your site language.<\/li>\n<li>Fixed: the calendar availability view could stay blank on some server setups.<\/li>\n<li>Developer: the slot engine is now service-aware, and a new amitry_booking_reminder_sent action lets add-ons deliver reminders through other channels.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: personalized booking links, step-by-step scheduling wizard, service catalog with hosts and locations, availability rules, confirmation emails with iCal, reminders, reschedule and cancel flows, CSV export, and a responsive booking calendar.<\/li>\n<\/ul>","raw_excerpt":"Self-hosted appointment scheduling with personalized booking links and QR codes. Embed the booking calendar in any page with a block or shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=329781"}],"author":[{"embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/amitry"}],"wp:attachment":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329781"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329781"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329781"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329781"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329781"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}