This is a public Blog  publicRSS

Posts

  • Luis Melo
    Fine-Tuning Your Service Cloud Configuration Settings5100%
    Entry posted June 7, 2018 by Luis MeloMaster, tagged Member Spotlight, Product / Product Release 

    Oracle Service Cloud has circa 500 configuration settings, which control the platform’s functions. This is part of what makes it so powerful…there are endless ways to configure and customize the solution to fit your needs! Some of these configuration settings are commonly used, but many of them are not as well known. Make sure you’re fine-tuning these levers and buttons within your Oracle Service Cloud implementation to fit your organization’s unique needs and to deliver great experiences to your customers.

    I have been covering some of these lesser known configuration settings on my blog, Doctor CX, and for the next installment of configuration settings, I wanted to feature configuration settings shared by my fellow CX Heroes in the Oracle Service Cloud Hero Hub.

    Disable Chat on Holidays

    Jessica CampbellThe CS_HOLIDAY_MSG_ENABLED configuration setting was mentioned by Jessica Campbell, Program Manager of Customer Experience at Brother International Corporation (and fellow Community All-Star!). Jessica used this configuration setting to disable the chat during holidays.

    If it is enabled (set to “Yes”) then OSvC will use the holidays table (which you can find in Configurations > Service > Service Level Agreements > Holidays) to determine whether the Live Chat should be enabled or disabled.

    If your customers try to use the Live Chat channel on a date that is specified as a holiday, they will be shown a message stating it is a holiday and no agent is available.

    The default value for this configuration setting is disabled (set to “No”).

    Give Agents a Head Start on Answering Questions

    Kristine TannertThe SNEAK_PREVIEW_ENABLED configuration setting was shared by Kristine Tannert, Product Manager for Insperity. She says her agents love the Sneak Preview functionality, as it allows them to get ahead of the game and prepare responses on chat with the customers. This is particularly helpful since the questions their agents have to answer for customers can sometimes take awhile to investigate, so anything that helps them get a jumpstart on answering the customers question is appreciated!

    It enables the Sneak Preview functionality, which allows agents to preview what a customer is typing prior to the customer sending the message.The default value for this configuration setting is disabled (set to “No”).

    QA Your Chat Transcripts

    Robert PozderecThe INC_INCLUDE_POST_TIME configuration setting was mentioned by Robert Pozderec, Manager of Customer Loyalty and Retention from Brother International Corporation, who said it is an extremely important setting when it comes to QA (Quality Assurance).

    It specifies whether the post time is to be included in incidents created for a Chat session, meaning messages in the chat transcript will have a date and time against it. The default value for this configuration setting is disabled (set to “No”).

    Run Large Reports with Custom Scripts

    Sasi GudimettaThe CUSTOM_SCRIPT_DATA_SIZE configuration setting was highlighted by Sasi Gudimetta, Senior Software Engineer at partner AST Corporation, who shared that he usually works with reports that have custom scripts, and these have a query data limit, controlled by this setting, which needs to be increased to avoid the script from stopping after the defined number of rows, and the report output from being “No Value”.

    This configuration setting specifies the size of the data buffer (in bytes) used when processing custom scripts in Analytics.

    The default value for this configuration setting is 50,000. The minimum value is zero (0) and the maximum value is 2,147,483,647.

    Keep in mind increasing this to a large value causes the custom script to parse more of the report data (which is good!), but this also causes additional load on the server, which could result in negative performance impact for the overall site (not so good!).

     

    Hopefully, these config setting tips (and use cases!) encourages you to keep digging into those 500+ config settings in Oracle Service Cloud. I’d love to hear what your experience has been with these configuration settings (e.g. feedback, use cases).

     

  • Daniel Foppen
    What's Waiting in Oracle Service Cloud 18B Release for...10100%
    Entry posted May 24, 2018 by Daniel FoppenJourneyer, tagged Product / Product Release 

    Oracle Service Cloud 18B release is now live and waiting for you! You'll find new functionalities and enhancements that empower our customers to streamline and simplify the service experience for agents and consumers.

    The Oracle Service Cloud 18B Release includes some exciting new features including:

    • Virtual Assistant
    • XML sitemaps with the web collection crawling content processing function
    • An Integration Cloud Service OPA adapter
    • Service Cloud Platform including, Enhancements to SAML Single Logout, Incident Threads Masking, and Data Lifecycle Enhancements

    To learn more, watch the Oracle Service Cloud 18B release video, Part I and 2.

    Oracle Service Cloud 18B Release Video, Part I

     

     

     

     

     

     

     

     

    Oracle Service Cloud 18B Release Video, Part 2

    Oracle Service Cloud 18B Release Video, Part 1

     

     

     

     

     

     

     

    Oracle Service Cloud 18B Release Resources

    For more detailed information on these and a rest of the features in the 18B release please visit the resources below.

    Leave a comment with what you're most excited using in Oracle Service Cloud 18B and how you're thinking about using it in your organization. We'd love to hear from you.

     

     
  • DanO
    LinkedIn’s Elegant Solution to Monitoring Network P...11100%
    Entry posted May 8, 2018 by DanOJourneyer, tagged Best Practices, Member Spotlight, Product / Product Release 

    I’ve been working with Oracle Service Cloud since 2007 (back when it was still RightNow). For the past five years I’ve managed LinkedIn’s Oracle Service Cloud implementation, handling everything from standard administration tasks and managing workspaces, workflows and business rules to doing C# development for Add-Ins.

    Recently, I had an “aha” moment. I discovered a way to monitor network performance for Oracle Service Cloud (and beyond!). This solution changed the game for LinkedIn, and I wanted to share in hopes it might help others.

    Challenge: Doing Root Cause Analysis of Performance Complaints

    LinkedIn has been using Oracle Service Cloud for several years across our contact centers, located in primarily in the U.S., Dublin, Singapore, and Bangalore. During this time our global team has reported that Oracle Service Cloud was s-l-o-w or crashing from time to time.

    Our Oracle Service Cloud administration team would investigate these issues, but it was extremely difficult to know where the issue originated. Was it a problem with Oracle Service Cloud, the internet connection for a specific LinkedIn location, or the agent’s computer? Were our scheduled reports and system utilities running at 12am CST causing performance issues for our Bangalore team? To make things harder our administration team is primarily based in the U.S., so we couldn’t always troubleshoot our global team’s issues real-time.

    Despite our best efforts at resolution we didn’t have a consistent, efficient solution for identifying the root cause of Oracle Service Cloud performance complaints. It was an ongoing headache and black hole of effort for our team.

    Solution: Create Network Performance Monitor Add-In

    During a discussion around our need for visibility into network performance issues, a thought occurred: the Add-In framework was always running in the background within Oracle Service Cloud and I could set up an Add-In to create an ongoing log of network performance metrics across all of our office locations and remote agents.

    Diagram of LinkedIn's Network Performance Monitor Add-In SolutionI spent a day designing, building and testing a solution using:

    • A custom object to store a wide array of network performance data
    • A lightweight Add-In that would ping five globally accessible sites: Oracle Service Cloud chat server, Oracle Service Cloud production server, LinkedIn.com, Google.com and Facebook.com. The Add-In starts logging when the user logs in and runs in the background every 15 minutes until they logout. I tried to find a balance between storage space created by these logs and having enough data to be useful. For example, an hour between each monitoring cycle is too long to determine how the network was performing at the time of a complaint.

    This solution generates several data points on network performance across five sites for the entire day (because users start at different times) for every Oracle Service Cloud agent worldwide at LinkedIn.

    Benefits: Faster Root Cause Analysis, Improved Performance and More!

    Now when we receive a complaint about Oracle Service Cloud performance, we can easily check the logs from our Network Performance Monitor Add-In and quickly tell if a network issue is/was the cause. We can also then identify if it was isolated to the Oracle Service Cloud servers, network issues at a specific LinkedIn office, or only impacting a specific agent’s local machine.

    Having consistent, high-level visibility into network performance saves my team countless hours of troubleshooting! Instead of working with IT and 15 other teams trying to gather and analyze data, we now have a good starting point and can identify the root cause significantly faster.

    While this customization was designed to help with troubleshooting, we’ve experienced many other benefits, including:

    • We understand how ping times vary across locations and have clearer expectations on performance across different channels (e.g. “How fast is chat in Bangalore?”). We can run performance benchmarking across locations.
    • We don’t have to ask users to send screenshots, run network traces, try other browsers or applications. Ironically, we have many of people say, “No, everything else is running fine,” but the network performance monitor logs tell a different story!
    • We submit fewer service requests to Technical Support unless it’s an Oracle Service Cloud-specific issue.
    • We share network performance data from our logs with our local IT teams when there are issues, so they can pinpoint those specific timeframes in their own logs to see what is going on. We can use this data to drive network performance improvements in our support locations.

    Since we can nail down the source of performance complaints, we’ve had fewer inaccurate reports of Oracle Service Cloud performance issues, and we have saved a significant amount of time on troubleshooting issues ultimately not related to Oracle Service Cloud! In short, this relatively simple Oracle Service Cloud customization has created huge value.

    Advice: Sharing A Few Tricks of the Trade

    If you’re interested in creating a Network Performance Monitoring Add-In for your organization here are some things to keep in mind:

    • First, have a clear picture of what you’re doing and why. The specifics of our solution might not make sense for your organization.
    • Timer events are your friend. You can configure it to kick off every minute, five minutes, 15 minutes, etc.
    • Pick an Add-In that is always running, instead of a conditional Add-In (e.g. report Add-Ins can only run when the related report is open). I used a Navigation Section Add-In that loads as soon as someone logs in and continues to run the entire time in the background - the user doesn’t even know it’s there, and it has no performance impact if you (correctly) use threading / tasks.
    • The .NET framework allows you to set up a server config variable in OSC which gives admins the ability to change those property values without requiring a developer. I used the server config variable to set our timer event interval which allows the admin team to change the default value from 15 minutes to one, five, or 10 minutes, etc. This also enables the admin team to change the list of URLs the Add-In pings on the fly. They can make adjustments based on specific business scenarios without having to engage a developer to make these changes in the code.
    • Test, test, test! Verify your Add-In is working like you expected by plugging in sample data and watch it work. Manually verify that the data being collected matches your expectations in testing.

     

    I hope this helps other organizations who may be struggling with similar issues and encourages you to take a step back when faced with common challenges and look for an entirely different solution. I’d love to hear your feedback on our solution or any other ways you’ve effectively dealt with this sort of challenge.

  • eleep
    Announcing Oracle Service Cloud 2018 Community All-Stars22100%
    Entry posted May 3, 2018 by eleepHero, tagged Awards, Member Spotlight 

    It’s an exciting time to be working in the customer experience space. You can map and create customer journeys that span systems and departments both online and offline, and generate unforgettable customer experiences and tangible results for your organization!

    But if we’re honest, it can be overwhelming time too. There are infinite possibilities on how solutions can be implemented, integrated and maintained. Best practices vary depending on your industry, company size, specifics of your implementation, etc. Customers’ expectations are being shaped by the likes of Amazon and Google. And don’t forget about the new privacy policy regulations, proliferation of channels, and the required technology framework upgrade.

    When facing this evolution, stay proactive and make sure you have access to trustworthy information and help. While many valuable resources exist, it’s impossible for curated materials to cover the infinite number of possibilities customer service practitioners, like you, encounter. That’s where the “power of the Community” comes in! It provides a place to ask, learn, explore and collaborate with other like-minded people.

    There is an elite group of individuals who truly embody the “power of the Community.” These individuals are proven experts, leaders and stewards in the Oracle Service Cloud Community (both here on these forums and beyond). These individuals generously offer their knowledge to help others find success. These elite members are truly All-Stars.

    It is my pleasure to introduce our 2018 Community All-Stars from all over the world:

    I wanted to add a few special call-out’s:

    • Four of this year's All-Stars, including Jessica Campbell, Pavol Procka, Richard Keevil and Zsolt Tolgyesi, are from customer organizations. This is a noteworthy accomplishment as our All-Star line-up has historically been dominated by partners.
    • Congrats to Hardik Gupta and Zsolt Tolgyesi whose Oracle Field Service Cloud expertise has helped jumpstart the Field Service forum.
    • Finally, we’d like to give special call-out to Simon Kilgarriff who qualified as an Oracle Service Cloud 2018 Community All-Star but recently joined Oracle as a CX Consultant. Of course, we’re not surprised Simon had this opportunity, and we’re excited to work with him on the Oracle team! smiley

    To become a Community All-Star, a member must demonstrate both expertise and a willingness to roll up his or her sleeves and be a leader within the Oracle Service Cloud Community. These members not only engage frequently, but also have a consistent track record of delivering quality responses. In other words, All-Star members know their stuff and are willing to share knowledge with their peers.

    This may take the form of consistently answering forum questions as well as contributing helpful content such as report recipes to the Analytics Cookbook, sample code, blog posts (such as Luis with his Doctor CX blog), etc. All-Stars contribute in varied ways, but each person's impact has a bigger ripple impact in the larger Service Cloud ecosystem. If you believe you have what it takes to be included amongst the best of the best, reach out to me for more info!

    Join me in thanking these All-Stars for giving generously of their time, knowledge and expertise to help everyone here be more successful at their job, using Oracle Service Cloud, and creating better customer experiences across the world.

  • Nate Hossner, Oracle
    Answer Versioning and Other Highlights in Oracle Service...1100%
    Entry posted April 30, 2018 by Nate Hossner, OracleWhiz, tagged Product / Product Release 

    I’m back from Modern Customer Experience in Chicago and the customers I met are really excited about Answer Versioning in 18A!

    In case you haven’t heard, Answer Versioning is available in 18A in Knowledge Foundation. It allows knowledge authors to draft and publish multiple versions of answers, compare them side-by-side and view historical and live versions of an answers. To enable this for your knowledge team, just add the Answer Versioning workspace elements to your answer workspace. Details here and video overview here and here.

    With about a quarter of our customers already using 18A, we’ve had some other feedback as well. Here’s some highlights:

    Bulk delete API for accounts and orgs. This is an extension of our recently released API capabilities which allow customers to efficiently destroy data that’s no longer needed. 18A enables bulk deletes of accounts and organizations. It also provides the flexibility to delete selective data based on custom ROQL queries.

    • Answer Editor. There’s a new text editor for knowledge authoring as well. This is the ‘CKEditor’ which is much more modern and cleaner than the editor Service Cloud has had for the last decade. You’ll see this as soon as you upgrade to 18A or higher. If your organization creates and edits a high volume of knowledge articles, or you have a heavy reliance on editing HTML in source mode, take some extra time to test before your upgrade and take a look at this Community Post which discusses some of the known defects and capability differences.

    • MySQL 5.7. Because this is an infrastructure change and not a product feature it will be rolled out separately from this product release as a series of infrastructure changes over the course of 2018 and maybe beyond. Keep your eyes out for a notification from Oracle about when your instance(s) of Service Cloud will be migrated to MySQL 5.7, and in the meantime, take a look at the differences between MySQL 5.1 and 5.7.

    • .NET upgrade. Okay, this isn’t live yet but rumor has it that Service Cloud will eventually require .NET 4.7.1 as the minimum version to install the Agent Desktop on your PC. This will likely take effect with 18D (November) so start planning your desktop upgrades now. In fact, you can start executing upgrades now because Service Cloud is supported on .NET 4.7.1 starting in 18A. Once details of the .NET requirement change are finalized, Oracle will be communicating them loudly and often.

    For more documentation on 18A, take a look at the Oracle Service Cloud 18A What's New and Oracle Service Cloud Release Readiness

    If you’re ready to make the move to the new release, make sure to check out our best practices for testing an update. You can use this link to request an update.

  • Edson Junior
    Simplifying Troubleshooting Process for Admins and Agents5100%OSvCTroubleshootAddIn.zip
    Entry posted April 3, 2018 by Edson JuniorPro, tagged Product / Product Release 

    If you are an Oracle Service Cloud administrator, you are likely the first person in your company your agents will go to when they are experiencing some error with their agent desktop. Troubleshooting errors can quickly spawn into a bigger investigative effort to identify the root cause (e.g., network issue, configuration issue, training, defect), but the troubleshooting process usually starts with getting the right details about the error from your agents. Your agents are already frustrated because an error could be impeding their work and impacting their metrics. And now you’re asking them to provide detailed information on the error: steps to reproduce this issue, workstation information or data traffic, much of which they aren’t familiar with.

    Recognizing the dynamics of this common scenario, we decided to walk a mile in both your shoes, as the administrator, and your agents’ shoes. As a result of this experience, we came up with the idea of automating the process for gathering the needed information from agents instead of requiring the administrators and agents to try and overcome the current challenges. We developed a sample code named as “Troubleshoot Add-In” for the Oracle Service Cloud Agent Desktop (currently not available for Browser UI) to address this need.

    The “Troubleshoot Add-In Sample Code” was created to automatically capture information, such as steps-to-reproduce, and workstation information in one fell swoop instead of requiring agents to install or use different tools outside of Oracle Service Cloud. All that agents need to do is push the "start" button (located in the status bar) and push the “stop” when the agents have completed all steps to reproduce the error.

    Take a look at these two scenarios and see how the “Troubleshoot Add-In” can improve communication between administrators and agents who are encountering an issue.

    'Before' scenario of troubleshooting an agent error

     

     

    'After' scenario of troubleshooting agent errors

    How Troubleshoot Add-In Sample Code Works

    Let’s take a more in-depth look at what the sample code delivers. The sample code is implementing an Extension StatusBar with a start and stop button, plus a timer that provides the duration of how long your agent is capturing the steps to reproduce.

    By clicking on the start button, a friendly loading form shows up. You can personalize your message by changing a ServerConfigProperty used in this sample code. At this moment, the sample code will start a standard windows application called PSR (Problem Steps to Reproduce). As a sample code, this code is limited to use a windows standard application and from here, I would encourage you as a developer to expand this sample code for your needs.

    enlightenedFor instance, If you want to get rid of Fiddler installation needs, you can use Fiddler Core and embed their .dll to capture data traffic plus steps to reproduce. Check out for Fiddler Demo Code and try yourself, I am pretty sure it will be useful.

    Once you have finished capturing your steps to reproduce click on stop button and the sample code closes PSR and starts to capture workstation information such as .NET version, windows version, capacity. Also, you can run the OSCinfo.bat as described in the answer 2412. This sample code is providing this option if you need to capture more information as ping and traces. See for the ServerConfigProperty options.

    Lastly, a message pops up to inform the agent where the results were saved. The sample code takes care of compile and compresses all files resulted from PSR and Workstation Information in a local folder or wherever folder you have specified in a ServerConfigProperty.

    Okay, this is true, I like to use ServerConfigProperty and there is more fo them. With that, you can set up your add-in without changing your code. smiley

    Ultimately, this solution should simplify your communication with agents experiencing errors, accelerate troubleshooting by having the required information in one easy step, and save everyone time and frustration that surrounds these issues.

    The source code is available here for download, and you take advantage to build a better troubleshoot model integrated into your Oracle Service Cloud. 

    If you are a developer and want to reuse this sample code, this session is for you.

    Developing the Extension

    The following picture describes the methods and its relationships.

     

     

    This sample code is started by receiving ServerConfigProperty from the TroubleshootStatusBarAddIn.cs followed by two methods (1) to define where the results will be saved and (2) to start the windows standard application to capture steps to reproduce.

     

    public StatusBarControl(IGlobalContext globalContext, bool isOscInfo, bool isScreenCap, 
            string tspath, int reminderInMinutes, string initialNotification, string finalNotificaiton)
    {
            InitializeComponent();
            _osvcLoggedin = globalContext.Login;
            _osvcInterface = globalContext.InterfaceName;
            _osvcSitename = globalContext.InterfaceURL;
            GContext = globalContext;
    
            _isOscInfo = isOscInfo;
            _isScreenCap = isScreenCap;
            _tspath = tspath;
            _reminderInMinutes = reminderInMinutes;
            _nextConfirmation = _reminderInMinutes;
            _initialnotification = initialNotification;
            _finalnotification = finalNotificaiton;
    }
    
    private void btnStart_Click(object sender, EventArgs e)
    {
            try
            { 
                    btnStart.Enabled = false;
                    btnStop.Enabled = true;
    
                    var sitename = new Uri(_osvcSitename);
                    _hostname = sitename.Host;
    
                    TroubleshootDirectory();
    
                    using (var frmWaitForm = new FrmWaitForm(LoadTroubleshoot, _initialnotification))
                    {
                            frmWaitForm.ShowDialog();
                    }
    
                    _isActive = true;
            }
            catch (Exception ex)
            {                
                    MessageBox.Show(ex.Message);
            }
    }
    
    private static void TroubleshootDirectory()
    {
            try
            {
                    if (_tspath == null)
                    {
                            Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\" + _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss"));
                            _path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\" +  _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss");
                            _rootpath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\";
                    }
                    else
                    {
                            if (Directory.Exists(_tspath))
                            {
                                    Directory.CreateDirectory(_tspath + "\\OSvC_Troubleshoot\\" + "\\" + _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss"));
                                    _path = _tspath + "\\OSvC_Troubleshoot\\" + _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss");
                                    _rootpath = _tspath + "\\OSvC_Troubleshoot\\";
                            }
                            else
                            {
                                    Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\" + _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss"));
                                    _path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\" + _osvcLoggedin + "\\" + _osvcLoggedin + "_" + DateTime.Now.ToString("MMddyyyyHHmmss");
                                    _rootpath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\OSvC_Troubleshoot\\";
                            }
                    }
            }
            catch (Exception e)
            {                
                    MessageBox.Show(e.Message);
            }
    }
    
    

     

    The sample code is centralizing all actions to start the external application in a single method. As now, it is loading only PSR, but you can add Fiddler as described before and also make it an option trought ServerConfigProperty.

     

    private void LoadTroubleshoot()
    {
            try
            {
                    if (_isScreenCap)
                            StartPsr();
    
                    for (var i = 0; i <= 500; i++)
                            Thread.Sleep(10);
            }
            catch (Exception e)
            {
                    GContext.LogMessage(e.Message);
            }
    }
    

     

    The following method is called to start Windows PSR.

     

    private void StartPsr()
    {
            try
            {
                    TryKillProcess(PsrExe);
    
                    _psrLogFile = Path.Combine(_path + "\\" + DateTime.Now.ToString("MMddyyyyHHmmss") + "_Steps_To_Reproduce.zip");
                    InvokeProcess(PsrExe,
                            $"/start /gui 0 /output \"{_psrLogFile}\" /slides 1 /recordpid \"{Process.GetCurrentProcess().Id}\"");
    
            }
            catch (Exception e)
            {
                    GContext.LogMessage(e.Message);
            }
    }
    

     

    The following two methods are generic, so you can reuse that for other applications if it is needed. These methods are used to start and stop Windows PSR in this context.

    private static void TryKillProcess(string processName)
    {
            var processes = Process.GetProcessesByName(processName);
            foreach (var proc in processes)
            {
                    try
                    {
                            proc.Kill();
                    }
                    catch (Exception e)
                    {                    
                            MessageBox.Show(e.Message);
                    }
            }
    }
    
    private static Process InvokeProcess(string processName, string parameters)
    {
            var startInfo = new ProcessStartInfo(processName, parameters)
            {
                    WindowStyle = ProcessWindowStyle.Hidden,
                    UseShellExecute = true,
                    ErrorDialog = false
            };
    
            var proc = new Process {StartInfo = startInfo};
            proc.Start();
    
            return proc;
    }
    

     

    The following method will take care of the time control, plus will control the duration. It will remind the agent that the capture is still running in case the agent has accidentally forgotten to stop.

    private void timer1_Tick_1(object sender, EventArgs e)
    {
            if (_isActive)
            {
                    _seconds++;
    
                    if (_seconds > 59)
                    {
                            _minutes++;
                            _seconds = 0;
                            if (Convert.ToInt32(_minutes) >= _nextConfirmation)
                            {
                                    _nextConfirmation += _reminderInMinutes;
    
                                    var dialogResult = MessageBox.Show(Resources.StatusBarControl_timer1_Tick_1_Are_you_still_collecting_data_, Resources.StatusBarControl_timer1_Tick_1_Troubleshoot, MessageBoxButtons.YesNo);
                                    switch (dialogResult)
                                    {
                                            case DialogResult.Yes:
                                                    return;
                                            case DialogResult.No:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.None:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.OK:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.Cancel:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.Abort:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.Retry:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            case DialogResult.Ignore:
                                                    btnStop_Click(sender, e);
                                                    break;
                                            default:
                                                    throw new ArgumentOutOfRangeException();
                                    }
                            }
    
                    }
                    if (_minutes >= 59)
                    {
                            _hours++;
                            _minutes = 0;
                    }
            }
    
            lblTimer.Text = string.Format(AppendZero(_hours) + ":" + AppendZero(_minutes) + ":" + AppendZero(_seconds));
    }
    
    private static string AppendZero(double str)
    {
            if (str <= 9)
                    return "0" + str;
            return str.ToString(CultureInfo.CurrentCulture);
    }
    

     

    When the Stop button is clicked the following method is called.

    private void btnStop_Click(object sender, EventArgs e)
    {
            try
            {
                    btnStart.Enabled = true;
                    btnStop.Enabled = false;
    
                    using (var frmWaitForm = new FrmWaitForm(StopTroubleshoot, _initialnotification))
                    {
                            frmWaitForm.ShowDialog();
                    }
            }
            catch (Exception ex)
            {
                    GContext.LogMessage(ex.Message);
            }            
    }      
    

     

    Similar to the logic applied to the start load, here the sequence to stop the applications running will take place.

    private void StopTroubleshoot()
    {
            try
            {
                    btnStop.Enabled = false;
                    btnStart.Enabled = true;
                    _isActive = false;
                    _seconds = _minutes = _hours = 0;
    
                    if (_isScreenCap)
                            StopPsr();
    
                    if (_isOscInfo)
                    {                    
                            Task.Factory.StartNew(() =>
                            {
                                    var ocsFile = _path + "\\OSvCinfo.bat"; // File downloaded in 03/20/2018.
                                    if (!File.Exists(ocsFile))                                                    
                                            ExtractEmbeddedResource("Troubleshoot_StatusBar", _rootpath, "OSvCInfo", "OSvCinfo.bat");                        
                            }).ContinueWith(antecedent =>
                            {                        
                                    RunOsvCInfo();
                            });
                    }
                    else
                    {
                            Task.Factory.StartNew(WorkStationInfo).ContinueWith(antecedent =>
                            {
                                    CompressAndNotify();
                            });                    
                    }
            }
            catch (Exception e)
            {
                    GContext.LogMessage(e.Message);
            }
    }
    

     

    The generic kill and invoke method will be called again to stop Windows PSR.

    private void StopPsr()
    {
            try
            {
    
                    InvokeProcess(PsrExe, @"/stop").WaitForExit(60000);
    
                    // Sleep to ensure PSR completes file creation operation
                    Thread.Sleep(SaveDelay);
    
                    if (!File.Exists(_psrLogFile))
                    {
                            MessageBox.Show(Resources.StatusBarControl_LoadPsr_No_user_actions_were_recorded_by_PSR_);
                    }
            }
            catch (Exception e)
            {
                    GContext.LogMessage(e.Message);
            }
    }
    

     

    If the ServerConfigProperty that allows OSCInfo.bat file runs has not been defined as True, this piece of code will collect at least the basic workstation information.

     

    private static void WorkStationInfo()
    {
            try
            {
                    var compInfor = new Microsoft.VisualBasic.Devices.ComputerInfo();
    
                    var ocsInfo = _path + "\\" + DateTime.Now.ToString("MMddyyyyHHmmss") + "_OSvCInfo.txt";                
    
                    using (var sw = File.CreateText(ocsInfo))
                    {
                            var openSubKey = Registry.LocalMachine.OpenSubKey("hardware\\description\\system\\centralprocessor\\0");                   
    
                            sw.WriteLine("-- Start Workstation Information --");
                            sw.WriteLine("OSvC Site Name: " + _osvcInterface);
                            sw.WriteLine("Host Name: " + Environment.MachineName);
                            if (openSubKey != null)
                                    sw.WriteLine("Processor: " + openSubKey.GetValue("ProcessorNameString"));
                            sw.WriteLine("OS: " + compInfor.OSFullName);
                            sw.WriteLine("Available Physical Memory: " + compInfor.AvailablePhysicalMemory / 1024 / 1024 / 1024 + "GB");
                            sw.WriteLine("Available Virtual Memory: " + compInfor.AvailableVirtualMemory / 1024 / 1024 / 1024 + "GB");
                            sw.WriteLine("Total Physical Memory: " + compInfor.TotalPhysicalMemory / 1024 / 1024 / 1024 + "GB");
                            sw.WriteLine("Total Virtual Memory: " + compInfor.TotalVirtualMemory / 1024 / 1024 / 1024 + "GB");
                            sw.WriteLine("Total Processes Running: " + Process.GetProcesses().Length);
                            sw.WriteLine(".NET Framework Version: " + Get45PlusFromRegistry());
                            sw.WriteLine("-- End Workstation Information --");
                            sw.WriteLine(" ");
                            sw.WriteLine("\nNote: For more information on Workstation and Network Data, please run the OSCinfo.bat utility as published in Answer 2412 or enable the Add-In ServerProperty WorkstationInfo.");
                    }
            }
            catch (Exception e)
            {                
                    MessageBox.Show(e.Message);
            }
    }
    
    private static string Get45PlusFromRegistry()
    {
            const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
            string version;
    
            using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
            {
                    version = ndpKey?.GetValue("Release") != null ? CheckFor45PlusVersion((int)ndpKey.GetValue("Release")) : ".NET Framework Version 4.5 or later is not detected.";
            }
    
            return version;
    }
    
    private static string CheckFor45PlusVersion(int releaseKey)
    {
            if (releaseKey >= 460798)
                    return "4.7 or later";
            if (releaseKey >= 394802)
                    return "4.6.2";
            if (releaseKey >= 394254)
                    return "4.6.1";
            if (releaseKey >= 393295)
                    return "4.6";
            if (releaseKey >= 379893)
                    return "4.5.2";
            if (releaseKey >= 378675)
                    return "4.5.1";
            return releaseKey >= 378389 ? "4.5" : "No 4.5 or later version detected";
    }
    

     

    Otherwise, the OSCInfo.bat file is extracted and will run using the agent session information, without to fill out information in the bat file.

    private static void ExtractEmbeddedResource(string nameSpace, string outDirectory, string internalFilePath, string resourceName)
    {
            try
            {                
                    var assembly = Assembly.GetCallingAssembly();
    
                    using (var s = assembly.GetManifestResourceStream(nameSpace + "." + (internalFilePath == "" ? "" : internalFilePath + ".") + resourceName))
                            if (s != null)
                                    using (var r = new BinaryReader(s))
                                    using (var fs = new FileStream(outDirectory + "\\" + resourceName, FileMode.OpenOrCreate))
                                    using (var w = new BinaryWriter(fs))
                                            w.Write(r.ReadBytes((int)s.Length));
            }
            catch (Exception e)
            {                
                    MessageBox.Show(e.Message);
            }
    }
    
    private static void RunOsvCInfo()
    {
            try
            {
                    var proc = new Process
                    {
                            StartInfo =
                            {
                                    FileName = _rootpath + "\\OSvCinfo.bat",
                                    Arguments =
                                            _osvcLoggedin + " " + _osvcInterface + " " + _hostname + " " + _path + "\\" +
                                            DateTime.Now.ToString("MMddyyyyHHmmss") + "_OSvCInfo.txt",
                                    WindowStyle = ProcessWindowStyle.Normal,
                                    CreateNoWindow = true
                            }
                    };
                    proc.Start();
                    proc.WaitForExit();
    
                    CompressAndNotify();
            }
            catch (Exception e)
            {                
                    MessageBox.Show(e.Message);
            }
    }
    

     

    Finally, the information is compressed and the result location will be shown to the agent.

    private static void CompressAndNotify()
    {
            try
            {
                    ZipFile.CreateFromDirectory(_path, _path + ".zip", CompressionLevel.Fastest, true);
                    Directory.Delete(_path, true);
    
                    var strLocation = _path + ".zip";
    
                    using (var frmCompletionForm = new FrmCompletionForm(strLocation, _finalnotification))
                    {
                            frmCompletionForm.ShowDialog();
                    }
    
            }
            catch (Exception e)
            {                
                    MessageBox.Show(e.Message);
            }
    }
    

     

    Leave a comment and let us know what you think, or if you have questions. We’d also love to hear other ways that you’ve simplified or improved troubleshooting agent issues.

  • Simon Kilgarriff
    How Does Your Knowledge Base’s Power Measure Up?24100%
    Entry posted March 13, 2018 by Simon KilgarriffPro, tagged Best Practices, Product / Product Release 

    They say knowledge is power. With power comes great responsibility, according to Spiderman’s uncle, and your Knowledge Base is no different. It has huge potential to create value for your customers and your organization, if you manage the responsibility well. Of course, that is where things get tricky—how do you know if you are managing your KB well and using its powers for good and not ill?

    Let’s take a look at where you can and should focus in determining you knowledge base’s performance.

    Your Knowledge Base is Tier 0

    It is easy to overlook the Knowledge Base as a key component to helping reduce costs and improve experience when there are other new, exciting components such as chatbots and AI are emerging.   

    Therefore, I always impress upon my customers early on that Knowledge Base is one of the most important things to get right. Why? Your Knowledge Base is effectively your “Tier 0” area for supporting and empowering your customers. Your Knowledge Base enables your customers get answers to their questions, when and where (syndicated widgets) they need it.

    If you look at your Knowledge Base as a member of your Support team, how many service requests is it resolving and deflecting every day? How does that compare to the average number of service requests your agents are closing every day? Your Knowledge Base is, or should be, your superhero agent who frees up your Tier 1, 2 and 3 agents for more complex inquiries!

    In short, your Knowledge Base should be high priority and area of strategic investment. It isn’t just about having a knowledge base and sitting back. It is about getting customers to self-serve, agents to offer answers in their responses and contribute their expertise back into the Knowledge Base, and agents updated through knowledge.  As you can imagine, this can be quite a culture change.

    The Dilemma of Measuring Knowledge Base Success

    In consulting engagements, I’m often asked what a successful Knowledge Base looks like. The questions range from, “What sort of reduction in emails might we see?” or “What kind of deflection can we expect to see?” or “How do we resource our knowledge base? How do we justify resourcing for our knowledge base?” There aren’t straight forward answers to these questions.

    Why are these questions hard to answer? Every Knowledge Base is unique—the number of answers, the quality of answers, whether you use knowledge syndication or not, whether you promote answer usage in incidents, chats or standard text, customizations…the list goes on!  Usage is also very different from a customer-facing, internal-only or HR Knowledge Base. Just a few examples:

    • HR is very transaction-based, so knowledge only goes so far as employees will likely need to submit a request. For example, if an employee wants to raise a grievance, then knowledge may help to understand the process, but ultimately, s/he needs to submit a service request to start the process off, so there is less chance to get people to self-serve.
    • Internal knowledge will have far fewer, if any, incidents created, so you would expect the self-serve rates would be high. But figures, such as answer hits, can vary. Some organizations might have low viewing stats since the staff churn is low and agents are knowledgeable.  Organizations with high agent churn may find the statistics are far higher since there are far more ‘green’ agents who need to view knowledge to solve requests.
    • Customer-facing knowledge is less likely to be transactional, so there is better chance of achieving high self-serve rates.  However, some organizations may require the customer to raise an incident in certain scenarios, which inevitably impacts the self-serve rates.

    It also depends on the website design too. How easy is it to search or view your Knowledge Base?  Do customers have to login to search your Knowledge Base? Knowledge can be consumed in many ways, and your metrics are going to vary accordingly. I would guess two Knowledge Bases from two organizations in the same industry might have very different statistics.

    Where Should You Start?

    I recommend setting a benchmark for your own Knowledge Base. Focus on improving your own figures, rather than trying to look at what others are doing or chasing industry benchmarks.

    Take a snapshot of various reports, and use them as a benchmark and look at trying to improve performance on those metrics. There are some useful out-of-the-box Knowledge Foundation reports that give a good assessment of your Knowledge Base’s performance:

    • Answers viewed by Answer (or by Category or by Product)
    • Answer Maintenance
    • Keyword Search
    • Site Effectiveness

    Keep measuring against the same metrics over periods of time; look at the behaviours they reveal and then improve where you can. Use the reports as a guide, so you get a picture as to what is going on, but remember no one report is the be-all and end-all.   

    You can go deeper and leverage the framework and reports from the ‘Deriving Business Intelligence through Service Cloud Value Analytics’ set of report recipes in the Analytics Cookbook.

    Check out some great articles (Knowledge Base answers, in fact!) including, “Tips and Best Practices for Maintaining Answers” and “Best Practices for Setting up Knowledge Base of Answers.”

     

    In summary, your Knowledge Base is uniquely yours. Don’t worry about what everyone else is doing.  Imagine what Spiderman would have missed out on if he spent all his time trying to be the Hulk!

    I’d love to hear how you have approached this challenge of analysing your Knowledge Base performance. What is a metric that you have focused on and positively influenced?

  • eleep
    Boost Your Career: Learn How to Deliver Legendary Service...100%
    Entry posted March 7, 2018 by eleepHero, tagged Industry News and Events, Modern Customer Experience, Product / Product Release 

    Back by popular demand, Pre-Conference Education makes its return to Modern Customer Experience 2018. This year, we’re bringing back Oracle Service Cloud training and expanding the program across the Oracle Customer Experience (CX) Cloud suite of applications.

    Want to learn more about KPIs and dashboards? Are you interested in creating dynamic interviews to build customer loyalty? Do you know what it takes to nurture a thriving Knowledge Management program? We’ve got all those sessions, and more!

    Whether you’re a customer or partner, we encourage you to take advantage of these in-depth, structured learning opportunities that will help advance your CX career and help you achieve legendary results for your organization.

    (Now through April 9thregister for only $1395 with the code CXBLOG to receive $500 off the onsite rate.)

    Here's what you need to know about pre-conference education:

    • What's covered? Expect to dive deep into Oracle Service Cloud and gain the product knowledge and best practices required to effectively manage transformation at your organization. These sessions are a great opportunity to network with Oracle product experts and your peers who are interested in the same topic. Check out the session catalog for details.
    • How long are the sessions? These structured learning opportunities are either 90-minute sessions or three-hour sessions divided into two parts–Part I in the morning followed by Part II in the afternoon.
    • What's the format? Some sessions are trainer-led, while others are hands-on workshops. Please note that the hands-on workshops have limited capacity, and are first-come, first-serve.
    • Who's presenting? We're sending our best experts from Oracle Product Management to lead each session. Additionally, Gold Partner  and MCX 2018 Gold Sponsor Helix Solutions is returning to deliver the popular "Customer Portal for Non-Developers" workshop again.
    • What's the cost? These sessions are FREE with your conference registration. That’s right, free. Just one more reason to attend MCX 2018.
    • Who can attend? Whether you’re an Oracle customer, partner, or if you’re just interested in learning more, you’re welcome to attend.
    • How do I reserve my spot? You don’t need to register to reserve your spot. The sessions are first-come, first-serve. However, please plan accordingly–the hands-on workshops fill up quickly!
    • Do I need to prepare? Yes and no. If you're interested in attending a hands-on workshop, you'll want to check your computer meets the requirements described in the session description. For the most part, it's just a matter of bringing your own Windows PC that meets system requirements outlined hereBut check the session description for details! Certain sessions require you to have a code editor (IDE),  Notepad++ and Cyberduck installed. Otherwise, just show ready to learn! 
    • Does this impact my travel plans? Yes, you’ll want to fly in early to take advantage of these learning opportunities. Pre-conference education begins on Tuesday, April 10th at 9:30 a.m. for Oracle Service Cloud attendees.

    Check out the Pre-Conference Education Session for your Oracle Service Cloud and the other CX products.

    Let us know if you have questions, and otherwise, we’ll see you in Chicago.

  • James W.
    How Costco Increased Agent Productivity with Simple Oracle...29100%Configuration-Details_How-Costco-Increased-Agent-Productivity-with-Simple-OSVC-Toolbox-Innovations.pdf
    Entry posted March 6, 2018 by James W.Journeyer, tagged Member Spotlight, Product / Product Release 

    I've been a software developer with Costco for almost 20 years! I actually started in the food court, moved to the tire center, and applied for a programmer trainee position. I took the aptitude test, and got into the training course, and came out as a developer! This transition marked the beginning of a career working on many different systems across multiple departments at Costco.

    Over the last five years, I've been part of a small IT team dedicated to supporting our Member Service Center. In May 2016, I started working on Oracle Service Cloud. We’re focused on offering web self-service, chat and capturing phone calls. We recently launched chat, which has been very popular with both our customers and agents and is accelerating our first call resolution rate!

    We have loved how we can configure and customize Oracle Service Cloud to meet our business needs. I wanted to share an example of how I used out of the box functionality in order to deal with a unique business challenge within Costco.

    The Challenge

    Many Oracle Service Cloud customers use web forms for email submissions and benefit from the native SPAM filtering functionality built into the system. However, Costco’s email configuration is a little unique, because we use a separate email-only domain and a 3rd party email host for our direct emails.

    While our email host has been great and has several SPAM avoidance options, the Oracle client doesn't provide SPAM feedback to our email host. Consequently, our email host can't get any "smarter" or learn what we consider to be SPAM. And we keep getting SPAM (e.g. vendors who want Costco to carry their products; “spray and pray” marketing emails; trashy spam that you’d see in your personal email).

    The problem was twofold: (1) we needed agents to get through emails faster and (2) we wanted to prevent future SPAM.

    The Solution

    I knew that our Oracle Service Cloud agent workspace—with all of its required fields—has a “minimum time required” to complete it correctly. For a customer email, all of these fields are valuable for solving customer issues and for creating great reporting. However, when agents are dealing with SPAM, they just need to get to the next email and not waste any time filling out required fields. And it’s even better if they don’t see another SPAM email from that Contact.

    To address this problem, I started by developing a “big click target” SPAM workspace. Now if an agent gets a SPAM email, they can just hit the SPAM button in the workspace ribbon and the incident disappears…POOF! No required fields. No more of the agent’s time wasted. This addressed the first problem of helping agents get through emails faster.

    Of course, if the agent made a mistake, they can go into Recent Items, re-open the incident, open the contact and change the AutoSPAM flag. As a side note, we did have some agents accidentally hit the SPAM workspace button, so we moved the button away from the Send & Exit button. Position matters!

    In order to prevent future SPAM email from a sender, I added a business rule that checks the AutoSPAM Contact field on incoming emails. If the AutoSPAM field is flagged “Yes,” it goes into an AutoSPAM queue. Future incoming emails from this email address will be reviewed by a supervisor to confirm it’s SPAM.

    In addition to solving the problem, our agents loved the ability to quickly process SPAM (“Wow, I’m done with that!”) and appreciated that we made their job easier. Can you tell that I love the configurability and customization options within Oracle Service Cloud? You can check out the step-by-step instructions with screenshots in the attached PDF.

     

    Even if you don’t have the same SPAM problem that we do, this concept has many different applications. You can take the top five disposition codes for incidents and make five buttons to set fields. Even auto-insert an answer. You don’t want to miss the right reason codes from a reporting perspective, but you also don’t have to bog agents down with repetitive clicks.

    By sharing this innovation, I hope to encourage and inspire you to learn about the different tools within the Oracle Service Cloud toolbox and how you can combine them to create simple yet effective solutions for your organization. 

  • Daniel Foppen
    Dig into Oracle Service Cloud and Field Service 18A Release3100%
    Entry posted February 27, 2018 by Daniel FoppenJourneyer, tagged Product / Product Release 

    This latest release of Oracle Service Cloud and Oracle Field Service Cloud includes new functionalities and enhancements that empower our customers to streamline and simplify the service experience for agents and consumers.

    The 18A Release includes some exciting new features in Service Cloud including Answer Versioning for Knowledge Foundation, CKEditor for Answers in .NET, and Workspaces for Agent Browser UI.

    With the latest release of Oracle Field Service Cloud, we have enabled new ways for customers to leverage our innovations to suit their needs, including, several new plug-ins. Beyond the plugins, 18A is jam packed full other cool innovations like:

    • IoT Cloud integration
    • Mobility app for iOS
    • Mobility landing page

    To learn more, watch the Oracle Service Cloud 18A Release Video, Part I and Part 2.

    Oracle Service Cloud 18A Release, Part 1 Video

    Oracle Service Cloud 18A Release, Video Part 1

    Oracle Service Cloud 18A Release, Video Part 2


    Oracle Service Cloud 18A Release Resources

    For more detailed information on these and a rest of the features in the 18A release please visit the resources below.