Xây dựng mini CRM từ dữ liệu trên Google Sheet
Hôm trước trong buổi cafe, ông anh mình có nhờ tìm cách để thống kê tất cả dữ liệu khách hàng đang được lưu dải rác trên google sheet
tương ứng với mỗi bạn nhân viên trong công ty.
Vấn đề doanh nghiệp gặp phải là từ những dữ liệu trên google sheet
, họ không thể thống kê các con số từ những dữ liệu đó. Họ mong muốn có một giải pháp có thể tập trung hóa dữ liệu tại một chỗ cũng như thống kê được từ những dữ liệu đó.
Ví dụ như không thể thống kê được bao nhiêu KH đã mua hàng từ bên doanh nghiệp, số lượng KH tập trung chủ yếu ở miền Nam hay miền Bắc hay là tìm kiếm dữ liệu 1 khách hàng nhanh chóng từ 1 mớ các google sheet
.
Từ vấn đề người dùng gặp phải với lưu dữ liệu trên google sheet
và cách mình xử lí đống dữ liệu đó. Hôm nay mình xin phép viết bài chia sẻ cách mình đã biến các dữ liệu khách hàng từ excel thành một hệ thống Customer Relationship Management
nho nhỏ.
1. CRM là gì ?
CRM(Customer Relationship Management ) là một phần mềm quản lý quan hệ khách hàng, một chiến lược kinh doanh mà doanh nghiệp sử dụng để giảm chi phí và tăng lợi nhuận bằng cách củng cố sự hài lòng của khách hàng, lòng trung thành.
Sự thật là CRM tập hợp thông tin từ tất cả các nguồn dữ liệu trong một tổ chức (và có khi thích hợp từ bên ngoài tổ chức) để cung cấp cho các nhà quản trị (CEO) một cái nhìn mới mẻ và định hướng mới dựa trên các dữ liệu phân tích.
Điều này cho phép khách hàng phải đối mặt với nhân viên trong các lĩnh vực như bán hàng, hỗ trợ khách hàng và tiếp thị để đưa ra quyết định nhanh chóng và được thông báo về tất cả mọi thứ từ mô hình "Cross-selling and upselling" cơ hội để nhắm mục tiêu chiến lược tiếp thị mục đích tạo chiến thuật định vị cạnh tranh.
Một số các lợi điểm của CRM với doanh nghiệp mà dễ dàng nhận thấy là
- Quản lý và sở hữu toàn bộ thông tin, dữ liệu làm việc với khách hàng
- Giữ kết nối với tất cả khách hàng của bạn
- Quản lý đội ngũ bán hàng hiệu quả, hỗ trợ nhân viên bán hàng tốt hơn
- Báo cáo đầy đủ, chính xác, cập nhật tức thì trên hệ thống
- Tổ chức các chiến dịch chăm sóc và marketing hiệu quả
- Làm được nhiều việc hơn trong thời gian ngắn hơn
2. Xử lí dữ liệu từ google sheet
Xuất phát từ những nhược điểm từ google sheet
mà @bunny.pi.green đã gặp phải khi lưu dữ liệu. Mình đã nghĩ ra ý tưởng xây dựng CRM nhanh chóng như sau.
- Việc thêm, xóa, sửa dữ liệu KH các file
google sheet
sẽ được giữ nguyên. Tức là mỗi bạn nhân viên trong công ty vẫn sẽ quản lí một filegoogle sheet
và thêm, xóa, sửa, trên file đó. - Tiến hành động bộ tất cả dữ liệu từ
google sheet
về 1 hệ cơ sơ dữ liệu. Ở đây để đơn giản nhất mình chọnmysql
. - Đồng bộ bằng cách nào ? Mình sử dụng Laravel tạo ra 1
cron job
đồng bộ dữ liệu vào cuối ngày vềmysql
. Từ đây xây dựng màn hình thống kê dựa trên dữ liệu đã đồng bộ về. - Với phát sinh ngay lập tức phải đồng bộ dữ liệu về
mysql
để phân tích thống kê thì sao ? Mình tạo thêm 1 nút bấm cho người dùng khi cần thiết có thể sử dụng để đồng bộ dữ liệu về chứ k cần chờcron job
vào cuối ngày.
2.1 Đặt cron job
Cho những bạn chưa biết.
Cron job là chức năng dùng để thực thi định kì lệnh nào đó trong một khoảng thời gian được xác định trước bởi admin website nào đấy. Ví dụ như tự động thống kê đơn hàng có được trong ngày vào lúc 23h59.
Ở đây mình xây dựng một cron job đồng bộ dữ liệu sau một ngày nhân viên tìm kiếm dữ liệu khách hàng. Trong laravel, rất dễ dàng để tạo ra một cron job với cú pháp php artisan make:command --ten_comand
. Chi tiết tìm hiểu thêm tại Task Scheduling
2.2 Lấy dữ liệu từ google sheet
Việc tiếp theo là phải connect tới google api
để fetch
toàn bộ dữ liệu thô
từ google sheet
xử lí thành dữ liệu tinh
và lưu vào trong mysql
.
Tại sao ở đây mình lại phân biệt giữa dữ liệu thô
và tinh
? Hãy tưởng tượng vấn đề như sau.
Thông tin KH của bạn gồm: Tên, tuổi, địa chỉ, tình trạng, đang thuộc về nhân viên nào kiểm soát. Nếu chúng ta fetch
được dữ liệu và lưu luôn dữ liệu thô
vào DB thì trong mysql
dữ liệu sẽ có cấu trúc như sau.
Name | City | District | Contact | User | Status |
---|---|---|---|---|---|
Nguyễn Văn A | Hà Nội | Ba Vì | 098xxxxxx | Nhân viên kinh doanh A | Tiềm năng |
Nguyễn Văn B | Hà Nội | Cầu Giấy | 098xxxxxx | Nhân viên kinh doanh A | Tiếp cận |
Nguyễn Văn C | Hà Nội | Hà Đông | 098xxxxxx | Nhân viên kinh doanh D | Từ chối |
Nguyễn Văn D | Hà Nội | Ba Vì | 098xxxxxx | Nhân viên kinh doanh B | Đang hợp tác |
Nguyễn Văn E | Hà Nội | Long Biên | 098xxxxxx | Nhân viên kinh doanh C | Tiềm năng |
Nguyễn Văn F | Hà Nội | Nam Từ Liêm | 098xxxxxx | Nhân viên kinh doanh C | Từ chối |
Nguyễn Văn G | Hà Nội | Ba Vì | 098xxxxxx | Nhân viên kinh doanh A | Tiềm năng |
... | ... | ... | ... | ... | ... |
Bây giờ là quản trị doanh nghiệp, tôi cần thống kê những KH đang ở tình trạng tiềm năng
để đưa ra chiến lược kinh doanh hợp lí. Mình có 1 select
chọn Tiềm năng
rồi gửi request lên server. Với mysql
, tôi có câu lệnh như sau.
select * from `customers` where status = 'Tiềm năng';
Thật tiếc là câu lệnh này sẽ không lấy được dữ liệu do điều kiện where
không support tiếng Việt. Có lẽ khả thi hơn trong trường hợp này là dùng where like nhưng mình đã không dùng mà thực hiện việc tách bảng.
Như trên sơ đồ có vẻ các bạn đã thấy mình tách các bảng có quan hệ 1-n với nhau. Mục đích là sẽ lưu id của các trường như: city
, district
, statuses
... để khi truy vấn sẽ dễ dàng hơn.
Vậy làm sao để convert được các data dạng thô là các chữ tiếng Việt thành các id dạng số. Vâng chính vì vậy nên mình đã coi dữ liệu trên google sheet là dữ liệu thô và cần tiền xử lí trước khi insert vào database mysql
.
Quay lại bài toán ban đầu, làm sao để lấy được dữ liệu từ google sheet
để lưu vào database
. Thật may, google có cung cấp cho chúng ta Google Sheets API
. Với laravel thật dễ dàng để fetch
dữ liệu về. Ở đây mình không hướng dẫn chi tiết cách fetch
về vì đã có 1 bài rất chi tiết mọi người xem qua tại đây Laravel và google sheet api
2.3 Xử lí dữ liệu thô
Như mình nói ở phần trên, việc tiếp theo cuả chúng ta là xử lí dữ liệu thô thành dữ liệu tinh.
public function handle()
{
Customer::truncate();
$client = $this->getGoogleClient();
$service = new Google_Service_Sheets($client);
$listSheetId = config('common.google_sheet_id');
$masterDataUser = User::where('role', 'staff')->get();
$masterDataCity = City::all();
$masterDataDist = District::all();
$masterDataStatus = Status::all();
foreach ($listSheetId as $spreadsheetId) {
$range = 'A2:Q';
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
$datacustomers = $response->getValues();
foreach ($datacustomers as $key => $data) {
if(!isset($data[0])) {
continue;
}
$custommer = [];
$custommer['user_id'] = $this->findUserID($data[0], $masterDataUser);
if(isset($data[2])) {
$custommer['city_id'] = $this->findCityID($data[2], $masterDataCity);
} else {
$custommer['city_id'] = 0;
}
if(isset($data[3])) {
$custommer['district_id'] = $this->findDistrictID($data[3], $masterDataDist);
} else {
$custommer['district_id'] = 0;
}
if(isset($data[8])) {
$custommer['status_id'] = $this->findStatusID($data[8], $masterDataStatus);
} else {
$custommer['status_id'] = 0;
}
$totaldata[] = $custommer;
}
Customer::insert($totaldata);
}
}
Đây là logic mình xử lí việc convert dữ liệu thô thành tinh. Bạn có thể thấy có 4 hàm mình dùng: findUserID
, findCityID
, findDistrictID
, findStatusID
.
Ví dụ để xử lí dữ liệu thô status
từ google sheet về có các trạng thái: Tiềm năng
, Tiếp cận
, Hủy bỏ
, Đối tác
.
Mình tạo 1 master data trong bảng statuses
lưu lần lượt các trường này.
id | name | slug |
---|---|---|
1 | Tiềm năng | tiem-nang |
2 | Tiếp cận | tiep-can |
3 | Hủy bỏ | huy-bo |
4 | Đối tác | doi-tac |
private function findStatusID($status, $masterDataStatus)
{
foreach ($masterDataStatus as $masterStatus) {
if(Str::slug($status) == $masterStatus->slug) {
return $masterStatus->id;
}
}
return 0;
}
Với tham số status là trạng thái của khách hàng lấy được từ google sheet
. Mình so sánh status
sau khi đã được slug()
với lần lượt cách trạng thái trong database
đã được lấy sẵn từ hàm handle
.
Nếu trùng sẽ lấy ra id của status đó.
Với tư tưởng tương tự, mình lần lượt lấy ra được id của city
, district
, user
và coi nó là dữ liệu tinh được push
vào một mảng. Sau đó insert
vào database
.
Vậy là hoàn thành việc lấy dữ liệu và lưu chúng vào mysql để dễ dàng cho việc thống kê. Việc cuối cùng là setup cron job
cuối ngày fetch thông tin từ google sheet
về để tiện trong quá trình thống kê theo ngày từ class app/Console/Kernel.php
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('FetchDataGoogleSheet')->dailyAt('23:00');
}
Sau khi có dữ liệu rồi, chúng ta có thể dễ dàng thống kê, phân tích dựa trên số liệu đã có hay dễ dàng tìm kiếm hơn nhờ sự trợ giúp của các câu lệnh mysql
. Đưa ra những con số biết nói
cho doanh nghiệp dễ dàng triển khai các chương trình khuyến mại phù với tập khách hàng.
3. Ưu nhược điểm
3.1 Ưu điểm
- Phù hợp với doanh nghiệp đang sử dụng
google sheet
- Tiết kiệm chi phí cho doanh nghiệp: Chắc chắn rồi, chỉ cần bỏ ra một số tiền rất nhỏ đã có thể sở hữu những con số biết nói.
- Tiết kiệm thời gian triển khai. Gần như toàn bộ phần thêm, xóa, sửa dữ liệu mình phó mặc cho
google sheet
xử lí. Tận dụng tối đa UI/UX dễ dùng củagoogle sheet
để nhân viên thao tác nhanh hơn.
3.2 Nhược điểm
- Thời gian fetch dữ liệu rất lâu: Ở đây mình phải xử lí trên 100 file
google sheet
. Việc connect đến từng file rồi lấy dữ liệu về khá tốn thời gian. Thêm nữa mỗi lần chạy cron job mình phảitruncate()
bảng để tránhduplicate()
dữ liệu nên mỗi lầninsert
cả chục nghìn dữ liệu tốn khá nhiều thời gian. - Dữ liệu chưa được validate chặt chẽ: Vì thao tác thêm xóa sửa trên google sheet nên khả năng
validate
dữ liệu cũng bị hạn chế nhiều - Cấu trúc hàng cột trên
google sheet
phải chuẩn để có thể lấy ra thật chuẩn xác khi fetch về.
4. Tổng kết
Như vậy là mình vừa giới thiệu cho các bạn cách mình đã triển khai việc xây dựng một CRM nho nhỏ từ dữ liệu google sheet
. Ở đây mình nói nhiều về cách triển khai hơn là từng bước làm để phù hợp với hoàn cảnh bài viết.
Thực ra đây chỉ là cách làm ăn xổi so với việc xây dựng 1 CRM nhưng cũng có thể đáp ứng mong muốn của người dùng. Họ mong muốn có những có số thống kê trong thời gian ngắn nhất và mình đáp ứng nhu cầu của họ.
Cảm ơn các bạn đã theo dõi bài viết, nếu có bất kì ý tưởng gì thêm cho việc xây dựng hay tối ưu cho hệ thống CRM
thì có thể để lại bình luận phía dưới.
Donate cho tác giả : Buy me a coffee
Đọc những bài viết khác của tác giả: Chillwithsu.com
Lời kết:
Chúng tôi - những người lập trình viên sinh ra để giải quyết những vấn đề của xã hội. Không phải là những công nhân code.
All rights reserved