Tạo website: từ Cloudflare, Telegram đến ba hệ thống nội bộ
Lấy API Cloudflare và Telegram bot, rồi giao Claude dựng ba website: trang cá nhân đặt lịch họp, hệ thống duyệt chi nội bộ, CRM quản trị khách hàng.
Ví von: mặt bằng, chìa khoá và số máy nội bộ
- Cloudflare Pages là mặt bằng miễn phí để dựng biển hiệu và cửa hàng trên mạng. Website của Sếp sẽ có địa chỉ
ten-sep-chon.pages.dev, mở được từ bất kỳ đâu, không tốn tiền thuê máy chủ. - API token là chìa khoá mặt bằng Sếp giao cho trợ lý (Claude) để nó tự ra vào dựng sửa. Giao bản sao có giới hạn quyền (chỉ được sửa website, không được động tới hoá đơn), và không đưa chìa cho ai khác.
- Telegram bot là số máy nội bộ: hệ thống dùng số này để nhắn Sếp "có đơn đặt lịch mới", "có phiếu chi chờ duyệt", và nhận lệnh Sếp bấm "Duyệt".
Phần này có ba việc chuẩn bị (4.1 Cloudflare, 4.2 Telegram, 4.3 cách giao việc) và ba website (4.4a–c). Làm tuần tự; website đầu tiên sẽ lâu nhất, hai cái sau nhanh hơn nhiều vì Claude đã quen "văn phòng".
4.1 Cloudflare: tạo tài khoản và lấy API
- Tạo tài khoản
Vào dash.cloudflare.com/sign-up, đăng ký bằng email công ty. Gói Free là đủ cho mọi website trong bộ này (không giới hạn lượt truy cập trang tĩnh; có 500 lần đẩy website/tháng).
- Ghi lại Account ID
Đăng nhập → menu trái chọn Workers & Pages. Ở cột bên phải trang tổng quan có dòng Account ID (một dãy 32 ký tự). Bấm copy, dán tạm vào Notepad.
- Tạo API token
Bấm vào biểu tượng người dùng góc trên phải → My Profile → thẻ API Tokens → nút Create Token → kéo xuống dưới cùng chọn Create Custom Token → Get started.
- Token name:
claude-code-website - Permissions (bấm Add more để thêm dòng):
- Account · Cloudflare Pages · Edit — để đẩy website
- Account · D1 · Edit — để website có bảng dữ liệu (đặt lịch, phiếu chi, khách hàng)
- Account · Workers KV Storage · Edit — bộ nhớ nhỏ cho cấu hình, đếm lượt
- Account · Workers Scripts · Edit — để chạy phần xử lý phía sau website (nhận form, gọi Telegram)
- Account Resources: Include · tài khoản của Sếp
- Bấm Continue to summary → Create Token.
Màn hình hiện token đúng một lần. Copy ngay.
- Token name:
- Giao chìa khoá cho Claude — qua file, không qua khung chat
Tạo file
D:\CongTy_Claude\40-web\.envbằng Notepad, nội dung 2 dòng (dán giá trị thật của Sếp):Nội dung file 40-web\.envCLOUDFLARE_API_TOKEN=dán_token_vào_đây CLOUDFLARE_ACCOUNT_ID=dán_account_id_vào_đây
Prompt mẫu · kiểm tra kết nối CloudflareTôi đã lưu token Cloudflare vào 40-web/.env (CLOUDFLARE_API_TOKEN và CLOUDFLARE_ACCOUNT_ID). 1. Thêm ".env" vào .gitignore nếu chưa có, để file này không bao giờ bị commit. 2. Nạp biến từ .env rồi chạy "wrangler whoami" (dùng npx, ghim bản wrangler 4.115.0) để kiểm tra token hợp lệ. 3. Tuyệt đối không in giá trị token ra màn hình hay ghi vào file nào khác; chỉ báo tôi "kết nối OK" kèm tên tài khoản, hoặc lỗi gì.

.env.Trên Cloudflare Pages, tên project Sếp đặt chính là tên miền: project dat-lich-abc → https://dat-lich-abc.pages.dev. Đặt tên không dấu, có gạch ngang, nghĩ trước khi tạo vì đổi sau rất phiền. Muốn dùng tên miền công ty (lich.abc.vn) thì sau này thêm ở mục Custom domains — không cần ngay.
- Project mới phải "create" trước rồi mới "deploy". Đẩy thẳng vào project chưa tồn tại sẽ báo "does not exist" và gợi ý chuyển sang Workers — đừng nghe, chỉ cần tạo project rồi đẩy lại.
- Ghim phiên bản công cụ wrangler. Bản mới nhất (từ 10/2026) đổi hành vi: lệnh tạo Pages lại tạo ra một Worker và in dòng "Notice to agents" khuyên dùng lệnh khác. Bảo Claude dùng
npx wrangler@4.115.0cho mọi lệnh Pages. - Biến môi trường trỏ nhầm tài khoản. Máy tôi từng có sẵn một
CLOUDFLARE_ACCOUNT_IDcủa tài khoản khác → lỗi "Authentication error 10000" dù token đúng. Luôn nạp lại Account ID từ file.envtrước khi đẩy.
4.2 Telegram bot: lấy token và chat_id
- Tạo bot với BotFather
Mở Telegram, tìm
@BotFather(có tích xanh) → bấm Start → gõ/newbot. BotFather hỏi hai thứ: tên hiển thị (ví dụ "Trợ lý ABC") và username (phải kết thúc bằngbot, không dấu, ví dụtroly_abc_bot). Xong nó trả về một dòng dài dạng123456789:AAH...— đó là token bot. - Lấy chat_id của Sếp
Tìm
@userinfobot→ Start → bot trả vềId: 123456789. Số đó là chat_id — "số máy" của Sếp để bot biết gửi cho ai.Muốn bot nhắn vào nhóm (ví dụ nhóm Ban giám đốc): thêm bot vào nhóm, gửi một tin bất kỳ trong nhóm, rồi bảo Claude gọi
getUpdatesđể đọc ra chat_id của nhóm (số âm, dạng-100…). - Bấm Start với chính bot của mình
Tìm username bot vừa tạo (
@troly_abc_bot) → bấm Start. Chưa bấm thì bot không được phép nhắn cho Sếp — đây là lỗi hay gặp nhất. - Lưu vào .env và thử gửi
Thêm vào file 40-web\.env
TELEGRAM_BOT_TOKEN=dán_token_bot TELEGRAM_CHAT_ID=dán_chat_id
Prompt mẫu · thử gửi TelegramTôi đã thêm TELEGRAM_BOT_TOKEN và TELEGRAM_CHAT_ID vào 40-web/.env. Hãy viết một script nhỏ tools/gui-telegram.py nhận một đoạn chữ và gửi tới chat_id đó qua API sendMessage của Telegram (đọc token từ .env, không ghi cứng). Chạy thử gửi tin: "✅ Bot của Sếp đã sẵn sàng — gửi từ Claude Code lúc [giờ hiện tại]". Không in token ra màn hình. Báo tôi kết quả API trả về (ok hay lỗi gì).

Ứng dụng robot lễ tân tại Tuần lễ Công nghiệp 2026 thu thông tin khách tham quan trên màn hình robot và bắn thẳng về nhóm Telegram của đội sale — anh em ở gian hàng khác vẫn biết có khách quan tâm dòng nào. Trang web cho khách tự tuỳ chỉnh giọng robot cũng có một form "báo Roboworld" → Telegram. Cùng một bot, cùng một cách gọi, dùng lại được cho mọi hệ thống sau.
Telegram cho phép tin nhắn có nút ("Duyệt" / "Từ chối"). Khi Sếp bấm, Telegram gọi về một địa chỉ web của hệ thống (gọi là webhook) — phần này Claude viết bằng một Pages Function trên Cloudflare. Sếp chỉ cần nói "tin nhắn phải có hai nút, bấm là cập nhật trạng thái phiếu"; cách làm Claude tự biết.
4.3 Cách giao việc dựng website: vòng lặp 5 bước
- Mô tả bằng lời — như giao cho một nhân viên mới
Trả lời bốn câu: ai dùng (khách, nhân viên, Sếp)? màn hình nào cần có? dữ liệu nào phải lưu lại? ai cần được báo khi có việc mới? Không cần nói công nghệ. Ba prompt ở mục 4.4 đã viết sẵn theo khung này.
- Bản 1 chạy trên máy, chưa lên mạng
Claude dựng, tự mở trong trình duyệt tích hợp, tự chụp màn hình máy tính và điện thoại, tự bắt lỗi. Sếp xem ảnh chụp hoặc bấm thử ngay trong ứng dụng.
- Góp ý như góp ý bản in
"Chữ bé quá", "bỏ cột này", "thêm ảnh nhà máy ở đầu trang", "màu phải theo logo". Có thể dán ảnh chụp màn hình kèm vẽ khoanh. Lặp 2–3 vòng.
- Nối dữ liệu thật và Telegram
Bản 1 thường dùng dữ liệu giả để xem bố cục. Vòng này Claude tạo bảng D1, nối form vào, nối bot. Thử một quy trình trọn vẹn: tạo phiếu → nhận tin → bấm duyệt → trạng thái đổi.
- Đẩy lên Cloudflare và kiểm tra trên link thật
Claude create project, deploy, rồi mở link thật bằng trình duyệt để kiểm lần cuối (ảnh có hiện, form có gửi). Sếp nhận link kèm ảnh chụp.
| Website cần gì | Lưu dữ liệu ở đâu | Ví dụ |
|---|---|---|
| Chỉ hiển thị | Không cần — file HTML tĩnh | Trang giới thiệu, catalog, báo giá gửi khách |
| Nhận form, báo Telegram | Pages Function + Telegram, có thể thêm KV | Đặt lịch họp đơn giản, form liên hệ |
| Có danh sách, trạng thái, đăng nhập | D1 (cơ sở dữ liệu SQLite của Cloudflare, miễn phí mức nhỏ) | Duyệt chi, CRM, quản lý thiết bị |
Website nội bộ phải có đăng nhập, dù chỉ là một mã truy cập chung lúc đầu. Mật khẩu để trong biến môi trường của Cloudflare (Claude biết cách đặt), không ghi vào mã nguồn, không gửi qua khung chat. Khi có nhiều người dùng, mỗi người một tài khoản, có vai trò (nhân viên / kế toán / giám đốc).
4.4a Website cá nhân + đặt lịch họp với đối tác
Mục tiêu: một trang giới thiệu Sếp và công ty, đối tác/nhà cung cấp mở lên là tự chọn được khung giờ họp trong lịch rảnh Sếp đã khai, không phải nhắn qua lại 5 lần. Mỗi lần có lịch mới, Telegram báo Sếp; Sếp bấm Xác nhận là khách nhận thông báo.
| Ai dùng | Màn hình | Dữ liệu | Báo ai |
|---|---|---|---|
| Đối tác, nhà cung cấp, ứng viên | Trang giới thiệu · chọn loại cuộc họp (30/60 phút, trực tiếp/online) · chọn ngày giờ · điền tên, công ty, nội dung · trang xác nhận | Khung giờ rảnh theo tuần · danh sách lịch đã đặt (D1) | Telegram cho Sếp, có nút Xác nhận / Đổi giờ |
| Sếp | Trang quản trị (có mã truy cập): lịch tuần, chặn ngày bận, xem lịch đã đặt | — | — |

Hãy dựng website cá nhân kiêm đặt lịch họp cho tôi, lưu trong 40-web/dat-lich/, sau này đẩy lên Cloudflare Pages với tên project "lich-hop-abc". NGƯỜI DÙNG: đối tác, nhà cung cấp, ứng viên muốn gặp tôi. Họ không có tài khoản. TRANG CHÍNH (một trang cuộn): - Giới thiệu ngắn về tôi và công ty (lấy từ ~/.claude/CLAUDE.md và 02-kien-thuc/nang-luc.json; ảnh nhà máy trong 00-nhan-dien/anh/ nếu có). - Khối "Đặt lịch họp": chọn loại (Gặp tại nhà máy 60 phút / Họp online 30 phút) → chọn ngày trong 3 tuần tới → chọn giờ còn trống → điền họ tên, công ty, số điện thoại, nội dung → bấm Đặt lịch. - Giờ rảnh mặc định của tôi: thứ 2–6, 9h–11h30 và 14h–17h, trừ thứ 4 chiều. Nghỉ lễ VN tự loại. - Trang xác nhận: "Đã nhận yêu cầu, tôi sẽ xác nhận trong 24 giờ". PHÍA SAU: - Lưu từng yêu cầu vào D1 (bảng lich_hen: id, loai, ngay_gio, ho_ten, cong_ty, sdt, noi_dung, trang_thai, tao_luc). - Gửi Telegram cho tôi (token trong 40-web/.env → đặt thành biến môi trường trên Cloudflare, không ghi cứng) với nội dung đầy đủ và 2 nút: ✅ Xác nhận · 🔁 Đề nghị đổi giờ. Bấm nút → cập nhật trang_thai và sửa tin nhắn thành "ĐÃ XÁC NHẬN". - Một giờ đã có lịch xác nhận thì không hiện cho người khác chọn nữa. TRANG QUẢN TRỊ /quan-tri (mã truy cập đặt trong biến môi trường): xem lịch tuần, chặn một ngày/giờ bận, danh sách yêu cầu theo trạng thái. NHẬN DIỆN: màu, font, logo theo 00-nhan-dien/ (nếu đã có skill thiết kế thì dùng skill đó). Phải đẹp trên điện thoại. CÁCH LÀM: dựng bản 1 chạy trên máy với dữ liệu giả trước, tự mở trình duyệt kiểm tra máy tính + điện thoại, chụp ảnh cho tôi xem. CHƯA deploy, CHƯA tạo D1 cho tới khi tôi duyệt bố cục.
Nối với Google Calendar qua Connector để lịch xác nhận tự vào lịch điện thoại Sếp; thêm nhắc trước 1 giờ qua Telegram; thêm trang tiếng Anh cho đối tác nước ngoài. Mỗi thứ là một câu giao việc.
4.4b Hệ thống duyệt chi nội bộ
Mục tiêu: thay chuỗi "nhắn Zalo xin chi → Sếp hỏi lại → chụp hoá đơn → quên" bằng một luồng rõ ràng: nhân viên tạo phiếu, hệ thống tự chuyển đúng người duyệt theo hạn mức, Sếp duyệt bằng một nút trên Telegram, kế toán nhìn thấy mọi phiếu đã duyệt để chi và đối soát.
| Ai dùng | Màn hình | Dữ liệu | Báo ai |
|---|---|---|---|
| Nhân viên / trưởng bộ phận | Tạo phiếu: hạng mục (vật tư, sửa máy, công tác, tiếp khách…), số tiền, lý do, nhà cung cấp, ảnh báo giá/hoá đơn · Phiếu của tôi · Trạng thái | Phiếu chi (D1), ảnh đính kèm | Người duyệt theo hạn mức |
| Giám đốc | Danh sách chờ duyệt · chi tiết phiếu · lịch sử · tổng chi theo tháng/bộ phận | — | Telegram có nút Duyệt / Từ chối / Hỏi lại |
| Kế toán | Phiếu đã duyệt chờ chi · đánh dấu đã chi · xuất Excel | — | Telegram khi có phiếu được duyệt |

Hãy dựng hệ thống duyệt chi nội bộ, lưu trong 40-web/duyet-chi/, tên project Cloudflare "duyet-chi-abc". NGƯỜI DÙNG VÀ VAI TRÒ (đăng nhập bằng tài khoản + mật khẩu, lưu D1, mật khẩu băm): - nhan_vien: tạo phiếu, xem phiếu của mình. - truong_bo_phan: như nhân viên + duyệt phiếu của bộ phận mình dưới 5.000.000 đ. - giam_doc (tôi): duyệt mọi phiếu từ 5.000.000 đ trở lên, xem báo cáo. - ke_toan: xem phiếu đã duyệt, đánh dấu đã chi, xuất Excel. PHIẾU CHI: mã tự sinh dạng DC-0001; hạng mục (chọn từ danh sách: vật tư sản xuất, sửa chữa máy, công tác phí, tiếp khách, văn phòng phẩm, khác); số tiền; lý do; nhà cung cấp; ảnh báo giá/hoá đơn (tối đa 3 ảnh, lưu R2 hoặc base64 trong D1 nếu nhỏ); ngày cần tiền. TRẠNG THÁI: cho_duyet → da_duyet / tu_choi / hoi_lai → da_chi. Mỗi lần đổi trạng thái ghi ai, lúc nào, ghi chú gì (bảng lich_su). TELEGRAM: - Phiếu mới → gửi cho đúng người duyệt theo hạn mức, nội dung đầy đủ + ảnh, 3 nút: ✅ Duyệt · ❌ Từ chối · ❓ Hỏi lại. Bấm nút → cập nhật trạng thái, sửa tin nhắn thành kết quả, báo lại người tạo phiếu. - Phiếu đã duyệt → báo kế toán. - 8h sáng thứ 2 → gửi tôi tổng hợp tuần trước: số phiếu, tổng tiền theo bộ phận, phiếu quá 3 ngày chưa duyệt. Mỗi người dùng có ô "Telegram chat_id" trong hồ sơ để nhận tin. BÁO CÁO: tổng chi theo tháng, theo bộ phận, theo hạng mục; xuất Excel. NHẬN DIỆN: theo 00-nhan-dien/. Dùng được trên điện thoại vì nhân viên tạo phiếu ngay tại xưởng. CÁCH LÀM: bản 1 trên máy với 4 tài khoản mẫu và 10 phiếu giả, chạy thử trọn luồng tạo → duyệt → chi; chụp ảnh từng màn cho tôi duyệt rồi mới tạo D1 thật và deploy. Mật khẩu tài khoản mẫu ghi vào 40-web/duyet-chi/TAI-KHOAN-MAU.md (file này vào .gitignore).
Hệ thống nội bộ RBW ONE của Roboworld đi đúng mô hình này cho mọi loại phiếu: ticket giao việc (TIC-00110), đề nghị thanh toán, xin xe. Ba thứ làm nó dùng được thật: mã phiếu tự sinh để mọi người gọi tên; deadline bắt buộc chọn (24h / 48h / 3 ngày…) để không có phiếu "lúc nào cũng được"; và lịch sử ai làm gì lúc nào để khỏi cãi nhau. Ba thứ này tôi đã đưa cả vào prompt mẫu ở trên.
4.4c Website quản trị khách hàng (CRM)
Mục tiêu: một chỗ duy nhất trả lời "khách này đang ở đâu trong hành trình mua, ai đang phụ trách, việc tiếp theo là gì, đã hứa gì" — thay cho Excel của từng sale và trí nhớ của Sếp. Với doanh nghiệp sản xuất B2B, hành trình thường là: liên hệ mới → khảo sát / nhận bản vẽ → báo giá → đàm phán → ký hợp đồng → sản xuất & giao → chăm sóc, đơn lặp lại.
| Ai dùng | Màn hình | Dữ liệu | Báo ai |
|---|---|---|---|
| Sale / kỹ thuật | Khách hàng · người liên hệ · cơ hội theo giai đoạn (bảng Kanban) · nhật ký hoạt động (gọi, gặp, gửi báo giá) · việc cần làm tiếp | Khách, liên hệ, cơ hội, hoạt động, hợp đồng (D1) | Telegram nhắc việc quá hạn |
| Giám đốc | Tổng quan: giá trị theo giai đoạn, tỷ lệ chốt, khách lâu không chăm, báo cáo tuần | — | Telegram 8h sáng: báo cáo ngày hôm trước |
| Kế toán | Hợp đồng đã ký, đợt thanh toán, công nợ | — | Telegram khi tới hạn thanh toán |

Hãy dựng CRM quản trị khách hàng cho công ty sản xuất B2B, lưu trong 40-web/crm/, tên project Cloudflare "crm-abc". ĐĂNG NHẬP: tài khoản + mật khẩu băm, vai trò sale / ky_thuat / ke_toan / giam_doc. Sale chỉ thấy khách mình phụ trách (và khách chung), giám đốc thấy tất cả. DỮ LIỆU (D1): - khach_hang: mã tự sinh KH-0001, tên công ty, mã số thuế, ngành, tỉnh, nguồn (giới thiệu / triển lãm / website / gọi lạnh), người phụ trách, nhóm khách (FDI / nội địa / đại lý). - nguoi_lien_he: thuộc khách, họ tên, chức vụ, số điện thoại (BẮT BUỘC, 10 số), email, vai trò (người quyết định / kỹ thuật / mua hàng). - co_hoi: thuộc khách, tên, sản phẩm quan tâm (chọn từ 02-kien-thuc/san-pham.json), giá trị dự kiến, giai đoạn (lien_he_moi → khao_sat → bao_gia → dam_phan → ky_hop_dong → san_xuat_giao → cham_soc), ngày dự kiến chốt, lý do thua (nếu thua). - hoat_dong: thuộc khách/cơ hội, loại (gọi / gặp / email / gửi báo giá / demo), nội dung, ngày, người làm, việc tiếp theo + hạn. - hop_dong: thuộc cơ hội, số HĐ, giá trị trước thuế, VAT, các đợt thanh toán (tỷ lệ, số tiền, hạn, đã thu), file đính kèm. MÀN HÌNH: - Tổng quan: giá trị theo giai đoạn, cơ hội sắp chốt tháng này, khách quá 30 ngày không có hoạt động, việc quá hạn. - Khách hàng: danh sách lọc theo người phụ trách / tỉnh / nhóm; chi tiết khách = hồ sơ + liên hệ + cơ hội + dòng thời gian hoạt động. - Cơ hội: bảng Kanban kéo thả giữa giai đoạn; chuyển sang "ky_hop_dong" bắt buộc nhập hợp đồng. - Việc của tôi: việc tiếp theo của tôi sắp tới hạn / quá hạn. - Báo cáo: tuần / tháng, xuất Excel. TELEGRAM (mỗi người dùng có chat_id): - Việc quá hạn 1 ngày → nhắc người phụ trách. - Đợt thanh toán tới hạn trong 3 ngày → nhắc kế toán + sale. - 8h sáng hằng ngày → gửi giám đốc: hoạt động hôm qua (ai gọi/gặp bao nhiêu), cơ hội đổi giai đoạn, hợp đồng mới. QUY TẮC: không xoá khách — chỉ "lưu trữ"; mọi sửa đổi hợp đồng ghi lịch sử; nhập khách mới trùng số điện thoại người liên hệ thì cảnh báo trùng. NHẬN DIỆN: theo 00-nhan-dien/. Bản 1 chạy trên máy với 20 khách giả lấy đúng ngành của tôi; chụp từng màn cho tôi duyệt rồi mới tạo D1 thật và deploy.
Ba bài học từ RBW ONE mà tôi đã nhét vào prompt trên: (1) số điện thoại người liên hệ là bắt buộc — vì hợp đồng thường không ghi, đến lúc tạo khách mới phải đi hỏi; (2) hệ thống chặn mã khách trùng số điện thoại để tránh tranh chấp hoa hồng — tưởng phiền, hoá ra cứu được nhiều cuộc cãi vã; (3) lead từ marketing đưa vào "Data Lake", sale nhận là phải gọi trong 1 giờ và giữ tối đa 1 data — quy tắc này làm tốc độ phản hồi khách tăng hẳn. Những quy tắc kiểu này là thứ Sếp biết rõ hơn bất kỳ ai; hãy viết nó vào prompt, Claude sẽ biến thành ràng buộc trong hệ thống.
Bảng tóm tắt ba website
| Website | Độ khó | Bản 1 với Claude | Dữ liệu | Telegram | Đăng nhập |
|---|---|---|---|---|---|
| a) Cá nhân + đặt lịch | Dễ | 1–2 giờ | D1, 1–2 bảng | Báo + 2 nút | Chỉ trang quản trị |
| b) Duyệt chi | Vừa | Nửa ngày | D1, 4–5 bảng + ảnh | Báo + 3 nút + tổng hợp tuần | 4 vai trò |
| c) CRM | Vừa–khó | 1 ngày | D1, 6–8 bảng | Nhắc việc + báo cáo ngày | 4 vai trò, phân quyền dữ liệu |
Làm theo thứ tự a → b → c. Sau website a, Claude đã có sẵn cách đăng nhập, cách nối Telegram, cách deploy — b và c dùng lại gần hết.
Bẫy đã gặp khi dựng web với Claude
Bảng 5–6 cột không bao giờ vừa màn hình 390 px: hoặc tràn ngang cả trang, hoặc cột bó còn một từ mỗi dòng. Bảo Claude: "trên điện thoại, mỗi dòng bảng đổi thành một thẻ, có nhãn cột". Bảng trong chính trang này làm đúng như vậy — Sếp thu nhỏ cửa sổ sẽ thấy.
Chromium phóng ảnh trong lưới theo cách khó đoán. Phải yêu cầu Claude chụp màn hình ở cả máy tính và điện thoại sau mỗi lần sửa, không tin vào mã nguồn "trông đúng".
Trên máy Windows của tôi, kiểm tra link .pages.dev bằng curl luôn lỗi bảo mật dù trang chạy tốt. Cách duy nhất đáng tin: mở bằng trình duyệt thật (trình duyệt tích hợp của ứng dụng Desktop, hoặc Chromium của Playwright).
Mọi file trong thư mục deploy đều được đưa lên web. Tôi từng để một file NGUON.md (ghi chú nguồn, điểm còn treo) trong thư mục deploy — ai biết đường dẫn là đọc được, xoá rồi vẫn còn trong bộ nhớ đệm 7 ngày. Ghi chú để ở thư mục dự án, không để cùng chỗ với website.
Dán link vào Zalo/Messenger mà không có ảnh bìa thì trông như link rác. Mọi trang gửi cho người khác phải có og:image 1200×630. Bảo Claude dựng ảnh bìa bằng HTML rồi chụp — mất 5 phút, tăng hẳn tỷ lệ người bấm.
