An open source appointment manager

Scheduling Specialist

© Photo by Leone Venter on Unsplash

© Photo by Leone Venter on Unsplash

Author(s):

If you have a business that requires customers to make an appointment in advance for services, letting them request the appointment via Easy!Appointments can free up your phone line.

Hair salons, medical offices, and other small businesses require customers to book an appointment. Traditionally, small businesses manage these appointments by offering a phone number. Customers call in, and an employee (or the business owner!) sets a date and time, usually writing everything down in an appointment book.

While this approach works, it suffers from a number of shortcomings. Customers can only phone in when the office is open. In addition, internal management becomes cumbersome if more than one person needs to know the next day's schedule: The receptionist then has to spend time telling each professional the weekly schedule instead of working on more important tasks.

To minimize (potentially significantly) these issues, you can leverage the power of technology and let computers do the hard work. Easy!Appointments [1], a free, open source web application, lets customers make appointments over the Internet even after business hours, while letting employees and business owners check their schedules from their smartphones without bothering the receptionist.

Installing Easy!Appointments

Easy!Appointments has a short list of prerequisites. It will run on any modern LAMP stack (see the "LAMP Servers in a Nutshell" box). Table 1 shows the current requirements for the latest stable version at the time of writing this article. I have also tested Easy!Appointments with OpenBSD's httpd and the MariaDB database with great success.

LAMP Servers in a Nutshell

Linux, Apache, MySQL, PHP (LAMP) describes machines serving web applications built upon these tools.

Setting up a LAMP server is very easy, but deploying one is outside the scope of this article. For testing purposes, you can set up a LAMP server in the cloud using a virtual private server (VPS) from Hetzner with a LAMP stack preconfigured (Figure 1). For more information, see Hetzner's documentation [2].

Figure 1: You can deploy a LAMP server via the Hetzner Cloud Console for testing purposes, if you don't want to roll one manually. © Hetzner Online GmbH

Table 1

Easy!Appointments 1.4.3 Prerequisites

Web server

Apache 2.4

Database

MySQL 5.7

PHP engine

PHP 7.3

The instructions provided here are for setting up Easy!Appointments on a Debian LAMP server. If you are using a minimal Hetzner LAMP install, you will need to install some additional software:

apt-get update
apt-get install unzip php7.4-mbstring
systemctl restart apache2

Once you have a LAMP server configured, installing Easy!Appointments is a breeze. First, move to your web server root (e.g., /var/www/demo.operationalsecurity.es) and download Easy!Appointments:

cd /var/www/demo.operationalsecurity.es
wget https://github.com/alextselegidis/easyappointments/releases/download/1.4.3/easyappointments-1.4.3.zip

Next, decompress the downloaded archive (you will need the unzip program installed on your system):

unzip easyappointments-1.4.3.zip

Then, grant the web server user ownership over the files:

chown -R www-data ./*

You will now create a database for the web application as shown in Listing 1. If you are using a minimal Hetzner LAMP install, you will find MySQL's root password (needed to issue all of the following commands) at /root/.hcloud_password. Keep in mind that passing SQL instructions to MySQL via a pipe is not secure, and it is done here only for the sake of clarity.

Listing 1

Creating a Database

echo "CREATE DATABASE easyappointments;" | mysql -u root -p
echo "CREATE USER easyappointments IDENTIFIED BY 'password';" | mysql -u root -p
echo "GRANT ALL PRIVILEGES ON easyappointments.* to easyappointments;" | mysql -u root -p

Finally, use the sample configuration file in Listing 2 as a template and edit it to your liking with a text editor:

cp config-sample.php config.php
vi config.php

Listing 2

Example config.php

01 <?php
02 class Config {
03
04   // ------------------------------------------------------
05   // GENERAL SETTINGS
06   // ------------------------------------------------------
07
08   const BASE_URL    = 'https://demo.operationalsecurity.es';
09   const LANGUAGE    = 'english';
10   const DEBUG_MODE  = FALSE;
11
12   // ------------------------------------------------------
13   // DATABASE SETTINGS
14   // ------------------------------------------------------
15
16   const DB_HOST      = '127.0.0.1';
17   const DB_NAME      = 'easyappointments';
18   const DB_USERNAME  = 'easyappointments';
19   const DB_PASSWORD  = 'some_password_here';
20
21   // ------------------------------------------------------
22   // GOOGLE CALENDAR SYNC
23   // ------------------------------------------------------
24
25   const GOOGLE_SYNC_FEATURE   = FALSE; // Enter TRUE or FALSE
26   const GOOGLE_PRODUCT_NAME   = '';
27   const GOOGLE_CLIENT_ID      = '';
28   const GOOGLE_CLIENT_SECRET  = '';
29   const GOOGLE_API_KEY        = '';
30 }

Once Easy!Appointments is loaded, you can visit your new site. An installation wizard will run automatically and help you finish the process (Figure 2).

Figure 2: Easy!Appointment's installation Wizard will ask you for some information in order to get the site set up.

Business Features

One of Easy!Appointments' most useful features is that it supports more than one service provider. For example, if you are setting up Easy!Appointments for the fictitious Horse Hoofcare business, which employs three farriers, you'll need to create an account for each employee. Customers then will be able to book an appointment with the farrier of their choice. To do this, go to the admin toolbar located at yoursite.com/index.php/user/login and log in.

First, you need to define the types of available appointments in the Services tab. Note that services can be grouped into categories if desired. Each service can have a price, a location, and an estimated completion time (Figure 3). An undocumented feature is that services can be defined as either Fixed or Flexible (see Table 2) [3]. In addition, you can allow multiple concurrent customers to sign up for a service, which is useful for courses and group activities that allow multiple people to sign up at the same time.

Table 2

Fixed and Flexible Appointments

Fixed

Appointments stack according to their defined duration. (If you have a 30-minute appointment at 09:30, the next available appointment will be at 10:00.)

Flexible

Appointments stack to the next interval of 15 minutes. (If you have a 30-minute appointment at 09:30, the next available appointment will be at 10:00, and the next one at 10:15.)

Figure 3: Add the services your business provides in the Services tab.

Once this is done, go to the Users tab and add as many providers as necessary (Figure 4). Keep in mind that you can assign different services to different providers. For example, you can assign Infection Treatment to a provider who is a veterinarian and Hoof Trimming to a farrier. If you have an employee who can provide both services, you can add both to that employee's list of services.

Figure 4: Select the Users tab to add as many providers as desired. You can also assign specific services to each provider.

Finally, go to the Business Logic tab located under Settings to set your business hours as well as assign employee breaks (Figure 5).

Figure 5: The Business Logic tab allows you to configure the available hours for booking appointments and to schedule breaks for your employees.

An optional, though undocumented, step is to configure Easy!Appointments to use an email provider for delivering email notifications to both your customers and employees. Email access can be configured in application/config/email.php as shown in Listing 3.

Listing 3

Example of email.php file

01 <?php defined('BASEPATH') or exit('No direct script access allowed');
02
03 $config['useragent'] = 'Easy!Appointments';
04 $config['protocol'] = 'smtp'; // or 'mail'
05 $config['mailtype'] = 'html'; // or 'text'
06 $config['smtp_auth'] = FALSE; // FALSE for anonymous relays
07 $config['smtp_host'] = 'smtp.example.org';
08 $config['smtp_debug'] = FALSE;
09 $config['smtp_user'] = '';
10 $config['smtp_pass'] = '';
11 $config['smtp_crypto'] = 'tls';
12 $config['smtp_port'] = '25';

Customer View

When potential customers visit your website, they will be offered a choice of services. Once the customer selects a service, a list of providers will be offered (Figure 6). After selecting a provider, the customer will be prompted to select an appointment time (Figure 7) and enter their contact information via a web form. Finally, an email notification is sent to both the customer and the employee whose services have been booked.

Figure 6: The customer selects both the service and the desired provider from drop-down lists.
Figure 7: The customer selects a date and time from a list of available slots.

The customer can change or cancel the appointment at any time using a link included in the email notification.

Lots of Features

Easy!Appointments offers some interesting extras. First, it is a responsive web application. You will find Easy!Appointments easy to use and pleasing to the eye from either a workstation or a mobile device.

It also supports the (infamous) cookie warnings, terms of service and privacy policy pop-ups, and a very necessary CAPTCHA to distinguish humans from bots.

In addition, Easy!Appointments supports multiple languages. Both customers and employees can select their preferred language when using Easy!Appointments.

Finally, Easy!Appointments integrates with other Internet services. In particular, it features integration with WordPress [4] via a plugin and synchronizes with Google Calendar (Figure 8) [5].

Figure 8: Employees can check upcoming appointments using the web calendar.

At the time of writing, a GitHub project lets you create an Easy!Appointments client for Android[6], but no official releases are listed at this time.

Hidden Drawbacks

While very handy, Easy!Appointments is not free from issues. Some of the features are barely documented or not documented at all. For example, as mentioned above, Easy!Appointments can be configured to interface with an email server (in order to deliver email notifications) in a number of ways, but this is not mentioned anywhere in the README file and is not configurable via the admin toolbar. Instead, a user must edit the application/config/email.php file manually. While not a big deal, this could be handled better.

Easy!Appointments sorely lacks functionality when it comes to appearance customization. There is no theme engine, and it looks like the user is expected to edit the relevant CSS rules. While certainly not an obstacle for a web designer, accessing the code directly in order to customize it may not be as easy as the name implies.

Conclusion

The Easy!Appointments web appointment scheduler is easy and quick to deploy and includes most of the functionality any small business may need. It supports internationalization, email notifications, CAPTCHAs, and legal notices, and the technical requirements are easy to meet. On the other hand, documentation is sparse, and it appears that the lead developer's business model is to sell support to users who want site customization.

The Author

Rubén Llorente is a mechanical engineer who ensures that the IT security measures for a small clinic are both legally compliant and safe. In addition, he is an OpenBSD enthusiast and a weapons collector.