动态

Dynamics 365客户服务门户:挑战和解决方案 - 第一部分

Diogo GouveiaProducts and Solutions, Technical Leave a Comment

微软Dynamics 365客户服务 提供了一套工具,使企业能够优化其客户服务管理。除了提高客户体验,这个平台还可以协助跟踪沟通和内部支持流程,使公司和客户都受益。

然而,尽管微软Dynamics 365客户服务门户可能是有用的,但配置它以满足一套独特的要求可能是一项具有挑战性的任务。

在Connecting Software,我们用 微软Dynamics 365客户服务 来建立我们的 支持门户网站.由于我们对我们的支持门户网站有一个具体的愿景,通过这篇文章,我们将详细介绍通过Dynamics 365客户服务实施的过程,同时展示我们在路上遇到的障碍和我们找到的最佳解决方案。

Dynamics 365客户服务门户网站的特点

Dynamics 365客户服务门户网站允许创建一个集中的 知识库这是我们支持门户网站的主要功能之一。它包含了围绕我们产品的常见使用案例的可靠信息,客户很容易获得这些信息。
知识库

在客户无法在知识库中找到所需答案的情况下,Dynamics 365客户服务门户允许客户创建支持案例。从客户的角度来看,这是我们支持门户网站的两个主要功能。

然而,对我们来说,主要的优势是能够产生有关使用支持门户和我们的软件解决方案的信息。例如,如果我们注意到有几个关于特定产品的特定问题的案例被提交,我们可以重新调整我们的资源以快速解决这个问题。如果这只是一个常见问题,我们可以把它添加到我们的支持门户的知识库中,使任何有同样关切的客户都能获得这些信息。

因此,Dynamics 365客户服务门户网站作为一个集中的工具,用于评估我们的产品质量,提高客户满意度,跟踪客户互动,保证我们能够获得让我们不断改进的信息,调整我们的资源规划,甚至产生有价值的内部报告,例如,每个产品的支持成本。

现在,让我们来看看我们在实施支持门户时面临的障碍。

事件#1 - 现有客户群

当我们开始开发支持门户网站时,有一个现有的客户群,结果是很麻烦的。

每当一个客户第一次注册我们的门户网站时,就会在微软Dynamics 365(CRM),也就是我们的客户数据库中创建一个重复的联系人。用于客户服务的Microsoft Dynamics 365并没有将重复的联系人与我们客户数据库中真正的客户联系人联系起来,因此,这些信息没有集中到一个记录中。这意味着,我们的支持案例也没有链接到与我们有既定关系的账户相关的联系人。相反,它们被链接到作为支持门户注册结果而创建的空的重复联系人。

这个问题本来可以通过自动发送邀请函来解决,该邀请函可以成功地将重复的联系人与我们CRM中的真实客户联系人联系起来,但这是必须从开始建立客户群时就进行的事情。此外,尽管这在理论上可行,但由于电子邮件打开率低,这并不是一个现实的解决方案。只是为了说明问题,根据Mailchimp的数据,所有行业的平均电子邮件打开率仅为 21.33% 在2021年。

你可能也在想,默认合并记录就够了,但事实并非如此,因为将记录信息合并为一个联系人会导致失去对我们支持门户网站的访问。

解决方案 - 一个Dynamics 365的插件

解决这个问题的另一个方法是创建一个自定义的微软Dynamics 365插件(在Power Apps领域被称为解决方案),这就是我们所做的。我们建立的插件在支持门户注册时扫描用户是否已经存在于我们的CRM中。

有两种可能的结果:如果该用户确实存在于我们的数据库中,该插件会识别这种匹配,并将两条记录上的信息合并为一个单一的联系人,而该用户不会失去对Dynamics 365客户服务门户的访问,也就是我们的支持门户。第二个联系人,此时不包含任何信息,被我们建立的插件自动删除,它每周运行一个单独的批量删除工作来清除记录。

如果注册门户网站的用户在我们的CRM中不存在,该插件会做一些不同的事情。作为一家B2B公司,我们数据库中客户的电子邮件有一个特定于他们工作的组织的域名。因此,如果一个不在我们CRM中的用户希望注册我们的门户网站,该插件会搜索我们CRM中这个新用户的电子邮件域名。如果有匹配的,就会在CRM中自动创建一个新的联系人,因为这个用户属于一个我们已经熟悉的公司。相反,如果我们的数据库中没有与注册支持门户的客户的电子邮件域相匹配,我们就会在内部被告知试图注册,并在需要时联系获得进一步信息。

你可以通过以下方式找到我们微软Dynamics 365插件的部分代码 这个环节.请随意 伸出援手 如果你想要完整的版本,请给我们

      public void Execute(IServiceProvider serviceProvider)
    {
        var tracingService = (ITracingService) serviceProvider.GetService(typeof(ITracingService));
        var context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var service = serviceFactory.CreateOrganizationService(context.UserId);
        if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity)
        {
            返回;
        }

        var entity = (Entity) context.InputParameters["Target"];
        var isLoginEnabled = HasLoginEnabled(entity);
        
        如果(isLoginEnabled == false)
        {
            返回;
        }

        试试
        {
            var emailAddress = (string) entity["emailaddress1"];
            var contactsWithSameEmailAddress = GetContactsByEmailAddress(service, entity.Id, emailAddress);
            如果(contactsWithSameEmailAddress.Entities.Count > 0)
            {
                var hasLoginEnabled = HasLoginEnabled(contactsWithSameEmailAddress.Entities[0]);
                如果(hasLoginEnabled)
                {
                    throw new InvalidPluginExecutionException(OperationStatus.Failed、
                        "用户已经存在。尝试用不同的电子邮件地址来注册,或登录你现有的账户。");
                }

                var mergeRequest = new MergeRequest
                {
                    SubordinateId = entity.Id、
                    目标 = new EntityReference("contact", contactsWithSameEmailAddress.Entities[0].Id)、
                    UpdateContent = GetUpdateContent(entity)
                };
                var _ = (MergeResponse) service.Execute(mergeRequest);
                entity[CustomAttributeName] = true;
                service.Update(entity);
            }
            否则
            {
                var domain = emailAddress.Split('@')[1];
                如果(_publicDomains.Contains(domain))
                {
                    SendEmailAndDeactivateContact(service, tracingService, entity);
                }
                否则
                {
                    var contactsWithSameDomain = GetContactsByDomain(service, entity.Id, domain);
                    如果(contactsWithSameDomain.Entities.Count > 0)
                    {
                        entity["parentcustomerid"] = contactsWithSameDomain.Entities[0]["parentcustomerid"] ;
                        service.Update(entity);
                    }
                    否则
                    {
                        SendEmailAndDeactivateContact(service, tracingService, entity);
                    }
                }
            }
        }
        捕获(FaultException 前)。
        {
            抛出新的InvalidPluginExecutionException("ContactPostOperationPlugin发生错误。", ex);
        }
    }
关闭代码

我们的网络商店

我们还必须为我们的产品创建另一个集成 网络商店因为我们只允许用户访问我们的微软Dynamics 365客户服务门户,当我们能够以某种方式将他们与我们的CRM中的记录相匹配,或者当我们已经澄清了他们是谁。
Image
并非每个在网上商店下订单的人都是我们CRM中的联系人,但如果他们从我们这里购买解决方案,他们可能需要支持。我们开发的集成从通过网络商店购买的用户那里获取数据,并在我们的客户数据库中创建一个线索。然后,这个线索被标记为 "合格",在CRM中自动创建一个联系人和账户,让他们访问我们的门户网站。

发生#2 - D365客户服务的错误信息

尚未在我们的Dynamics 365客户服务门户网站注册的用户在试图登录时收到一条误导性的错误信息。这条信息说他们的密码不正确,而不是通知他们他们的电子邮件没有在支持门户网站上注册。
回到我们之前发生的情况,每当一个用户注册了支持门户,我们的CRM中就会创建一个重复的记录。没有注册门户的客户没有这个重复的记录,因此,没有任何记录可供系统读取,其中包含有关他们的登录信息。系统所做的是更新CRM中的 "用户名输入 "字段,其中不包含任何信息。然后,这就触发了微软Dynamics 365客户服务部,认为用户已经有了一个登录账号,显示出通知他们密码不正确的信息。

解决方案 - Dynamics 365插件

就像我们有一个现有客户数据库的问题的解决方案一样,与这个错误信息作斗争的最好方法是使用微软Dynamics 365插件/解决方案。

事实上,我们使用的是已经有的Dynamics 365插件,只是稍作了改动。我们的开发团队又注册了一个插件步骤,这基本上是一个命令,可以识别并阻止系统在 "用户名输入 "字段中没有任何信息时更新该字段而产生的错误。然后,该插件步骤纠正了显示给试图访问门户网站的用户的错误信息,说明他们没有支持门户网站的登录名,而不是说他们的密码不正确。

我们希望你到目前为止喜欢阅读这篇文章。 第二部分 报道即将出版,请关注我们的网站。 博客页面 以成为第一个知道它被释放的人!


关于作者

Diogo Gouveia

作者 Diogo Gouveia

"在英国完成学业后,我加入了Connecting Software的营销团队,创建关于软件集成和其他各种IT主题的内容。如果你有任何意见或建议,请联系我"。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.