##Omnichannel Platforms for lower labor cost

An omnichannel platform is a unified system that enables businesses to provide a seamless and consistent customer experience across multiple channels and touchpoints. It integrates various communication channels, such as websites, mobile apps, social media, email, phone, and physical stores, into a cohesive platform.

The key idea behind an omnichannel platform is to ensure that customers can interact with a business using their preferred channel, and have a consistent and personalized experience regardless of the channel they choose. It allows customers to start an interaction on one channel and seamlessly transition to another without any loss of information or continuity.

From the customer service agents’ point of view, this means that there will be no need to switch between channels. The contacts from all channels arrive to the same platform and are automatically assigned to the available agents based on the predefined prioritization settings. The occupancy is expected to be higher than it would be otherwise. On top of that, this also removes the need to create shifts with multiple skills one coming after the other.

However, planning for Omnichannel set ups may be challenging. This is due to the fact that the channels despite being on one platform have different service level, productivity, and perhaps occupancy assumptions. The logical approach would be to perform the calculations for each channel one after the other while using the unoccupied FTE’s for the next channel. This is of course assuming that the system settings allows sending the contacts in the same order when ever there are multiple contacts from different channels.

Install and load to the memory space

#install and load devtools package
if(!require("devtools",character.only = TRUE)) install.packages("devtools")
library(devtools)

#install/load RWFM from github
devtools::install_github("tesfahunboshe/RWFM")
library("RWFM")

Load the input data and calculate the necessary fields

  1. for dataframes with multiple data points
# read the data from a local file
data = read.csv("omnichannel.csv")
data
##             Interval Phone.calls Emails
## 1 12:00 AM - 1:00 AM          20     30
## 2  1:00 AM - 2:00 AM          22     35
## 3  2:00 AM - 3:00 AM          23     40
## 4  3:00 AM - 4:00 AM          25     42
## 5  4:00 AM - 5:00 AM          25     47
## 6  5:00 AM - 6:00 AM          30     50
## 7  6:00 AM - 7:00 AM          33     55
## 8  7:00 AM - 8:00 AM          35     59
# calculate the metrics and add additional columns
data$agents_for_calls <- mapply(ReqFTE,data$Phone.calls,900,0.8,30,3600)
data$Occupancy_calls <- mapply(Occupancy,data$Phone.calls,900,3600,data$agents_for_calls)

# output
data
##             Interval Phone.calls Emails agents_for_calls Occupancy_calls
## 1 12:00 AM - 1:00 AM          20     30                8       0.6250000
## 2  1:00 AM - 2:00 AM          22     35                9       0.6111111
## 3  2:00 AM - 3:00 AM          23     40                9       0.6388889
## 4  3:00 AM - 4:00 AM          25     42               10       0.6250000
## 5  4:00 AM - 5:00 AM          25     47               10       0.6250000
## 6  5:00 AM - 6:00 AM          30     50               11       0.6818182
## 7  6:00 AM - 7:00 AM          33     55               12       0.6875000
## 8  7:00 AM - 8:00 AM          35     59               13       0.6730769
# occupancy delta from 80%
data$occupancyDelta <- 0.8 - data$Occupancy_calls

# FTE's unoccupied
data$FTEs_idle <- data$occupancyDelta*data$agents_for_calls

# How many emails can they solve in every interval?
data$Emails_Solved <- round(data$FTEs_idle*3600/600,0)

# how many emails remain?
data$Emails_remaining <- data$Emails - data$Emails_Solved

data
##             Interval Phone.calls Emails agents_for_calls Occupancy_calls
## 1 12:00 AM - 1:00 AM          20     30                8       0.6250000
## 2  1:00 AM - 2:00 AM          22     35                9       0.6111111
## 3  2:00 AM - 3:00 AM          23     40                9       0.6388889
## 4  3:00 AM - 4:00 AM          25     42               10       0.6250000
## 5  4:00 AM - 5:00 AM          25     47               10       0.6250000
## 6  5:00 AM - 6:00 AM          30     50               11       0.6818182
## 7  6:00 AM - 7:00 AM          33     55               12       0.6875000
## 8  7:00 AM - 8:00 AM          35     59               13       0.6730769
##   occupancyDelta FTEs_idle Emails_Solved Emails_remaining
## 1      0.1750000      1.40             8               22
## 2      0.1888889      1.70            10               25
## 3      0.1611111      1.45             9               31
## 4      0.1750000      1.75            11               31
## 5      0.1750000      1.75            11               36
## 6      0.1181818      1.30             8               42
## 7      0.1125000      1.35             8               47
## 8      0.1269231      1.65            10               49
# How many agents needed for the remaining emails?
(Email_only_agents <- ceiling(sum(data$Emails_remaining)*600/(8*3600)/0.8)) # 0.8 for 80% occupancy
## [1] 8