
Revamping Campaign Management for Scalable
Multi-Channel Engagement
Revamping Campaign Management for Scalable
Multi-Channel Engagement
Revamping Campaign Management for Scalable Multi-Channel Engagement
Revamping Campaign Management for
Scalable Multi-Channel Engagement
Simplifying complex campaign workflows using the scalable design system to improve usability and efficiency.
First, a little context
First, a little context
Overview
Overview
Overview
Five9 Campaign Manager is an enterprise campaign management platform that lets teams schedule and manage customer outreach across voice, SMS and digital channels. Used by Fortune 500 organizations, it supports the creation and management of campaigns across 40+ interconnected modules, helping teams run large scale customer engagement workflows with greater efficiency and visibility.
Five9 Campaign Manager is an enterprise campaign management platform that lets teams schedule and manage customer outreach across voice, SMS and digital channels. Used by Fortune 500 organizations, it supports the creation and management of campaigns across 40+ interconnected modules, helping teams run large scale customer engagement workflows with greater efficiency and visibility.
Project details
Project details
Project details
Time
4 months
Tools
Figma, Chatgpt
Design System
Nimbus
Scope
Web Application
Design Team
Design Team
Senior UI/UX Designer
Senior UI/UX Designer
Mid level UI/UX Designer
UI/UX Designer (me)
Redesigned Campaign Manager, module by module.
Redesigned Campaign Manager, module by module.
Five9 Campaign Manager was already an established enterprise product.
The brief wasn’t to invent a new campaign platform. The product already had established workflows, terminology, business logic and users.
I was assigned particular modules to redesign within that existing ecosystem. That meant I couldn’t simply redesign whatever looked outdated. Every change had to work with the rest of the product. And as I started going through the modules, I noticed a pattern. So before redesigning anything, I needed to understand what was actually happening underneath the screens.
Five9 Campaign Manager was already an established enterprise product.
The brief wasn’t to invent a new campaign platform. The product already had established workflows, terminology, business logic and users.
I was assigned particular modules to redesign within that existing ecosystem. That meant I couldn’t simply redesign whatever looked outdated. Every change had to work with the rest of the product. And as I started going through the modules, I noticed a pattern. So before redesigning anything, I needed to understand what was actually happening underneath the screens.
UX Audit
UX Audit
Identifying usability and hierarchy issues across existing modules.
Identifying usability and hierarchy issues across existing modules.
Information Architecture
Information Architecture
Restructuring navigation, content relationships and simplifying complex workflows.
Restructuring navigation, content relationships and simplifying complex workflows.
UX / UI Design
UX / UI Design
Redesigning assigned Campaign Manager modules and their key workflows.
Redesigning assigned Campaign Manager modules and their key workflows.
UX / UI Design
Redesigning assigned Campaign Manager modules and their key workflows.
Design System
Applying and extending reusable components across the product.
Accessibility
Accessibility
Addressing keyboard, focus, contrast and accessible interaction requirements.
Addressing keyboard, focus, contrast and accessible interaction requirements.
Collaboration
Collaboration
Working with developers, QA & stakeholders from design through implementation.
Working with developers, QA & stakeholders from design through implementation.
Design System
Design System
Applying and extending reusable components across the product.
Applying and extending reusable components across the product.
Understanding the Existing Product
Understanding the Existing Product
I didn’t have direct access to end users, so I didn’t want to pretend I had conducted user interviews or usability testing. Instead, I triangulated what I could learn from five stakeholder walkthroughs, Product and Engineering discussions, existing documentation and tickets. This gave me two types of information. What the product currently did. And: where people were already questioning it. That distinction became important throughout the redesign.
I didn’t have direct access to end users, so I didn’t want to pretend I had conducted user interviews or usability testing. Instead, I triangulated what I could learn from five stakeholder walkthroughs, Product and Engineering discussions, existing documentation and tickets. This gave me two types of information. What the product currently did. And: where people were already questioning it. That distinction became important throughout the redesign.
Stakeholder Discussion
Stakeholder Discussion
Reviewing current screens
Reviewing current screens
Business requirements
Business requirements
Existing workflow analysis
Existing workflow analysis
What the product does, and where people question it
What the product does, and where people question it
My Approach
My Approach
My Approach
I approached the redesign by first understanding the existing product, its modules, workflows and underlying patterns before making changes.
I approached the redesign by first understanding the existing product, its modules, workflows and underlying patterns before making changes.
Reviewed existing Campaign Manager modules
Reviewed existing Campaign Manager modules
Audited hierarchy, navigation and interaction patterns
Audited hierarchy, navigation and interaction patterns
Mapped key workflows and dependencies
Mapped key workflows and
dependencies
Mapped key workflows and
dependencies
Identified repeated UX and UI patterns
Identified repeated UX and UI
patterns
Identified repeated UX and UI
patterns
Validated assumptions through stakeholder discussions
Validated assumptions through stakeholder discussions
Translated findings into reusable design solutions
Translated findings into reusable design solutions
Problems Identified
Problems Identified
Problems Identified
The audit revealed inconsistencies across navigation, hierarchy and interactions that made some workflows harder to understand and use.
The audit revealed inconsistencies across navigation, hierarchy and interactions that made some workflows harder to understand and use.
Inconsistent information hierarchy
Inconsistent information hierarchy
Unclear primary and secondary actions
Unclear primary and secondary actions
Complex and unclear workflows
Complex and unclear workflows
Tightly coupled
module structures
Tightly coupled module structures
Tightly coupled module structures
Inconsistent component usage
Inconsistent component usage
Inconsistent component
usage
Unclear campaign status and states
Unclear campaign status and states
Limited accessibility across interactions
Limited accessibility across interactions
Dense content with limited flexibility
Dense content with limited flexibility
I found one problem hiding in the navigation
I found one problem
hiding in the
navigation
I found one problem hiding in the navigation
I found one problem
hiding in the navigation
While working on user creation, I noticed that Users and Roles were being handled together. But they represented different things. A user is a person. A role defines permissions.
Keeping them together made the information architecture feel like users needed to understand the product’s internal structure before they could manage it. So I proposed separating them into their own navigation areas.
The important part wasn’t adding another navigation item. It was recognising that the relationship between two concepts doesn’t mean they need to share the same place in the interface.
While working on user creation, I noticed that Users and Roles were being handled together. But they represented different things. A user is a person. A role defines permissions.
Keeping them together made the information architecture feel like users needed to understand the product’s internal structure before they could manage it. So I proposed separating them into their own navigation areas.
The important part wasn’t adding another navigation item. It was recognising that the relationship between two concepts doesn’t mean they need to share the same place in the interface.


Reducing the Initial Setup Burden
Reducing the
Initial Setup Burden
Reducing the Initial Setup Burden
Reducing the Initial
Setup Burden
A key design decision across all creation flows was to reduce the initial setup burden. Rather than requiring users to configure every setting during creation, the flow was redesigned to capture only the essential information needed to create a line item. Additional configurations could then be completed later through the edit flow. This progressive approach reduced cognitive load, accelerated task completion, and made complex workflows feel significantly more manageable.
A key design decision across all creation flows was to reduce the initial setup burden. Rather than requiring users to configure every setting during creation, the flow was redesigned to capture only the essential information needed to create a line item. Additional configurations could then be completed later through the edit flow. This progressive approach reduced cognitive load, accelerated task completion, and made complex workflows feel significantly more manageable.

Create Action
Create Action
This will redirect to new campaign creation screen
This will redirect to new campaign creation screen.
This will redirect to new campaign creation screen
This will redirect to new campaign creation screen
Create Action
Create Action
Basic information is collected in the creation screen.
Basic information is collected in the creation screen.
Basic information is collected in the creation screen.


Edit & Continue Setup
Edit & Continue Setup
Continue configuration in an editable detail view. This will create the campaign and redirect to Edit/detail screen with success toaster. Simplified the campaign creation flow by showing only essential steps upfront and moving advanced configurations to the edit stage.
Continue configuration in an editable detail view. This will create the campaign and redirect to Edit/detail screen with success toaster. Simplified the campaign creation flow by showing only essential steps upfront and moving advanced configurations to the edit stage.
Continue configuration in an editable detail view. This will create the campaign and redirect to Edit/detail screen with success toaster. Simplified the campaign creation flow by showing only essential steps upfront and moving advanced configurations to the edit stage.
Two modules, Breaking down
the final design piece by piece
Two modules, Breaking down
the final design piece by piece
The redesign spanned 100+ screens across the platform. Below are two modules representative screens I can walk through in detail from problem to decision rationale. The original 'before' interface is no longer accessible (the legacy portal has since been decommissioned), so these are the screens I was able to capture before that access was lost.
The redesign spanned 100+ screens across the platform. Below are two modules representative screens I can walk through in detail from problem to decision rationale. The original 'before' interface is no longer accessible (the legacy portal has since been decommissioned), so these are the screens I was able to capture before that access was lost.
Campaign Groups
Campaign Groups
Campaign Groups serves as one of the core workflow that brings together strategy configuration, channel selection, audience targeting, and execution.
Campaign Groups serves as one of the core workflow that brings together strategy configuration, channel selection, audience targeting, and execution.
Status Visibility & System Feedback
Status Visibility & System
Feedback
Status Visibility & System Feedback
Status Visibility & System Feedback
For reviewers processing dozens of campaigns a day, ambiguous status colors meant re-checking work that was already approved a direct hit to their daily throughout.
For reviewers processing dozens of campaigns a day, ambiguous status colors meant re-checking work that was already approved a direct hit to their daily throughout.
Before - Home Screen
Before - Home Screen

Before: Campaign status was communicated through heavy red blocks that dominated the table regardless of severity a minor pending action looked identical in urgency to a blocking error and poor toaster message that appears on top left.
Before: Campaign status was communicated through heavy red blocks that dominated the table regardless of severity a minor pending action looked identical in urgency to a blocking error and poor toaster message that appears on top left.
After - Home Screen
After - Home Screen

After: I introduced a tiered status system where color, icon, and label working together so reviewers could tell at a glance what needed action versus what was already resolved, cutting redundant re-checks out of their workflow entirely. User gets notified through toasters that are colors coded.
After: I introduced a tiered status system where color, icon, and label working together so reviewers could tell at a glance what needed action versus what was already resolved, cutting redundant re-checks out of their workflow entirely. User gets notified through toasters that are colors coded.
Before: Campaign status was communicated through heavy red blocks that dominated the table regardless of severity a minor pending action looked identical in urgency to a blocking error and poor toaster message that appears on top left.
Before - Home Screen
Before: Campaign status was communicated through heavy red blocks that dominated the table regardless of severity a minor pending action looked identical in urgency to a blocking error and poor toaster message that appears on top left.
Before: Campaign status was communicated through heavy red blocks that dominated the table regardless of severity a minor pending action looked identical in urgency to a blocking error and poor toaster message that appears on top left.
After - Home Screen


After: I introduced a tiered status system where color, icon, and label working together so reviewers could tell at a glance what needed action versus what was already resolved, cutting redundant re-checks out of their workflow entirely. User gets notified through toasters that are colors coded.
After: I introduced a tiered status system where color, icon, and label working together so reviewers could tell at a glance what needed action versus what was already resolved, cutting redundant re-checks out of their workflow entirely. User gets notified through toasters that are colors coded.
Modal Overload & Visual Hierarchy
Modal Overload & Visual
Hierarchy
Modal Overload & Visual Hierarchy
When a submitter can't visually distinguish where one section ends and the next begins, or which action actually moves them forward, setup stops being a quick task and becomes a hunt and losing all background context in a full-screen overlay meant users had no way to cross-reference the record they were configuring against, forcing them to close and reopen the flow just to check something they should've been able to see the whole time.
When a submitter can't visually distinguish where one section ends and the next begins, or which action actually moves them forward, setup stops being a quick task and becomes a hunt and losing all background context in a full-screen overlay meant users had no way to cross-reference the record they were configuring against, forcing them to close and reopen the flow just to check something they should've been able to see the whole time.
After - Add Campaign Group
Before - Add Campaign Group
Before - Add Campaign Group
Before - Add Campaign Group

Before: The "Add Voice Campaign Group" flow buried its primary action inside a low-contrast round button with no visual dominance. The full-screen overlay blocked all background context, and input borders fell below usable contrast thresholds. Required fields are not informed before hand.
Before: The "Add Voice Campaign Group" flow buried its primary action inside a low-contrast round button with no visual dominance. The full-screen overlay blocked all background context, and input borders fell below usable contrast thresholds. Required fields are not informed before hand.
After - Add Campaign Group
After - Add Campaign Group


.After: I added the modal to preserve background context instead of fully obscuring it, and elevated critical system constraints like "Name and type can't be edited after saving" out of buried helper text into a structured information alert at the top of the flow, so users made irreversible decisions with the right information in front of them, not after the fact. I collected the basic information for creation not forcing the user to fill in all details right away they are given the option to create and create & edit option. I also brought the modal in line with the system's design tokens for typography and spacing, so section boundaries read clearly without needing labels to do all the work.
Before - Add Campaign Group
After - Add Campaign Group
After - Add Campaign Group

.After: I added the modal to preserve background context instead of fully obscuring it, and elevated critical system constraints like "Name and type can't be edited after saving" out of buried helper text into a structured information alert at the top of the flow, so users made irreversible decisions with the right information in front of them, not after the fact. I collected the basic information for creation not forcing the user to fill in all details right away they are given the option to create and create & edit option. I also brought the modal in line with the system's design tokens for typography and spacing, so section boundaries read clearly without needing labels to do all the work.
.After: I added the modal to preserve background context instead of fully obscuring it, and elevated critical system constraints like "Name and type can't be edited after saving" out of buried helper text into a structured information alert at the top of the flow, so users made irreversible decisions with the right information in front of them, not after the fact. I collected the basic information for creation not forcing the user to fill in all details right away they are given the option to create and create & edit option. I also brought the modal in line with the system's design tokens for typography and spacing, so section boundaries read clearly without needing labels to do all the work.
High Cognitive Load & Weak Feedback
High Cognitive Load & Weak
Feedback
High Cognitive Load & Weak Feedback
For a parameter-heavy configuration screen like this, ungrouped fields don't just look messy they raise the real risk of a user setting a threshold or increment value without understanding its effect, since nothing on screen told them what a safe or valid range even looked like. At the scale this platform operates, a misconfigured threshold isn't a cosmetic error, it's a live campaign behaving incorrectly.
For a parameter-heavy configuration screen like this, ungrouped fields don't just look messy they raise the real risk of a user setting a threshold or increment value without understanding its effect, since nothing on screen told them what a safe or valid range even looked like. At the scale this platform operates, a misconfigured threshold isn't a cosmetic error, it's a live campaign behaving incorrectly.
Before - Configure Campaign Group
Before - Configure Campaign Group

Before: Parameters for Balancing, Threshold, and Delivery settings were mixed together with no logical grouping, so a user configuring one aspect of the campaign had to visually parse the entire form to find related fields. There was no contextual help attached to any parameter a threshold or increment value with no explanation of what it controlled or what range was valid and the modal overlay reduced awareness of the record being edited in the background. Here the same input fields are differently handled at two places.
Before: Parameters for Balancing, Threshold, and Delivery settings were mixed together with no logical grouping, so a user configuring one aspect of the campaign had to visually parse the entire form to find related fields. There was no contextual help attached to any parameter a threshold or increment value with no explanation of what it controlled or what range was valid and the modal overlay reduced awareness of the record being edited in the background. Here the same input fields are differently handled at two places.
Before: Parameters for Balancing, Threshold, and Delivery settings were mixed together with no logical grouping, so a user configuring one aspect of the campaign had to visually parse the entire form to find related fields. There was no contextual help attached to any parameter a threshold or increment value with no explanation of what it controlled or what range was valid and the modal overlay reduced awareness of the record being edited in the background. Here the same input fields are differently handled at two places.
After - Configure Campaign Group

After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.
After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration — so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.
After - Configure Campaign Group
After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration — so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.

After - Configure Campaign Group
After - Configure Campaign Group
After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.


After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.
After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.
Historical Reports
Historical Reports
A module for creating, scheduling, and reviewing past campaign reports, redesigned to reduce cognitive load, clarify saved report identity, and simplify complex filtering into a guided flow.. As one of the largest modules in the platform, it needed to handle a high volume of configuration options without overwhelming the user at any single step.
A module for creating, scheduling, and reviewing past campaign reports, redesigned to reduce cognitive load, clarify saved report identity, and simplify complex filtering into a guided flow.. As one of the largest modules in the platform, it needed to handle a high volume of configuration options without overwhelming the user at any single step.
A module for creating, scheduling, and reviewing past campaign reports, redesigned to reduce cognitive load, clarify saved report identity, and simplify complex filtering into a guided flow.. As one of the largest modules in the platform, it needed to handle a high volume of configuration options without overwhelming the user at any single step.
A module for creating, scheduling, and reviewing past campaign reports, redesigned to reduce cognitive load, clarify saved report identity, and simplify complex filtering into a guided flow.. As one of the largest modules in the platform, it needed to handle a high volume of configuration options without overwhelming the user at any single step.
Clear Copy and Hierarchy
Clear Copy and Hierarchy
For a module built around reviewing historical data across potentially dozens of saved reports, indistinguishable names and an unlabeled entry point meant users had to open reports one by one just to figure out which was which turning a lookup task into trial and error, and adding friction to a module people return to repeatedly rather than use once.
For a module built around reviewing historical data across potentially dozens of saved reports, indistinguishable names and an unlabeled entry point meant users had to open reports one by one just to figure out which was which turning a lookup task into trial and error, and adding friction to a module people return to repeatedly rather than use once.
Before - Home Screen
Before - Home Screen

Before: The main report list screen copy did not convey what it meant. The primary action to create a new report was a floating orange "+" button with no label, while the table itself gave no clear hierarchy between primary actions (view/open) and secondary ones (schedule, history, more options).
Before: The main report list screen copy did not convey what it meant. The primary action to create a new report was a floating orange "+" button with no label, while the table itself gave no clear hierarchy between primary actions (view/open) and secondary ones (schedule, history, more options).
Before: The main report list screen copy did not convey what it meant. The primary action to create a new report was a floating orange "+" button with no label, while the table itself gave no clear hierarchy between primary actions (view/open) and secondary ones (schedule, history, more options).
After - Home Screen

After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight.
After - Home Screen
After - Home Screen

After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight. I also restructured the sidebar so Historical Reports sits clearly within a "Reports" group alongside Dashboard, Data Extract, and Performance, giving it proper information-architecture context instead of sitting as an isolated item.
After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight. I also restructured the sidebar so Historical Reports sits clearly within a "Reports" group alongside Dashboard, Data Extract, and Performance, giving it proper information-architecture context instead of sitting as an isolated item.
After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight. I also restructured the sidebar so Historical Reports sits clearly within a "Reports" group alongside Dashboard, Data Extract, and Performance, giving it proper information-architecture context instead of sitting as an isolated item.
After - Home Screen

After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight. I also restructured the sidebar so Historical Reports sits clearly within a "Reports" group alongside Dashboard, Data Extract, and Performance, giving it proper information-architecture context instead of sitting as an isolated item.
After: I gave saved reports as the name of the tab so users could know it as the "Home" list view. I replaced the unlabeled "+" with an explicit "Create New Report" button as the clear primary action, and surfaced supporting actions search, refresh, duplicate, filter, and export history as consistent icon-based secondary actions along the table header, so primary and secondary actions are never competing for the same visual weight. I also restructured the sidebar so Historical Reports sits clearly within a "Reports" group alongside Dashboard, Data Extract, and Performance, giving it proper information-architecture context instead of sitting as an isolated item.
Cognitive Overload
Cognitive Overload
Facing 89 checkboxes and every filter category open by default meant users had to scroll and hunt just to find the handful of fields they actually needed, turning report creation into a search task before it was even a configuration task.
Facing 89 checkboxes and every filter category open by default meant users had to scroll and hunt just to find the handful of fields they actually needed, turning report creation into a search task before it was even a configuration task.
Before - Filtering
Before - Filtering

Before: Every parameter, filter, and display field was crammed onto a single screen. 89 display field options alone, all expanded and visible at once alongside timezone, report view, period, and five filter tabs.
Before: Every parameter, filter, and display field was crammed onto a single screen. 89 display field options alone, all expanded and visible at once alongside timezone, report view, period, and five filter tabs.
After - Filtering
After - Filtering


After: I broke the flow into collapsible sections. Report Parameters, Data Filters, Display Fields so only relevant sections expand at a time, and moved deep field lists into a separate filtered view users open only when needed, letting them view and configure a large field selectively instead of scanning everything at once.
After: I broke the flow into collapsible sections. Report Parameters, Data Filters, Display Fields so only relevant sections expand at a time, and moved deep field lists into a separate filtered view users open only when needed, letting them view and configure a large field selectively instead of scanning everything at once.
After - Filtering

After: I broke the flow into collapsible sections. Report Parameters, Data Filters, Display Fields so only relevant sections expand at a time, and moved deep field lists into a separate filtered view users open only when needed, letting them view and configure a large field selectively instead of scanning everything at once.
Redundant Field Order
Redundant Field Order
Scheduling a recurring report without visible timezone context meant users couldn't be sure what time their report would actually send a small ambiguity that erodes trust every time the report doesn't land when expected.
For a parameter-heavy configuration screen like this, ungrouped fields don't just look messy they raise the real risk of a user setting a threshold or increment value without understanding its effect, since nothing on screen told them what a safe or valid range even looked like. At the scale this platform operates, a misconfigured threshold isn't a cosmetic error, it's a live campaign behaving incorrectly.
For a parameter-heavy configuration screen like this, ungrouped fields don't just look messy they raise the real risk of a user setting a threshold or increment value without understanding its effect, since nothing on screen told them what a safe or valid range even looked like. At the scale this platform operates, a misconfigured threshold isn't a cosmetic error, it's a live campaign behaving incorrectly.
Before - Schedule Report
Before - Schedule Report

Before: Frequency, day, and time fields sat in a single flat form with no timezone context shown, and a long warning paragraph about password protection ran directly beneath the email field with no visual separation.
Before: Frequency, day, and time fields sat in a single flat form with no timezone context shown, and a long warning paragraph about password protection ran directly beneath the email field with no visual separation.
Before: Frequency, day, and time fields sat in a single flat form with no timezone context shown, and a long warning paragraph about password protection ran directly beneath the email field with no visual separation.
Before: Frequency, day, and time fields sat in a single flat form with no timezone context shown, and a long warning paragraph about password protection ran directly beneath the email field with no visual separation.
After - Schedule Report

After: I added explicit timezone display next to Report Time, grouped Report Time and Report Day side by side instead of stacked separately, and gave the password warning its own visually distinct space instead of blending into surrounding form text.
After - Schedule Report
After - Schedule Report

After: I restructured the form into clear parameter clusters Volume Settings, Threshold Controls, and Queue Configuration — so related fields are visually grouped instead of scattered. I added inline min/max range hints directly under each input (e.g. "Min: 1, Max: 99,999") so users get contextual guidance at the point of entry rather than having to guess or fail on submit, and gave toggle states like campaign segment balancing explicit visual differentiation so enabled/disabled states are unambiguous at a glance.
After: I added explicit timezone display next to Report Time, grouped Report Time and Report Day side by side instead of stacked separately, and gave the password warning its own visually distinct space instead of blending into surrounding form text.
After: I added explicit timezone display next to Report Time, grouped Report Time and Report Day side by side instead of stacked separately, and gave the password warning its own visually distinct space instead of blending into surrounding form text.
After - Schedule Report

After: I added explicit timezone display next to Report Time, grouped Report Time and Report Day side by side instead of stacked separately, and gave the password warning its own visually distinct space instead of blending into surrounding form text.
After: I added explicit timezone display next to Report Time, grouped Report Time and Report Day side by side instead of stacked separately, and gave the password warning its own visually distinct space instead of blending into surrounding form text.
Rethinking Manage Contacts
Then I got one
completely wrong
I worked on Manage Contacts as an entire module.
I worked on Manage Contacts as an entire module.
Version 1
Version 1
My initial interpretation treated the filtering experience as part of a creation workflow. The assumption was roughly:
My initial interpretation treated the filtering experience as part of a creation workflow. The assumption was roughly:
Create template
Create template
Filter Contacts
Filter Contacts
Perform Action
Perform Action
View Data
View Data
Save template
Save template
Edit template
Create template
Filter Contacts
Perform Action
View Data
Save template
Edit template


But during stakeholder discussions, that model was challenged. The filters weren’t meant to force users into creating a template.
But during stakeholder discussions, that model was challenged. The filters weren’t meant to force users into creating a template.
Finalised Version
Finalised Version
The actual use case was more flexible. A user might simply want to follow this flow and they may or may not want to save that result. That changed the entire structure of the module. This was a full redesign of the module rather than a UI refinement. And this became one of the most useful lessons from the project: a design can be internally consistent and still be based on the wrong mental model.
The actual use case was more flexible. A user might simply want to follow this flow and they may or may not want to save that result. That changed the entire structure of the module. This was a full redesign of the module rather than a UI refinement. And this became one of the most useful lessons from the project: a design can be internally consistent and still be based on the wrong mental model.
Filter contacts
Filter contacts
View data
View data
Perform Action
Perform Action
Save as template or filter
Save as template or filter
Saved in queries
Saved in queries
Filter contacts
View data
Perform Action
Save as template or filter
Saved in queries


Going beyond the design system
Going beyond the design system
Script Designer
Script Designer
The client requested a workflow change for Script Designer that didn't map to any existing pattern in the platform this wasn't a straightforward redesign of an existing screen, but a rethink of how the module needed to function. Because this was for the main client, we had more room to deviate from the established design system than usual, as long as any new approach stayed achievable for the dev team to build.
The client requested a workflow change for Script Designer that didn't map to any existing pattern in the platform this wasn't a straightforward redesign of an existing screen, but a rethink of how the module needed to function. Because this was for the main client, we had more room to deviate from the established design system than usual, as long as any new approach stayed achievable for the dev team to build.

Edit Form
Repurposed the platform's existing form pattern to support conditional question logic and validators, letting non-technical staff build structured intake forms without needing a developer.
Edit Form
Repurposed the platform's existing form pattern to support conditional question logic and validators, letting non-technical staff build structured intake forms without needing a developer.
Edit Form
Repurposed the platform's existing form pattern to support conditional question logic and validators, letting non-technical staff build structured intake forms without needing a developer.
Repurposed the platform's existing form pattern to support conditional question logic and validators, letting non-technical staff build structured intake forms without needing a developer.

Drag & Drop Variables
Adapted the existing panel component into a searchable variable library, letting users insert business parameters and global variables directly into question text through drag and drop instead of manual entry.
Adapted the existing panel component into a searchable variable library, letting users insert business parameters and global variables directly into question text through drag and drop instead of manual entry.

Flowchart
Built a new visual flow view on top of existing platform patterns, giving users a clear map of question branching and conditions that didn't exist anywhere else in the platform before this module.
Flowchart
Built a new visual flow view on top of existing platform patterns, giving users a clear map of question branching and conditions that didn't exist anywhere else in the platform before this module.
Flowchart
Built a new visual flow view on top of existing platform patterns, giving users a clear map of question branching and conditions that didn't exist anywhere else in the platform before this module.
Built a new visual flow view on top of existing platform patterns, giving users a clear map of question branching and conditions that didn't exist anywhere else in the platform before this module.

Edit Flowchart
Connected the flowchart view directly to the form editor, so changes to conditional logic reflect immediately in both the visual flow and the underlying form, keeping the two in sync as the workflow gets built out.
Connected the flowchart view directly to the form editor, so changes to conditional logic reflect immediately in both the visual flow and the underlying form, keeping the two in sync as the workflow gets built out.
Extending the existing system
Sometimes the new
requirement
doesn’t fit the old
pattern
Sometimes the new requirement doesn’t fit the old
pattern
Sometimes the new
requirement doesn’t fit
the old pattern
While working on Tools, I came across a different kind of problem. The Purge & Archive section introduced a use case that the existing table structure wasn’t designed for. It needed a child table. Until that use case appeared, the existing structure was enough.
So rather than introducing a one-off solution inside the module, I explored how a parent-child table pattern could work within the broader product. I proposed the pattern to the Nimbus Council, considering how it could work for both the Report Table and Core Table.
While working on Tools, I came across a different kind of problem. The Purge & Archive section introduced a use case that the existing table structure wasn’t designed for. It needed a child table. Until that use case appeared, the existing structure was enough.
So rather than introducing a one-off solution inside the module, I explored how a parent-child table pattern could work within the broader product. I proposed the pattern to the Nimbus Council, considering how it could work for both the Report Table and Core Table.
The component had to serve the interaction, not just the system
The component had to serve the interaction, not just the system
One example was changing a slider-based interaction to a numeric control. The design system already had a suitable numeric component, but that wasn’t the only reason I used it.
One example was changing a slider-based interaction to a numeric control. The design system already had a suitable numeric component, but that wasn’t the only reason I used it.
Old Design
Old Design

For values where users may need to make precise changes across a large range, repeatedly dragging a slider isn’t always the most efficient interaction.
For values where users may need to make precise changes across a large range, repeatedly dragging a slider isn’t always the most efficient interaction.
New Design
New Design

A numeric input allows users to enter a value directly, increment/decrement precisely, and use the keyboard while still remaining consistent with the broader component system.
A numeric input allows users to enter a value directly, increment/decrement precisely, and use the keyboard while still remaining consistent with the broader component system.
New Design



A numeric input allows users to enter a value directl,increment/decrement precisely, and use the keyboard while still remaining consistent with the broader component system.
A numeric input allows users to enter a value directly, increment/decrement precisely, and use the keyboard while still remaining consistent with the broader component system.
A numeric input allows users to enter a value directl,increment/decrement precisely, and use the keyboard while still remaining consistent with the broader component system.
So the reasoning wasn’t: “The design system told me to use this.” It was: “The interaction called for precision, and the design system already gave me a consistent way to support it.” That’s a much stronger design rationale.
So the reasoning wasn’t: “The design system told me to use this.” It was: “The interaction called for precision, and the design system already gave me a consistent way to support it.” That’s a much stronger design rationale.
So the reasoning wasn’t: “The design system told me to use this.” It was: “The interaction called for precision, and the design system already gave me a consistent way to support it.” That’s a much stronger design rationale.
Collapsible Table
Collapsible Table
As multiple modules required expandable data tables, I identified a gap in the design system where no standardized collapsible table pattern existed. I explored several approaches and presented multiple design options. Through iterative discussions and refinements, the pattern was consolidated into a single solution
As multiple modules required expandable data tables, I identified a gap in the design system where no standardized collapsible table pattern existed. I explored several approaches and presented multiple design options. Through iterative discussions and refinements, the pattern was consolidated into a single solution


Explorations
Explorations
Text Wrap
Text Wrap
I identified a limitation in the design system around table headers with longer labels and proposed design solutions for supporting text wrapping. The recommendations focused on preserving readability, consistency, and scalability across data-heavy interfaces.
I identified a limitation in the design system around table headers with longer labels and proposed design solutions for supporting text wrapping. The recommendations focused on preserving readability, consistency, and scalability across data-heavy interfaces.


Grouped Headers
Grouped Headers
I proposed a grouped table header solution to better structure related data points within dense tables.
I proposed a grouped table header solution to better structure related data points within dense tables.

Designing Beyond the Visual Layer
Designing Beyond the Visual Layer
Accessibility wasn’t something I wanted to check after finishing the UI. Across the modules I worked on, I considered keyboard interaction, focus behaviour, narration/audio considerations, contrast and component states.
The challenge was particularly relevant in a product with dense enterprise workflows.
A hierarchy that works visually still needs to make sense when someone navigates it differently.
Accessibility wasn’t something I wanted to check after finishing the UI. Across the modules I worked on, I considered keyboard interaction, focus behaviour, narration/audio considerations, contrast and component states.
The challenge was particularly relevant in a product with dense enterprise workflows.
A hierarchy that works visually still needs to make sense when someone navigates it differently.
Accessibility wasn’t something I wanted to check after finishing the UI. Across the modules I worked on, I considered keyboard interaction, focus behaviour, narration/audio considerations, contrast and component states.
The challenge was particularly relevant in a product with dense enterprise workflows.
A hierarchy that works visually still needs to make sense when someone navigates it differently.
Narration testing
Narration testing
Used screen narration to confirm that content, labels, and interactive components were announced clearly and in the correct sequence.
Used screen narration to confirm that content, labels, and interactive components were announced clearly and in the correct sequence.
Keyboard navigation
Keyboard navigation
Verified that interactive elements could be accessed and navigated using only the keyboard, ensuring a logical focus order.
Verified that interactive elements could be accessed and navigated using only the keyboard, ensuring a logical focus order.
Verified that interactive elements could be accessed and navigated using only the keyboard, ensuring a logical focus
order.
Contrast audit
Contrast audit
Evaluated color contrast between text, UI elements, and backgrounds to improve readability and support users with visual impairments.
Evaluated color contrast between text, UI elements, and backgrounds to improve readability and support users with visual impairments.
From Design to Production
From Design to Production
For my assigned modules, I wasn’t only designing the screens. I was involved in the discussions around what we should build, stakeholder reviews, developer handoff and QA.
Every module I worked on received stakeholder approval and was implemented in production. As more modules adopted the shared patterns, inconsistencies became easier to address across the product.
For my assigned modules, I wasn’t only designing the screens. I was involved in the discussions around what we should build, stakeholder reviews, developer handoff and QA.
Every module I worked on received stakeholder approval and was implemented in production. As more modules adopted the shared patterns, inconsistencies became easier to address across the product.
What I Learned
What I Learned
Campaign Manager was my first deeper experience working on a complex B2B product. It taught me that enterprise UX isn’t necessarily about making everything look simpler. It’s about understanding why the complexity exists, deciding what users actually need to see and do, and creating a structure that helps them navigate that complexity.
I learned to question existing assumptions, defend design decisions with reasoning, take rejection as part of the process and think beyond the screen I was currently designing.
Campaign Manager was my first deeper experience working on a complex B2B product. It taught me that enterprise UX isn’t necessarily about making everything look simpler. It’s about understanding why the complexity exists, deciding what users actually need to see and do, and creating a structure that helps them navigate that complexity.
I learned to question existing assumptions, defend design decisions with reasoning, take rejection as part of the process and think beyond the screen I was currently designing.
Other Projects
Other Projects

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.

Available for work
- Let’s Connect
I am open for
Full-Time roles.
Nivethaarul © 2026.


