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:

  1. Settings → Workspace → Custom Functions

  2. Configure notifications for each event: Booked, Rescheduled, Canceled, Marked as Completed, or No Show.

  3. Hover over the desired event and click on Configure.

  4. 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:

Booked Event
// 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;
Rescheduled
// 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;
Cancelled
// 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;
Marked As Completed
// 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;

Marked As No Show
// 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