保姆级教程:如何快速搭建一个符合企业需求的CRM客户关系管理系统?

413 篇文章 4 订阅
134 篇文章 4 订阅
本文介绍了企业在面对客户信息管理混乱和CRM系统复杂问题时,如何通过使用零代码开发平台快速搭建符合需求的CRM系统。重点阐述了CRM的基本需求,包括客户管理、销售过程管理、营销管理和售后管理,并详细指导了搭建过程中的关键步骤,如安装、模版初始化、基础数据配置等。
摘要由CSDN通过智能技术生成

客户信息、线索分配管理乱,纸笔记录工作量太大;改用Excel,数据量又多又分散,同步协作难,数据丢失风险大;想买一个标准CRM系统吧,却发现功能繁杂不贴合实际需求,价格高,不实用……

那我们到底该如何快速搭建一个符合企业需求的CRM客户关系管理系统呢?

要我说啊,还是推荐使用零代码开发平台进行搭建,操作简单好上手,部署时间短,并且自定义化程度高,能够很好满足企业的需求。

我们团队用了不到一天时间就成功搭建出了一个CRM系统,有需要的可以自取,也可以在模板的基础上自行搭建——https://www.jiandaoyun.com(一键安装,进入链接即可查看和使用)

CRM客户关系管理基本需求

在搭建之前,我们首先要知道,最基本的CRM客户关系管理主要包括四个需求:客户管理、销售过程管理、营销管理、售后管理。

1、客户管理

客户管理是CRM系统的核心模块,涉及对客户信息的收集、存储和分析,包括客户的基本资料、购买历史、交流记录和偏好等。传统的纸质记录工作量很大,如果都交由销售人员自主登记,可能会出现信息收集内容不一致、信息分散等问题,想要交接的时候就会出现很多麻烦。因此,CRM系统的首要任务就是收集和管理这些客户信息数据,为企业建立一个全面的客户档案,帮助企业了解客户需求,预测客户行为,以及制定个性化的服务和沟通策略。

2、销售过程管理

销售过程管理旨在对整体的销售活动进行管理和监控,从客户录入、联系人完善、商机创建,到最后的持续跟进,帮助企业规范销售流程。销售主管、销售人员可对客户进行管理、对销售机会进行跟踪;企业能够提高销售效率,缩短销售周期,提高成交率。

3、营销管理

CRM系统也需要做到对市场活动的计划、执行、数据分析等全过程进行管理,拥有多样化的数据统计,有效追踪市场变化,及时进行活动调整,了解客户获取情况、目标客户来源、获取线索的成本等数据,从而为新的市场活动及公司战略规划提供有力的数据支持,帮助企业有效规划营销活动,控制营销支出,优化企业投入产出比。

4、售后管理

售后环节是企业经营中必不可少的一部分,优质的售后服务不仅可以提升客户满意度,提高企业的信誉,还可以增加产品的复购可能性,减少推广成本。因此,CRM系统也需要能够有效解决退换货、售后服务等问题,完善企业的售后流程。

下面我们根据这四大需求来快速搭建一个CRM客户关系管理系统

以我们团队使用的CRM系统为例,搭建CRM系统的基本步骤主要有五步:

1、安装CRM套件

2、模版初始化

3、基础数据配置

4、自定义表单

5、管理系统后台

1、安装CRM套件

  • 首先,在工作台中,点击新建应用,选择从模板中心创建后,进入模板中心;

  • 在模板中心中,搜索“CRM”,点击CRM进入CRM预览中,根据自己企业实际需求,安装一款最合适的CRM套件;

  • 在CRM预览中,点击“安装应用”,并选择“保留示例数据”;

  • 点击安装好的CRM套件,即可进入到CRM中。

2、模版初始化

初次安装CRM套件时,需要在管理员第一次进入CRM时进行模板初始化。已经开启过CRM或后续安装多个CRM模板时,不再需要做初始化了。

  • 通讯录中新增 CRM 角色组:销售总监、销售主管、销售人员;

  • 添加创建者、系统管理员至销售总监;

  • 配置对应角色至预设表单权限组。

3、基础数据配置

当系统安装基本完成后,将准备好的客户信息、联系人信息、商机信息等数据录入系统,录入方式可以是直接填写或者Excel导入(注意格式)。

4、自定义表单/仪表盘

(1)客户表
  • 在“客户及商机管理”模块中,点击进入“客户”页面,可以在此处添加、修改或更新相关客户信息,创建或修改客户联系人、负责人、商机等;

  • 如需退回某个客户,可以在客户页面点击具体客户数据,进入客户详情页,点击“退回”,在退回客户页面填写想要退回的公海池以及退回原因。

(2)公海池

公海池是客户信息的公共资源储存点,能够将不同行业、地区等客户信息组合在一起,使得销售能够共享客户信息,根据业务情况将客户领取到自己的客户中,达到客户的高度利用。

  • 在“客户及商机管理”模块中,点击进入“公海池”页面,可以在此处添加、删除、编辑、查看客户信息;

  • 如果只想查看特定公海池中的线索,还可以进行公海池的筛选;

  • 如果需要将公海池中的客户分配给某一个确定的销售人员负责跟进,可以进入客户详情页,点击“分配”按钮,在成员列表选择要分配的成员,完成客户分配。

(3)商机表

在CRM系统的商机表中,企业可以将所有销售机会进行整理汇总,通过商机表直观地观察到一个完整的销售周期,以便快速进行商机跟进,实现最终的赢单或输单。

  • 在“客户及商机管理”的“商机”板块,可以添加添加、删除、编辑、查看所有商机信息;

  • 业务人员也可以将商机进行分享,便于其他业务人员查看该商机的相关数据,了解商机详情。在“商机详情页>>基础信息”处,点击“分享”按钮,即可得到链接,进行分享;

  • 在跟进某条商机时,如果商机负责人出现离职、转岗等情况,需要更换相应的商机负责人,也可以在商机详情页面进行调整;

  • 记录有关商机推进的过程,可以直接在“商机”页面点击“推进”操作。

(4)客户分析

销售人员通过对客户的不断跟进,转化为商机并完成订单成交后,需要对客户进行管理,建立有效的客户管理制度。在CRM系统中,可以利用起客户分析看板,配置所需的相关仪表盘,如客户转化漏斗、客户画像分析、客户-商机转化分析、客户跟进分析,获取当前客户转化、分布情况,掌握客户的全局数据,针对客户情况制定下一步的营销方案。

 (5)市场活动分析

市场营销活动产生线索后,线索会转化为客户,形成销售机会,对此我们可以对此销售活动进行活动成效的分析,比如线索数、转化客户数、最终成单数、活动ROI等。分析营销活动的转化率,从而优化资源投放的比例,以达到利润最大化。CRM系统中的市场活动分析仪表盘主要分为两部分:营销ROI分析和营销活动看板。

(6)售后分析

参考系统中的订单数据,CRM系统可以自动生成售后分析仪表盘,主要有三个部分:售后服务分析、退货分析、满意度分析。因此,在产品售后阶段,管理人员可以通过售后分析看板,了解服务工单的需求次数、退货原因及其金额占比、以及售后服务的满意度情况等,全方位了解企业当前售后信息,以便于针对性的提升服务品质,增强产品质量。

(7)目标/绩效看板

这款CRM系统的销售目标及绩效看板主要包含目标完成率看板和员工绩效提成看板,系统可以根据导入的数据自动生成看板数据,有利于企业更直观地查看各部门、各成员的回款金额、目标完成情况,并直接计算出各成员每月的绩效提成,掌握员工绩效的一手数据,从而更好地进行人员管理。

5、管理系统后台

(1)权限配置

安装好CRM套件后,预设表单(如线索、客户、联系人、商机等)是默认无任何权限配置的,所以在正式使用前,管理员需要进行表单权限配置,仅需3个步骤,即可快速完成。

  • 点击进入左下角“管理后台”。

  • 进入管理后台,在“表单/仪表盘权限”中,选择需要编辑权限的预设表单,包括:线索、客户、联系人、商机、跟进计划和跟进记录。

  • 在预设表单权限组中点击“选择成员”,从部门成员列表中勾选组织架构/角色/成员,如将线索表的“全部”权限分配给CRM的销售总监角色;选择好后点击“确定”,完成CRM表单权限配置。

(2)消息提醒

当业务发生变动时,CRM系统将自动触发对相关人员的提醒。

  • 在“管理后台”界面,可以就相关提醒进行设置,包括提醒方式和是否提醒的设置。

以上就是快速搭建一个CRM客户关系管理系统的全过程。

crm项目的架构 * 创建web工程 * 引入jar包 * mysql的驱动包 * hibernate需要的jar包 * spring需要的jar包 * struts2需要的jar包 * jstl 需要的jar包 * junit需要的jar包 * 包的介绍 * cn.itcast.crm.container:重新封装spring容器 * cn.itcast.crm.dao:放置的是dao接口 * cn.itcast.crm.dao.impl:放置的是dao接口的实现类 * cn.itcast.crm.domain:放置的是po类、po类和数据库表关联的映射文件 * cn.itcast.crm.service:业务层的接口 * cn.itcast.crm.service.impl:业务层的接口的实现类 * cn.itcast.crm.web.action:struts2的action * cn.itcast.crm.web.form:封装页面数据的javaBean * junit:开发人员测试用的 * 搭建hibernate层 * 定义需求:部门信息的页面数据要插入到数据库中 * 定义表 CREATE TABLE `sys_user_group` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, #编号 `remark` TEXT, #备注 `name` VARCHAR(100) DEFAULT NULL, #部门名称 `principal` VARCHAR(50) DEFAULT NULL, #部门负责人 `incumbent` VARCHAR(200) DEFAULT NULL, #部门职能 PRIMARY KEY (`id`) ) * 创建po对象,放置在cn.itcast.crm.domain包下 public class SysUserGroup implements java.io.Serializable { private Integer id; private String remark; // 备注 private String name; // 部门名称 private String principal; // 部门负责人 private String incumbent; // 部门职能 } * 创建表和po之间的映射文件SysUserGroup.hbm.xml 放置在cn.itcast.crm.domain包下 * SysUserGroup.hbm.xml文件的内容直接看该文件即可 * 创建hibernate.cfg.xml文件连接数据库,加载SysUserGroup.hbm.xml文件,放置src下 <session-factory> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/itcast0807crm</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.autocommit">true</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <mapping resource="cn/itcast/crm/domain/SysUserGroup.hbm.xml"/> </session-factory> * 测试.放置在junit包下 public class TestHibernate { @Test public void testHibernateConf(){ Configuration config=new Configuration(); config.configure(); SessionFactory sf=config.buildSessionFactory(); Session s=sf.openSession(); Transaction tx=s.beginTransaction(); SysUserGroup sysUserGroup=new SysUserGroup(); sysUserGroup.setName("销售部"); sysUserGroup.setPrincipal("xxx"); sysUserGroup.setIncumbent("ttt"); s.save(sysUserGroup); tx.commit(); s.close(); } } * 搭建spring和hibernate * 创建beans.xml文件,放置在src下 * 引入命名空间 bean tx context aop <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> * 配置如下: <!-- 1 配置注解的自动扫描--> <context:component-scan base-package="cn.itcast.crm"/> <!--3 配置本地化代理工程bean,这是spring整合hibernate的入口 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <!--表示在类路径下加载hibernate.cfg.xml --> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <!--4 创建事务管理器 aop切面--> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--5 配置处理事务的注解--> <tx:annotation-driven transaction-manager="txManager"/> * 创建dao层共同的接口,放置在cn.itcast.crm.dao下 public interface ICommonDao<T> { public void save(T entity); } * 创建dao层共同的接口的实现类,,放置在cn.itcast.crm.dao.impl下 public class CommonDaoImpl<T> extends HibernateDaoSupport implements ICommonDao<T> { public void save(T entity) { this.getHibernateTemplate().save(entity); } @Resource(name="sessionFactory") //注入sessionFactory public void setSessionFactoryDI(SessionFactory sessionFactory) { System.out.println("sessionFactory "+sessionFactory); //调用父类的setSessionFactory方法,注入sessionFactory super.setSessionFactory(sessionFactory); } } * 创建部门的dao接口 SysUserGroupDao接口 放在cn.itcast.crm.dao包下 public interface ISysUserGroupDao extends ICommonDao<SysUserGroup> { public final static String SERVICE_NAME="cn.itcast.crm.dao.impl.SysUserGroupDaoImpl"; } * 创建部门的dao接口的实现类 放在cn.itcast.crm.dao.impl包下 @Repository(ISysUserGroupDao.SERVICE_NAME) public class SysUserGroupDaoImpl extends CommonDaoImpl<SysUserGroup> implements ISysUserGroupDao { } * 测试,放置在junit包下 public class TestSysUserGroupDao { @Test public void testSave() { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); ISysUserGroupDao sysUserGroupDao = (ISysUserGroupDao) ctx.getBean(ISysUserGroupDao.SERVICE_NAME); SysUserGroup sysUserGroup = new SysUserGroup(); sysUserGroup.setName("销售部"); sysUserGroup.setPrincipal("xxx"); sysUserGroup.setIncumbent("ttt"); sysUserGroupDao.save(sysUserGroup); } } * 创建部门的业务层接口 ,放置在cn.itcast.crm.service包下 public interface ISysUserGroupService { public final static String SERVICE_NAME="cn.itcast.crm.service.impl.SysUserGroupServiceImpl"; public void saveSysUserGroup(SysUserGroup sysUserGroup); } * 创建部门的业务层接口实现类,放置在cn.itcast.crm.service.impl包下 @Transactional(readOnly=true) @Service(ISysUserGroupService.SERVICE_NAME) public class SysUserGroupServiceImpl implements ISysUserGroupService { @Resource(name=ISysUserGroupDao.SERVICE_NAME) private ISysUserGroupDao sysUserGroupDao; @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false) public void saveSysUserGroup(SysUserGroup sysUserGroup) { sysUserGroupDao.save(sysUserGroup); } } * 测试 public class TestSysUserGroupService { @Test public void testSavex() { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); ISysUserGroupService sysUserGroupService = (ISysUserGroupService) ctx.getBean(ISysUserGroupService.SERVICE_NAME); SysUserGroup sysUserGroup = new SysUserGroup(); sysUserGroup.setName("销售部"); sysUserGroup.setPrincipal("xxx"); sysUserGroup.setIncumbent("ttt"); sysUserGroupService.saveSysUserGroup(sysUserGroup); } } * 搭建struts2(保存部门信息) * jsp页面(sys/group/add.jsp) * 请求的路径/sys/sysUserGroupAction_save.do * 根据路径创建SysUserGroupAction和在action中增加save方法,放置在cn.itcast.crm.web.action包下 public class SysUserGroupAction extends ActionSupport public String save() throws IllegalAccessException, InvocationTargetException{ System.out.println("xxxxxxxxxxxxxxxxxxxxxxxx "); return null; } } * 建立请求路径和action之间的关联 * 创建struts.xml文件,放置在src下 * 文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 配置请求后缀名.do --> <constant name="struts.action.extension" value="do"/> <!-- 配置主题为简单主题 --> <constant name="struts.ui.theme" value="simple"/> <!--配置struts2的模式为开发模式--> <constant name="struts.devMode" value="true"/> <package name="sys" namespace="/sys" extends="struts-default"> <action name="sysUserGroupAction_*" class="cn.itcast.crm.web.action.SysUserGroupAction" method="{1}"> <result name="add">/sys/group/add.jsp</result> </action> </package> </struts> * 在web.xml文件配置struts2的过滤器 <filter> <filter-name>StrutsPrepareAndExecuteFilter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>StrutsPrepareAndExecuteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> * 测试 * 定义javaBean(vo对象)接收表单数据,放置在cn.itcast.crm.web.form包下 public class SysUserGroupForm implements java.io.Serializable { private String id; private String name; private String principal; private String incumbent; private String remark; } * action要实现模型驱动接口 public class SysUserGroupAction extends ActionSupport implements ModelDriven<SysUserGroupForm>{ private SysUserGroupForm sysUserGroupForm=new SysUserGroupForm(); public String save() throws IllegalAccessException, InvocationTargetException{ System.out.println("xxxxxxxxxxxxxxxxxxxxxxxx "); return null; } public SysUserGroupForm getModel() { return sysUserGroupForm; } } * 测试,SysUserGroupForm是否接收到值 * 如何在struts2的SysUserGroupAction中的save方法中,获取spring容器中bean节点的对象 * 创建ServiceProvinderCore,加载beans.xml文件,放置在cn.itcast.crm.container包下 public class ServiceProvinderCore { protected ApplicationContext ctx; /** * @param filename beans.xml */ public void load(String filename){ ctx=new ClassPathXmlApplicationContext(filename); } } * 创建ServiceProvinder类,获取获取spring容器中bean节点的对象,放置在cn.itcast.crm.container包下 public class ServiceProvinder { private static ServiceProvinderCore sc; static{ System.err.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); sc=new ServiceProvinderCore(); sc.load("beans.xml"); } public static Object getService(String beanName){ System.err.println("ppppppppppppppppppppppp"); if(StringUtils.isBlank(beanName)){ throw new RuntimeException("您要访问的服务名称不能为空"); } Object bean=null; //如果spring容器中包含beanName if(sc.ctx.containsBean(beanName)){ bean=sc.ctx.getBean(beanName); } //如果spring容器中不包含beanName if(bean==null){ throw new RuntimeException("您要访问的服务名称["+beanName+"]不存在"); } return bean; } } * 测试 @Test public void testSave() { ISysUserGroupService sysUserGroupService=(ISysUserGroupService)ServiceProvinder.getService(ISysUserGroupService.SERVICE_NAME); SysUserGroup sysUserGroup = new SysUserGroup(); sysUserGroup.setName("销售部"); sysUserGroup.setPrincipal("xxx"); sysUserGroup.setIncumbent("ttt"); sysUserGroupService.saveSysUserGroup(sysUserGroup); } * 在 SysUserGroupAction中的save方法中增加如下代码 public String save() throws IllegalAccessException, InvocationTargetException{ System.out.println("sysUserGroupForm.getName() "+sysUserGroupForm.getName()); //实例化po对象 SysUserGroup sysUserGroup=new SysUserGroup(); //赋值vo对象的值到po中 BeanUtils.copyProperties(sysUserGroup, sysUserGroupForm); //获取业务层的对象(本项目struts2和spring是分离的) ISysUserGroupService sysUserGroupService= (ISysUserGroupService)ServiceProvinder.getService(ISysUserGroupService.SERVICE_NAME); //调用业务层保存po对象 sysUserGroupService.saveSysUserGroup(sysUserGroup); return null; } * 测试:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值