{"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-07-14T22:32:49","modified_gmt":"2026-07-14T22:32:49","slug":"amitry-booking","status":"publish","type":"plugin","link":"https:\/\/de.wordpress.org\/plugins\/amitry-booking\/","author":23468925,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.1","stable_tag":"0.4.1","tested":"7.0.1","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-07-14 22:32:49","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":133,"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"},"0.4.1":{"tag":"0.4.1","author":"amitry","date":"2026-07-14 22:32:49"}},"upgrade_notice":{"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":3609315,"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":[],"tagged_versions":["0.2.7","0.4.1"],"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>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>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=\"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.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 and booking calendar with personalized booking links, QR codes, and automatic visitor time zones.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=329781"}],"author":[{"embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/amitry"}],"wp:attachment":[{"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329781"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329781"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329781"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329781"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329781"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/de.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}