Phân nhóm khách hàng RFM bằng Google Sheets: công thức, chấm điểm và hành động cho từng nhóm
Hướng dẫn từng bước tính Recency, Frequency, Monetary bằng Google Sheets, chấm điểm 1 đến 5, gom thành 8 nhóm khách và quyết định chăm sóc từng nhóm.

Trong bài này
- 14 phút đọc
- 11 phần
- 18 mẫu sao chép được
- 5 bảng tra cứu
Mục lục
Shop online nào sau một thời gian bán hàng cũng có một danh sách khách hàng dài: vài nghìn số điện thoại, vài chục nghìn đơn hàng. Câu hỏi là: trong danh sách đó, ai đáng được chăm sóc đặc biệt, ai sắp rời bỏ, ai chỉ mua một lần rồi thôi? Gửi cùng một tin ưu đãi cho tất cả là cách tốn kém nhất: khách trung thành không cần giảm giá vẫn mua, còn khách đã quên shop thì một tin nhắn chung chung không đủ để kéo họ về.
RFM là phương pháp phân nhóm khách hàng lâu đời và dễ áp dụng nhất trong marketing dựa trên dữ liệu. Nó chỉ cần ba thông tin có sẵn trong lịch sử đơn hàng, và có thể làm hoàn toàn bằng Google Sheets mà không cần phần mềm CRM. Bài này hướng dẫn từng bước: chuẩn bị dữ liệu, tính ba chỉ số, chấm điểm, đặt tên nhóm và quyết định làm gì với từng nhóm. Các công thức đều là công thức Google Sheets phổ biến, có thể chép và chỉnh lại theo cấu trúc dữ liệu của bạn.
RFM là gì#
RFM đánh giá mỗi khách hàng theo ba chiều:
| Chữ | Ý nghĩa | Câu hỏi | Cách tính |
|---|---|---|---|
| R – Recency | Độ gần | Lần mua gần nhất cách đây bao lâu? | Số ngày từ đơn gần nhất đến ngày phân tích |
| F – Frequency | Tần suất | Khách đã mua bao nhiêu lần? | Số đơn thành công |
| M – Monetary | Giá trị | Khách đã chi bao nhiêu? | Tổng giá trị các đơn thành công |
Ý tưởng đằng sau: khách vừa mua gần đây, mua nhiều lần và chi nhiều là khách có khả năng mua tiếp cao nhất. Khách lâu không mua, chỉ mua một lần, chi ít là khách có nguy cơ không quay lại. Giữa hai cực đó có nhiều nhóm với hành vi khác nhau, và mỗi nhóm cần một cách tiếp cận khác.
Trong ba chỉ số, R thường quan trọng nhất để dự đoán khách có mua lại hay không. Một khách từng chi rất nhiều nhưng đã 18 tháng không quay lại có thể đã chuyển sang shop khác. Một khách mới mua lần đầu tuần trước đang ở thời điểm dễ chăm sóc nhất.
Bước 1: Chuẩn bị dữ liệu đơn hàng#
Bạn cần một bảng đơn hàng, mỗi dòng là một đơn, tối thiểu bốn cột. Có thể xuất từ trang quản trị website, sàn thương mại điện tử, phần mềm bán hàng, hoặc tự gộp từ nhiều nguồn.
| Cột | Tên | Ví dụ | Ghi chú |
|---|---|---|---|
| A | Mã đơn | DH10234 | Không bắt buộc cho tính toán, giúp đối chiếu |
| B | Mã khách | 0901234567 | Số điện thoại đã chuẩn hoá, hoặc mã khách hàng |
| C | Ngày đặt | 15/09/2026 | Phải là kiểu ngày, không phải chữ |
| D | Giá trị | 450000 | Số, không có chữ “đ” hay dấu chấm phân cách dạng chữ |
| E | Trạng thái | Thành công | Để loại đơn huỷ, đơn hoàn |
Đặt tên trang tính này là Don. Dữ liệu bắt đầu từ dòng 2.
Làm sạch dữ liệu
Phần lớn sai lệch trong RFM đến từ dữ liệu bẩn, không phải từ công thức. Những việc cần làm trước:
- Chuẩn hoá số điện thoại. Cùng một khách có thể xuất hiện dưới dạng “0901 234 567”, “+84901234567”, “84901234567”. Nếu không chuẩn hoá, một khách bị đếm thành ba khách, mỗi người có F bằng 1.
- Loại đơn không thành công. Đơn huỷ, đơn hoàn, đơn bom hàng không nên tính vào F và M.
- Kiểm tra kiểu ngày. Ngày xuất từ một số hệ thống ở dạng chữ, hoặc theo định dạng tháng/ngày. Hãy kiểm tra bằng cách đổi định dạng ô sang dạng số: nếu ô hiện ra một số như 46280, đó là ngày hợp lệ.
- Gộp dữ liệu nhiều kênh. Nếu bán trên website, sàn và Zalo, khách có thể mua ở nhiều kênh. Gộp lại theo số điện thoại sẽ cho bức tranh đầy đủ hơn, trong giới hạn dữ liệu mà từng kênh cho phép bạn có.
Công thức chuẩn hoá số điện thoại Việt Nam về dạng bắt đầu bằng 0, đặt ở một cột phụ:
=LET(
so, REGEXREPLACE(TO_TEXT(B2), "[^0-9]", ""),
IF(LEFT(so, 2) = "84", "0" & MID(so, 3, 20),
IF(LEFT(so, 1) = "0", so, "0" & so))
)
Công thức bỏ mọi ký tự không phải số, đổi đầu số 84 thành 0, và thêm số 0 nếu bị mất (thường do bảng tính tự bỏ số 0 ở đầu khi coi số điện thoại là số).
Bước 2: Lập bảng khách hàng và tính R, F, M#
Tạo trang tính mới tên RFM. Ô H1 chứa ngày phân tích, ví dụ hôm nay:
=TODAY()
Nên cố định ngày phân tích bằng một ngày cụ thể thay vì TODAY() nếu bạn muốn so sánh kết quả giữa các lần chạy.
Danh sách khách duy nhất
Ô A2, lấy danh sách mã khách không trùng, chỉ từ đơn thành công:
=UNIQUE(FILTER(Don!B2:B, Don!B2:B <> "", Don!E2:E = "Thành công"))
Recency – số ngày từ lần mua gần nhất
Ô B2, kéo xuống hết danh sách:
=$H$1 - MAXIFS(Don!$C$2:$C, Don!$B$2:$B, A2, Don!$E$2:$E, "Thành công")
Frequency – số đơn thành công
Ô C2:
=COUNTIFS(Don!$B$2:$B, A2, Don!$E$2:$E, "Thành công")
Monetary – tổng giá trị
Ô D2:
=SUMIFS(Don!$D$2:$D, Don!$B$2:$B, A2, Don!$E$2:$E, "Thành công")
Nếu danh sách khách dài hàng nghìn dòng, thay vì kéo công thức, có thể dùng BYROW để tính một lần cho cả cột. Ví dụ cho Frequency:
=BYROW(A2:A, LAMBDA(kh, IF(kh = "", ,
COUNTIFS(Don!B2:B, kh, Don!E2:E, "Thành công"))))
Bước 3: Chấm điểm từ 1 đến 5#
Ba con số R, F, M có đơn vị khác nhau (ngày, lần, đồng), nên cần quy về cùng thang điểm. Cách phổ biến là chia mỗi chỉ số thành 5 mức, điểm 5 là tốt nhất. Có hai cách chia.
Cách 1: Ngưỡng cố định
Bạn tự đặt ngưỡng dựa trên hiểu biết về chu kỳ mua hàng của ngành. Cách này dễ giải thích, ổn định giữa các lần chạy, phù hợp khi bạn đã biết rõ khách thường mua lại sau bao lâu. Ví dụ cho một shop mỹ phẩm, khách thường mua lại sau 1 đến 2 tháng:
| Điểm | R (ngày) | F (đơn) | M (đồng) |
|---|---|---|---|
| 5 | ≤ 30 | ≥ 6 | ≥ 3.000.000 |
| 4 | 31 – 60 | 4 – 5 | 1.500.000 – 2.999.999 |
| 3 | 61 – 120 | 3 | 800.000 – 1.499.999 |
| 2 | 121 – 240 | 2 | 300.000 – 799.999 |
| 1 | > 240 | 1 | < 300.000 |
Các ngưỡng trên chỉ minh hoạ cách đặt. Ngưỡng phù hợp với shop của bạn phụ thuộc vào ngành hàng, giá trị đơn trung bình và chu kỳ mua lại. Một shop bán nội thất có chu kỳ hàng năm sẽ cần ngưỡng R dài hơn nhiều.
Công thức điểm R với ngưỡng cố định, ô E2:
=IFS(B2 <= 30, 5, B2 <= 60, 4, B2 <= 120, 3, B2 <= 240, 2, TRUE, 1)
Điểm F, ô F2:
=IFS(C2 >= 6, 5, C2 >= 4, 4, C2 = 3, 3, C2 = 2, 2, TRUE, 1)
Điểm M, ô G2:
=IFS(D2 >= 3000000, 5, D2 >= 1500000, 4, D2 >= 800000, 3, D2 >= 300000, 2, TRUE, 1)
Cách 2: Chia theo phân vị
Chia khách thành 5 nhóm bằng nhau theo thứ hạng: 20% khách tốt nhất được 5 điểm, 20% tiếp theo 4 điểm, và cứ thế. Cách này tự điều chỉnh theo dữ liệu, không cần biết trước ngưỡng. Nhược điểm: ngưỡng thay đổi mỗi lần chạy, và với F, rất nhiều khách có cùng giá trị 1 nên việc chia đều không hoạt động tốt.
Điểm M theo phân vị:
=MIN(5, 1 + INT(PERCENTRANK.INC($D$2:$D, D2) * 5))
Với R, số ngày càng nhỏ càng tốt, nên đảo chiều:
=MIN(5, 1 + INT((1 - PERCENTRANK.INC($B$2:$B, B2)) * 5))
Gợi ý thực tế: dùng phân vị cho M, ngưỡng cố định cho F (vì phần lớn khách chỉ mua 1 lần), và ngưỡng cố định cho R dựa trên chu kỳ mua lại thực tế. Chu kỳ mua lại có thể ước lượng bằng trung vị khoảng cách giữa hai đơn liên tiếp của những khách mua từ hai lần trở lên.
Ghép mã RFM
Ô H2, ghép ba điểm thành một mã như “545”:
=E2 & F2 & G2
Với 5 mức cho mỗi chỉ số, có 125 tổ hợp. Quá nhiều để làm việc. Bước tiếp theo là gom lại thành một số nhóm có ý nghĩa.
Bước 4: Gom thành nhóm khách hàng#
Có nhiều cách gom. Một cách đơn giản và đủ dùng cho shop nhỏ là dựa trên điểm R và điểm trung bình của F và M (gọi là FM). Lý do: F và M thường đi cùng nhau, khách mua nhiều lần thường cũng chi nhiều.
Ô I2, điểm FM:
=ROUND((F2 + G2) / 2, 0)
Bảng phân nhóm dựa trên R và FM:
| Nhóm | Điều kiện | Mô tả |
|---|---|---|
| Trung thành | R ≥ 4 và FM ≥ 4 | Mua gần đây, mua nhiều, chi nhiều |
| Tiềm năng | R ≥ 4 và FM = 2 hoặc 3 | Mua gần đây, đang trên đà gắn bó |
| Khách mới | R ≥ 4 và FM = 1 | Mới mua lần đầu, chưa rõ có quay lại không |
| Cần chú ý | R = 3 và FM ≥ 3 | Từng tốt, bắt đầu giãn khoảng cách mua |
| Sắp ngủ đông | R = 3 và FM ≤ 2 | Ít mua, khoảng cách đang dài ra |
| Không thể mất | R ≤ 2 và FM ≥ 4 | Từng là khách tốt nhất, lâu rồi không quay lại |
| Có nguy cơ | R ≤ 2 và FM = 3 | Từng mua khá, đang rời đi |
| Đã rời đi | R ≤ 2 và FM ≤ 2 | Ít mua, lâu không quay lại |
Công thức gán nhóm, ô J2:
=IFS(
AND(E2 >= 4, I2 >= 4), "Trung thành",
AND(E2 >= 4, I2 >= 2), "Tiềm năng",
E2 >= 4, "Khách mới",
AND(E2 = 3, I2 >= 3), "Cần chú ý",
E2 = 3, "Sắp ngủ đông",
I2 >= 4, "Không thể mất",
I2 = 3, "Có nguy cơ",
TRUE, "Đã rời đi"
)
Thứ tự điều kiện trong IFS quan trọng: công thức dừng ở điều kiện đúng đầu tiên. Vì vậy các điều kiện cho R ≥ 4 đặt trước, rồi R = 3, cuối cùng là R ≤ 2.
Bảng tổng hợp
Trên một trang tính riêng, đếm số khách và tổng doanh thu theo nhóm bằng QUERY:
=QUERY(RFM!A2:J,
"select J, count(A), sum(D), avg(D)
where A is not null
group by J
order by sum(D) desc
label J 'Nhóm', count(A) 'Số khách', sum(D) 'Doanh thu', avg(D) 'Chi tiêu TB'", 0)
Bảng này thường cho thấy một điều quen thuộc: một nhóm nhỏ khách (Trung thành, Không thể mất) đóng góp phần lớn doanh thu. Con số cụ thể ở shop của bạn sẽ khác, nhưng việc nhìn thấy nó trên bảng tính giúp quyết định ngân sách chăm sóc dễ hơn nhiều.
Bước 5: Mỗi nhóm làm gì#
Phân nhóm chỉ có giá trị khi dẫn tới hành động khác nhau. Bảng dưới đây là gợi ý xuất phát điểm:
| Nhóm | Mục tiêu | Hành động gợi ý | Tránh |
|---|---|---|---|
| Trung thành | Giữ và trân trọng | Ưu tiên hàng mới, quà tri ân, mời đánh giá, chương trình giới thiệu bạn bè | Giảm giá sâu không cần thiết, làm mất biên lợi nhuận |
| Tiềm năng | Biến thành trung thành | Gợi ý sản phẩm liên quan, ưu đãi khi đạt mốc chi tiêu, chương trình thành viên | Gửi quá nhiều tin |
| Khách mới | Có đơn thứ hai | Hướng dẫn sử dụng, hỏi thăm trải nghiệm, ưu đãi đơn thứ hai trong thời hạn ngắn | Bỏ mặc sau đơn đầu |
| Cần chú ý | Kéo lại trước khi rời đi | Nhắc nhẹ khi đến chu kỳ mua lại, gợi ý sản phẩm từng mua | Chờ đến khi họ thành “đã rời đi” |
| Sắp ngủ đông | Thử kích hoạt | Ưu đãi có thời hạn, nội dung giới thiệu hàng mới | Đầu tư ngân sách lớn |
| Không thể mất | Hiểu lý do và kéo về | Liên hệ cá nhân, hỏi lý do, ưu đãi riêng đáng kể | Gửi tin nhắn hàng loạt như mọi người |
| Có nguy cơ | Kéo về | Ưu đãi quay lại, nhắc những gì đã thay đổi tốt hơn | Giảm giá liên tục làm khách chỉ chờ giảm giá |
| Đã rời đi | Thử một lần, rồi để yên | Một chiến dịch quay lại duy nhất, sau đó giảm tần suất | Tiếp tục gửi tin đều đặn, tốn chi phí và gây phiền |
Một nguyên tắc chung: giảm giá là công cụ đắt nhất. Hãy dùng nó cho các nhóm cần một lý do mạnh để quay lại (Có nguy cơ, Không thể mất), và dùng sự quan tâm, nội dung hữu ích, quyền lợi thành viên cho các nhóm đang gắn bó.
Gửi tin đúng luật
Khi dùng kết quả RFM để gửi tin ưu đãi, chỉ gửi cho khách đã đồng ý nhận thông tin quảng cáo. Theo Luật Bảo vệ dữ liệu cá nhân có hiệu lực từ 1/1/2026, việc xử lý dữ liệu khách hàng cho mục đích quảng cáo cần sự đồng ý của khách, và khách có quyền từ chối. Hãy thêm một cột “Đồng ý nhận ưu đãi” vào bảng khách hàng và lọc theo cột này trước khi xuất danh sách gửi tin. Chi tiết về các kênh gửi tin xem bài Zalo OA và ZNS cho thông báo đơn hàng.
Lọc danh sách khách “Có nguy cơ” đã đồng ý nhận tin, giả sử cột K là trạng thái đồng ý:
=FILTER(RFM!A2:D, RFM!J2:J = "Có nguy cơ", RFM!K2:K = "Có")
Bước 6: Theo dõi sự dịch chuyển giữa các nhóm#
Một lần phân nhóm cho bạn bức tranh hiện tại. Chạy lại hàng tháng cho bạn thấy xu hướng: khách đang dịch chuyển lên nhóm tốt hơn hay xuống nhóm xấu hơn. Đây là thước đo hiệu quả chăm sóc khách hàng thực tế hơn số lượt mở tin nhắn.
Cách làm đơn giản:
- Cuối mỗi tháng, sao chép cột Mã khách và Nhóm sang một trang tính lưu trữ, đặt tên theo tháng, ví dụ RFM_2026_10.
- Trong trang tính tháng mới, thêm cột “Nhóm tháng trước” bằng
XLOOKUP. - Lập bảng chéo: hàng là nhóm tháng trước, cột là nhóm tháng này.
=XLOOKUP(A2, RFM_2026_10!A:A, RFM_2026_10!J:J, "Mới xuất hiện")
Câu hỏi đáng theo dõi nhất mỗi tháng:
- Bao nhiêu “Khách mới” tháng trước đã thành “Tiềm năng”? Đây là tỷ lệ có đơn thứ hai, chỉ số quan trọng với shop đang tăng trưởng.
- Bao nhiêu “Trung thành” tháng trước đã rơi xuống “Cần chú ý”? Nếu con số tăng, có điều gì đó không ổn với sản phẩm hoặc dịch vụ.
- Chiến dịch kéo khách “Có nguy cơ” có thực sự đưa họ lên nhóm cao hơn không?
Những sai lầm thường gặp#
- Không chuẩn hoá mã khách. Một khách bị tách thành nhiều dòng, F và M đều thấp hơn thực tế, khách trung thành bị xếp nhầm vào “khách mới”.
- Tính cả đơn huỷ, đơn hoàn. Khách hay bom hàng có thể được xếp vào nhóm “Trung thành” vì có nhiều đơn.
- Dùng ngưỡng R không hợp chu kỳ ngành. Shop bán nước giặt và shop bán sofa không thể dùng chung ngưỡng 30 ngày.
- Phân nhóm xong rồi không làm gì. Bảng tính đẹp không tạo ra doanh thu. Bắt đầu với một hoặc hai nhóm, làm một chiến dịch, đo kết quả, rồi mở rộng.
- Coi nhóm là nhãn cố định. Khách dịch chuyển giữa các nhóm liên tục. Phân nhóm cần chạy lại định kỳ.
- Bỏ qua khách mua qua kênh khác. Một khách “Đã rời đi” trên website có thể vẫn đang mua đều trên sàn. Gộp dữ liệu nhiều kênh khi có thể.
Khi nào cần nhiều hơn bảng tính#
Google Sheets phù hợp với vài nghìn đến vài chục nghìn khách. Khi dữ liệu lớn hơn, bảng tính chạy chậm và dễ lỗi khi nhiều người cùng sửa. Các dấu hiệu nên chuyển sang công cụ khác:
- Bảng đơn hàng vượt vài trăm nghìn dòng, công thức mất nhiều giây để tính lại.
- Cần cập nhật phân nhóm hàng ngày thay vì hàng tháng.
- Muốn tự động gửi tin theo nhóm mà không phải xuất danh sách thủ công.
Khi đó, nhiều phần mềm CRM và nền tảng tự động hoá marketing có sẵn tính năng phân nhóm theo hành vi. Logic vẫn giống hệt những gì bạn đã làm trên bảng tính, nên hiểu RFM bằng bảng tính trước giúp bạn cấu hình công cụ đúng ý hơn và đánh giá được kết quả công cụ trả về.
Câu hỏi thường gặp#
Shop mới, ít đơn, có nên làm RFM không?
Với vài chục khách, bạn có thể nhớ từng người và không cần RFM. Phương pháp này bắt đầu hữu ích khi danh sách khách đủ lớn để không còn nhớ hết, thường từ vài trăm khách trở lên.
Nên chọn khoảng thời gian dữ liệu bao lâu?
Thường là 12 đến 24 tháng gần nhất. Dữ liệu quá cũ phản ánh hành vi không còn đúng. Với ngành có chu kỳ mua dài, có thể cần khoảng thời gian dài hơn.
Có nên tính M theo doanh thu hay lợi nhuận?
Lợi nhuận phản ánh giá trị thực hơn, nhưng khó tính vì cần giá vốn từng đơn. Doanh thu là điểm khởi đầu hợp lý. Nếu biên lợi nhuận giữa các sản phẩm chênh lệch rất lớn, hãy cân nhắc chuyển sang lợi nhuận gộp.
Khách mua qua sàn thương mại điện tử có dùng được không?
Phụ thuộc vào dữ liệu mà sàn cung cấp cho người bán. Một số sàn hạn chế hoặc che thông tin liên hệ của người mua. Hãy dùng dữ liệu trong phạm vi sàn cho phép và tuân thủ chính sách của sàn về việc liên hệ khách ngoài nền tảng.
Kết luận#
RFM không phải phương pháp mới hay phức tạp, nhưng là một trong những cách hiệu quả nhất để biến danh sách khách hàng thành kế hoạch hành động. Bạn không cần phần mềm đắt tiền: một bảng đơn hàng sạch, vài công thức Google Sheets, và một buổi chiều để thiết lập là đủ. Phần khó không nằm ở công thức mà ở kỷ luật: chạy lại định kỳ, mỗi nhóm một hành động, và đo xem khách có thực sự dịch chuyển lên nhóm tốt hơn không.
Nếu khách hàng của bạn đến từ nhiều kênh quảng cáo khác nhau, bước tiếp theo là biết kênh nào đem về khách trung thành, kênh nào chỉ đem về khách mua một lần. Cách gắn nguồn cho từng đơn hàng được trình bày trong bài đo hiệu quả kênh bán hàng bằng UTM và GA4.
Nguồn tham khảo cú pháp hàm: Danh sách hàm Google Sheets (Google Docs Editors Help); quy định dữ liệu cá nhân: Tạp chí Luật sư Việt Nam.


