reConsents — MÔ TẢ TOÀN HỆ THỐNG

Bản v1.1 · 20/08/2026 · CTCP Axion Tài liệu này viết để ai đọc cũng hiểu: nhà đầu tư, luật sư, nhân viên kinh doanh, kỹ sư, cán bộ nhà mạng, cán bộ quản lý nhà nước. Không cần đọc tài liệu nào khác trước.


0. ĐỌC TÀI LIỆU NÀY THẾ NÀO

Tài liệu chia làm 4 tầng. Đọc đến đâu đủ dùng thì dừng.

Bạn là aiĐọc phầnMất khoảng
Người nghe lần đầu, cần hiểu "nó là cái gì"1 → 310 phút
Người bán hàng, đối tác, nhà đầu tư1 → 930 phút
Luật sư / cán bộ tuân thủ / DPO4 → 9 + 1630 phút
Kỹ sư, người sẽ tích hợp hoặc bàn giao10 → 1760 phút

Quy ước: chữ in đậm là khái niệm có định nghĩa trong Từ điển thuật ngữ (mục 17).


1. MỘT TRANG TÓM TẮT

1.1. Vấn đề

Ở Việt Nam, gọi điện tiếp thị cho người chưa đồng ý là hành vi bị cấm và bị phạt (Nghị định 91/2020, Nghị định 13/2023 về bảo vệ dữ liệu cá nhân, Luật Bảo vệ dữ liệu cá nhân 91/2025). Nhưng trên thực tế:

Cả ba bên đều thiếu cùng một thứ: một tờ bằng chứng đồng ý mà không bên nào sửa được, và cả ba bên đều đọc được.

1.2. reConsents làm gì

reConsents là nền tảng bằng chứng đồng ý nhận cuộc gọi. Nhiệm vụ duy nhất:

Khi một người bấm "đồng ý nhận cuộc gọi", reConsents chụp lại toàn bộ hoàn cảnh của cái bấm đó, đóng dấu chữ ký số, xâu vào một cuốn sổ không sửa được, và phát ra một mã tra cứu mà doanh nghiệp, nhà mạng, người dân và cơ quan quản lý đều kiểm tra được — kể cả khi reConsents đã ngừng hoạt động.

Chỉ vậy. Không hơn.

1.3. reConsents KHÔNG làm gì (quan trọng ngang phần trên)

Ranh giới này là quyết định chiến lược, không phải hạn chế kỹ thuật:

1.4. Vì sao mô hình này bền

Ba lý do, xếp theo độ khó bắt chước:

  1. Bằng chứng có giá trị vì bên thứ ba kiểm được. Càng nhiều nơi công nhận cách kiểm này, bằng chứng càng có giá — và giá trị đó dồn về nơi phát hành.
  2. Không đụng vào miếng cơm của ai. Không cạnh tranh tổng đài, không cạnh tranh nhà mạng, không cạnh tranh CRM. Ai cũng có thể là kênh phân phối.
  3. Càng siết luật càng cần. Rủi ro pháp lý tăng thì nhu cầu chứng minh tăng.

2. AI DÙNG — NĂM MẶT PHẲNG

Hệ thống chia làm 5 mặt phẳng hoàn toàn tách nhau. Đây là ranh giới kiến trúc, không phải ranh giới giao diện: mỗi mặt phẳng dùng một loại vé đăng nhập riêng (cookie riêng), và có một tường lửa mặt phẳng chặn trước mọi xử lý — cầm vé của mặt phẳng này thì gõ cửa mặt phẳng kia là bị chặn ngay ở vòng ngoài, không đi vào được bên trong.

#Mặt phẳngAiCửa vàoVé (cookie)
ADoanh nghiệp (merchant)Chủ DN, quản lý, sale, kế toán, DPO, kiểm toán nội bộ/app.htmlrc_session
BVận hành nền tảng (ops)Axion: quản trị, thẩm định, kế toán, hỗ trợ, pháp chế/ops.htmlrc_ops
CĐối tác phân phối (partner)Đại lý bán hàng, tổng đài/CRM tích hợp/partner.htmlrc_partner
DNhà mạng (carrier)Cán bộ đối soát, cán bộ theo dõi của nhà mạng/carrier.htmlrc_carrier
ECông khaiNgười dân, luật sư, cán bộ kiểm tra, phóng viên — không cần đăng nhập/verify.html, /congdan.html, /tinh-trang.html

2.1. Vai trong mặt phẳng doanh nghiệp (A)

VaiThấy gìLàm được gì
owner — ChủTất cảTất cả, kể cả tiền và tên miền
manager — Quản lýĐội ngũ + toàn bộ leadChia việc, duyệt câu chữ, đặt tiêu chí
agent — Nhân viên gọiChỉ lead được giao cho mìnhGhi kết quả gọi, đặt lịch gọi lại
accountant — Kế toánSố dư, sao kê credit, tính năng & giáChỉ xem — không nạp ví, không bật/tắt tính năng (hai việc đó cần quyền billing:pay, hiện chỉ Chủ có)
dpo — Phụ trách dữ liệu cá nhânBằng chứng, yêu cầu của chủ thể dữ liệuXử lý yêu cầu rút quyền / truy cập / xoá
viewer — Kiểm toán nội bộXem tất cảKhông sửa được gì

Nguyên tắc: nhân viên gọi chỉ nhìn thấy phần việc của mình. Không ai được xem toàn bộ danh bạ chỉ vì tò mò.


3. VÒNG ĐỜI MỘT BẰNG CHỨNG — KỂ BẰNG MỘT CÂU CHUYỆN

Chị Lan đang xem căn hộ trên website của Công ty Sao Mai.

Bước 1 — Widget xuất hiện. Dưới form đăng ký có một ô nhỏ: "Nha Khoa Sao Mai (MST 0107778899) xin phép gọi điện tư vấn…", kèm nút Đồng ý và nút Không, cảm ơn to bằng nhau.

Bước 2 — Mở phiên. Trước khi chị Lan bấm gì, trình duyệt đã hỏi reConsents: "khoá website này có thật không, và người này có đang bị chặn không?". reConsents kiểm:

Bước 3 — Nhận diện, pha sàng lọc (miễn phí). Lúc này hệ thống chưa hỏi nhà mạng "người này là ai" — hỏi thế là tốn tiền cho cả những người chỉ lướt ngang qua. Nó chỉ cần một câu YES/NO: có được phép hỏi người này không. Kết quả tạm thời là mức nhận diện bậc thấp trong thang 5 bậc (mục 5), và bằng chứng sau này sẽ nói thật đúng mức đó nếu không có gì nâng lên. Câu hỏi đắt tiền để dành tới bước 5b. Chi tiết ở mục 5b.

Bước 3b — Đo hành trình (miễn phí). Song song, widget ghi lại khách đến từ chiến dịch quảng cáo nào, đã xem mấy trang. Không dùng dữ liệu của nhà mạng, không dùng dữ liệu cá nhân.

Bước 4 — Widget tự đo chính mình. Ngay tại trình duyệt, widget đo:

Đây là điểm khác biệt: hầu hết hệ thống chỉ lưu "khách đã tick". reConsents lưu khách đã nhìn thấy cái gì.

Bước 5 — Chị Lan bấm Đồng ý.

Bước 5b — GIỜ mới hỏi nhà mạng (trả phí). Đến khoảnh khắc này mới đáng bỏ tiền hỏi "thuê bao nào", và cũng chỉ hỏi nếu doanh nghiệp đã tự tay bật tính năng đó. Mức nhận diện được nâng lên bậc cao nhất. Mỗi đồng trả ra đều gắn với một người đã tự nguyện đồng ý.

Bước 6 — Đóng gói. reConsents dựng một bản ghi gồm: thời điểm, website, sản phẩm, nguyên văn câu chữ chị Lan đọc (lưu bằng mã băm để chống sửa), số đo hiển thị ở bước 4, mức nhận diện ở bước 3, và một mã tham chiếu thuê baokhông phải số điện thoại thô.

Bước 7 — Chấm tiêu chí, ngay lúc phát hành. Bản ghi được đối chiếu với bộ tiêu chí doanh nghiệp tự đặt. Đạt hay không đạt đều được ghi vào bằng chứng, không hồi tố: đổi tiêu chí ngày mai không làm bằng chứng hôm nay đẹp lên hay xấu đi.

Bước 8 — Ký hai chữ ký. Bằng chứng được ký bởi Axion và bởi cổng nhà mạng. Hai bên độc lập cùng ký — một bên chối thì chữ ký bên kia vẫn còn.

Bước 9 — Xâu vào sổ. Mã băm của bằng chứng được nối vào mắt xích — mỗi bản ghi mang dấu vân tay của bản ghi trước. Sửa một bản ghi giữa sổ là đứt xích ở mọi bản ghi phía sau, nhìn là biết.

Bước 10 — Niêm phong theo ngày. Cuối ngày, toàn bộ bằng chứng trong ngày được gộp thành một dấu niêm phong duy nhất (Merkle root), rồi ký. Sau này chỉ cần giữ dấu niêm phong đó là chứng minh được cả ngày hôm ấy không ai sửa gì. Giới hạn phải nói rõ: dấu này hiện do chính reConsents ký, nên nó chứng minh được với mọi bên KHÁC, nhưng chưa chứng minh được thời điểm trước một bên nghi ngờ chính reConsents — muốn thế thì gốc ngày phải được một tổ chức cấp dấu thời gian được cấp phép đóng dấu (xem src/tsa.js, hiện trả TSA_PENDING).

Bước 11 — Chị Lan nhận mã. Ví dụ CT-3C8149. Chị vào /verify.html, dán mã vào, thấy: ai xin phép, xin lúc nào, xin để làm gì, chữ chị đọc là chữ gì, và một nút RÚT QUYỀN. Bấm là xong — không cần gọi tổng đài, không cần email, không cần chứng minh mình là ai với người đã làm phiền mình.

Bước 12 — Rút quyền. Rút quyền không xoá bằng chứng cũ (bằng chứng là sự thật lịch sử: chị đã từng đồng ý). Nó ghi thêm một sự kiện rút, và từ giây đó van kiểm trước cuộc gọi chặn mọi cuộc gọi tới chị.


4. BẰNG CHỨNG GỒM GÌ, VÀ AI KIỂM ĐƯỢC

4.1. Ba lớp lưu trữ

LớpTênXoá được?Vì sao thiết kế vậy
1records — bản ghi đầy đủLuật cho phép chủ thể yêu cầu xoá dữ liệu cá nhân. Phải xoá được thật.
2chain — mắt xích chỉ chứa mã bămKhôngChỉ có dấu vân tay, không có dữ liệu cá nhân → xoá lớp 1 vẫn giữ được lớp 2, vẫn chứng minh được "đã từng có một bằng chứng ở đúng vị trí này, đúng thời điểm này".
3roots — dấu niêm phong ngày, có chữ kýKhôngMột dòng cho cả ngày. Có thể công bố ra ngoài, đóng dấu thời gian độc lập.

Đây là cách giải một mâu thuẫn tưởng như không giải được: vừa xoá được theo luật, vừa không sửa được.

4.2. Năm lớp kiểm — công cụ kiểm chạy được khi không có mạng

Gói bằng chứng (rc-evidence-bundle-1) tải về là một file. Công cụ tools/verify-offline.js kiểm 5 lớp mà không cần gọi về máy chủ reConsents:

LớpKiểm cái gìTrả lời câu hỏi
L1Toàn vẹn bản ghiNội dung có bị sửa một chữ nào không?
L2Mắt xíchBản ghi này có đúng vị trí trong sổ không?
L3Đường chứng MerkleNó có thật sự nằm trong ngày đã niêm phong không?
L4Chữ ký dấu niêm phongDấu niêm phong ngày đó có phải do Axion ký không?
L5Token hai chữ kýCả Axion và nhà mạng có cùng ký bằng chứng này không?

Vì sao "chạy offline" là điều quan trọng nhất trong toàn bộ tài liệu này: nếu phải hỏi máy chủ reConsents mới biết bằng chứng thật hay giả, thì bằng chứng chỉ đáng tin bằng độ đáng tin của Axion. Kiểm offline được nghĩa là bằng chứng sống lâu hơn công ty phát hành ra nó. Toà án năm 2032 vẫn kiểm được một bằng chứng cấp năm 2026, kể cả khi Axion không còn tồn tại.

4.3. Bằng chứng KHÔNG chứa gì

Không chứa số điện thoại thô. Trong toàn bộ token chỉ có mã tham chiếu thuê bao — một chuỗi thay thế. Có một chốt chặn trong code: nếu bộ nhận diện lỡ trả về một số điện thoại dạng thô, hệ thống ném lỗi và từ chối phát hành, chứ không âm thầm ghi vào.

🔴 Việc còn nợ (đã biết, chưa làm): mã tham chiếu hiện dùng chung một khoá cho cả nền tảng. Đúng ra mỗi doanh nghiệp phải có khoá riêng, để hai doanh nghiệp không thể ghép sổ với nhau mà suy ra "cùng một người". Đây là thay đổi kiến trúc duy nhất còn phải làm lại — xem mục 16.

5. THANG NHẬN DIỆN 5 MỨC — "TOKEN PHẢI NÓI THẬT NÓ MẠNH CỠ NÀO"

Không phải bằng chứng nào cũng nặng như nhau. Thay vì giả vờ mọi bằng chứng đều vàng ròng, reConsents dán nhãn độ mạnh ngay trên bằng chứng:

MứcTênNghĩa làSức nặng
5carrier_identifiedNhà mạng xác nhận đúng thuê bao đóMạnh nhất
4form_otpKhách nhập OTP gửi về máyMạnh
3platform_reconstructedNền tảng ghép lại từ dữ liệu phiênTrung bình
2form_onlyChỉ có số khách tự điền vào formYếu
1compliance_onlyChỉ đủ để chứng minh có tuân thủ quy trìnhYếu nhất

Nhãn này hiện công khai trên trang tra cứu. Người mua bằng chứng biết mình mua hàng loại nào. Doanh nghiệp muốn bằng chứng nặng hơn thì trả tiền cho lượt nhận diện qua nhà mạng — đó chính là chỗ nhà mạng kiếm được tiền.


5b. HAI TẦNG NHẬN DIỆN — TẦNG MIỄN PHÍ NUÔI TẦNG TRẢ PHÍ

Bổ sung 20/08/2026. Đây là quyết định kinh tế quan trọng nhất của sản phẩm, và nó quyết định luôn việc merchant có dám nhúng widget hay không.

5b.1. Vì sao phải tách

Ban đầu hệ thống hỏi nhà mạng "đây là ai" ngay khi mở phiên — tức là cho mọi người chỉ ghé ngang qua trang. Nếu nhà mạng tính tiền theo lượt hỏi thì merchant phải trả cho cả những người không bao giờ bấm gì. Kết cục: không ai dám nhúng widget, và sản lượng của nhà mạng bằng 0.

Nên tách làm hai pha:

PhaChạy khiTrả lời câu hỏiMức nhận diệnTiền
Sàng lọcMở phiên (mọi lượt ghé)"Có được phép hỏi người này không?" — một câu YES/NO về việc bị chặn, không phải phép tra danh tínhHạ xuống platform_reconstructedMiễn phí
Phân giảiKhách đã bấm Đồng ý"Thuê bao nào?"Nâng lên carrier_identifiedTrả phí

Nguyên tắc đi kèm: mặc định an toàn nghiêng về phía không tiêu tiền của khách hàng — ai quên khai pha thì được cái rẻ, không phải cái đắt. Và pha trả phí chỉ chạy khi merchant đã tự tay bật tính năng Nhận diện qua nhà mạng (mặc định TẮT).

Lập luận để đàm phán với nhà mạng: tính tiền theo mọi lượt ghé → sản lượng 0. Tính theo lượt chuyển đổi → đơn giá cao hơn, sản lượng thật, và mỗi lượt hỏi đều gắn với một người đã tự nguyện đồng ý — sạch cả về chi phí lẫn pháp lý.

5b.2. Tầng miễn phí: hành trình khách theo thời gian thực

Vì pha sàng lọc không hỏi nhà mạng, phần "khách này là ai, đến từ đâu" được dựng 100% bằng dữ liệu bên thứ nhất do chính widget đo. Đây là một Google Analytics bản rút gọn, miễn phí, gắn thẳng vào nghiệp vụ đồng ý:

Màn hình: Trực tiếp (đang có ai trên trang, từ nguồn nào) và Nguồn & chiến dịch trong Thống kê — phễu 5 nấc xem trang → thấy ô xin phép → bấm đồng ý → ra bằng chứng, đếm theo người chứ không theo lượt tải lại trang.

5b.3. Ba rào chắn quyền riêng tư của tầng này

Xây một tầng analytics là bước dễ trở thành thứ mình đang phê phán nhất. Ba luật cứng:

  1. Mã người xem riêng theo từng doanh nghiệp. Trình duyệt gửi lên một chuỗi ngẫu nhiên; hệ thống băm bằng muối riêng của từng merchant trước khi lưu. Cùng một trình duyệt ghé hai doanh nghiệp sẽ ra hai mã khác hẳn nhau, không ai ghép được — kể cả người vận hành nền tảng. Đây chính là Luật Hai Chìa (mục 9.3) áp xuống tầng analytics, và là bản mẫu cho việc sửa mã tham chiếu thuê bao ở mục 16.
  2. Không dữ liệu cá nhân. Chỉ lấy đường dẫn trang (vứt toàn bộ query string trừ tham số utm_*), chỉ lấy host của trang giới thiệu. Không đọc nội dung form, không dấu vân tay trình duyệt.
  3. Không quay lại phiên làm việc, không toạ độ chuột, không ghi phím. Chỉ các sự kiện rời rạc có tên. Đây là ranh giới đã tuyên bố công khai khi từ chối chép tính năng session replay của đối thủ Mỹ.

Thêm, về hạn lưu: bản đầu đặt tự xoá sau 90 ngày, nhưng PO bác (20/08): không tự xoá gì cả — dữ liệu hành trình là tài sản (so mùa này với mùa trước, và là chỗ thu phí duy trì về sau). Giữ vô hạn vẫn đứng được về pháp lý vì bảng này không có dữ liệu cá nhân (mã người xem đã băm, đường dẫn đã vứt query). Thứ luật đòi là đường xoá theo yêu cầu — có sẵn, xoá đích danh theo từng người-từng doanh nghiệp, không có lệnh "xoá hết".

5b.4. Món lợi kèm theo: bằng chứng nặng hơn hẳn

Một bản tóm tắt hành trình được đính thẳng vào bằng chứng khi phát hành: đã xem mấy trang, đã thấy ô xin phép chưa, đọc bao lâu, cân nhắc bao lâu, đến từ chiến dịch nào.

"Ở trên trang 47 giây, cuộn qua đoạn chữ đồng ý, rồi mới bấm" là bằng chứng đồng ý có hiểu biết — mạnh hơn rất nhiều so với một cái tick trần.

Nói cách khác: tầng analytics miễn phí đang nuôi chính món trả phí. Merchant nhúng widget vì muốn xem số liệu; mỗi lượt xem lại làm bằng chứng của họ dày thêm.

(Kỹ thuật: các số này vào token dưới dạng số nguyên — canonical JSON cấm số thực, xem mục 11.3.)


6. NGUYÊN TẮC NỀN TẢNG: GHI ≠ CHẤP NHẬN

Đây là doctrine quan trọng nhất của sản phẩm. Nói gọn:

Nền tảng luôn ghi sự thật — không cấu hình được. Doanh nghiệp tự chọn ngưỡng chấp nhận — cấu hình được.

Ví dụ cụ thể: có nên cho phép đồng ý bằng ô đã tích sẵn không?

Điều này học từ TrustedForm (Mỹ): trong hệ thống của họ, opt_in_types_allowedbộ lọc của bên nhận lead, không phải tuyên bố của nền tảng rằng loại nào hợp pháp. Nền tảng ghi thật; bên nhận tự đặt khẩu vị rủi ro của mình.

6.1. Bộ tiêu chí kiểm bằng chứng (doanh nghiệp tự đặt)

Tiêu chíMặc định khuyến nghị
Bắt buộc nêu tên doanh nghiệp trong câu xin phépBật
Cỡ chữ tối thiểu13 px
Độ tương phản tối thiểu7:1
Nút từ chối tối thiểu44 px
Cho phép đồng ý bấm tayBật
Cho phép ô tích sẵnTắt (bật được, có cảnh báo + nhật ký)
Cho phép đồng ý không tương tácTắt
Mức nhận diện tối thiểuform_only
Bắt buộc dùng câu chữ đã duyệtTắt

7. CÂU CHỮ ĐỒNG Ý — QUẢN LÝ NHƯ QUẢN LÝ HỢP ĐỒNG

Mỗi lượt đồng ý mang theo nguyên văn câu chữ khách đã đọc. Hệ thống tự gom các biến thể lại thành một danh sách (nhận diện bằng mã băm nội dung), đếm mỗi biến thể xuất hiện bao nhiêu lần, lần đầu và lần cuối khi nào.

Doanh nghiệp có 3 trạng thái để dán lên mỗi biến thể: chưa duyệt · đã duyệt · từ chối.

Vì sao cần: một công ty có 20 landing page, marketing sửa chữ liên tục, và không ai biết ngoài kia đang chạy bao nhiêu phiên bản câu xin phép. Khi bị thanh tra, câu hỏi đầu tiên là "khách đã đọc chính xác cái gì". Màn này trả lời câu đó trong 5 giây — và chỉ ra ngay biến thể nào đang chạy mà chưa ai duyệt.


8. RÚT QUYỀN, DANH SÁCH KHÔNG GỌI, VÀ TÁI ĐỒNG Ý

8.1. Van kiểm trước cuộc gọi

Trước mỗi cuộc gọi, hệ thống trả lời một câu hỏi duy nhất: được gọi số này không? Chặn nếu: đã rút quyền · nằm trong DNC · đồng ý hết hiệu lực · vượt tần suất cho phép.

Van này không phải tính năng bật/tắt được. Trong danh mục tính năng có một nguyên tắc bất di bất dịch được ghi thẳng vào mã nguồn: không bao giờ có tính năng kiểu "tắt kiểm DNC", "bỏ qua van chặn". Bán quyền tắt rào chắn là bán chính uy tín làm nên sản phẩm.

8.2. Chiến dịch tái đồng ý (QT-07)

Doanh nghiệp có danh sách khách cũ, không có bằng chứng đồng ý. Thay vì gọi liều, họ gửi lời mời tái đồng ý qua ZNS/SMS brandname — khách bấm vào, đọc, tự quyết.

Luật cứng trong hệ thống: ai đã từng từ chối thì bị loại khỏi danh sách mời, không mời lại. Không có cách nào cấu hình để lách.

(Kênh gửi ZNS/SMS brandname hiện ở trạng thái chờ pháp chế — xem mục 16.)


9. RANH GIỚI THƯƠNG MẠI & PHÁP LÝ

9.1. Ai ký gì với ai

   Doanh nghiệp  ──── hợp đồng thoại ────►  Nhà mạng
        │                                       ▲
        │ hợp đồng phần mềm                     │ hợp đồng thứ tự dùng
        ▼                                       │ (thuê chỗ, SMS brandname,
      Axion  ─────────────────────────────────► lượt nhận diện)

Ba hợp đồng tách bạch. Axion không bao giờ đứng giữa bán lại dịch vụ viễn thông — đó là ngành có điều kiện. Axion bán phần mềm, và mua từ nhà mạng những thứ hạ tầng mình dùng.

9.2. Nguyên tắc một chiều tiền

Tiền chỉ chảy Axion → Nhà mạng. Axion không nhận chia doanh thu cước từ nhà mạng. Lý do: nhận chia cước là bước đầu tiên biến mình thành đại lý viễn thông — đúng cái mìn cần tránh.

9.3. Luật Hai Chìa

Bản đồ dữ liệu xuyên nhiều doanh nghiệp (ví dụ: "số này đã đồng ý cho bao nhiêu công ty") là thứ có giá trị thật — TrustedForm ở Mỹ vẫn làm. Nhưng cũng là thứ nguy hiểm nhất nếu làm bừa.

Giải pháp không phải lời hứa "chúng tôi sẽ không làm", mà là cấu trúc: bản đồ chỉ vẽ được khi hai chìa cùng xoay — một chìa của Axion, một chìa của bên còn lại (nhà mạng, hoặc cơ quan có thẩm quyền). Một mình Axion không vẽ được, kể cả khi muốn, kể cả khi bị ép.

Điều này cũng là cách đón đầu khi có sàn dữ liệu quốc gia: khi cơ quan có thẩm quyền yêu cầu, cơ chế hai chìa cho phép đáp ứng đúng thủ tục thay vì phải phá vỡ cam kết đã đưa ra với khách hàng.


10. BẢN ĐỒ MÀN HÌNH

10.1. Mặt phẳng doanh nghiệp — /app.html (19 màn)

#MànDùng để
p0WebsitesThêm site, lấy đoạn mã nhúng, bật chế độ thử nghiệm
p8Việc hôm nayMàn mở đầu của nhân viên gọi: hôm nay gọi ai
p1Sổ leadDanh sách lead, ai đang giữ, trạng thái
p9Lịch hẹn gọi lạiHẹn giờ, nhắc việc
p2Tái đồng ýĐánh thức khách cũ đúng luật (trước gọi là "Chiến dịch" — đổi tên vì trùng nghĩa với chiến dịch quảng cáo)
p3Đội ngũMời người, đặt vai, chia việc
p18Trực tiếpAi đang trên trang ngay lúc này, từ nguồn nào, đã thấy ô xin phép chưa — miễn phí, realtime
p4Thống kêTỉ lệ đồng ý, tỉ lệ gọi được, theo site + phễu Nguồn & chiến dịch
p5Số dư creditVí, lịch sử trừ tiền
p10Nhật ký hành độngAi làm gì, lúc nào, từ IP nào
p17Việc cần làm6 nhóm việc khởi động, tự dò tiến độ — không phải tick tay
p11Câu chữ đồng ýDuyệt / từ chối các biến thể (mục 7)
p12Tiêu chí kiểm bằng chứngĐặt ngưỡng chấp nhận (mục 6)
p13Tên miềnXác minh sở hữu qua bản ghi TXT, mời đối tác xác nhận nguồn
p14Tính năng & giáBật/tắt tính năng trả phí, mỗi lần bật ghi một dòng đồng ý mức giá
p15Tích hợpKho khoá API/webhook, mã hoá AES-256-GCM, không bao giờ hiện lại giá trị bí mật
p16Cá nhân & bảo mậtĐổi mật khẩu, bật 2FA (TOTP), mã dự phòng
p6Cài đặtThông tin doanh nghiệp, giao diện
p7Bằng chứng & yêu cầu chủ thểTra bằng chứng, tải gói kiểm offline, xử lý yêu cầu của chủ thể dữ liệu

10.2. Bốn mặt phẳng còn lại

Vận hành nền tảng — /ops.html: tổng quan hệ thống · thẩm định hồ sơ doanh nghiệp (KYB) · duyệt/từ chối chiến dịch · quản lý DNC toàn nền tảng · nạp/trừ credit · tạm ngưng doanh nghiệp vi phạm · niêm phong & xuất bằng chứng · nhật ký toàn nền tảng · quản lý tài khoản & 5 vai của Axion.

Đối tác — /partner.html: danh sách doanh nghiệp mình giới thiệu · lời mời · hoa hồng và chốt kỳ · đội ngũ đối tác (chủ / kinh doanh / kế toán).

Nhà mạng — /carrier.html: tổng quan sản lượng · doanh thu · tải file đối soát CSV · tình trạng cổng. Hai vai: đối soát (tải được file) và theo dõi (chỉ xem).

Công khai — không cần đăng nhập:


11. KIẾN TRÚC KỸ THUẬT

11.1. Nguyên tắc chọn công nghệ

Toàn hệ thống chạy trên Node.js 22 thuần, không có bước build, đúng một thư viện ngoài (jose để ký JWS), cơ sở dữ liệu là SQLite tích hợp sẵn trong Node (node:sqlite).

Vì sao khắc nghiệt vậy — ba lý do:

  1. Bàn giao được. Người nhận bàn giao chỉ cần node src/server.js. Không webpack, không docker-compose, không 900 gói phụ thuộc để một trong số đó bị chiếm quyền.
  2. Kiểm toán được. Hệ thống bằng chứng mà chính nó là hộp đen thì vô nghĩa. Ít phụ thuộc = đọc hết được.
  3. Sống lâu. Ít phụ thuộc thì ít lý do vỡ khi nâng cấp.

Mọi chú thích trong mã nguồn viết bằng tiếng Việt, và giải thích vì sao chứ không phải làm gì.

11.2. Bản đồ mã nguồn (~6.750 dòng)

NhómTệpViệc
Lõiserver.js (1.354)Định tuyến, tường lửa mặt phẳng, phát hành bằng chứng
db.js (15)Ba hàm: one / q / run
canonical.js (37)Chuẩn hoá JSON để mọi ngôn ngữ ra byte giống hệt nhau
crypto.js (77)Băm, ký, kiểm
Bằng chứngledger.js (96)Sổ 2 tầng, Merkle root
identify.js (79)Thang nhận diện 5 mức · hai pha sàng lọc/phân giải · chốt chặn số điện thoại thô
journey.js (416)Hành trình khách: mã người xem theo từng merchant, phễu theo chiến dịch, tóm tắt gắn bằng chứng
criteria.js (178)Bộ tiêu chí + chấm điểm
consent-language.js (92)Gom & duyệt biến thể câu chữ
tsa.js (24)Đóng dấu thời gian độc lập (giao diện đóng băng, chờ cấp phép)
rotation.js (113)Xoay khoá ký
Mặt phẳngops.js (943) · partners.js (728) · carrier.js (446) · cskh.js (608)Bốn mặt phẳng B/C/D + nghiệp vụ chăm sóc khách hàng
perm.js (163)6 vai doanh nghiệp + phân quyền
Vành đaiguard.js (101)Giới hạn tần suất, khoá đăng nhập sai, chính sách mật khẩu
twofa.js (209)TOTP RFC 6238 tự cài bằng thư viện chuẩn
audit.js (48)Nhật ký hành động
backup.js (56)Sao lưu tự động 24h, giữ 14 bản
health.js (148)Tình trạng hệ thống — cố ý không lộ số liệu khách hàng
Kinh doanhbilling.js (79) · features.js (282) · checklist.js (195)Ví, tính năng & giá, tiến độ khởi động
domains.js (232) · integrations.js (183)Xác minh tên miền, kho khoá mã hoá
invite-channel.js (72) · notify.js (57) · alerts.js (50)Kênh mời, thông báo, cảnh báo
gate-mock.js (50)Cổng nhà mạng giả lập để chạy độc lập

11.3. Chuẩn hoá JSON — chi tiết nhỏ, hệ quả lớn

Để hai máy khác nhau, viết bằng hai ngôn ngữ khác nhau, cùng kiểm được một chữ ký, thì cả hai phải dựng lại chính xác từng byte nội dung đã ký. Quy tắc:

Điều cuối cùng nghe kỳ quặc nhưng là bắt buộc: số thực (9.2) được các ngôn ngữ in ra khác nhau (9.2 / 9.200000000000001), làm chữ ký lệch. Vì thế các số đo hiển thị vào token dưới dạng số nguyên nhân thang: font_px_x10 = 140 thay vì 14.0, contrast_x100 = 910 thay vì 9.1. Bản số thực vẫn được giữ riêng để hiển thị cho người đọc.

11.4. Bảo mật

LớpCách làm
Mật khẩuscrypt (không phải MD5/SHA1)
Hai lớp (2FA)TOTP RFC 6238, bước 30 giây, chống phát lại, 10 mã dự phòng băm bằng scrypt. Doanh nghiệp có thể bắt buộc 2FA toàn tài khoản
Khoá tích hợpAES-256-GCM, dữ liệu bổ trợ ràng theo `cred_idmerchant_id` → khoá của doanh nghiệp A không giải được ở doanh nghiệp B
Chống dò mật khẩu8 lần sai trong 10 phút theo cặp email+IP → khoá 10 phút
Chống trộm khoá websiteKiểm Origin/Referer khớp tên miền đã đăng ký, sai thì 403 + ghi vết
Chống rác API công khai600 lượt/phút mỗi IP
Tách mặt phẳng5 cookie riêng, chặn trước mọi xử lý
Rò rỉ bí mậtHàm assertNoSecretLeak() chạy thật ở mọi đường trả dữ liệu ra ngoài

11.5. Vận hành


12. GIAO DIỆN LẬP TRÌNH (API)

Khoảng 90 điểm cuối. Nhóm chính:

NhómĐiểm cuối tiêu biểu
Widget (công khai)POST /v1/sessions · POST /v1/consents · POST /v1/consents/deny · POST /v1/events · GET /px.gif
Bằng chứngGET /v1/verify/:key/bundle · GET /v1/evidence · GET /v1/root · POST /v1/chain/verify · GET /jwks
Doanh nghiệp/v1/me · /v1/sites · /v1/leads · /v1/campaigns · /v1/team · /v1/stats · /v1/pipeline · /v1/my-day · /v1/callbacks
Hành trìnhPOST /v1/journey (công khai, sendBeacon) · /v1/journey/live · /v1/journey/funnel · /v1/journey/visitor/:id
Đợt 3/v1/criteria · /v1/consent-language · /v1/domains · /v1/features · /v1/integrations · /v1/checklist · /v1/2fa/* · /v1/audit · /v1/perf
Vận hành/v1/ops/* (27 điểm cuối)
Đối tác/v1/partner/* (9)
Nhà mạng/v1/carrier/* (7, gồm reconcile.csv)
Sức khoẻ/healthz · /v1/health

Mô tả máy đọc được: openapi.yaml.


13. TIỀN

13.1. Hai lớp giá (đừng trộn)

13.2. Danh mục tính năng (10 mục — khung tham chiếu, chốt theo hợp đồng)

Tính năngGiáMặc định
Thu đồng ý qua widgetMiễn phíBật
Lọc trùng leadMiễn phíBật (không tắt được)
Phát hành bằng chứng ký sốMiễn phíBật
Gói kiểm offlineMiễn phíBật
Tra cứu công khaiMiễn phíBật
Lưu giữ bằng chứng dài hạn100–500 đ/bản ghi/thángTắt
Xác minh bằng chứng200–1.000 đ/lượtTắt
Van kiểm trước cuộc gọi100–500 đ/lượtTắt
Chiến dịch tái đồng ý1.000–3.000 đ/lời mờiTắt
Nhận diện qua nhà mạng500–2.000 đ/lượtTắt

Mỗi lần bật một tính năng trả phí sinh một dòng nhật ký ghi rõ: tài khoản nào, lúc nào, từ IP nào, và đã nhìn thấy giá bao nhiêu tại thời điểm bật. Đây là lá chắn tranh chấp thương mại rẻ nhất có thể — không cần chữ ký, không cần phụ lục hợp đồng.

Ngoài ra: nạp ví tự động (dưới ngưỡng thì nạp thêm), và ghi nhận chấp nhận điều khoản theo phiên bản văn bản tại thời điểm bấm.

13.3. Lọc trùng lead — trả phí đúng một lần cho một người

Doanh nghiệp chạy nhiều landing page trong hệ thống. Cùng một người đồng ý lần nữa — trên trang khác, hoặc sau khi bản cũ hết hạn/bị rút — thì không thu thêm phí lead. Ba điểm đáng nói:

Ca rút-quyền-được-hoàn rồi đồng ý lại vẫn tính là trùng: chấp nhận thiệt về phía nền tảng, không bao giờ nhập nhằng về phía doanh nghiệp.

13.4. Phân bổ tính năng theo gói

Mỗi tính năng trong danh mục có thể gắn gói thấp nhất được bật (thang Dùng thử < Khởi Động < Tăng Tốc < Chuyên Nghiệp). Cơ chế đã dựng sẵn trong code; chưa gán bậc cho mục nào — gán bậc là quyết định biểu giá, chốt cùng hợp đồng thật. Nguyên tắc hiển thị: gói thấp vẫn nhìn thấy tính năng gói cao (kèm nhãn gói) — thẻ khoá là lời mời nâng gói; thẻ tàng hình thì không ai nâng gói vì thứ mình không biết tồn tại. Tắt thì luôn được — không ai bị giam trong tính năng.


14. CHẤT LƯỢNG — 665 TEST TỰ ĐỘNG

Bộ testSố testKiểm gì
carrier-boundary193Nhà mạng không lấn sang dữ liệu doanh nghiệp
partner-boundary174Đối tác chỉ thấy doanh nghiệp mình giới thiệu
dot370Toàn bộ tính năng Đợt 3
ops-roles605 vai vận hành, ai làm được gì
red-items34Các điểm rủi ro đã từng suýt sai
hardening24Vành đai: tần suất, khoá đăng nhập, mật khẩu
evidence17Sổ, mắt xích, Merkle, chữ ký
qt0717Tái đồng ý — nhất là luật "đã từ chối thì không mời lại"
vectors17Vector chuẩn: chuẩn hoá JSON, TOTP RFC 6238
widget-sdk17Ràng buộc tên miền, phiên bản SDK, hiệu năng, thang nhận diện
journey42Hành trình: miễn phí lúc mở phiên · trả phí đúng lúc · không theo dõi xuyên website · lọc trùng lead

Chạy tất cả: node test/hardening.test.js && node test/evidence.test.js && …


15. XEM DEMO

15.1. Bốn lệnh

cd reconsents-proto
node src/server.js                          # cửa sổ 1 — máy chủ ở cổng 8787
node seed-demo.js                           # cửa sổ 2 — dựng dữ liệu nền
RC_DOMAIN_MOCK=1 node seed-dot3.js          # cửa sổ 2 — dựng dữ liệu Đợt 3

(Trên Windows: bấm đúp KHOI-DONG.bat.)

15.2. Tài khoản demo — mật khẩu chung matkhau123

Vào đâuEmailLà ai
/app.htmlchu@saomai.vnChủ doanh nghiệp (đầy đủ nhất)
/app.htmlhoa@saomai.vnNhân viên gọi — để thấy chỉ nhìn được lead của mình
/app.htmldpo@saomai.vnPhụ trách dữ liệu cá nhân
/app.htmlchu@hoasen.vnDoanh nghiệp thứ hai — để thấy hai DN không thấy nhau
/ops.htmladmin@reconsents.vnVận hành nền tảng
/partner.htmlchu@binhminh.vnĐối tác phân phối
/carrier.htmldoisoat@nhamang.vnCán bộ đối soát nhà mạng

15.3. Kịch bản đi demo 12 phút

  1. /widget.html — bấm Đồng ý như một người khách. Nhận mã bằng chứng.
  2. /verify.html — dán mã. Xem sự thật hiện ra. Bấm nút Rút quyền.
  3. Quay lại /widget.html, thử lại bằng cùng người đó → widget không hiện nữa. Đây là khoảnh khắc thuyết phục nhất.
  4. /app.html (chu@saomai.vn) → Tiêu chí kiểm → xem bộ ngưỡng. → Bằng chứng → tải gói kiểm offline.
  5. Chạy node tools/verify-offline.js <file vừa tải>5 lớp đều xanh, không cần mạng.
  6. Câu chữ đồng ý → thấy 3 biến thể, một cái đã duyệt, một cái bị từ chối.
  7. Đăng nhập lại bằng hoa@saomai.vn → thấy chỉ có lead của Hoa.
  8. /carrier.html (doisoat@nhamang.vn) → tải CSV đối soát → thấy nhà mạng có sản lượng và tiền, nhưng không có danh sách khách hàng của ai cả.
  9. /tinh-trang.html — trang tình trạng công khai.

Bước 3, 5 và 8 là ba bước nên dành thời gian nhất: chúng là ba lời hứa cốt lõi của sản phẩm, và cả ba đều chạy thật.


16. TRẠNG THÁI THẬT — CÁI GÌ THẬT, CÁI GÌ GIẢ LẬP, CÁI GÌ CHƯA CÓ

Mục này viết ra để không ai bị bất ngờ. Đọc kỹ trước khi demo cho người ngoài.

✅ Thật, chạy được ngay

Đăng ký/đăng nhập · 6 vai doanh nghiệp + 5 vai vận hành + 3 vai đối tác + 2 vai nhà mạng · widget đo hiển thị thật · phát hành bằng chứng ký số · sổ 2 tầng + Merkle root + chữ ký · kiểm offline 5 lớp · rút quyền + DNC + van kiểm · tiêu chí kiểm · câu chữ đồng ý · tên miền (TXT thật) · 2FA TOTP · kho tích hợp mã hoá · nhật ký · sao lưu · tính năng & giá · ví + nạp tự động · checklist tự dò · trang tình trạng · hành trình khách realtime + phễu theo chiến dịch · lọc trùng lead · 665 test.

🟡 Giả lập có chủ đích (giao diện đã đóng băng, chỉ chờ bật)

PhầnHiện tạiChờ gì
Cổng nhà mạnggate-mock.js ký bằng khoá thửKết nối MobiFone thật
Nhận diện qua nhà mạngAdapter dùng cổng giảNhư trên
Nhận diện bằng OTPavailable: falseXây giao diện OTP
Kênh mời ZNS/SMS brandnameavailable: false, chỉ có link demoPháp chế duyệt
Đóng dấu thời gian độc lậpTrả TSA_PENDINGĐơn vị cấp dấu thời gian được cấp phép

🔴 Chưa làm, đã biết, có tên

  1. Mã tham chiếu thuê bao theo từng doanh nghiệp — hiện dùng chung một khoá. Phải đổi sang khoá riêng mỗi doanh nghiệp. Đây là thay đổi kiến trúc duy nhất phải làm lại, và càng để lâu càng đắt vì dữ liệu cũ phải chuyển đổi. (Cách làm đã có bản mẫu chạy thật: mã người xem trong journey.js đúng là kiểu muối-riêng-từng-merchant cần áp cho mã tham chiếu thuê bao — xem mục 5b.3.)
  2. Đặc tả API cho đối tác (để tổng đài/CRM khác gọi vào từ ứng dụng sẵn có của họ).
  3. Đặc tả sẵn sàng cho sàn dữ liệu — chứng thư theo lô, xác minh hàng loạt, trường căn cứ pháp lý, chỗ trống cho định danh điện tử của cơ quan nhà nước.
  4. Hồ sơ an toàn thông tin theo Nghị định 85.
  5. Sổ tay vận hành (khi hỏng thì làm gì).
  6. Ba trang web còn lại: cách hoạt động · bằng chứng · giá.
  7. Nhãn hiệu reConsents (Cục SHTT, nhóm 42 + 35).

⏳ Đang chờ người khác


17. TỪ ĐIỂN THUẬT NGỮ

TừNghĩa trong tài liệu này
Bằng chứngBản ghi đầy đủ hoàn cảnh một lượt đồng ý, đã ký số
Mã bằng chứngChuỗi kiểu CT-3C8149 để tra cứu công khai
Mắt xíchChuỗi mã băm nối các bản ghi — sửa một cái là đứt cả đoạn sau
Dấu niêm phong ngày (Merkle root)Một mã băm đại diện cho toàn bộ bằng chứng của một ngày
Gói bằng chứngFile tải về, kiểm được offline 5 lớp
Mặt phẳngMột không gian người dùng tách biệt hoàn toàn (có 5)
Mức nhận diệnNhãn độ mạnh của bằng chứng, 5 bậc
Tiêu chí kiểmNgưỡng chấp nhận do doanh nghiệp tự đặt
Van kiểm trước cuộc gọiCửa chặn cuối cùng trước khi quay số
DNCDanh sách không được gọi
Tái đồng ýMời khách cũ đồng ý lại, đúng luật
GHI ≠ CHẤP NHẬNNền tảng ghi sự thật; doanh nghiệp chọn ngưỡng chấp nhận
Luật Hai ChìaBản đồ xuyên doanh nghiệp chỉ vẽ được khi hai bên cùng mở khoá
KYBThẩm định hồ sơ pháp lý doanh nghiệp
DPONgười phụ trách bảo vệ dữ liệu cá nhân
TOTPMã 6 số đổi mỗi 30 giây trong ứng dụng xác thực

18. MỘT CÂU CUỐI

Nếu chỉ được giữ lại một câu trong tài liệu này:

reConsents không bán danh sách khách hàng, không bán cước, không gọi hộ ai. Nó bán một thứ duy nhất: khả năng chứng minh — trước toà, trước cơ quan quản lý, trước chính khách hàng — rằng cuộc gọi này đã được cho phép, bằng một tờ giấy mà chính người phát hành ra nó cũng không sửa được.

CTCP Axion · reConsents v1.1 · 20/08/2026 Tài liệu liên quan: Master Spec · Mô tả nghiệp vụ 12 quy trình · Blueprint cổng ↔ 3C · Khung hồ sơ ĐGTĐ · Phụ lục DPA dự thảo · Nghiên cứu ActiveProspect/TrustedForm