

Khi xây dựng website độc lập, tôi nhận ra rằng sáng thứ Hai nào mình cũng làm đúng một việc.
Mở Google Search Console, thủ công xuất dữ liệu truy vấn của tháng trước. Mở GA4, xuất 50 trang đích có nhiều lượt truy cập nhất thành CSV. Dùng Excel ghép hai bảng lại với nhau, đối chiếu số lần hiển thị và lượt nhấp từ GSC với phiên truy cập và chuyển đổi từ GA4 theo URL. Sau đó tự tô màu: lưu lượng giảm thì đánh dấu đỏ, tỷ lệ chuyển đổi thấp hơn mức trung bình thì đánh dấu vàng.
Toàn bộ quá trình mất khoảng một tiếng rưỡi. Làm xong tôi gửi vào nhóm, khách hàng trả lời một câu: "Đã nhận".
Tôi đã làm việc này suốt ba năm, tuần nào cũng như vậy.

Cho đến tháng trước, một người bạn làm kỹ thuật liếc qua màn hình của tôi và nói một câu khiến tôi rất chạnh lòng: "Việc này chẳng phải chỉ cần kết nối API là xong sao? Tại sao tuần nào cậu cũng làm thủ công?"
Tôi sững người một lúc. Cậu ấy nói đúng. Không phải vì tôi không biết GSC và GA4 có API. Mà mỗi lần nghĩ đến việc "viết script gọi API", trong đầu tôi lại hiện ra cả một dự án: viết Python, xử lý xác thực, xử lý phân trang, xử lý ánh xạ trường dữ liệu, viết giao diện hiển thị... Tổng cộng những việc đó đúng là có thể tiết kiệm thời gian, nhưng chi phí khởi động quá cao nên tôi luôn lười bắt tay vào làm.
Bước ngoặt là gì? Là Codex.

I. Trước hết, Codex là gì, và tại sao không phải ChatGPT
Nhiều người nghe đến AI viết code sẽ phản ứng đầu tiên là: "ChatGPT giúp tôi viết một script nhé". Tôi cũng đã thử. ChatGPT đưa cho bạn một đoạn code, bạn dán vào trình soạn thảo, cấu hình môi trường, cài dependency, chạy và gặp lỗi, dán lỗi trở lại để nó sửa, rồi chạy lại, rồi lại lỗi... Qua lại bảy tám vòng còn mệt hơn tự xuất dữ liệu.
Codex có định vị hoàn toàn khác. Đây là một Agent lập trình chạy trực tiếp trong terminal, có môi trường sandbox độc lập, có thể đọc file, ghi file, cài package, thực thi lệnh và xử lý lỗi. Bạn không cần sao chép code qua lại từ đầu đến cuối. Bạn chỉ cần đưa cho nó một yêu cầu bằng ngôn ngữ tự nhiên, nó sẽ tự lập kế hoạch, viết, chạy và sửa.
Ví dụ, câu lệnh tôi đưa cho nó là:
"Giúp tôi xuất dữ liệu truy vấn 28 ngày gần nhất của GSC, hợp nhất với dữ liệu trang đích của GA4 theo URL, rồi tạo bảng gồm 20 trang có mức sụt giảm lưu lượng lớn nhất."
Nó tự hoàn thành các việc sau:
•Kiểm tra môi trường hiện tại đã có thư viện Python cho Google API chưa, nếu chưa thì tự cài•Đọc đường dẫn đến file xác thực GSC và GA4 của tôi, xử lý OAuth•Gọi GSC API để lấy dữ liệu theo chiều truy vấn và chiều trang, tự động xử lý phân trang•Gọi GA4 Data API để lấy dữ liệu phiên truy cập và chuyển đổi theo chiều trang đích•Làm sạch URL, loại bỏ tham số, dấu gạch chéo cuối và thống nhất tiền tố www•Hợp nhất giao nhau theo URL, tính phễu hiển thị - lượt nhấp - chuyển đổi cho từng trang•Xuất bảng Markdown được sắp xếp theo mức độ sụt giảm lưu lượng
Tôi ngồi bên cạnh nhìn màn hình trong khi nó tự chạy toàn bộ quy trình. Giữa chừng, định dạng ngày của GA4 API báo lỗi một lần. Nó đọc thông báo lỗi, tự sửa, chạy lại và thành công.
🔴 Điểm khác biệt giữa các công cụ lập trình AI không nằm ở việc "có viết được code hay không", vì công cụ nào cũng làm được. Mấu chốt là "có tự chạy thành công được hay không".
II. Quy trình hoàn chỉnh dùng Codex để tạo vòng lặp dữ liệu GSC + GA4
Dưới đây tôi sẽ xem lại cách xây dựng quy trình này theo đúng thứ tự thao tác thực tế. Không nói lý thuyết, từng bước đều đã được tôi chạy thật trong terminal.

1. Chuẩn bị: xác thực Google Cloud
Không thể bỏ qua bước này. API của GSC và GA4 đều phải sử dụng xác thực OAuth hoặc Service Account của Google Cloud. Dù có dùng AI hay không, bước này vẫn phải thao tác thủ công.
Những việc tôi đã làm:
•Tạo một dự án trong Google Cloud Console, bật Search Console API và Google Analytics Data API•Tạo một Service Account, tải file khóa JSON về máy•Trong GSC, thêm email của Service Account này với vai trò "Người dùng bị hạn chế" (quyền đầy đủ)•Trong phần quản trị GA4, thêm email này với vai trò "Người xem dữ liệu"
Codex không thể giúp bạn ở bước này, vì xác thực và cấp quyền là quy trình tương tác giữa người dùng và hệ thống, nó không thể thay bạn nhấp vào trang cấp quyền của Google. Nhưng ở mọi bước sau, chỉ cần đường dẫn file xác thực chính xác, nó có thể kết nối liền mạch.
⚠️ Phần lớn quá trình tự động hóa API bị mắc ở điểm đầu tiên không phải do code, mà do quyền hạn. Hệ thống quyền của Google giống như những con búp bê Nga: GSC có một cổng, GA4 có một cổng khác, Google Cloud lại có một cổng khác nữa; quyền ở ba cổng này không liên thông với nhau. Kiên nhẫn hoàn thành bước này thì các bước sau sẽ thuận lợi.
2. Skill đầu tiên: lấy dữ liệu truy vấn GSC
Cách Codex hoạt động là bạn có thể đóng gói một nhóm tác vụ thành một Skill có thể tái sử dụng, đặt trong thư mục ~/.codex/skills/. Mỗi lần gọi cùng một Skill, nó sẽ thực thi theo cùng một logic.
Đầu tiên tôi viết phiên bản đơn giản nhất: chỉ lấy dữ liệu theo chiều truy vấn của GSC.
Skill này cho Codex biết ba việc: dùng API nào, lấy những chiều dữ liệu nào và xuất ra định dạng gì. Sau một lần chạy, nó mất khoảng 40 giây để xuất danh sách 100 truy vấn hàng đầu, gồm lượt nhấp, lượt hiển thị, CTR và thứ hạng trung bình.
Tôi đối chiếu kết quả này với file CSV xuất thủ công của tháng trước, dữ liệu hoàn toàn trùng khớp. Khi đó tôi có cảm giác "thời đại làm thủ công đã kết thúc".
Nhưng chưa hoàn toàn chính xác. GSC API có một điểm cần lưu ý: mặc định nó chỉ trả về 1000 dòng, vượt quá số này thì phải phân trang. Lần đầu chạy, website của tôi có hơn 3400 truy vấn trong một tháng. Codex tự phát hiện số dòng dữ liệu trả về không khớp, bổ sung logic phân trang và chạy lại. Lần thứ hai đã lấy đủ.
Nó tự phát hiện. Tự sửa. Đây là trải nghiệm hoàn toàn khác so với việc dùng ChatGPT viết script.
3. Skill thứ hai: kết nối GA4
Sau khi lấy xong dữ liệu GSC, tôi yêu cầu nó lấy thêm dữ liệu trang đích của GA4.
Độ khó tăng lên đáng kể. GA4 Data API yêu cầu bạn tự tạo một "request body", định nghĩa các chiều dữ liệu cần lấy (landingPage), chỉ số (sessions, conversions, eventCount), phạm vi ngày và điều kiện lọc. Cấu trúc JSON của request body hoàn toàn khác GSC. Ngoài ra, trong phản hồi của GA4, tên trường có định dạng dài như eventName_xxx, cần tự phân tích.
Cách Codex đọc và sử dụng GA4 API khiến tôi ấn tượng sâu sắc. Nó không máy móc gọi API theo chỉ dẫn, mà trước khi gọi còn thực hiện một lần thăm dò Schema: gọi GA4 Metadata API để lấy toàn bộ các chiều, chỉ số có trong property, cũng như cách ghép tên trường, rồi mới xây dựng request body.
💡 Cách làm "tìm hiểu rõ hiện trạng rồi mới bắt tay vào làm" này chính là cách một người thật thường làm khi tích hợp API mới. AI đã tự động hóa quy trình đó.
Sau khi chạy xong hai Skill, tôi có hai bảng:
•Chiều truy vấn GSC: từ khóa, URL trang, lượt nhấp, lượt hiển thị, CTR, thứ hạng trung bình•Chiều trang đích GA4: URL trang, phiên truy cập, chuyển đổi, thời gian tương tác trung bình
Tiếp theo là hợp nhất.

4. Hợp nhất, từ hai bảng thành một Todo được sắp xếp theo mức độ ưu tiên
Hợp nhất hai bảng nghe có vẻ đơn giản, URL đối chiếu URL rồi ghép lại là xong. Nhưng khi thực hiện thực tế, có vô số điểm nhỏ cần xử lý.
Tôi yêu cầu Codex tự "xem" mẫu dữ liệu của hai bảng trước. Nó phát hiện URL trang của GSC có tiền tố https://, còn đường dẫn trang đích của GA4 chỉ ghi /blog/seo-guide. URL của GSC có tham số truy vấn ở cuối như ?utm_source=google, trong khi GA4 đã loại bỏ tham số này. Một số trang có dữ liệu trong GSC nhưng không có trong GA4, và ngược lại.
Codex tự làm sạch những khác biệt này: loại bỏ tiền tố, tham số và anchor, thống nhất dấu gạch chéo cuối, sau đó mới hợp nhất phần giao nhau.
Sau khi hợp nhất, thứ nó xuất ra không phải là một bảng pivot lạnh lùng, mà là kết quả chẩn đoán được gắn mức độ ưu tiên theo từng loại vấn đề:
Độ ưu tiên|Đặc điểm trang|Hướng chẩn đoán
🔴 P0|Lượt hiển thị giảm trên 30%, thứ hạng từ top5 rơi khỏi top10|Mất thứ hạng, kiểm tra backlink và tính cập nhật của nội dung
🟡 P1|Lượt hiển thị cao, CTR thấp (CTR thấp hơn mức trung bình 50%)|Tiêu đề chưa đủ hấp dẫn, chỉnh Title và Meta
🟡 P1|Lượt nhấp cao, chuyển đổi thấp (tỷ lệ chuyển đổi thấp hơn mức trung bình 40%)|Khả năng chuyển đổi của trang đích chưa đủ, kiểm tra nội dung trang và CTA
🟢 P2|Xếp hạng vị trí 8-20, có lượng tìm kiếm cao|Cơ hội ở ngay trước mắt, bổ sung liên kết nội bộ và củng cố nội dung
📊 Biến hai báo cáo riêng lẻ thành một Todo được sắp xếp theo mức độ nghiêm trọng, đó mới là ý nghĩa của "vòng lặp dữ liệu". Không phải để xem dữ liệu, mà để biết cần làm gì.

III. Những vấn đề thực tế gặp phải trong quá trình này
Sau khi viết Skill và chạy thành công, nhìn lại mọi thứ có vẻ "hợp lý và tất yếu". Nhưng vào thời điểm đó, có vài việc thực sự từng khiến tôi mắc kẹt.
Vấn đề một: tên chỉ số của GA4 không trực quan
Trong GA4 API, số phiên không gọi là sessions mà cũng gọi là sessions. Số chuyển đổi không gọi là conversions, mà gọi là eventCount, nhưng chỉ giới hạn ở những sự kiện bạn đã đánh dấu là chuyển đổi. Thời gian tương tác trung bình không gọi là avgTimeOnPage, mà gọi là userEngagementDuration, sau đó phải tự chia cho số phiên.
Đọc tài liệu thì tất nhiên có thể hiểu những điều này, vấn đề là bạn phải mất một hoặc hai tiếng để tra từng mục. Codex giúp tôi tiết kiệm chính khoảng thời gian đó. Trước khi xây dựng request API, nó tự gọi Metadata API của GA4 một lần để lấy toàn bộ tên, kiểu và mô tả của các chỉ số khả dụng trong property, rồi dựa trên ngữ nghĩa tiếng Anh để đối chiếu xem "tôi cần số phiên" tương ứng với trường nào.
Vấn đề hai: giới hạn quota của GSC API
Quota hằng ngày của GSC API, giống như khi bạn thao tác thủ công trong GSC, có giới hạn. Lần đầu tôi đặt phân trang quá mạnh, gọi đồng thời 20 trang và lập tức bị giới hạn tốc độ. Sau khi nhận HTTP 429, Codex dừng vài giây rồi thử lại. Lần thứ hai, nó giảm tốc độ phân trang xuống còn 2 trang mỗi giây và chạy ổn định.
Trải nghiệm này khiến tôi nhận ra rằng dù AI thông minh đến đâu, nó vẫn đang gọi một API do con người viết. Những việc khó chịu như quy tắc giới hạn tốc độ, định dạng dữ liệu và cách đặt tên trường, nó có thể thay bạn xử lý, nhưng bạn vẫn phải biết các điểm dễ gặp vấn đề nằm ở đâu.
Vấn đề ba: đôi khi Codex quá chú trọng kỹ thuật
Có lần tôi yêu cầu nó "phân nhóm dữ liệu theo loại trang". Ý tôi là phân biệt theo các tiền tố như /blog/ và /product/ trong đường dẫn URL. Codex lại hiểu là đọc cấu trúc HTML của từng trang để trích xuất loại trang. Nó thực sự làm được: gọi thư viện requests để thu thập HTML từng trang, phân tích thẻ meta và đánh dấu schema, sau đó phân loại.
Nó chạy thành công, nhưng mất gần 4 phút. Trong khi thứ tôi cần thực ra chỉ là chia nhóm theo điều kiện dựa trên tiền tố đường dẫn URL.
⚠️ Khi cộng tác với AI, mức độ cụ thể của vấn đề quyết định hiệu suất. Bạn nói càng chính xác, nó làm càng nhanh. Nếu mô tả quá mơ hồ, nó sẽ dùng cách phức tạp nhất để "hiểu" vấn đề, và chưa chắc nó sẽ nói cho bạn biết mình đã đi đường vòng.

IV. Biến nó thành thứ có thể tái sử dụng, không chỉ là một script dùng một lần
Chạy thành công một lần thì khá dễ. Biến nó thành một "vòng lặp dữ liệu" có thể chạy hằng tuần và hoạt động trên các website khác mới là phần có giá trị.
Đóng gói bằng cơ chế Skill của Codex
Codex hỗ trợ file Skill, tức một file hướng dẫn định dạng Markdown đặt trong thư mục ~/.codex/skills/. Về bản chất, đây là một quy trình thao tác được viết cực kỳ chính xác. Mỗi lần gọi Skill này, Codex sẽ thực thi lại cùng một SOP từ đầu đến cuối, không bị ảnh hưởng bởi những thay đổi tạm thời từ lần trước mà bạn quên hoàn tác.
Tôi đã tách quy trình lấy dữ liệu GSC + GA4 → làm sạch → hợp nhất → chẩn đoán → xuất kết quả thành ba Skill độc lập:
Skill|Chức năng|Đầu ra
seo-gsc-pull|Lấy dữ liệu truy vấn và trang của GSC, tự động phân trang|Hai CSV: gsc_queries.csv, gsc_pages.csv
seo-ga4-pull|Lấy dữ liệu trang đích và chuyển đổi của GA4, tự động đối chiếu chỉ số|ga4_landing.csv
seo-data-merge|Hợp nhất ba bảng, làm sạch URL và xuất thứ tự chẩn đoán|Báo cáo chẩn đoán Markdown + CSV sau khi hợp nhất
Lợi ích của việc tách thành ba Skill là: khi GSC gặp sự cố thì chỉ chạy phần GSC, khi quota GA4 không đủ thì chỉ chạy phần GA4, chúng không chặn lẫn nhau. Ngoài ra, với website của các khách hàng khác nhau, nguồn dữ liệu của hai Skill đầu có thể khác nhau, nhưng Skill thứ ba (hợp nhất và chẩn đoán) vẫn có thể tái sử dụng, chỉ cần thay tham số URL website.
Kích hoạt toàn bộ quy trình bằng một dòng lệnh
Sau khi tách ba Skill, tôi viết một "Skill điều phối" trong Codex:
/seo-weekly-report site=example.comCodex nhận thấy lệnh này và lần lượt gọi ba Skill: lấy dữ liệu GSC, lấy dữ liệu GA4, hợp nhất chẩn đoán, rồi cuối cùng xuất trong terminal một báo cáo chẩn đoán cấp trang được sắp xếp theo P0/P1/P2. Toàn bộ quá trình mất hơn 2 phút một chút.
💡 "Tự động hóa" không phải là viết một tập lệnh không bao giờ hỏng. Đó là biến một công việc cần lặp đi lặp lại thành quy trình có thể kích hoạt chỉ bằng một câu lệnh và thích ứng với sự thay đổi của dữ liệu.
Năm, những thay đổi thực tế của tôi sau khi hoàn thiện hệ thống này
Không hề phóng đại, buổi sáng thứ Hai của tôi đã hoàn toàn khác trước.
Trước đây:
•Mất 40 phút để xuất, làm sạch và hợp nhất dữ liệu GSC và GA4 thủ công•Mất 20 phút tô màu và sắp xếp mức độ ưu tiên trong Excel•Mất 20 phút viết một bản "tóm tắt SEO tuần này" rồi gửi vào nhóm•Khách hàng trả lời một câu "Đã nhận, cảm ơn bạn"
Bây giờ:
•Thứ Hai đến công ty, gõ một dòng /seo-weekly-report trong terminal•Hai phút sau, báo cáo chẩn đoán được tạo trong thư mục reports/•Sao chép và dán vào WeChat, thêm hai câu chú thích rồi gửi đi
Nhưng đồng thời, một chuyện thú vị đã xảy ra. Trước đây tôi "bận rộn rất lâu" để gửi một bản báo cáo, khách hàng cảm thấy bạn đã làm rất nhiều việc. Bây giờ bạn có kết quả sau hai phút, một số khách hàng lại nghĩ: "Nhanh vậy, có phải bạn chưa xem kỹ không?"
Nghe buồn cười nhỉ? Nhưng đó là tâm lý con người có thật.
Vì vậy, giờ tôi điều chỉnh chiến lược. Sau khi báo cáo được tạo, tôi chọn ra vài trang P0, dành 15 phút mở từng trang và xem qua, rồi thêm một câu "ý kiến kiểm tra thủ công" vào báo cáo. 15 phút này không hề lãng phí, mà giúp khách hàng cảm nhận rằng "có người thực sự đã xem", thay vì nhận một báo cáo máy móc do AI tạo ra.
🔴 AI làm thay bạn những việc nặng nhọc. Nhưng phán đoán, kinh nghiệm và việc bạn sẵn sàng xem kỹ thêm một lần nữa, đó là những phần sẽ không bị tự động hóa. Và chính xác là những điều khách hàng quan tâm nhất.

Sáu, một vài lời khuyên thiết thực dành cho những ai muốn xây dựng hệ thống này
Nếu bạn cũng muốn dùng Codex để hoàn thiện vòng khép kín dữ liệu SEO của mình, dưới đây là một vài điều tôi đã đổi bằng tiền thật và thời gian:
① Đừng ngay từ đầu theo đuổi sự hoàn hảo. Trước tiên hãy kết nối riêng GSC cho chạy thông suốt.
Chỉ một Skill: lấy dữ liệu truy vấn trong 28 ngày gần nhất và xuất ra CSV. Khi chạy thông suốt, bạn đã có khả năng "theo dõi thứ hạng hoàn toàn tự động". Tôi mất nửa giờ để đi từ con số 0 đến 1, phần lớn thời gian dành cho việc xử lý quyền trên Google Cloud. Sau khi kết nối xong Skill đầu tiên, rào cản tâm lý cũng biến mất.
② Quản lý cẩn thận tệp xác thực, đây là "điểm then chốt" của toàn bộ chuỗi.
Một khi tệp khóa JSON của Service Account trên Google Cloud bị lộ, người khác có thể đọc và ghi dữ liệu GSC và GA4 của bạn. Đừng đặt tệp này trong kho Git; hãy dùng biến môi trường để tham chiếu đường dẫn. Trong Skill của Codex, hãy tham chiếu bằng cách viết như `${GSC_CREDENTIALS_PATH}`, đừng hard-code.
③ Ghi thời gian thực hiện từng bước trong nhật ký Codex.
Thêm một câu vào Skill: "Vui lòng ghi lại thời gian thực hiện sau mỗi bước thao tác". Không phải để phô trương, mà để bạn biết bước nào là nút thắt: lấy dữ liệu từ API GSC chậm, GA4 có nhiều trang phân trang, hay logic làm sạch URL quá phức tạp. Biết nguyên nhân thì mới tối ưu đúng hướng.
④ Trước khi tái sử dụng trên nhiều trang web, hãy đảm bảo cấu trúc thuộc tính GA4 của trang mới và trang cũ nhất quán.
Cùng một Skill chạy bình thường với khách hàng A nhưng báo lỗi với khách hàng B, trong 80% trường hợp là vì thứ nguyên tùy chỉnh và tên sự kiện trong hai thuộc tính GA4 khác nhau. Khi chạy trang mới lần đầu, hãy để Codex lấy Metadata của GA4 một lần trước để xem cấu trúc.
📊 Dữ liệu thực tế của tôi: xây dựng đầy đủ quy trình từ đầu cho một khách hàng mất khoảng 45 phút, bao gồm thiết lập quyền Google; thời gian chạy mỗi tuần sau đó khoảng 2 phút.
Trên GitHub có vài Codex SEO Skill mã nguồn mở có thể lấy về và chỉnh sửa trực tiếp, chẳng hạn owensky-dev viết một bộ seo-gsc-ga4-analyst, còn AminForou xây dựng một máy chủ MCP có tên mcp-gsc. Bạn không cần phát minh lại bánh xe từ con số 0. Lấy một Skill có sẵn về chạy thử, xem đầu ra trông như thế nào, rồi chỉnh theo nhu cầu của mình. Nhanh hơn 10 lần so với viết từ đầu.
Dĩ nhiên, đầu ra của Skill có sẵn không nhất thiết hoàn toàn phù hợp với nhu cầu của bạn. Ví dụ, Skill của owensky-dev mặc định lấy dữ liệu trong 90 ngày, còn tôi quen phân tích theo khoảng thời gian 28 ngày. Những thay đổi nhỏ như vậy chỉ cần sửa một tham số trong tệp Skill, Codex sẽ đọc phần chỉnh sửa của bạn rồi làm theo.
Toàn bộ quá trình, từ một ý tưởng đến khi chạy ổn định, tôi mất khoảng hai buổi chiều. Buổi chiều đầu tiên dành cho việc xử lý quyền và kết nối API, buổi chiều thứ hai để viết Skill và tinh chỉnh định dạng đầu ra. Từ đó, mỗi tuần nó đều giúp tôi lấy lại hai buổi chiều ấy.
Tuần trước, một người đồng nghiệp làm trang thương mại quốc tế hỏi tôi: "Bạn dùng công cụ gì để xem dữ liệu?"
Tôi nói: Codex.
Anh ấy hỏi có đắt lắm không.
Tôi nói: Không đắt hơn thời gian anh đã dành cho Excel tuần trước đâu.
Anh ấy im lặng vài giây. Sau đó nói: "Vậy gửi cho tôi Skill đó một bản nhé."
