Zoho Bookings
Setting Up WhatsApp Notifications for Zoho Bookings with OwnChat: Streamline Your Communication
By integrating WhatsApp notifications into your Zoho Bookings via OwnChat, you ensure timely and effective communication with your customers at every stage of their booking journey. This setup helps you automate reminders, confirmations, and updates, enhancing customer experience while saving time. Let’s walk you through the step-by-step process.
Why Integrate WhatsApp Notifications with Zoho Bookings?
This integration allows you to:
Automate communication with customers for booking confirmations, cancellations, or reschedules.
Enhance customer engagement by reaching them on their preferred platform, WhatsApp.
Save time with seamless, automated updates for various booking events.
Improve customer satisfaction with real-time notifications
Step-by-Step Guide to Setting Up
1. Log In to OwnChat
Start by logging into your OwnChat account to configure the connection between Zoho Bookings and WhatsApp.
2. Connect Zoho Bookings to OwnChat
Navigate to: Apps → Zoho Bookings → Connections → Add New Connection
Complete the OAuth process and provide a unique connection name.
Create a connection to link Zoho Bookings to OwnChat.
3. Subscribe to Events and Configure Templates
Once the connection is active:
Subscribe to the desired events such as Booking Confirmed, Rescheduled, Cancelled, etc.
Set up notification templates for each event. These templates will be triggered whenever the corresponding event occurs.
4. Configure Notifications in Zoho Bookings
Now, head over to Zoho Bookings and log in to your account:
Settings → Workspace → Custom Functions
Configure notifications for each event: Booked, Rescheduled, Canceled, Marked as Completed, or No Show.
Hover over the desired event and click on Configure.
Copy and paste the respective code for each event as shown below.
Event-Specific Code
Ensure you replace the webhook URL with the one provided after subscribing to events in OwnChat.
Here’s the code you need to add for various events:
// Assuming bookingInfo map is available with all booking details
info bookingInfo;
// Extract all booking information from bookingInfo map
data_map = Map();
data_map.put("booking_id", bookingInfo.get("booking_id"));
data_map.put("workspace_name", bookingInfo.get("workspace_name"));
data_map.put("workspace_id", bookingInfo.get("workspace_id"));
data_map.put("service_name", bookingInfo.get("service_name"));
data_map.put("service_id", bookingInfo.get("service_id"));
data_map.put("service_description", bookingInfo.get("service_description"));
data_map.put("staff_id", bookingInfo.get("staff_id"));
data_map.put("staff_name", bookingInfo.get("staff_name"));
data_map.put("staff_email", bookingInfo.get("staff_email"));
data_map.put("staff_contact_number", bookingInfo.get("staff_contact_number"));
data_map.put("duration", bookingInfo.get("duration"));
data_map.put("pre_buffer", bookingInfo.get("pre_buffer"));
data_map.put("post_buffer", bookingInfo.get("post_buffer"));
data_map.put("booking_type", bookingInfo.get("booking_type"));
data_map.put("cost", bookingInfo.get("cost"));
data_map.put("cost_paid", bookingInfo.get("cost_paid"));
data_map.put("due", bookingInfo.get("due"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("currency", bookingInfo.get("currency"));
data_map.put("start_time", bookingInfo.get("start_time"));
data_map.put("end_time", bookingInfo.get("end_time"));
data_map.put("iso_start_time", bookingInfo.get("iso_start_time"));
data_map.put("iso_end_time", bookingInfo.get("iso_end_time"));
data_map.put("last_updated_time", bookingInfo.get("last_updated_time"));
data_map.put("booked_on", bookingInfo.get("booked_on"));
data_map.put("customer_name", bookingInfo.get("customer_name"));
data_map.put("customer_email", bookingInfo.get("customer_email"));
data_map.put("customer_contact_no", bookingInfo.get("customer_contact_no"));
data_map.put("status", bookingInfo.get("status"));
data_map.put("payment_status", bookingInfo.get("payment_status"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("customer_booking_start_time", bookingInfo.get("customer_booking_start_time"));
data_map.put("customer_more_info", bookingInfo.get("customer_more_info").toString());
// Map needs to be converted to string
data_map.put("summary_url", bookingInfo.get("summary_url"));
data_map.put("notes", bookingInfo.get("notes"));
data_map.put("customer_notification", bookingInfo.get("customer_notification"));
data_map.put("triggered_from", bookingInfo.get("triggered_from"));
data_map.put("triggered_by", bookingInfo.get("triggered_by"));
// Specify your webhook URL
webhook_url = "replace the webhook URL";
// Set up the headers (optional if not required by the webhook)
headers_map = Map();
headers_map.put("Content-Type", "application/json");
// Convert the payload to JSON
data_json = data_map.toString();
// Send the data to the webhook via a POST request
response = postUrl(webhook_url, data_json, headers_map);
// Log the response for debugging (optional)
info response;// Assuming bookingInfo map is available with all booking details
info bookingInfo;
// Extract all booking information from bookingInfo map
data_map = Map();
data_map.put("booking_id", bookingInfo.get("booking_id"));
data_map.put("workspace_name", bookingInfo.get("workspace_name"));
data_map.put("workspace_id", bookingInfo.get("workspace_id"));
data_map.put("service_name", bookingInfo.get("service_name"));
data_map.put("service_id", bookingInfo.get("service_id"));
data_map.put("service_description", bookingInfo.get("service_description"));
data_map.put("staff_id", bookingInfo.get("staff_id"));
data_map.put("staff_name", bookingInfo.get("staff_name"));
data_map.put("staff_email", bookingInfo.get("staff_email"));
data_map.put("staff_contact_number", bookingInfo.get("staff_contact_number"));
data_map.put("duration", bookingInfo.get("duration"));
data_map.put("pre_buffer", bookingInfo.get("pre_buffer"));
data_map.put("post_buffer", bookingInfo.get("post_buffer"));
data_map.put("booking_type", bookingInfo.get("booking_type"));
data_map.put("cost", bookingInfo.get("cost"));
data_map.put("cost_paid", bookingInfo.get("cost_paid"));
data_map.put("due", bookingInfo.get("due"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("currency", bookingInfo.get("currency"));
data_map.put("start_time", bookingInfo.get("start_time"));
data_map.put("end_time", bookingInfo.get("end_time"));
data_map.put("iso_start_time", bookingInfo.get("iso_start_time"));
data_map.put("iso_end_time", bookingInfo.get("iso_end_time"));
data_map.put("last_updated_time", bookingInfo.get("last_updated_time"));
data_map.put("booked_on", bookingInfo.get("booked_on"));
data_map.put("customer_name", bookingInfo.get("customer_name"));
data_map.put("customer_email", bookingInfo.get("customer_email"));
data_map.put("customer_contact_no", bookingInfo.get("customer_contact_no"));
data_map.put("status", bookingInfo.get("status"));
data_map.put("payment_status", bookingInfo.get("payment_status"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("customer_booking_start_time", bookingInfo.get("customer_booking_start_time"));
data_map.put("customer_more_info", bookingInfo.get("customer_more_info").toString());
// Map needs to be converted to string
data_map.put("summary_url", bookingInfo.get("summary_url"));
data_map.put("notes", bookingInfo.get("notes"));
data_map.put("customer_notification", bookingInfo.get("customer_notification"));
data_map.put("triggered_from", bookingInfo.get("triggered_from"));
data_map.put("triggered_by", bookingInfo.get("triggered_by"));
data_map.put("appointment_history", bookingInfo.get("appointment_history"));
// Specify your webhook URL
webhook_url = "replace the webhook URL";
//webhook_url = "https://api-test.ownchat.app/apps/66eba3f9375ae62f332538ce/events/66eba3f9375ae62f332538cf";
// Set up the headers (optional if not required by the webhook)
headers_map = Map();
headers_map.put("Content-Type", "application/json");
// Convert the payload to JSON
data_json = data_map.toString();
// Send the data to the webhook via a POST request
response = postUrl(webhook_url, data_json, headers_map);
// Log the response for debugging (optional)
info response;// Assuming bookingInfo map is available with all booking details
info bookingInfo;
// Extract all booking information from bookingInfo map
data_map = Map();
data_map.put("booking_id", bookingInfo.get("booking_id"));
data_map.put("workspace_name", bookingInfo.get("workspace_name"));
data_map.put("workspace_id", bookingInfo.get("workspace_id"));
data_map.put("service_name", bookingInfo.get("service_name"));
data_map.put("service_id", bookingInfo.get("service_id"));
data_map.put("service_description", bookingInfo.get("service_description"));
data_map.put("staff_id", bookingInfo.get("staff_id"));
data_map.put("staff_name", bookingInfo.get("staff_name"));
data_map.put("staff_email", bookingInfo.get("staff_email"));
data_map.put("staff_contact_number", bookingInfo.get("staff_contact_number"));
data_map.put("duration", bookingInfo.get("duration"));
data_map.put("pre_buffer", bookingInfo.get("pre_buffer"));
data_map.put("post_buffer", bookingInfo.get("post_buffer"));
data_map.put("booking_type", bookingInfo.get("booking_type"));
data_map.put("cost", bookingInfo.get("cost"));
data_map.put("cost_paid", bookingInfo.get("cost_paid"));
data_map.put("due", bookingInfo.get("due"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("currency", bookingInfo.get("currency"));
data_map.put("start_time", bookingInfo.get("start_time"));
data_map.put("end_time", bookingInfo.get("end_time"));
data_map.put("iso_start_time", bookingInfo.get("iso_start_time"));
data_map.put("iso_end_time", bookingInfo.get("iso_end_time"));
data_map.put("last_updated_time", bookingInfo.get("last_updated_time"));
data_map.put("booked_on", bookingInfo.get("booked_on"));
data_map.put("customer_name", bookingInfo.get("customer_name"));
data_map.put("customer_email", bookingInfo.get("customer_email"));
data_map.put("customer_contact_no", bookingInfo.get("customer_contact_no"));
data_map.put("status", bookingInfo.get("status"));
data_map.put("payment_status", bookingInfo.get("payment_status"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("customer_booking_start_time", bookingInfo.get("customer_booking_start_time"));
data_map.put("customer_more_info", bookingInfo.get("customer_more_info").toString());
// Map needs to be converted to string
data_map.put("summary_url", bookingInfo.get("summary_url"));
data_map.put("notes", bookingInfo.get("notes"));
data_map.put("customer_notification", bookingInfo.get("customer_notification"));
data_map.put("triggered_from", bookingInfo.get("triggered_from"));
data_map.put("triggered_by", bookingInfo.get("triggered_by"));
// Specify your webhook URL
webhook_url = "replace the webhook URL";
// Set up the headers (optional if not required by the webhook)
headers_map = Map();
headers_map.put("Content-Type", "application/json");
// Convert the payload to JSON
data_json = data_map.toString();
// Send the data to the webhook via a POST request
response = postUrl(webhook_url, data_json, headers_map);
// Log the response for debugging (optional)
info response;// Assuming bookingInfo map is available with all booking details
info bookingInfo;
// Extract all booking information from bookingInfo map
data_map = Map();
data_map.put("booking_id", bookingInfo.get("booking_id"));
data_map.put("workspace_name", bookingInfo.get("workspace_name"));
data_map.put("workspace_id", bookingInfo.get("workspace_id"));
data_map.put("service_name", bookingInfo.get("service_name"));
data_map.put("service_id", bookingInfo.get("service_id"));
data_map.put("service_description", bookingInfo.get("service_description"));
data_map.put("staff_id", bookingInfo.get("staff_id"));
data_map.put("staff_name", bookingInfo.get("staff_name"));
data_map.put("staff_email", bookingInfo.get("staff_email"));
data_map.put("staff_contact_number", bookingInfo.get("staff_contact_number"));
data_map.put("duration", bookingInfo.get("duration"));
data_map.put("pre_buffer", bookingInfo.get("pre_buffer"));
data_map.put("post_buffer", bookingInfo.get("post_buffer"));
data_map.put("booking_type", bookingInfo.get("booking_type"));
data_map.put("cost", bookingInfo.get("cost"));
data_map.put("cost_paid", bookingInfo.get("cost_paid"));
data_map.put("due", bookingInfo.get("due"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("currency", bookingInfo.get("currency"));
data_map.put("start_time", bookingInfo.get("start_time"));
data_map.put("end_time", bookingInfo.get("end_time"));
data_map.put("iso_start_time", bookingInfo.get("iso_start_time"));
data_map.put("iso_end_time", bookingInfo.get("iso_end_time"));
data_map.put("last_updated_time", bookingInfo.get("last_updated_time"));
data_map.put("booked_on", bookingInfo.get("booked_on"));
data_map.put("customer_name", bookingInfo.get("customer_name"));
data_map.put("customer_email", bookingInfo.get("customer_email"));
data_map.put("customer_contact_no", bookingInfo.get("customer_contact_no"));
data_map.put("status", bookingInfo.get("status"));
data_map.put("payment_status", bookingInfo.get("payment_status"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("customer_booking_start_time", bookingInfo.get("customer_booking_start_time"));
data_map.put("customer_more_info", bookingInfo.get("customer_more_info").toString());
// Map needs to be converted to string
data_map.put("summary_url", bookingInfo.get("summary_url"));
data_map.put("notes", bookingInfo.get("notes"));
data_map.put("customer_notification", bookingInfo.get("customer_notification"));
data_map.put("triggered_from", bookingInfo.get("triggered_from"));
data_map.put("triggered_by", bookingInfo.get("triggered_by"));
// Specify your webhook URL
webhook_url = "replace the webhook URL";
// Set up the headers (optional if not required by the webhook)
headers_map = Map();
headers_map.put("Content-Type", "application/json");
// Convert the payload to JSON
data_json = data_map.toString();
// Send the data to the webhook via a POST request
response = postUrl(webhook_url, data_json, headers_map);
// Log the response for debugging (optional)
info response;// Assuming bookingInfo map is available with all booking details
info bookingInfo;
// Extract all booking information from bookingInfo map
data_map = Map();
data_map.put("booking_id", bookingInfo.get("booking_id"));
data_map.put("workspace_name", bookingInfo.get("workspace_name"));
data_map.put("workspace_id", bookingInfo.get("workspace_id"));
data_map.put("service_name", bookingInfo.get("service_name"));
data_map.put("service_id", bookingInfo.get("service_id"));
data_map.put("service_description", bookingInfo.get("service_description"));
data_map.put("staff_id", bookingInfo.get("staff_id"));
data_map.put("staff_name", bookingInfo.get("staff_name"));
data_map.put("staff_email", bookingInfo.get("staff_email"));
data_map.put("staff_contact_number", bookingInfo.get("staff_contact_number"));
data_map.put("duration", bookingInfo.get("duration"));
data_map.put("pre_buffer", bookingInfo.get("pre_buffer"));
data_map.put("post_buffer", bookingInfo.get("post_buffer"));
data_map.put("booking_type", bookingInfo.get("booking_type"));
data_map.put("cost", bookingInfo.get("cost"));
data_map.put("cost_paid", bookingInfo.get("cost_paid"));
data_map.put("due", bookingInfo.get("due"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("currency", bookingInfo.get("currency"));
data_map.put("start_time", bookingInfo.get("start_time"));
data_map.put("end_time", bookingInfo.get("end_time"));
data_map.put("iso_start_time", bookingInfo.get("iso_start_time"));
data_map.put("iso_end_time", bookingInfo.get("iso_end_time"));
data_map.put("last_updated_time", bookingInfo.get("last_updated_time"));
data_map.put("booked_on", bookingInfo.get("booked_on"));
data_map.put("customer_name", bookingInfo.get("customer_name"));
data_map.put("customer_email", bookingInfo.get("customer_email"));
data_map.put("customer_contact_no", bookingInfo.get("customer_contact_no"));
data_map.put("status", bookingInfo.get("status"));
data_map.put("payment_status", bookingInfo.get("payment_status"));
data_map.put("time_zone", bookingInfo.get("time_zone"));
data_map.put("customer_booking_start_time", bookingInfo.get("customer_booking_start_time"));
data_map.put("customer_more_info", bookingInfo.get("customer_more_info").toString());
// Map needs to be converted to string
data_map.put("summary_url", bookingInfo.get("summary_url"));
data_map.put("notes", bookingInfo.get("notes"));
data_map.put("customer_notification", bookingInfo.get("customer_notification"));
data_map.put("triggered_from", bookingInfo.get("triggered_from"));
data_map.put("triggered_by", bookingInfo.get("triggered_by"));
// Specify your webhook URL
webhook_url = "replace the webhook URL";
// Set up the headers (optional if not required by the webhook)
headers_map = Map();
headers_map.put("Content-Type", "application/json");
// Convert the payload to JSON
data_json = data_map.toString();
// Send the data to the webhook via a POST request
response = postUrl(webhook_url, data_json, headers_map);
// Log the response for debugging (optional)
info response;Last updated