In the last few years especially during and after the Covid-19 era, we have seen a dramatic increase in the adoption of CCaaS applications. The organizations are also increasingly shedding their old reluctance towards moving their VoIP infrastructure to the cloud. When we look at this changed landscape in the Cisco realm, we see that Cisco is in a pretty sweet spot due to its significant presence in the on-prem Contact Center space and has a direct path to its CCaaS solutions while keeping everyone in the same ecosystem. Customers that are currently on UCCX can opt for Webex Contact Center (WxCC) while those on UCCE and opt for Webex Contact Center Enterprise (WxCCE).
But the journey from UCCX to WxCC migration can be a technical and operational hurdle – especially when it comes to migrating configurations such as Teams, Agents, CSQs, Skills, Phonebooks etc. This is where having an automation tool can significantly help ease the migration of key configuration elements from UCCX to WxCC thereby offering a quick, consistent & secure process. That’s exactly the problem statement we will be solving in this post. We will be building an app that would migrate data from UCCX to WxCC in literally a couple of minutes as opposed to hours which is usually what we would spend if we were to do it manually.
The table of contents is given below. You can click on the links to jump to relevant sections.
- Migration Challenges
- How It Works ?
- High Level Architecture
- Features at a Glance
- Exclusions
- Video Demo (Use Case)
- Github Repo
- What’s the need ?
Migration Challenges
Migrating from UCCX to WxCC isn’t a straightforward copy-paste job. The two platforms are completely different architecture wise. The terminologies are different, the way the relationship is built between different components is different etc. We can always do manual configuration but that’s not only extremely time-consuming but also prone to human error thereby jeopardizing business continuity and might even cause and increas in deployment costs.
How It Works ?
This migration app works in two main phases:
Extracting Configuration from UCCX – Phase 1
The tool connects to the on-prem UCCX system through its REST APIs and Basic Auth. It then accesses and pulls down configuration data such as:
- CSQs
- Agents
- Applications
- Call Control Groups
- Skills
- Teams
- Triggers
- Wrap Up and Reason Codes
- Phonebooks
The captured information is then stored in an Excel spreadsheet. The sheet has different tabs pertaining to each of the above mentioned component and their respective information is stored there. At the end of this phase, we have an option to either stop the app and review the data captured so far or proceed with the second phase whose details are given below.
Pushing Configuration to WxCC – Phase 2
Once the UCCX configuration is mapped and transformed into WxCC compatible formats, the app then connects to the Webex Contact Center (WxCC) tenant via its own APIs – this time using OAuth 2.0 for authentication instead of Basic Auth as it did in phase 1. If you want to learn more about OAuth then you check out this series. During this phase, the app will do the following:
- Creates new Entry Points, Queues, Teams, Aux Codes, Address Books, Contacts, Skills.
- Assigns agents to appropriate teams.
- Create Skill Profiles and associate appropriate Skills to these profiles.
- Create Teams with appropriate Skill Profiles.
- Validates API responses for success and error handling.
To accommodate for differences in system architecture, terminologies and the relationship among different components, the app converts the UCCX data into a new WxCC appropriate format and stores it in a new Excel spreadsheet. This minimizes manual intervention and completes the entire process in one single flow.
High Level Architecture
Here is a high level overview of how this app works and the different components involved in its functioning.

- CCX API Communication : The code initiates communication with the CCX system via an API call.
- CCX Details : The data retrieved from CCX is sent to an Excel Spreadsheet.
- Code Handoff : Another code file takes over the data handling.
- WxCC Details : This new code file converts CCX data into a WxCC compatible format and stores it in a new Excel Spreadsheet.
- Code Handoff : Another code file reads the newly formatted data
- Code Handoff : Another code file prepares for OAuth-based communication.
- OAuth Communication : Sets up the OAuth communication which finally results in a “Token”.
- WxCC API Communication : Authenticated API calls are made to the WxCC to send the converted data into WxCC to complete the migration.
The “Web Server” component is doing 2 things here as a part of the OAuth process
- Listening to the “Authorization Code” and “State” values from Cisco
- Exchanging the “Authorization Code” value for a “Token” which is finally used in Step 8.
Features at a Glance
- Secure Auth: Uses Basic Auth for UCCX and OAuth 2.0 for WxCC to align with each platform’s security model.
- Smart Mapping : Automatically maps UCCX entities to WxCC equivalents and stores data in a new file.
- Preview & Edit: Allows us to preview and validate configurations before pushing them to WxCC.
- Migration Status: Gives a step-by-step status of each configuration element.
Exclusions
This app doesn’t include the following configuration components. I deliberately excluded them because their configuration usually varies from organization to organization. You may have agents synced from LDAP or AD or they may even be local. As far as Triggers are concerned, you could either be having 5-digit internal extensions as triggers to complete 10 digit DIDs.
- Triggers
- Agents
Since the idea was to keep the app as easy-to-adapt as possible for everyone out there, it didn’t make any sense to hard-code this functionality. However, I have implemented them in my personal use case for one of my customers. So, if you want to discuss it or have my specific inputs then please feel free to reach out on Linkedin.
Video Demo (Use Case)
If you want to skip all this reading and understand it in a video format then please check out the following video. This contains a demo of the app as well. In this use case, we will be migrating UCCX configuration for a typical “Telecom Company” to a WxCC tenant.
While you are there, please also subscribe to this channel. This would mean a lot! I’ll be posting a a lot of tutorials and explanatory videos there including a complete series on Network Automation focused on absolute beginners which I had put on Udemy and Tutorials Point last year.
Github Repo
You can download the code at the following link. I would highly suggest going through the ReadMe file included in the project first.
https://github.com/simranjit-uc/Cisco-UCCX-WxCC-Migration
What’s the need ?
Some of you may be wondering about why we are reinventing the wheel since Cisco offers its own tool to migrate data from UCCX to WxCC. That’s true and in my view, it’s not a question of whether we should use Cisco’s tool or this one or build another one. It’s more about satisfying your own inner technical curiosity and using that to build and share something with the rest of the technical community which can then be expanded and improved upon by others’ contributions.
I believe that if you want to be a good system admin then it’s essential that you understand the inner workings of the systems you are responsible for. You should have a good understanding of how each subcomponent works within an application. That’s the only way you’ll be able to expand the feature set by coding your own stuff. So, even if you end up using a different tool due to reasons which are out of your control, you will still be in a more advatnageous position than others because you know how things work under the hood. If you want to talk to a SaaS solution as a third party then API is the primary option. So, it doesn’t matter if it’s your code that’s talking to those APIs or if it’s a million dollar company selling their custom solutions to talk to the same set of APIs. They both will achieve the same result.
So, the summary of this rant is that it never hurts to get your own hands dirty. That’s the only way to learn new stuff!!
I hope you get to contribute and use this project in your own environment and it helps you in your migration journey. Please feel free to share your feedback/suggestions, if any.
Until then, Happy Learnings!!
