Tick từng check khi audit site
Checklist chia 2 phần: Phần A — Site Audit (293 check / 8 yếu tố site-level) tick 1 lần cho cả site; Phần B — Content Audit (49 check) tick lặp lại cho từng bài viết. Tổng 342 check. Scroll xuống hoặc click sidebar bên trái để jump.
293Phần A · Site
49Phần B · Content
152🔴 Critical
149🟡 Important
Filter:
Tất cả
🔴 Critical
🟡 Important
🟢 Recommended
☐ Chưa tick
0 / 69
29 🔴
31 🟡
9 🟢
Foundation: Robots + Sitemap + Canonical (1-16 — 16 check)
[1]
🔴 Critical
Site có file robots.txt không?
💡 Tại sao: robots.txt cho phép/cấm bot crawl từng folder. Không có file = Google + AI bot crawl bừa, miss page quan trọng hoặc tốn budget vào page rác.
✅ Cách check: Mở
yoursite.com/robots.txt trên browser → phải hiển thị text content. Hoặc terminal: curl -sI yoursite.com/robots.txt → HTTP 200.
[2]
🔴 Critical
robots.txt có lỗi cú pháp không?
💡 Tại sao: Cú pháp sai = bot ignore toàn file, default allow mọi thứ → tệ nhất là leak admin page.
✅ Cách check: Paste content file vào [Google robots.txt tester](https://www.google.com/webmasters/tools/robots-testing-tool) → 0 errors.
[3]
🔴 Critical
Có khai báo rule rõ ràng cho 6 bot quan trọng không?
💡 Tại sao: Default
User-agent: * rules áp dụng cho cả AI bot 2026. Khai báo rõ Googlebot, Bingbot, GPTBot, ClaudeBot, PerplexityBot, CCBot mới control được training vs retrieval bot.✅ Cách check: Mở file robots.txt, dùng Ctrl+F tìm tên từng bot → có rule
User-agent: GPTBot etc.
[4]
🔴 Critical
File CSS/JS có bị block trong robots.txt không?
💡 Tại sao: Google cần render page như browser. Block CSS/JS = Google thấy page broken → giảm rank.
✅ Cách check: Mở robots.txt, không được có
Disallow: /wp-content/themes/, Disallow: *.css, Disallow: *.js.
[5]
🔴 Critical
sitemap.xml có được khai báo trong robots.txt không?
💡 Tại sao: Google tìm sitemap qua dòng
Sitemap: trong robots.txt. Không khai báo = Google chậm discover URL mới.✅ Cách check: Mở robots.txt → tìm dòng
Sitemap: https://yoursite.com/sitemap.xml.
[6]
🔴 Critical
sitemap.xml có truy cập được không?
💡 Tại sao: URL khai báo trong robots.txt phải reachable. Sitemap 404 = Google không có map crawl site.
✅ Cách check: Mở
yoursite.com/sitemap.xml trên browser → phải hiển thị XML content. Không 404, không redirect.
[7]
🔴 Critical
sitemap.xml có hợp lệ XML schema không?
💡 Tại sao: Sitemap broken XML = Google parse fail → bỏ qua mọi URL trong sitemap.
✅ Cách check: Paste URL sitemap vào [xml-sitemaps validator](https://www.xml-sitemaps.com/validate-xml-sitemap.html) → 0 errors.
[8]
🟡 Important
Mỗi URL trong sitemap có
<lastmod> không?
💡 Tại sao:
<lastmod> cho Google biết khi nào page update, ưu tiên re-crawl content mới.✅ Cách check: Mở sitemap.xml, scroll xuống vài URL → mỗi
<url> block có <lastmod>2026-05-30</lastmod> style.
[9]
🟡 Important
Sitemap có ít hơn 50,000 URL không?
💡 Tại sao: Google chỉ accept sitemap ≤ 50k URL hoặc 50MB. Quá thì phải tách thành sitemap index.
✅ Cách check: Mở sitemap.xml, Ctrl+End scroll xuống cuối, đếm số
<url> block (Ctrl+F "<url>" count).
[10]
🟡 Important
Site lớn (>50k URL) có dùng sitemap index không?
💡 Tại sao: Sitemap index = file
<sitemapindex> link tới nhiều sitemap nhỏ. Cần thiết cho site e-commerce, news, programmatic SEO.✅ Cách check: Nếu site bạn >50k URL, mở sitemap → top-level element phải là
<sitemapindex> không phải <urlset>.
[11]
🔴 Critical
Mọi page có canonical tag không?
💡 Tại sao: Canonical bảo Google "đây là URL chính của content này", tránh duplicate authority bị split.
✅ Cách check: Mở bất kỳ page nào, View Source (Ctrl+U), Ctrl+F tìm
canonical → phải có <link rel="canonical" href="..."> trong <head>.
[12]
🔴 Critical
Canonical có tự trỏ về URL hiện tại không?
💡 Tại sao: Self-referencing canonical = signal mạnh cho Google. Canonical trỏ sai URL = Google index URL khác.
✅ Cách check: Mở page, View Source, tìm canonical →
href value phải match URL hiện tại trên browser (hoặc preferred version nếu page là duplicate).
[13]
🟡 Important
Page có meta robots tag không?
💡 Tại sao: Default Google index mọi page found. Meta robots cho phép control granular per page (vd: page tag archive nên
noindex).✅ Cách check: View Source page → có
<meta name="robots" content="index,follow"> hoặc absent (= default index,follow OK).
[14]
🟡 Important
X-Robots-Tag HTTP header có conflict với meta robots không?
💡 Tại sao: Server có thể set X-Robots-Tag override meta tag. Conflict = bot confused, không biết nghe ai.
✅ Cách check: Terminal:
curl -I yoursite.com/page → check header X-Robots-Tag (nếu có) không được conflict với <meta name="robots"> trong HTML.
[15]
🔴 Critical
Page quan trọng có bị
noindex vô tình không?
💡 Tại sao:
noindex cấm Google index page → mất hết organic traffic. Lỗi rất hay gặp khi deploy production từ staging.✅ Cách check: View Source homepage + top 10 page → Ctrl+F
noindex → không tìm thấy.
[16]
🟢 Recommended
Pagination dùng
rel="next"/rel="prev" hoặc self-canonicals?
💡 Tại sao: Post-2019 Google không còn dùng rel=next/prev nhưng vẫn hiểu. Pattern khác là self-canonical mỗi paginated page.
✅ Cách check: Mở page 2 của blog (yoursite.com/blog/page/2/), View Source → có 1 trong 2:
<link rel="next"> hoặc <link rel="canonical" href="self URL">.Indexability + Crawl Errors (17-31 — 15 check)
[17]
🔴 Critical
Site đã verify với Google Search Console chưa?
💡 Tại sao: GSC là kênh duy nhất biết Google thực sự nghĩ gì về site bạn (index status, crawl errors, ranking queries). Không có GSC = audit blind.
✅ Cách check: Login [search.google.com/search-console](https://search.google.com/search-console) → site bạn hiển thị trong dropdown property + có data 28-day window.
[18]
🟡 Important
Site đã verify với Bing Webmaster Tools chưa?
💡 Tại sao: Bing chiếm 5-10% search Việt Nam + powering ChatGPT Search. Bỏ qua = mất truth data từ 2 engine.
✅ Cách check: Login [bing.com/webmasters](https://www.bing.com/webmasters) → site bạn verified, có thể import từ GSC trong 30 giây.
[19]
🔴 Critical
Có page quan trọng nào bị
noindex không?
💡 Tại sao:
noindex cấm Google index page → mất tất cả organic traffic. Hay xảy ra với plugin SEO settings nhầm.✅ Cách check: GSC → Coverage report → tab "Excluded" → tìm reason "Excluded by 'noindex' tag". 0 page quan trọng trong list.
[20]
🔴 Critical
Crawl errors trong GSC có dưới 5% không?
💡 Tại sao: > 5% = Google tốn budget vào URL chết, miss URL mới. Crawl errors tăng dần báo hiệu site issue nghiêm trọng.
✅ Cách check: GSC → Coverage → đếm "Error" count / "Valid" count → tỉ lệ < 5%.
[21]
🟡 Important
Có soft 404 nào GSC báo không?
💡 Tại sao: Soft 404 = page trả HTTP 200 nhưng content giống "not found" (empty search result, etc.). Google rất ghét vì tốn crawl budget.
✅ Cách check: GSC → Coverage → tab "Excluded" → tìm "Soft 404". Báo cáo = 0.
[22]
🔴 Critical
Tất cả redirect dùng 301 (permanent) không phải 302?
💡 Tại sao: 301 = permanent, transfer ranking signal. 302 = temporary, không transfer. Dùng 302 sai = mất ranking khi URL đổi.
✅ Cách check: Mở [httpstatus.io](https://httpstatus.io/), paste URL cũ → expect HTTP 301 với Location header trỏ URL mới.
[23]
🟡 Important
Có redirect chain dài hơn 2 hop không?
💡 Tại sao: Mỗi hop tốn crawl budget + chậm trang. URL A → B → C → D = 3 hop, Google có thể bỏ crawl giữa chừng.
✅ Cách check: Paste URL vào [httpstatus.io](https://httpstatus.io/) → trace chain → ≤ 2 hop từ start đến final URL.
[24]
🔴 Critical
Có redirect loop nào không?
💡 Tại sao: Loop (A → B → A) = Google bỏ crawl ngay, browser hiện "ERR_TOO_MANY_REDIRECTS". Lỗi tệ nhất.
✅ Cách check: Mở URL trên browser, không gặp lỗi "too many redirects". Hoặc [httpstatus.io](https://httpstatus.io/) → không cycle.
[25]
🔴 Critical
HTTPS redirect từ HTTP có work bằng 301 không?
💡 Tại sao: HTTP không secure, Google ranking signal Critical. HTTP phải 301 lên HTTPS để consolidate authority.
✅ Cách check: Mở
http://yoursite.com (cố tình HTTP) → browser tự redirect sang https://. Hoặc terminal: curl -I http://yoursite.com → 301.
[26]
🟡 Important
www và non-www có consistent không?
💡 Tại sao:
yoursite.com và www.yoursite.com là 2 URL khác Google. Phải chọn 1 preferred, version kia 301 redirect.✅ Cách check: Mở
www.yoursite.com → tự redirect sang yoursite.com (hoặc ngược lại, consistent direction).
[27]
🟡 Important
Trailing slash (
/page vs /page/) có consistent không?
💡 Tại sao: 2 version trailing slash = duplicate content potential, Google split authority.
✅ Cách check: Mở URL không slash
/page → tự redirect sang version có slash /page/ (hoặc ngược lại). 1 version canonical, version kia 301.
[28]
🟢 Recommended
URL viết hoa và thường có consistent không?
💡 Tại sao:
/Page và /page là 2 URL khác Google (Linux server). Tốt nhất canonical lowercase.✅ Cách check: Mở
/PAGE (viết hoa cố tình) → tự redirect sang /page lowercase.
[29]
🟡 Important
Broken internal link có dưới 0.5% không?
💡 Tại sao: Internal link 404 tốn crawl budget + bad UX. > 0.5% báo hiệu site bị neglect.
✅ Cách check: Dùng tool free [Broken Link Checker](https://www.brokenlinkcheck.com/) → tỉ lệ 4xx internal < 0.5% total.
[30]
🟢 Recommended
Broken external link đã flag + replace chưa?
💡 Tại sao: Link tới external site chết = signal site bạn out-of-date. Cần audit định kỳ.
✅ Cách check: Cùng tool Broken Link Checker → kiểm tra "External" tab → 4xx < 1%, broken link replace hoặc remove.
[31]
🔴 Critical
Mobile và desktop có cùng content không (mobile-first index)?
💡 Tại sao: Google chỉ crawl mobile version từ 2021. Nếu mobile thiếu content/schema vs desktop = Google nghĩ site thin content.
✅ Cách check: Mở page trên DevTools (F12) → toggle Mobile view → content + schema markup giống hệt desktop view.
Schema Markup (v30 + AI parsing) (32-46 — 15 check)
[32]
🔴 Critical
Homepage có Organization schema không?
💡 Tại sao: Organization schema cho Google + AI engine biết "đây là company/brand gì". Không có = AI engine không disambiguate được brand bạn vs brand khác cùng tên.
✅ Cách check: Mở [Rich Results Test](https://search.google.com/test/rich-results), paste homepage URL → phải thấy "Organization" detected với
name, logo, sameAs populated.
[33]
🟡 Important
Có WebSite schema kèm SearchAction không?
💡 Tại sao: SearchAction cho phép Google show "sitelinks search box" trong SERP (user search trực tiếp từ result).
✅ Cách check: Rich Results Test → tab "Detected items" → thấy
WebSite + potentialAction của type SearchAction.
[34]
🟡 Important
Mọi non-home page có BreadcrumbList schema không?
💡 Tại sao: Breadcrumb trong SERP tăng click-through. Kèm theo AI engine dùng để hiểu site hierarchy.
✅ Cách check: Mở 1 page sâu (yoursite.com/blog/post-slug), Rich Results Test → BreadcrumbList detected với
itemListElement có position + name + item.
[35]
🔴 Critical
Blog post có Article schema không?
💡 Tại sao: Article schema giúp Google show snippet rich + AI Overview pull answer. Thiếu = bài blog mất eligibility cho rich SERP.
✅ Cách check: Rich Results Test trên 1 blog post URL → "Article" detected với
author, datePublished, dateModified, image đầy đủ.
[36]
🟡 Important
Author schema có phải Person hoặc Organization (không phải string)?
💡 Tại sao:
"author": "Admin" (string) = generic, AI không trust. "author": {"@type": "Person", "name": "Tên Tác Giả"} = entity rõ ràng.✅ Cách check: View Source bài blog, tìm block
application/ld+json → author là object có @type = "Person" hoặc "Organization".
[37]
🟡 Important
Author có
sameAs links tới external profiles không?
💡 Tại sao: sameAs (LinkedIn, X, Wikipedia) là entity disambiguation signal mạnh nhất cho E-E-A-T.
✅ Cách check: View Source → author object có
sameAs: ["https://linkedin.com/in/...", "https://x.com/..."] với ≥ 2 URL.
[38]
🟡 Important
Site e-commerce có Product schema kèm offers + rating không?
💡 Tại sao: Product schema unlock rich snippet trong SERP (giá, rating, stock). Skip nếu site không bán hàng.
✅ Cách check: Rich Results Test trên product page → Product type với
offers (price + availability), aggregateRating, review populated.
[39]
🟡 Important
Page có FAQ section trong HTML có FAQPage schema không?
💡 Tại sao: FAQPage [deprecated 2026-05-07 cho Google SERP rich result](https://searchengineland.com/google-to-no-longer-support-faq-rich-results-476957) NHƯNG ChatGPT, Perplexity, Claude AI Mode vẫn đọc để pull answer.
✅ Cách check: View Source page có FAQ → tìm
"@type": "FAQPage" trong JSON-LD block, kèm mainEntity array các Q&A.
[40]
🟢 Recommended
Article có Speakable schema không?
💡 Tại sao: Speakable đánh dấu paragraph quan trọng cho voice assistant (Siri, Google Assistant) + AI Mode đọc voice.
✅ Cách check: View Source bài blog → tìm
"speakable" property với cssSelector trỏ tới các paragraph chính.
[41]
🟡 Important
Local business có LocalBusiness schema không?
💡 Tại sao: Cần thiết cho Google Map ranking + local pack. Skip nếu site không có physical location.
✅ Cách check: View Source homepage →
"@type": "LocalBusiness" với address + telephone populated.
[42]
🟢 Recommended
Hub page có [SignificantLink property](https://schema.org/significantLink) không?
💡 Tại sao: SignificantLink mới (Schema.org v30) đánh dấu URL quan trọng cho AI agent navigate efficient.
✅ Cách check: View Source homepage hoặc hub page → tìm
"significantLink" property trỏ tới 3-5 URL top-tier (pricing, about, top product).
[43]
🟡 Important
Schema có compliance với spec v30 mới nhất không?
💡 Tại sao: [Schema.org v30 stable 2026-03-19](https://schema.org/docs/releases.html). Spec cũ dùng deprecated property = mất rich result eligibility.
✅ Cách check: Paste page URL vào [Schema.org validator](https://validator.schema.org/) → 0 deprecated property warnings.
[44]
🔴 Critical
Google Rich Results Test pass với 0 errors không?
💡 Tại sao: Tool chính thức Google. Error = Google không hiểu schema → không show rich result.
✅ Cách check: [Rich Results Test](https://search.google.com/test/rich-results) cho homepage + 3 sample page (1 product, 1 blog, 1 hub) → mỗi page 0 errors.
[45]
🟡 Important
Schema dùng format JSON-LD không (không Microdata/RDFa)?
💡 Tại sao: Google explicit prefer JSON-LD. Microdata/RDFa inline trong HTML lỗi thời + khó maintain.
✅ Cách check: View Source → schema phải trong block
<script type="application/ld+json">, không inline itemtype=, vocab=.
[46]
🟡 Important
Schema có nằm trong
<head> hoặc đầu <body> không?
💡 Tại sao: Google crawler đọc top-down. Schema cuối page = Google có thể crawl không tới + ignore.
✅ Cách check: View Source → schema block xuất hiện trong khoảng 2000 ký tự đầu của HTML (trước hết
<main> content).Hreflang + Internationalization (47-54 — 8 check)
[47]
🔴 Critical
Mọi multi-language page có hreflang tag không?
💡 Tại sao: hreflang bảo Google "page này có version ngôn ngữ X tại URL Y". Thiếu = Google serve sai language version cho user.
✅ Cách check: View Source page → tìm
<link rel="alternate" hreflang="vi" href="..."> cho mỗi language version có sẵn.
[48]
🔴 Critical
hreflang có cover hết tất cả language/region combos không?
💡 Tại sao: Site có VN + EN + US thì cả 3 hreflang phải khai báo trên cả 3 version, không thiếu chiều nào.
✅ Cách check: View Source mỗi version → đếm số hreflang tag = số language version site có (vd: 3 lang = 3 hreflang per page).
[49]
🔴 Critical
hreflang return links có bidirectional không?
💡 Tại sao: Page VN trỏ EN nhưng EN không trỏ ngược VN = Google ignore hreflang.
✅ Cách check: Dùng [hreflang checker tool](https://www.aleydasolis.com/english/international-seo-tools/hreflang-tags-generator/) → paste URLs → tool verify bidirectional.
[50]
🟡 Important
Có
x-default hreflang cho fallback không?
💡 Tại sao: User vào site với ngôn ngữ không match (vd: Pháp khi site có VN + EN) → x-default specify version fallback.
✅ Cách check: View Source → 1 page có
<link rel="alternate" hreflang="x-default" href="...">.
[51]
🟡 Important
<html> có lang attribute đúng không?
💡 Tại sao:
<html lang="vi"> cho browser + bot biết ngôn ngữ chính của page. Default missing = bot guess sai.✅ Cách check: View Source dòng đầu HTML →
<html lang="vi"> (site VN) hoặc <html lang="en"> (site EN). Match content language.
[52]
🟢 Recommended
Currency, date, number format có localized không?
💡 Tại sao: UX signal cho user trust. Site VN show "$100 USD 12/31/2025" = user bị confused.
✅ Cách check: Browse site → site VN phải show "100,000 VND" + "31/12/2025"; site EN show "$100 USD" + "12/31/2025".
[53]
🟡 Important
ccTLD / subdomain / subfolder strategy có consistent không?
💡 Tại sao: 3 lựa chọn (
yoursite.vn ccTLD vs vn.yoursite.com subdomain vs yoursite.com/vi/ subfolder). Mix = Google confused về authority.✅ Cách check: Browse các language version → mỗi version dùng 1 strategy nhất quán, không mix.
[54]
🟡 Important
GSC Geotargeting có set cho mỗi property không?
💡 Tại sao: Cho strategy subdomain/subfolder, GSC cần biết property nào target country nào.
✅ Cách check: GSC → mỗi property → Legacy tools → International Targeting → tab Country → "target users in [country]" set đúng.
AI Crawlers + llms.txt + Server Health (55-65 — 11 check)
[55]
🔴 Critical
robots.txt có rule explicit cho cả 10 AI bot 2026 không?
💡 Tại sao: Default
User-agent: * áp dụng cho mọi bot, không control được training vs retrieval. Pattern publisher lớn (NYT, Reuters, WSJ): block training (GPTBot, ClaudeBot, CCBot, Google-Extended) + allow retrieval (OAI-SearchBot, Claude-User, Claude-SearchBot, PerplexityBot, Applebot, BingPreview).✅ Cách check: Mở
yoursite.com/robots.txt, Ctrl+F tìm tên từng bot trong 10 bot trên → mỗi bot có rule riêng (Allow hoặc Disallow), không rơi vào default.
[56]
🟡 Important
Site có file llms.txt ở root không?
💡 Tại sao: File Markdown đề xuất 2024 cho AI bot ([llmstxt.org](https://llmstxt.org/)), giống robots.txt nhưng dành cho LLM. List top 20-30 page quan trọng. AI crawler dùng để crawl efficient thay vì brute-force.
✅ Cách check: Mở
yoursite.com/llms.txt trên browser → phải hiển thị content Markdown (không 404).
[57]
🟢 Recommended
Có llms-full.txt companion file không?
💡 Tại sao: llms-full.txt là version chi tiết của llms.txt, full content map cho AI crawler crawl deeper.
✅ Cách check: Mở
yoursite.com/llms-full.txt trên browser → HTTP 200, không 404.
[58]
🟢 Recommended
Có WebMCP action manifest không?
💡 Tại sao: [Google Feb 2026 preview](https://12amagency.com/blog/schema-markup-in-2026/) cho phép site declare permitted actions cho AI agent (vd: add to cart, subscribe). Chưa stable, defer 6-12 tháng nếu chưa sẵn sàng.
✅ Cách check: Mở
yoursite.com/mcp.json trên browser → nếu site đã implement, file hiển thị JSON manifest; nếu chưa thì skip (chưa mandatory).
[59]
🔴 Critical
Server log có 5xx errors dưới 0.1% không?
💡 Tại sao: 5xx = server error, bot bỏ crawl URL đó. Tăng dần báo hiệu server unstable.
✅ Cách check: Hosting provider dashboard hoặc Cloudflare Analytics → tab "Errors" → 5xx rate 7-day < 0.1% total request.
[60]
🟡 Important
Site infinite scroll có paginated alternative cho bot không?
💡 Tại sao: Bot không scroll như user. Infinite scroll = bot chỉ thấy 10-20 item đầu, miss content còn lại.
✅ Cách check: Nếu site dùng infinite scroll, mở
yoursite.com/?page=2 → phải work + show content page 2 (URL parameter alternative).
[61]
🔴 Critical
Page render bằng JavaScript có SSR/prerender cho bot không?
💡 Tại sao: Google partial render JS nhưng AI bot (GPTBot, ClaudeBot) thường không execute. SPA không SSR = bot thấy empty page.
✅ Cách check: View Source page (Ctrl+U) → thấy actual content trong HTML, không phải
<div id="root"></div> rỗng.
[62]
🔴 Critical
CSS/JS files có bị block trong robots.txt không?
💡 Tại sao: Google cần render page với CSS+JS. Block = Google thấy page broken layout → giảm rank (duplicate check #4 nhưng critical re-emphasis).
✅ Cách check: Mở robots.txt → không có
Disallow: *.css, Disallow: *.js, Disallow: /wp-content/themes/.
[63]
🟡 Important
Page có mixed content warnings không?
💡 Tại sao: Page HTTPS load resource HTTP (image, script) = browser block + bot warning. UX bad + SEO penalty.
✅ Cách check: Mở page → F12 DevTools → tab Console → không có "Mixed Content" warnings màu vàng.
[64]
🟡 Important
Có render-blocking resource above the fold không?
💡 Tại sao: CSS/JS block render = LCP chậm = fail Core Web Vitals.
✅ Cách check: Paste URL vào [PageSpeed Insights](https://pagespeed.web.dev/) → mục "Diagnostics" → audit "Eliminate render-blocking resources" phải pass (không warning).
[65]
🟢 Recommended
Site có favicon.ico không?
💡 Tại sao: Favicon = trust signal nhỏ, brand recognition trong tab browser + SERP. Missing = unprofessional impression.
✅ Cách check: Mở
yoursite.com/favicon.ico trên browser → file image hiển thị (không 404).Advanced: Log Analysis + Crawl Depth + Render Crawlability (66-69 — 4 check)
[66]
🔴 Critical
robots.txt vs noindex dùng đúng cơ chế chưa?
💡 Tại sao: Disallow trong robots.txt KHÔNG phải cơ chế chặn index (Google nói rõ). Muốn chặn index phải dùng noindex; và page noindex KHÔNG được đồng thời bị Disallow, nếu không bot không đọc được thẻ noindex.
✅ Cách check: Page muốn ẩn khỏi index: dùng
noindex meta, KHÔNG Disallow. Đảm bảo page noindex không bị robots.txt chặn để bot đọc được thẻ.
[67]
🔴 Critical
Pagination + related links dùng
<a href> crawlable, không button-only?
💡 Tại sao: Pagination/category/related-content phải dùng anchor
<a href> chuẩn. Google không click <button> khi crawl pagination/load-more, dùng button-only thì bot không theo được link.✅ Cách check: View source pagination + related module: phải là
<a href> không phải <button>. SSR cho route quan trọng, structured data trong HTML render đầu.
[68]
🟡 Important
Đã phân tích server log xem Googlebot thực sự crawl URL nào?
💡 Tại sao: Log-file analysis cho thấy URL nào Googlebot THỰC SỰ crawl, không chỉ cái sitemap khai. Đây là ranh giới audit senior vs junior.
✅ Cách check: Export server/Cloudflare log, filter user-agent Googlebot, đối chiếu URL crawl thật vs URL quan trọng trong sitemap, phát hiện page quan trọng không được crawl.
[69]
🟡 Important
Crawl depth của page quan trọng dưới 3 click từ homepage?
💡 Tại sao: Bài cách homepage hơn 3 click thì authority loãng, bot crawl thưa, orphan ngầm. Cần check crawl depth riêng ngoài orphan detection.
✅ Cách check: Screaming Frog cột Crawl Depth: page quan trọng tối đa 3. Page sâu hơn thì thêm internal link từ page nông hơn.
0 / 41
18 🔴
17 🟡
6 🟢
LCP Audit (Server + Asset + Render) (1-10 — 10 check)
[1]
🔴 Critical
LCP p75 mobile < 2.5s ở CrUX field data?
💡 Tại sao: đây là threshold chính thức Google công nhận PASS. Lab score Lighthouse không thay thế được vì sample population khác (CrUX = user thật, Lighthouse = dev machine).
✅ Cách check: Mở [pagespeed.web.dev](https://pagespeed.web.dev), nhập URL → scroll xuống section "Discover what your real users are experiencing" → xem LCP p75. Nếu chưa đủ data: GSC > Core Web Vitals report cho aggregate.
[2]
🔴 Critical
Hero image có
<link rel="preload"> ưu tiên cao?
💡 Tại sao: hero image thường là LCP element. Không preload → browser phải đợi parse HTML xong mới fetch, mất 200-500ms.
✅ Cách check: View source page, tìm
<link rel="preload" as="image" href="hero.webp" fetchpriority="high"> trong <head>. Hoặc terminal: curl -s yoursite.com | grep -i 'rel="preload"'.
[3]
🔴 Critical
Server response (TTFB) < 200ms p75?
💡 Tại sao: TTFB là tầng đầu của LCP budget. TTFB 600ms = LCP rất khó đạt 2.5s vì còn render + load asset.
✅ Cách check: Chrome DevTools > Network > document request > Timing tab > TTFB. Hoặc terminal:
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\n" https://yoursite.com.
[4]
🔴 Critical
Hero image có
fetchpriority="high" attribute?
💡 Tại sao: từ 2023 browser hỗ trợ priority hint. Hero image không có
fetchpriority="high" bị browser xếp ngang với image dưới fold → fetch chậm.✅ Cách check: View source, tìm
<img src="hero.webp" fetchpriority="high">. Hero phải có fetchpriority="high", ảnh dưới fold dùng loading="lazy".
[5]
🔴 Critical
Hero image format WebP/AVIF size < 200KB?
💡 Tại sao: JPG/PNG hero 800KB+ tốn 2-3s download trên 4G. WebP/AVIF size giảm 30-50% cùng quality.
✅ Cách check: DevTools > Network > Image tab > xem size cột "Size". Hoặc terminal:
curl -sI https://yoursite.com/hero.webp | grep -i content-length. Cần < 200KB.
[6]
🔴 Critical
CDN serving hero image với edge cache?
💡 Tại sao: hero load từ origin Hà Nội đến user TP.HCM mất 80-120ms latency. CDN edge cache giảm xuống 10-30ms.
✅ Cách check: DevTools > Network > hero image > Response Headers > tìm
cf-cache-status: HIT (Cloudflare), x-cache: HIT (KeyCDN), hoặc age: > 0.
[7]
🔴 Critical
HTML response không bị render-blocked CSS/JS?
💡 Tại sao: render-blocking resources làm browser phải đợi parse xong mới render LCP. Block 3-4 file CSS/JS = thêm 500-800ms.
✅ Cách check: [PageSpeed Insights](https://pagespeed.web.dev) > xem section "Eliminate render-blocking resources" trong Diagnostics. Mục tiêu 0 render-blocking ngoài critical CSS.
[8]
🔴 Critical
Critical CSS inline trong
<head> < 14KB?
💡 Tại sao: 14KB là TCP initial congestion window. Critical CSS lớn hơn = tốn thêm round-trip TCP, kéo LCP chậm.
✅ Cách check: View source, tìm
<style>...</style> trong <head>. Đếm size: curl -s yoursite.com | grep -oP '(?s)<style>.*?</style>' | wc -c (cần < 14000).
[9]
🟡 Important
HTTP/2 hoặc HTTP/3 enabled?
💡 Tại sao: HTTP/1.1 chỉ cho phép 6 connection song song mỗi domain → asset stack pile up. HTTP/2 multiplex unlimited stream, HTTP/3 thêm UDP fast handshake.
✅ Cách check: DevTools > Network > Protocol column → phải là
h2 hoặc h3. Hoặc terminal: curl -sI --http2 https://yoursite.com | head -1.
[10]
🟡 Important
Brotli compression enabled cho text response?
💡 Tại sao: Brotli compression nén HTML/CSS/JS 20% tốt hơn Gzip. Tiết kiệm 50-100KB cho page average, giảm 200-400ms trên 4G.
✅ Cách check: DevTools > Network > document request > Response Headers > tìm
content-encoding: br. Nếu gzip = chưa optimal.INP Audit (Main-Thread + Long-Task) (11-20 — 10 check)
[11]
🔴 Critical
INP p75 mobile < 200ms ở CrUX field data?
💡 Tại sao: 43% mobile site fail check này theo CrUX 2026 Q1. Đây là metric Google ưu tiên fix cao nhất 2026 vì replace FID.
✅ Cách check: [pagespeed.web.dev](https://pagespeed.web.dev) > section "Discover what your real users are experiencing" > INP. Hoặc GSC > Core Web Vitals report > Mobile.
[12]
🔴 Critical
Long task < 50ms ở main thread budget?
💡 Tại sao: task > 50ms block main thread, user tap vào không có ai xử lý. Long task 200ms+ = INP fail ngay.
✅ Cách check: DevTools > Performance tab > record interaction → xem task ô đỏ "Long Task". Tìm task group > 50ms để optimize.
[13]
🔴 Critical
JS bundle initial < 300KB gzipped?
💡 Tại sao: parse + execute 500KB JS mất 500-800ms trên mobile mid-tier. Browser block input trong thời gian đó.
✅ Cách check: DevTools > Network > filter JS > xem size cột "Size" (compressed). Sum total initial < 300KB. Hoặc dùng
webpack-bundle-analyzer cho Next.js / Vite.
[14]
🔴 Critical
3rd-party widget (chat, analytics) defer load?
💡 Tại sao: widget chat / Hotjar / Facebook Pixel load sync chiếm 100-300ms main thread mỗi cái. 5 widget = 500ms-1.5s block.
✅ Cách check: View source, tìm
<script src="3rd-party.js" defer> hoặc dynamic load sau window.load. Nếu thấy <script src=...> không defer/async = sync, block render.
[15]
🔴 Critical
React/Vue hydration time < 100ms?
💡 Tại sao: SSR app gửi HTML thẳng nhưng hydration phải re-attach event handler. Hydration > 100ms = user tap vào button thấy không phản hồi.
✅ Cách check: DevTools > Performance > tìm long task ngay sau
DOMContentLoaded. Hoặc dùng React DevTools Profiler > Commit phase.
[16]
🔴 Critical
Image decode không block main thread?
💡 Tại sao: PNG/JPG kích thước lớn decode trên CPU mobile mất 80-200ms, block frame paint.
✅ Cách check: DevTools > Performance > tìm "Decode Image" task > 50ms. Fix: dùng WebP/AVIF (decode nhanh hơn), hoặc
decoding="async" attribute trên <img>.
[17]
🔴 Critical
Event handler không synchronous heavy work?
💡 Tại sao:
onClick chạy 200ms calculation = INP fail. Cần defer heavy work qua requestIdleCallback hoặc Web Worker.✅ Cách check: DevTools > Performance > record click → xem event handler task duration. > 50ms = optimize. Split work với
requestIdleCallback.
[18]
🟡 Important
CSS animation dùng GPU-accelerated property?
💡 Tại sao: animate
top/left/width trigger layout recalc + repaint = expensive. Animate transform/opacity chạy GPU, không block main thread.✅ Cách check: DevTools > Rendering > Paint flashing → xem khi animate có repaint flicker không. CSS audit: grep
transition:.*top\|width\|left → flag.
[19]
🟡 Important
No
setTimeout(fn, 0) queue stacking?
💡 Tại sao: nhiều
setTimeout(fn, 0) queue lên main thread, mỗi cái task riêng, tổng > 50ms.✅ Cách check: DevTools > Performance > xem group Timer task chồng nhau. Refactor sang
Promise.resolve().then() (microtask) hoặc batch với requestAnimationFrame.
[20]
🟡 Important
Service Worker không block install/activate?
💡 Tại sao: SW install precache 5-10MB asset mất 1-2s block main thread của page khác đang tap.
✅ Cách check: DevTools > Application > Service Workers > xem "Installing" duration. Hoặc reduce precache list, dùng runtime cache thay vì pre-cache toàn bộ.
CLS Audit (Dimensions + Font + Dynamic) (21-28 — 8 check)
[21]
🔴 Critical
CLS p75 mobile < 0.1 ở CrUX field data?
💡 Tại sao: CLS > 0.1 = user thấy layout nhảy bất ngờ → tap nhầm button, mất kiên nhẫn, bounce.
✅ Cách check: [pagespeed.web.dev](https://pagespeed.web.dev) > Core Web Vitals Assessment > CLS p75. Hoặc GSC > Core Web Vitals report.
[22]
🔴 Critical
Mọi
<img> có width + height attribute?
💡 Tại sao: browser cần dimensions để reserve space trước khi image load. Không có = image load xong push text xuống = CLS spike.
✅ Cách check: View source →
<img src="..." width="800" height="450" ...> phải có cả 2 attribute. Hoặc terminal: curl -s yoursite.com | grep -oP '<img [^>]*>' | grep -v 'width=' | wc -l (cần = 0).
[23]
🟡 Important
Video/iframe có aspect-ratio CSS?
💡 Tại sao: YouTube embed không có aspect-ratio = container collapse rồi expand khi iframe load → CLS spike.
✅ Cách check: Inspect element trên video container → CSS
aspect-ratio: 16/9 hoặc padding-bottom: 56.25% trick.
[24]
🟡 Important
Font swap dùng
font-display: optional hoặc swap với fallback metric?
💡 Tại sao: web font swap layout shift nếu font fallback có metric khác xa (chiều rộng/cao chữ).
✅ Cách check: CSS
@font-face { font-display: swap; size-adjust: 105%; ascent-override: 90%; } để match fallback metric với web font.
[25]
🟡 Important
Ads slot có dimensions reserved trước khi ad load?
💡 Tại sao: Google AdSense slot không có min-height = container collapse, ad inject push content = CLS lớn.
✅ Cách check: Inspect ad container → phải có
min-height: 250px hoặc aspect-ratio matching ad slot size.
[26]
🟡 Important
Notification banner / cookie consent không inject mid-page?
💡 Tại sao: banner xuất hiện sau 2s push content xuống = CLS. Phải fixed bottom/top hoặc reserve space từ đầu.
✅ Cách check: CSS
position: fixed hoặc position: sticky cho banner. Test: scroll page, banner phải overlay không push content.
[27]
🟡 Important
Skeleton loader có dimensions matching real content?
💡 Tại sao: skeleton 100px height, content thật 300px = CLS khi swap. Phải match dimensions hoặc dùng aspect-ratio.
✅ Cách check: DevTools > Elements > inspect skeleton + content cùng selector → height phải gần bằng nhau.
[28]
🟡 Important
Dynamic content (carousel, accordion) không expand vùng visible?
💡 Tại sao: accordion expand đẩy section dưới xuống = layout shift cho user đã scroll qua.
✅ Cách check: CSS
position: absolute cho expanded panel, hoặc cảnh báo "Click to expand" + scroll-to-target sau khi expand.Resource Delivery (CSS Critical + Preload) (29-33 — 5 check)
[29]
🟡 Important
Critical CSS inline < 14KB trong
<head>?
💡 Tại sao: 14KB = TCP initial congestion window. Critical CSS lớn hơn tốn round-trip TCP, kéo LCP.
✅ Cách check: View source >
<style> trong <head> size: curl -s yoursite.com | python -c "import sys,re; html=sys.stdin.read(); css=re.findall(r'<style>(.*?)</style>', html, re.DOTALL); print(sum(len(c) for c in css), 'bytes')".
[30]
🟡 Important
Preload critical font + LCP image?
💡 Tại sao: font swap chậm vì browser fetch font sau khi parse CSS. Preload font + hero image giảm 200-400ms LCP.
✅ Cách check: View source
<head> tìm <link rel="preload" as="font" href="font.woff2" crossorigin> + <link rel="preload" as="image" href="hero.webp" fetchpriority="high">.
[31]
🟡 Important
Preconnect tới CDN/font domain quan trọng?
💡 Tại sao: DNS lookup + TLS handshake với CDN khác domain mất 100-300ms.
<link rel="preconnect"> warm connection trước khi cần.✅ Cách check: View source
<head> tìm <link rel="preconnect" href="https://cdn.yoursite.com" crossorigin>. Cần cho 2-3 domain critical, không spam.
[32]
🟢 Recommended
Early Hints (HTTP 103) enabled trên server?
💡 Tại sao: server gửi response 103 với preload hint trong khi đang generate HTML. Browser bắt đầu fetch asset sớm hơn 100-300ms.
✅ Cách check: DevTools > Network > document request > Timing > "Early hints" row. Hoặc Cloudflare > Speed > Optimization > Early Hints (toggle ON).
[33]
🟡 Important
Lazy load images dưới fold + iframe?
💡 Tại sao: lazy load image dưới fold tiết kiệm 60-80% data transfer ban đầu, giảm LCP.
✅ Cách check: View source, image hero KHÔNG có
loading="lazy" (hoặc fetchpriority="high"), image dưới fold CÓ loading="lazy" decoding="async". Iframe loading="lazy" thuộc spec từ 2022.Field Data + RUM (CrUX + GSC) (34-38 — 5 check)
[34]
🟢 Recommended
CrUX field data accessible cho site bạn?
💡 Tại sao: site mới hoặc traffic thấp không đủ data trong CrUX. Không có CrUX = Google không pass CWV vào ranking signal, dù lab score đẹp.
✅ Cách check: [pagespeed.web.dev](https://pagespeed.web.dev) > nhập URL → nếu "Discover what your real users are experiencing" hiển thị data = OK. Nếu báo "No data available" = chưa đủ sample.
[35]
🟡 Important
GSC Core Web Vitals report verified + visible?
💡 Tại sao: GSC aggregate CrUX cho toàn site, chia mobile/desktop, breakdown URL group. Đây là source of truth Google sử dụng cho ranking signal.
✅ Cách check: Mở [Google Search Console](https://www.google.com/search/console) > chọn property > Experience > Core Web Vitals > xem 2 report Mobile + Desktop.
[36]
🟢 Recommended
First-party RUM library deployed (web-vitals.js hoặc tương đương)?
💡 Tại sao: CrUX/GSC delay 28 ngày aggregate. First-party RUM cho realtime data theo cohort (user mobile A vs desktop B), debug fast hơn.
✅ Cách check: View source tìm
web-vitals.js import hoặc Google Tag Manager event "core_web_vitals". Hoặc DevTools > Console > window.webVitals defined.
[37]
🟢 Recommended
RUM data tích hợp dashboard (DataDog, NewRelic, custom Grafana)?
💡 Tại sao: data trong production không có dashboard = không actionable. Cần view theo route, theo geo, theo device để fix targeted.
✅ Cách check: Mở dashboard analytics → check có panel "CWV by route/device/geo" không. Nếu chỉ có aggregate site-wide = chưa đủ granular.
[38]
🟢 Recommended
BigQuery CrUX historical query setup cho trend analysis?
💡 Tại sao: CrUX dataset public trên BigQuery cho phép query lịch sử 25 tuần, so sánh với competitor. Useful cho monthly health report.
✅ Cách check: Setup BigQuery free tier (1TB query/tháng free), connect CrUX dataset
chrome-ux-report. Query SQL pattern ở [developer.chrome.com/docs/crux/bigquery](https://developer.chrome.com/docs/crux/bigquery).Advanced Debugging + CI Regression Gate (39-41 — 3 check)
[39]
🔴 Critical
Đã breakdown LCP thành 4 sub-part để biết fix tầng nào?
💡 Tại sao: Cách đúng để debug LCP là funnel 4 giai đoạn: TTFB, resource load delay, resource load duration, element render delay. Liệt fix rời rạc mà thiếu khung phân rã thì không biết fix tầng nào.
✅ Cách check: PageSpeed Insights / Chrome DevTools chia LCP thành 4 sub-part, xác định tầng chiếm thời gian lớn nhất rồi fix đúng chỗ.
[40]
🟡 Important
TTFB p75 dưới 500ms (tránh Googlebot giảm ưu tiên crawl)?
💡 Tại sao: Server response hơn 500ms thường xuyên thì Googlebot âm thầm giảm ưu tiên content mới. Fix TTFB là ROI cao nhất cho site lớn, lợi cả user lẫn crawl efficiency.
✅ Cách check: Đo TTFB p75; nếu hơn 500ms thì ưu tiên fix server/edge cache trước mọi tối ưu frontend.
[41]
🟢 Recommended
Có performance budget + Lighthouse CI gate chặn regression?
💡 Tại sao: Phòng regression: đặt budget (LCP dưới 2.5s, INP dưới 200ms, CLS dưới 0.1) làm benchmark, chạy Lighthouse trong CI/CD để bắt regression trước khi deploy. Hợp với DevOps.
✅ Cách check: Cấu hình Lighthouse CI trong pipeline, fail build nếu vượt budget.
0 / 43
21 🔴
17 🟡
5 🟢
Perceivable (Text Alt + Color + Caption) (1-12 — 12 check)
[1]
🔴 Critical
Mọi
<img> non-decorative có alt attribute mô tả nội dung?
💡 Tại sao: screen reader đọc alt text thay vì image. Không có alt = user mù không hiểu content. Image decorative dùng
alt="" (empty).✅ Cách check: View source, grep
<img không có alt= attribute. Hoặc terminal: curl -s yoursite.com | grep -oP '<img [^>]*>' | grep -v 'alt='. WCAG 1.1.1.
[2]
🔴 Critical
Alt text mô tả ý nghĩa, không phải mô tả pixel?
💡 Tại sao: alt="image.jpg" hoặc alt="company logo" không giúp user mù hiểu purpose. Cần "Founder John ký hợp đồng với CEO Acme Corp" để communicate ý nghĩa.
✅ Cách check: Audit manual 10-20 alt text ngẫu nhiên. Hỏi "screen reader user nghe câu này có hiểu image làm gì không?". Tool axe-core flag generic alt.
[3]
🔴 Critical
Color contrast text-on-background ≥ 4.5:1 cho body text?
💡 Tại sao: text màu nhạt trên background nhạt = low-vision user (8% adult) không đọc được. WCAG AA min 4.5:1, AAA 7:1.
✅ Cách check: [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) nhập 2 mã màu. Hoặc Chrome DevTools > Inspect element > color picker hiện contrast ratio. WCAG 1.4.3.
[4]
🔴 Critical
Color contrast UI components (button border, focus ring) ≥ 3:1?
💡 Tại sao: button border màu nhạt = user không phân biệt được clickable area. WCAG 2.1 thêm 1.4.11 Non-text Contrast requirement.
✅ Cách check: Inspect button border + background, dùng DevTools color contrast. Cần ≥ 3:1.
[5]
🔴 Critical
Color không phải means duy nhất truyền thông tin?
💡 Tại sao: chart đỏ/xanh báo trạng thái = user mù màu không phân biệt. Cần thêm icon, pattern, hoặc text label.
✅ Cách check: Filter Chrome DevTools > Rendering > Emulate vision deficiencies > Protanopia. Site còn dùng được không? WCAG 1.4.1.
[6]
🔴 Critical
Video có caption (closed caption) cho audio?
💡 Tại sao: user điếc/khó nghe (5% adult) không dùng được video không caption. EAA bắt buộc cho video commerce.
✅ Cách check: YouTube embed > setting > captions có available không. Self-hosted video:
<track kind="captions" src="..."> trong <video> tag. WCAG 1.2.2.
[7]
🟡 Important
Audio có transcript text alternative?
💡 Tại sao: podcast/audio file không text = user điếc miss content. Kèm theo transcript boost SEO indexing.
✅ Cách check: Mở page có audio, scroll tìm transcript section hoặc download link
.txt/.srt. WCAG 1.2.1.
[8]
🔴 Critical
Text resize 200% không break layout?
💡 Tại sao: user low-vision zoom 200% browser. Nếu CSS dùng
font-size: 12px fixed → user không zoom được, hoặc layout break.✅ Cách check: Chrome > Ctrl + 200% zoom. Hoặc CSS
body { zoom: 200% }. Layout còn usable không? WCAG 1.4.4.
[9]
🔴 Critical
Reading order screen reader match visual order?
💡 Tại sao: CSS
flex: row-reverse đảo thứ tự visual nhưng DOM order không đổi = screen reader đọc theo DOM, user thấy visual khác = confused.✅ Cách check: Disable CSS (DevTools > Cmd+Shift+P > "Disable CSS"). Reading order theo HTML có hợp lý không? WCAG 1.3.2.
[10]
🔴 Critical
Heading hierarchy logical (H1 > H2 > H3, no skip)?
💡 Tại sao: screen reader navigate by heading. H1 → H3 skip H2 = user bị confused về cấu trúc.
✅ Cách check: HeadingsMap extension Chrome hoặc terminal:
curl -s yoursite.com | grep -oP '<h[1-6][^>]*>' | sort | uniq -c. WCAG 1.3.1.
[11]
🔴 Critical
Form input có
<label> linked với for=/id=?
💡 Tại sao: input không label = screen reader đọc "edit text" không biết field gì. User mù không submit được form.
✅ Cách check: View source form, mỗi
<input> phải có <label for="input-id"> trước hoặc aria-label="Tên trường". WCAG 1.3.1 + 3.3.2.
[12]
🟡 Important
Image text trong logo có text alternative?
💡 Tại sao: logo image chứa text "Acme Corp" = screen reader đọc "image" không có text. Cần alt="Acme Corp logo".
✅ Cách check: Logo container,
<img> alt attribute phải chứa text trong logo. WCAG 1.4.5.Operable (Keyboard + Focus + Target Size) (13-22 — 10 check)
[13]
🔴 Critical
Mọi interactive element (link, button, input) reachable bằng Tab key?
💡 Tại sao: keyboard-only user (motor disability) chỉ Tab/Shift+Tab navigate. Element không nhận focus = user không thể click. WCAG 2.1.1.
✅ Cách check: Tab qua entire page từ đầu. Mọi link/button/input nhận focus visible không? Custom div onclick thường miss
tabindex="0".
[14]
🔴 Critical
Không có keyboard trap (Tab vào element mà không Tab ra được)?
💡 Tại sao: modal/carousel custom thường trap focus inside, user Tab không escape được. Chỉ chuột mới đóng = keyboard user kẹt.
✅ Cách check: Tab vào modal, có Tab ra được không (Esc close modal + return focus). WCAG 2.1.2.
[15]
🔴 Critical
Focus indicator visible cho mọi focusable element?
💡 Tại sao: CSS reset bỏ
outline: none mà không thay thế = user keyboard không biết focus đang ở đâu. WCAG 2.4.7.✅ Cách check: Tab qua page. Mỗi element focused phải có visible indicator (border, background, glow). Min contrast 3:1 với background.
[16]
🟡 Important
Focus indicator không bị obscured bởi sticky header/footer?
💡 Tại sao: Tab xuống element bị sticky bottom navigation che → user không thấy focus location. WCAG 2.2 new 2.4.11.
✅ Cách check: Tab xuống cuối page, sticky bar có che focused element không. Scroll-margin CSS fix.
[17]
🟡 Important
Skip link đầu page bypass nav repetitive?
💡 Tại sao: keyboard user phải Tab qua 20+ nav link mỗi page = mệt. Skip link "Skip to main content" jump thẳng tới content. WCAG 2.4.1.
✅ Cách check: Tab lần đầu vào page, link đầu tiên có phải "Skip to content" không (hidden khi không focus, visible khi focused).
[18]
🟡 Important
Click target size ≥ 24×24px (WCAG 2.2 new)?
💡 Tại sao: button/link nhỏ < 24×24px = user motor disability tap miss thường xuyên trên mobile. WCAG 2.2 new 2.5.8.
✅ Cách check: Inspect element > Box model > width/height. Hoặc Lighthouse a11y audit flag. Spacing 8px+ giữa target adjacent.
[19]
🟡 Important
Drag-and-drop có keyboard alternative?
💡 Tại sao: drag-drop sortable list = motor user không dùng được. WCAG 2.2 new 2.5.7 cần button "Move up/down" thay thế.
✅ Cách check: Tìm sortable list, click button "Move up" có hoạt động không. Hoặc keyboard arrow key sort.
[20]
🔴 Critical
Page title có descriptive cho mỗi page?
💡 Tại sao: screen reader đọc page title đầu khi load. "Home" không informative bằng "Audit Technical SEO 2026 | Ông Bố IT".
✅ Cách check:
<title> tag mỗi page unique và descriptive. WCAG 2.4.2.
[21]
🔴 Critical
Link text descriptive ngoài context?
💡 Tại sao: link "Click here" / "Read more" = screen reader đọc list link không biết link đi đâu. Cần "Read more about audit checklist 2026".
✅ Cách check: Tools > Accessibility > Tab list "Links". Audit có link nào generic không. WCAG 2.4.4.
[22]
🔴 Critical
Time limit form có warning + extend option?
💡 Tại sao: form session timeout 5 phút = cognitive disability user không kịp đọc + fill. Cần warning + button extend. WCAG 2.2.1.
✅ Cách check: Form login/checkout, timeout có warning xuất hiện 30s trước không. Button "Stay logged in" extend.
Understandable (Clear + Predictable) (23-30 — 8 check)
[23]
🔴 Critical
HTML có
<html lang="vi"> attribute?
💡 Tại sao: screen reader switch pronunciation theo lang. Không có = đọc tiếng Việt với accent English = không hiểu được.
✅ Cách check: View source line 1-2:
<html lang="vi"> (hoặc en, fr, etc.). WCAG 3.1.1.
[24]
🟡 Important
Đoạn text khác ngôn ngữ có
lang="..." attribute?
💡 Tại sao: bài Việt có quote tiếng Anh = screen reader đọc accent Việt câu English. Cần
<span lang="en">quote here</span>.✅ Cách check: Audit content có inline foreign language không. WCAG 3.1.2.
[25]
🟡 Important
Navigation consistent qua các page?
💡 Tại sao: nav menu order khác nhau page-by-page = cognitive user mất time tìm lại. Cần stable order.
✅ Cách check: Mở 5 page khác nhau, nav menu có cùng order + label không. WCAG 3.2.3.
[26]
🟡 Important
Component identification consistent (icon = function)?
💡 Tại sao: search icon ở header page A nhưng print icon ở page B = user confused. Cần icon = function consistent.
✅ Cách check: Icon nhất quán semantic qua site. WCAG 3.2.4.
[27]
🔴 Critical
Form field required có dấu visible + aria-required?
💡 Tại sao: user fill form bỏ field required = submit fail không hiểu tại sao. Cần asterisk +
aria-required="true".✅ Cách check: Form input required, label có dấu "*" + input có
aria-required="true" hoặc required attribute.
[28]
🔴 Critical
Error message identify field + suggest fix?
💡 Tại sao: "Form error" generic = user không biết field nào. Cần "Email: định dạng không hợp lệ, ví dụ user@example.com".
✅ Cách check: Submit form invalid, error message có specify field + suggest fix không. WCAG 3.3.1 + 3.3.3.
[29]
🟡 Important
Help text + tooltip không chỉ rely on hover (mobile cannot hover)?
💡 Tại sao: tooltip xuất hiện trên hover only = mobile user (touch) không thấy được info.
✅ Cách check: Tooltip có hiển thị on tap/click mobile không. Hoặc inline help text always visible.
[30]
🟢 Recommended
Consistent Help (WCAG 2.2 new)?
💡 Tại sao: contact info / chat / FAQ link phải ở vị trí consistent qua các page. WCAG 2.2 new 3.2.6.
✅ Cách check: Help link ở header/footer cùng vị trí qua các page không.
Robust (Semantic + ARIA) (31-36 — 6 check)
[31]
🔴 Critical
HTML semantic (header, nav, main, footer, article) thay vì all div?
💡 Tại sao: screen reader landmark navigation dùng
<nav>, <main>, <footer> để jump quanh page. Div all = no landmark = user navigate khó.✅ Cách check: View source, tìm
<nav>, <main>, <header>, <footer>, <article>. Tool axe-core flag missing landmarks. WCAG 1.3.1.
[32]
🟡 Important
ARIA attributes đúng spec + không conflict semantic HTML?
💡 Tại sao:
<button role="link"> mâu thuẫn semantic. ARIA dùng đúng thì support, sai = phá hỏng AT.✅ Cách check: axe-core audit. First rule of ARIA: nếu HTML native element làm được, đừng dùng ARIA.
[33]
🟡 Important
aria-label/aria-labelledby cho element không có visible label?
💡 Tại sao: icon-only button (hamburger menu, search) không text = screen reader đọc "button" không biết function.
✅ Cách check: Icon button có
aria-label="Mở menu" hoặc visually-hidden text inside. WCAG 4.1.2.
[34]
🟡 Important
Modal/dialog có
role="dialog" + focus management?
💡 Tại sao: modal mở phải trap focus inside + Esc close + return focus original button. Sai = keyboard user lost.
✅ Cách check: Modal có
role="dialog" aria-modal="true" aria-labelledby="title-id". Test keyboard navigation in/out.
[35]
🟡 Important
Live region announce dynamic content update?
💡 Tại sao: cart count update, error toast appear = screen reader user không biết nếu không có aria-live region.
✅ Cách check: Dynamic content container có
aria-live="polite" (cho info) hoặc "assertive" (cho error urgent).
[36]
🟡 Important
Form field có aria-describedby cho help text?
💡 Tại sao: help text "Tối thiểu 8 ký tự" cạnh input = screen reader không link tới input tự động. Cần aria-describedby.
✅ Cách check:
<input id="pwd" aria-describedby="pwd-help"> + <span id="pwd-help">Tối thiểu 8 ký tự</span>.WCAG 2.2 New SC + EAA (37-40 — 4 check)
[37]
🟡 Important
Accessible Authentication (WCAG 2.2 new 3.3.8)?
💡 Tại sao: CAPTCHA chữ vặn vẹo, puzzle math = cognitive disability user không pass được. EAA bắt buộc alternative.
✅ Cách check: Login page có alternative cho CAPTCHA: email magic link, password manager support, hoặc biometric. WCAG 3.3.8.
[38]
🟢 Recommended
Redundant Entry (WCAG 2.2 new 3.3.7)?
💡 Tại sao: form multi-step bắt user nhập lại email/address mỗi step = cognitive burden. Cần auto-fill từ previous step.
✅ Cách check: Checkout multi-step, info đã nhập có auto-prefill step sau không. WCAG 3.3.7.
[39]
🟢 Recommended
EAA accessibility statement public + maintained?
💡 Tại sao: EAA bắt buộc publish accessibility statement với contact info, conformance level, last audit date.
✅ Cách check: Footer link "Accessibility" hoặc
/accessibility-statement/. Page có specify WCAG 2.1/2.2 AA, last audit date, feedback contact.
[40]
🟢 Recommended
EN 301 549 conformance documented (EU)?
💡 Tại sao: EAA technical standard EN 301 549 (extends WCAG 2.1 AA với clauses cho hardware + closed functionality). Site phục vụ EU government / commerce cần documented conformance.
✅ Cách check: Compliance report theo EN 301 549 v3.2.1, accessible từ accessibility statement.
Process + Legal: Methodology + Status Messages + Audit Trail (41-43 — 3 check)
[41]
🔴 Critical
Audit gồm đủ 3 lớp: automated + manual keyboard + screen reader?
💡 Tại sao: Automated tool chỉ bắt được khoảng 30-57% lỗi theo volume; phần còn lại cần người + keyboard + screen reader. Chạy mỗi axe-core là chưa đủ, dễ tưởng pass nhưng vẫn fail thực tế.
✅ Cách check: Mỗi audit phải gồm 3 lớp: automated scan, manual keyboard test, screen reader (NVDA/VoiceOver).
[42]
🟡 Important
Status message (toast, đã gửi) có aria-live/role=status (WCAG 4.1.3)?
💡 Tại sao: SC 4.1.3 Status Messages hay bị miss nhất. Thay đổi trạng thái phải programmatically determinable mà không cần nhận focus.
✅ Cách check: Toast/status update có
aria-live (polite/assertive) hoặc role=status, screen reader announce mà không cướp focus.
[43]
🟢 Recommended
Có lưu audit trail (ngày, người, method, scope, fix) cho legal?
💡 Tại sao: Giữ hồ sơ audit là critical nếu bị complaint/legal (EAA/ADA). Có accessibility statement chưa đủ, cần internal audit trail.
✅ Cách check: Lưu record mỗi đợt audit: ngày, người, methodology, scope, fix. Quan trọng khi tranh chấp pháp lý.
0 / 36
21 🔴
12 🟡
3 🟢
HTTPS + TLS + HSTS Preload (1-6 — 6 check)
[1]
🔴 Critical
Site serve HTTPS với HTTP redirect 301?
💡 Tại sao: HTTP plain text user có thể intercept WiFi public. Phải redirect HTTP → HTTPS permanent.
✅ Cách check:
curl -sI http://yoursite.com | grep -i location → HTTP/1.1 301 + Location: https://yoursite.com. Browser direct: HTTP URL phải auto redirect HTTPS.
[2]
🔴 Critical
TLS 1.2+ enabled, TLS 1.0/1.1 disabled?
💡 Tại sao: TLS 1.0/1.1 deprecated 2020, vulnerable BEAST/POODLE attack. Browser flag warning cho user.
✅ Cách check: [SSL Labs](https://www.ssllabs.com/ssltest/) nhập domain → Protocols section: TLS 1.2/1.3 = Yes, TLS 1.0/1.1 = No. Cần rating A+ (A là OK).
[3]
🔴 Critical
HSTS header với max-age ≥ 31536000 (1 năm)?
💡 Tại sao: HSTS bắt browser memory site = HTTPS-only cho khoảng thời gian max-age. Tránh SSL stripping attack.
✅ Cách check:
curl -sI https://yoursite.com | grep -i strict-transport-security → cần max-age=31536000; includeSubDomains; preload.
[4]
🔴 Critical
HSTS preload submitted to Chrome preload list?
💡 Tại sao: Preload list giúp browser HTTPS-only NGAY LẦN ĐẦU user visit, không đợi HSTS header set.
✅ Cách check: [hstspreload.org](https://hstspreload.org/) nhập domain → "Status: Preloaded" = OK. Nếu chưa: submit (cần includeSubDomains + max-age 1 năm).
[5]
🔴 Critical
Mixed content (HTTP asset trong HTTPS page) bằng 0?
💡 Tại sao: HTTP image/script inside HTTPS = browser block hoặc warning. Padlock icon broken.
✅ Cách check: DevTools > Console → tìm "Mixed Content" warning. Hoặc [Why No Padlock](https://www.whynopadlock.com/) audit.
[6]
🟡 Important
SSL certificate valid + auto-renew setup?
💡 Tại sao: cert expire = site down. Let's Encrypt 90-day, manual renew dễ quên. Cần Certbot auto-renew cron.
✅ Cách check:
openssl s_client -connect yoursite.com:443 -servername yoursite.com 2>/dev/null | openssl x509 -noout -dates → notAfter date. Cron: certbot renew --dry-run.Security Headers (CSP L3 + X-Frame) (7-14 — 8 check)
[7]
🔴 Critical
Content-Security-Policy (CSP) Level 3 với strict-dynamic?
💡 Tại sao: CSP block inline script + 3rd-party script không allow. Level 3 strict-dynamic chặn phần lớn XSS modern pattern.
✅ Cách check:
curl -sI https://yoursite.com | grep -i content-security-policy → cần directive script-src 'strict-dynamic' 'nonce-...' 'unsafe-inline' https:; object-src 'none';. Audit [CSP Evaluator](https://csp-evaluator.withgoogle.com/).
[8]
🔴 Critical
X-Frame-Options: DENY hoặc SAMEORIGIN?
💡 Tại sao: site bị embed iframe trên site malicious = clickjacking attack. Block iframe embed prevent.
✅ Cách check:
curl -sI yoursite.com | grep -i x-frame-options → DENY (recommended) hoặc SAMEORIGIN. Hoặc CSP frame-ancestors directive thay thế.
[9]
🟡 Important
Referrer-Policy: strict-origin-when-cross-origin?
💡 Tại sao: referrer header leak URL nội bộ ra 3rd-party. Strict-origin chỉ leak domain, không leak path.
✅ Cách check:
curl -sI yoursite.com | grep -i referrer-policy → strict-origin-when-cross-origin (default modern browser). Set explicit để confirm.
[10]
🟡 Important
Permissions-Policy với restrict default features?
💡 Tại sao: Permissions-Policy (formerly Feature-Policy) block camera/microphone/geolocation default. 3rd-party iframe không access được.
✅ Cách check:
curl -sI yoursite.com | grep -i permissions-policy → ví dụ geolocation=(), camera=(), microphone=() (empty = blocked).
[11]
🔴 Critical
X-Content-Type-Options: nosniff?
💡 Tại sao: browser MIME-sniff response → đoán wrong type → execute JS từ user-uploaded file. Block prevent.
✅ Cách check:
curl -sI yoursite.com | grep -i x-content-type-options → nosniff.
[12]
🟢 Recommended
COOP (Cross-Origin-Opener-Policy): same-origin?
💡 Tại sao: COOP isolate browsing context khỏi popup malicious. Combined với COEP enable SharedArrayBuffer cho perf.
✅ Cách check:
curl -sI yoursite.com | grep -i cross-origin-opener-policy → same-origin.
[13]
🟢 Recommended
COEP (Cross-Origin-Embedder-Policy): require-corp?
💡 Tại sao: COEP yêu cầu cross-origin resource phải opt-in CORS. Enable SharedArrayBuffer + Spectre mitigation.
✅ Cách check:
curl -sI yoursite.com | grep -i cross-origin-embedder-policy → require-corp. Note: enable COEP có thể break 3rd-party embed nếu họ không CORS.
[14]
🟡 Important
Subresource Integrity (SRI) cho CDN script?
💡 Tại sao: CDN script compromise (jQuery CDN bị hack) = mọi site dùng dính. SRI hash verify file unchanged.
✅ Cách check: View source
<script src="cdn.../jquery.js" integrity="sha384-..." crossorigin="anonymous"> → SRI hash present. Tool [SRI Hash Generator](https://www.srihash.org/).GDPR Cookie + Consent + DSR (15-20 — 6 check)
[15]
🔴 Critical
Cookie banner explicit opt-in (không opt-out preset)?
💡 Tại sao: GDPR Art. 7 + EDPB Cookie Guidelines 03-2020: consent phải freely given, specific, informed, unambiguous. Pre-checked box ≠ consent.
✅ Cách check: Mở site (incognito), cookie banner default state phải có tất cả non-essential cookie UNCHECKED. User phải actively check + click "Accept" để enable.
[16]
🔴 Critical
Nút "Reject All" cùng prominence với "Accept All"?
💡 Tại sao: EDPB 2024 guideline + CJEU C-673/17 (Planet49): "Reject" phải same size, same color contrast, same hierarchy với "Accept". Dark pattern (Reject ẩn sau "Settings") = non-compliant.
✅ Cách check: Cookie banner có nút "Reject All" visible same level với "Accept All" không (không ẩn trong "Settings/Manage" sub-menu).
[17]
🔴 Critical
Privacy Policy comprehensive theo GDPR Article 13?
💡 Tại sao: GDPR Art. 13 list 11 thông tin bắt buộc: identity controller, contact DPO, purpose processing, lawful basis, retention period, data subject rights, complaint authority, etc.
✅ Cách check: Open
/privacy-policy/ page, scan có cover 11 mục Article 13. Hoặc dùng [GDPR Privacy Policy Checker](https://complianz.io/) audit.
[18]
🔴 Critical
Data Subject Access Request (DSAR) form/email functional?
💡 Tại sao: User có quyền request "Cho tôi xem mọi data về tôi" + "Xóa data tôi" theo Art. 15-17. Response 30 ngày tối đa.
✅ Cách check: Site có form/email submit DSAR không. Test submit, response thực tế 30 ngày.
[19]
🟡 Important
Cookie banner cho phép withdraw consent dễ dàng?
💡 Tại sao: GDPR Art. 7(3): withdraw consent phải easy như give consent. Cần button "Cookie Settings" footer accessible mọi page.
✅ Cách check: Footer có link "Cookie Settings" mở banner lại. Toggle cookie category off + save = revoke consent.
[20]
🟡 Important
Cross-border data transfer mechanism (SCC + DPF)?
💡 Tại sao: Data EU → US/3rd country cần legal mechanism: Standard Contractual Clauses (SCC) hoặc EU-US Data Privacy Framework (DPF, 07-2023 valid).
✅ Cách check: Privacy policy có specify data transfer mechanism + 3rd country list không. Vendor list (Google Analytics, Facebook Pixel) DPF-certified không.
PDPD Nghi Dinh 13 VN (21-26 — 6 check)
[21]
🔴 Critical
Site đã register notification với Cục A05 chưa?
💡 Tại sao: Nghị định 13 Điều 24 bắt buộc register processing notification trong 60 ngày kể từ ngày bắt đầu xử lý. Không register = fines 50M VND.
✅ Cách check: Submit form notification online tại [Cổng dịch vụ công Bộ Công an](https://dichvucong.bocongan.gov.vn/). Lưu receipt làm bằng chứng. DPO/legal handle.
[22]
🔴 Critical
Privacy notice tiếng Việt + theo Điều 13 format?
💡 Tại sao: Nghị định 13 Điều 13 list 10 thông tin bắt buộc notice: purpose, scope, retention, data subject rights, contact controller, complaint authority, etc.
✅ Cách check:
/chinh-sach-bao-mat/ page tiếng Việt cover Điều 13 10 mục. English version separate /privacy-policy/ cho international user.
[23]
🔴 Critical
Consent rule theo Điều 11 (rõ ràng + voluntary)?
💡 Tại sao: Điều 11 + 12 bắt buộc consent explicit, có thể withdraw, không bị coerce. Pre-checked + bundled consent với T&C = invalid.
✅ Cách check: Form đăng ký user, consent checkbox separate, không pre-checked, không bundle với T&C agreement.
[24]
🔴 Critical
Sensitive data (nhạy cảm) handle theo Điều 28?
💡 Tại sao: Nghị định 13 Điều 2(4): sensitive data gồm health, religion, biometric, political, financial. Cần consent + impact assessment chuyên biệt.
✅ Cách check: Form thu thập sensitive data có separate consent + privacy impact assessment record không.
[25]
🟡 Important
Breach notification 72 giờ tới A05 + user?
💡 Tại sao: Điều 23: data breach phải notify A05 + affected user trong 72 giờ. Late = fines tăng.
✅ Cách check: Incident response plan có document 72h notification workflow không. Test với mock breach drill.
[26]
🟡 Important
DPO (Data Protection Officer) assigned + contact public?
💡 Tại sao: Điều 27: tổ chức processing data ≥ 100K user phải có DPO. Contact info DPO public trên privacy notice.
✅ Cách check: Privacy notice có "DPO: [tên] - email: [email]" không. DPO báo cáo trực tiếp board, không conflict interest.
Data Leak Prevention (27-30 — 4 check)
[27]
🔴 Critical
No sensitive data trong client-side JS bundle?
💡 Tại sao: API key, secret, internal endpoint trong JS bundle = anyone view source thấy được.
✅ Cách check: View source main.js, grep
password|secret|api_key|token. Tool [TruffleHog](https://github.com/trufflesecurity/trufflehog) scan bundle. Sensitive data phải proxy qua backend.
[28]
🔴 Critical
Public file/folder không expose sensitive (.env, .git, /admin)?
💡 Tại sao:
.env file expose database password + API key. .git/config expose internal repo path. /admin/ expose login bypass.✅ Cách check:
curl -I yoursite.com/.env → 403/404 = OK, 200 = leak. Tool [Wapiti](https://wapiti-scanner.github.io/) audit endpoint expose.
[29]
🟡 Important
PII (Personal Identifiable Info) không log clear text?
💡 Tại sao: log file capture email/phone/credit card clear text = leak risk khi server compromise. Cần hash hoặc mask.
✅ Cách check: Audit log format, PII field phải
mask hoặc hash. Compliance team review log retention policy.
[30]
🟢 Recommended
Public bucket (S3/GCS) bucket policy private?
💡 Tại sao: AWS S3 bucket public = anyone download file. Common cause data leak (Capital One 2019, Verizon 2017).
✅ Cách check: AWS Console > S3 > bucket > Permissions tab → Block Public Access ON. Object level ACL không public-read.
Application + Server Security (31-36 — 6 check)
[31]
🔴 Critical
Đã scan dependency vulnerability (npm/pip-audit, Dependabot, Snyk)?
💡 Tại sao: Đa số tấn công đến từ thư viện lỗi thời. Mọi nguồn security 2026 đều liệt đầu tiên, nhưng phần lớn audit transport/compliance bỏ qua.
✅ Cách check: Chạy
npm audit / pip-audit / Dependabot / Snyk / Trivy: 0 high/critical vuln trong production deps. Auto-update qua Dependabot/Renovate.
[32]
🔴 Critical
Có rate limiting + bot mitigation trên endpoint public/login?
💡 Tại sao: Chặn brute-force, credential stuffing, scraping, DoS. Endpoint public không rate limit thì dễ bị abuse.
✅ Cách check: Contact form, search, auth, write API đều có per-IP rate limit (vd 60 req/phút). Login/signup có bot challenge (Turnstile/hCaptcha/Cloudflare).
[33]
🔴 Critical
Cookie có đủ flag Secure + HttpOnly + SameSite?
💡 Tại sao: Cookie CONSENT (GDPR) khác cookie SECURITY flags. Session cookie thiếu HttpOnly thì XSS đánh cắp được session.
✅ Cách check: Mọi cookie có
Secure, HttpOnly, SameSite=Lax/Strict. Regenerate session ID sau login.
[34]
🟡 Important
Đã ẩn server version/fingerprint (Server, X-Powered-By)?
💡 Tại sao: Header
Server: Apache/2.4.54 + X-Powered-By: PHP/8.1 lộ stack, attacker tra vuln đã biết.✅ Cách check:
curl -I: Server header generic hoặc ẩn, X-Powered-By removed.
[35]
🟡 Important
Auth hardening: admin MFA + password policy + lockout?
💡 Tại sao: Admin account cần MFA; password tối thiểu 12+ ký tự, block common password, hash bcrypt/Argon2; giới hạn failed login chặn brute-force.
✅ Cách check: Admin bắt buộc MFA, password policy enforce, failed login lockout.
[36]
🟡 Important
Có chống injection cơ bản (parameterized query, escape output, CSRF token)?
💡 Tại sao: OWASP Top 10 cốt lõi. Dù scope bài hẹp vẫn nên cover tầng cơ bản.
✅ Cách check: Parameterized query (chống SQLi), escape output (chống XSS), CSRF token + SameSite cho form write.
0 / 33
17 🔴
13 🟡
3 🟢
llms.txt + AI-Friendly Markdown (1-6 — 6 check)
[1]
🔴 Critical
Site có file
/llms.txt root domain?
💡 Tại sao: llms.txt spec [llmstxt.org](https://llmstxt.org/) là chuẩn de-facto 2024-2026. AI crawler (ChatGPT, Claude) check file này trước HTML để discover priority content.
✅ Cách check: Mở
yoursite.com/llms.txt browser → phải hiển thị markdown content. Hoặc curl -sI yoursite.com/llms.txt → HTTP 200.
[2]
🔴 Critical
llms.txt format markdown đúng spec (H1 + summary + H2 sections + links)?
💡 Tại sao: spec yêu cầu H1 = site name, summary 1-2 dòng, H2 sections group content. Sai format = AI parse fail.
✅ Cách check: Open llms.txt content, verify H1 → summary → H2 (Docs/Examples/Optional) → bullet links. Spec ví dụ tại [llmstxt.org](https://llmstxt.org/).
[3]
🟡 Important
Có
/llms-full.txt cho deep content (optional nhưng giá trị)?
💡 Tại sao:
/llms-full.txt chứa concatenated markdown của top page (10-50 page) để AI fetch 1 lần thay vì 50 lần. Reduce hallucination.✅ Cách check:
curl -s yoursite.com/llms-full.txt | wc -l → 500+ dòng OK. Hoặc dùng Anthropic generator script.
[4]
🔴 Critical
Content body có markdown structure rõ (H2/H3 + bullet + code block)?
💡 Tại sao: AI engine parse markdown tốt hơn HTML messy với inline style. Page Vue/React SPA với nested div không có semantic = AI bỏ qua.
✅ Cách check: View source body, count H2/H3 + bullet + code block. Sạch markdown = OK. Nested div thuần = refactor cần.
[5]
🔴 Critical
Robots.txt cho phép AI bot crawl (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot)?
💡 Tại sao: nhiều theme default block AI bot. Site invisible với AI search nếu bot disallow.
✅ Cách check:
curl -s yoursite.com/robots.txt | grep -i 'gptbot\|claudebot\|perplexitybot' → tìm Allow: / hoặc không có rule disallow.
[6]
🔴 Critical
Sitemap.xml include trong llms.txt links?
💡 Tại sao: AI crawler check sitemap để map content priority. Link trong llms.txt section "Docs" giúp index nhanh.
✅ Cách check: llms.txt content có line
- [Sitemap](https://yoursite.com/sitemap.xml): Full content index không.Schema Markup for AI Parsing (7-14 — 8 check)
[7]
🔴 Critical
Article schema với author + datePublished + dateModified?
💡 Tại sao: AI engine + Google ranking factor (E-E-A-T) check author + freshness. Thiếu = signal weak.
✅ Cách check: [Schema Validator](https://validator.schema.org/) nhập URL → Article type với 3 property mandatory. Hoặc view source
<script type="application/ld+json"> search "Article".
[8]
🔴 Critical
FAQPage schema cho FAQ section page?
💡 Tại sao: FAQ schema mặc dù deprecated Google rich result 05-2026 nhưng AI engine vẫn cite FAQPage data heavily. [SearchEngineLand FAQ deprecation](https://searchengineland.com/google-deprecates-faqpage-howto-rich-results-454466).
✅ Cách check: Schema Validator → FAQPage type với mainEntity array of Question. Mỗi Question có acceptedAnswer property.
[9]
🔴 Critical
Person schema (author) với sameAs links to social/LinkedIn?
💡 Tại sao: AI engine build entity graph cho author. sameAs link tới LinkedIn + Twitter + GitHub xác nhận identity, boost trust.
✅ Cách check: Validator → Person type với name + jobTitle + sameAs array. sameAs cần 3-5 link verified.
[10]
🔴 Critical
Organization schema với logo + sameAs + contactPoint?
💡 Tại sao: brand entity recognition cho AI. Organization schema map name → industry → location → contact, AI cite chính xác hơn.
✅ Cách check: Validator homepage → Organization type với @type, name, logo, sameAs, contactPoint properties.
[11]
🟡 Important
BreadcrumbList schema cho nav structure?
💡 Tại sao: AI engine map content hierarchy + topic group. Breadcrumb signal page thuộc category nào.
✅ Cách check: Validator interior page → BreadcrumbList type với itemListElement array.
[12]
🟡 Important
HowTo schema cho tutorial step-by-step?
💡 Tại sao: tutorial page có HowTo schema dễ được ChatGPT/Perplexity cite hơn cho query "how to X". Mặc dù Google deprecated 2023 rich result, AI engine vẫn parse.
✅ Cách check: Validator tutorial page → HowTo type với step array.
[13]
🔴 Critical
Product schema với offer + aggregateRating cho e-commerce/review?
💡 Tại sao: review article không Product schema = AI không identify product entity. Mất visibility query so sánh "X vs Y".
✅ Cách check: Validator review page → Product với offer.price, aggregateRating.ratingValue, brand properties.
[14]
🔴 Critical
Schema markup không có error theo Schema.org v30?
💡 Tại sao: schema syntax error = browser/AI ignore toàn block. 1 lỗi property = mất hết signal.
✅ Cách check: [Schema Validator](https://validator.schema.org/) → 0 error. Hoặc [Google Rich Results Test](https://search.google.com/test/rich-results) cho Google-specific validation.
Citability Block-Level (15-22 — 8 check)
[15]
🔴 Critical
Mỗi H2/H3 section answer 1 câu hỏi cụ thể?
💡 Tại sao: heading question format match user query AI extract. "Tại sao X quan trọng?" được cite cho query "Why is X important?".
✅ Cách check: Audit H2/H3 list, count question (?) vs statement. Target 60-80% question format.
[16]
🔴 Critical
Paragraph đầu mỗi section có definition-first sentence?
💡 Tại sao: AI extract first sentence làm answer summary. "X là Y" định nghĩa thẳng = citation perfect.
✅ Cách check: Audit 5-10 section đầu, sentence 1 có pattern "X là ..." định nghĩa thẳng không.
[17]
🔴 Critical
Stats có inline source link (hyperlink tới authority)?
💡 Tại sao: AI verify stat qua source. Stats không link = AI skip vì không trust. Inline link → AI cite cả bạn lẫn source.
✅ Cách check: Body grep stats (%, số tuyệt đối). Mỗi stats có markdown link
[stat](URL) không. Min 9 inline link per article (per ongboit rule).
[18]
🔴 Critical
Block content (1-3 paragraph) standalone hiểu được không cần context?
💡 Tại sao: AI extract 1-3 paragraph làm citation. Nếu paragraph reference "as mentioned above" = AI không hiểu, skip.
✅ Cách check: Read random 3 paragraph trong article không context. Standalone meaningful không.
[19]
🟡 Important
Sentence length avg 16-22 words?
💡 Tại sao: sentence > 30 words = AI compress sai meaning. Sentence < 12 words = không đủ content cite.
✅ Cách check: [Hemingway Editor](https://hemingwayapp.com/) nhập article → avg sentence length. Sweet spot 16-22.
[20]
🟡 Important
Bullet list có 3-7 items per list?
💡 Tại sao: AI extract bullet list nguyên block. List 10+ items bị truncate, list 1-2 items không meaningful.
✅ Cách check: Audit bullet list count items. Refactor list > 7 thành 2 list hoặc table.
[21]
🔴 Critical
Code block có comment + clear context?
💡 Tại sao: AI cite code snippet kèm explanation. Code không comment = AI cite raw code, user không biết dùng.
✅ Cách check: Code block có comment đầu + paragraph context trước/sau không.
[22]
🟡 Important
First 100 words paragraph chứa primary keyword + definition?
💡 Tại sao: AI engine ưu tiên first 100 words làm summary. Keyword + definition front-loaded = citation higher.
✅ Cách check: First paragraph article có primary keyword + 1 sentence definition không.
Brand Mentions + Entity (23-26 — 4 check)
[23]
🔴 Critical
Brand name + variant consistent trong content?
💡 Tại sao: "Ông Bố IT" vs "OngBoIT" vs "OBI" inconsistent = AI confused entity. Pick 1 canonical + dùng nhất quán.
✅ Cách check: Audit content grep brand name variant. Standardize trên 1 canonical (e.g., "Ông Bố IT" full name).
[24]
🟡 Important
Brand mention trong external article authority (PR + backlink)?
💡 Tại sao: AI engine train trên external mention. Brand không mention ngoài site = entity weak, AI không cite confident.
✅ Cách check: Google search
"Ông Bố IT" site:.edu OR site:.gov OR site:authoritydomain.com → mention count. Target 10+ authority mention.
[25]
🟡 Important
sameAs link trong Organization schema verified?
💡 Tại sao: sameAs link tới Wikipedia, Wikidata, LinkedIn = AI verify entity. Unverified link bị skip.
✅ Cách check: Organization schema sameAs array có Wikipedia entry không. Nếu không có: create Wikipedia stub hoặc Wikidata entity.
[26]
🟡 Important
Brand co-occurrence với category keyword trong top article?
💡 Tại sao: "Ông Bố IT" co-occurrence với "Claude Code", "SEO", "n8n" = AI map brand → category group.
✅ Cách check: Top 10 article có brand name + category keyword cùng paragraph không. Audit + add inline mention strategic.
Platform-Specific (ChatGPT/Perplexity/AIO) (27-30 — 4 check)
[27]
🟢 Recommended
Content có direct answer 40-60 words ngay đầu cho ChatGPT?
💡 Tại sao: ChatGPT extract first 40-60 words làm answer summary. Front-load answer = cite probability tăng 2.5x.
✅ Cách check: First paragraph 40-60 words có direct answer cho query target không.
[28]
🟡 Important
Recency signal (datePublished + dateModified < 6 tháng)?
💡 Tại sao: AI engine có recency bias. Content cũ ít được AI cite hơn content tươi; update dateModified khi refresh content.
✅ Cách check: Schema Article dateModified < 6 tháng. Audit content > 18 tháng list để refresh quarterly.
[29]
🟢 Recommended
Perplexity-optimized: content < 800 words concise sections?
💡 Tại sao: Perplexity prefer concise section dễ extract. Long-form 3K+ words bị down-rank vs section-based article.
✅ Cách check: Audit article > 5K words → split thành multiple smaller article hoặc TOC navigation prominent.
[30]
🟢 Recommended
Google AIO speakable Schema cho voice search?
💡 Tại sao: Google AIO + voice assistant extract speakable section. Schema.org speakable property identify voice-ready content.
✅ Cách check: View source
<script type="application/ld+json"> có "@type": "SpeakableSpecification" với cssSelector array không.Measurement + Fan-out + Anti-stuffing (31-33 — 3 check)
[31]
🟡 Important
Có baseline AI visibility (GA4 AI-bot segment + manual prompt test 30-50 query/quý)?
💡 Tại sao: Measurement là 1 trục riêng của GEO 2026. Không đo baseline thì không biết GEO có tiến không.
✅ Cách check: Set GA4 segment cho AI bot traffic (ChatGPT-User, PerplexityBot referrer); manual prompt test 30-50 query mỗi quý; record baseline cite rate để so trend.
[32]
🟡 Important
Content cover fan-out sub-question quanh topic chính, không chỉ keyword chính?
💡 Tại sao: AI bẻ câu hỏi phức tạp thành nhiều sub-query (fan-out) rồi search từng cái. Content nên cover các sub-question xung quanh topic.
✅ Cách check: Mỗi pillar cover các câu hỏi phụ buyer hay hỏi AI (audit bằng cách hỏi ChatGPT what related questions cho topic).
[33]
🟡 Important
Fact density đủ NHƯNG tránh keyword stuffing + stats vô nghĩa?
💡 Tại sao: Princeton research: thêm quote/stats/citation tăng visibility tới khoảng 40%, NHƯNG keyword stuffing GIẢM visibility khoảng 10%; stats generic out-of-context không tác dụng.
✅ Cách check: Audit fact density (data point + named citation mỗi 500 từ) nhưng tránh keyword stuffing + stats vô nghĩa.
0 / 22
8 🔴
12 🟡
2 🟢
Profile Health (RD + DR + Velocity) (1-5 — 5 check)
[1]
🔴 Critical
Total referring domains diverse + tăng trưởng 6 tháng?
💡 Tại sao: 100 backlink từ 1 domain = 1 vote, 100 backlink từ 100 domain = 100 vote. Referring domains diverse quan trọng hơn total link count. Min 50+ RD cho competitive niche.
✅ Cách check: [Ahrefs Site Explorer](https://ahrefs.com/site-explorer) > "Referring domains" tab → xem total + growth chart 6 tháng. Hoặc DataForSEO Backlinks API
referring_domains endpoint.
[2]
🔴 Critical
Domain Rating (DR) hoặc Domain Authority (DA) trend tăng?
💡 Tại sao: DR/DA absolute score không bằng trend. Site bạn DR 40 stable 1 năm = stagnant; DR 30 tăng dần lên 45 = healthy growth signal.
✅ Cách check: Ahrefs DR (scale 0-100) hoặc Moz DA. Track monthly, plot trend line. Target: +2-5 points mỗi quý cho site đang grow.
[3]
🔴 Critical
Link velocity natural (không spike bất thường)?
💡 Tại sao: Spike +500% backlinks trong 30 ngày = Google red flag (paid link / PBN signal), có thể trigger algorithmic demotion. Velocity natural là gradual growth.
✅ Cách check: Ahrefs "New backlinks" daily/weekly chart. Healthy: <50 new RD per month cho mid-size site. Suspicious: >200 new RD overnight.
[4]
🟡 Important
Dofollow vs nofollow ratio 60-80% dofollow?
💡 Tại sao: Dofollow link pass authority, nofollow chỉ traffic signal. 100% dofollow = unnatural pattern (forum/comment spam thường nofollow), 100% nofollow = zero authority pass.
✅ Cách check: Ahrefs Site Explorer > Backlinks tab > filter "Dofollow / Nofollow". Healthy: 60-80% dofollow.
[5]
🟡 Important
Total backlinks count + outreach pipeline track?
💡 Tại sao: Total backlinks số tuyệt đối cho context volume. Outreach pipeline tracking giúp velocity dự đoán + content marketing ROI.
✅ Cách check: Ahrefs total backlinks number + outreach CRM (e.g., Pitchbox, BuzzStream). Target: 10-20 new quality backlinks per month cho site grow.
Anchor Text Relevance (6-9 — 4 check)
[6]
🔴 Critical
Branded anchor 40-60% tổng anchor distribution?
💡 Tại sao: Branded anchor "Ông Bố IT", "ongboit.com", URL anchor = natural pattern. Healthy site 40-60% branded. Dưới 20% = signal artificial pattern (paid link without brand mention).
✅ Cách check: Ahrefs Site Explorer > "Anchors" tab > filter "Branded". Target: 40-60% total.
[7]
🔴 Critical
Exact-match anchor < 5% tổng portfolio?
💡 Tại sao: Exact-match anchor "claude code audit" cao = unnatural (paid link). 2024 threshold 10%, 2026 Google tightened xuống ~5% cho competitive niche. Vượt = Penguin algorithmic penalty.
✅ Cách check: Ahrefs "Anchors" tab filter "Exact-match" hoặc query DataForSEO API
anchor_text field. Target: < 5%.
[8]
🟡 Important
Generic anchor 15-25% (click here, read more, link)?
💡 Tại sao: Generic anchor natural cho citation + curation context. Quá thấp (<5%) = forced anchor pattern; quá cao (>40%) = low-quality forum/comment spam.
✅ Cách check: Ahrefs anchor distribution chart. Generic 15-25% healthy.
[9]
🟡 Important
Anchor contextual relevance với surrounding paragraph?
💡 Tại sao: Anchor "best Claude Code skill" trong paragraph nói về cooking = irrelevant context = low quality signal. Google parse surrounding 50-100 words.
✅ Cách check: Manual review 10-20 backlinks random. Surrounding paragraph có match topic page link tới không. Hoặc DataForSEO
backlinks API có surrounding_text field.Toxic + Spammy Detection (10-13 — 4 check)
[10]
🔴 Critical
Toxic backlink count < 5% total portfolio?
💡 Tại sao: Toxic score > 5% portfolio = algorithmic demotion 2026 threshold. Ahrefs/Moz toxic score tổng hợp 20+ factor (spam score, low DR, malware, deindexed).
✅ Cách check: Ahrefs Toxic Score column hoặc Moz Spam Score (>5 = toxic). Disavow batch nếu >5% portfolio.
[11]
🔴 Critical
PBN (Private Blog Network) signals detected?
💡 Tại sao: PBN footprint: same hosting IP group, same registrar, cheap whois, similar theme/template, thin content. Google detect PBN penalize cả linking + receiving site.
✅ Cách check: Manual review top 50 referring domains. Tool [Spamzilla](https://spamzilla.io/) automated PBN scan. Flag suspicious group + disavow.
[12]
🔴 Critical
Sudden anchor spike alert (>50% growth in 30 days)?
💡 Tại sao: Spike anchor distribution bất ngờ = negative SEO attack (competitor build spam links). Cần monitor weekly + disavow nhanh.
✅ Cách check: Ahrefs Alerts setup "Anchor distribution change". Hoặc DataForSEO scheduled query weekly + compare anchor distribution.
[13]
🟡 Important
Foreign language link spam (Chinese/Russian) check?
💡 Tại sao: Comment spam Chinese/Russian từ pharma/casino spam network = toxic. Phổ biến trên WordPress sites không protect comment.
✅ Cách check: Ahrefs "Anchors" filter character set non-Latin. Hoặc protect WordPress với Akismet + disable trackback.
Competitor Gap Analysis (14-17 — 4 check)
[14]
🟡 Important
Common backlinks competitor có mà bạn không?
💡 Tại sao: Nếu 3-5 competitor cùng có backlink từ domain X mà bạn không = high-probability X cũng cho bạn link nếu pitch đúng.
✅ Cách check: Ahrefs "Link Intersect" tool nhập 3-5 competitor domain + your domain → output common RD competitor có. Hoặc Moz Link Explorer "Compare Link Profile".
[15]
🟢 Recommended
EDU / .gov / .org niche relevant links?
💡 Tại sao: EDU/.gov link cao authority + difficult to obtain → cao value. Search niche relevant: VN universities tech blog, government open-data initiative.
✅ Cách check: Google search
site:.edu.vn OR site:.gov.vn "claude code" OR "AI automation" + outreach. Long-term effort.
[16]
🟡 Important
Resource page + listicle inclusion opportunities?
💡 Tại sao: Resource page "Best Claude Code resources 2026" / listicle "Top SEO tools VN" là natural fit cho citation. Pitch easy.
✅ Cách check: Google search
intitle:"resources" + niche keyword + intitle:"best tools" + niche. Outreach via email.
[17]
🟡 Important
Broken link building targets (competitor lost links)?
💡 Tại sao: Competitor lost links → bạn pitch thay thế. Tool surface broken backlink URL của competitor → contact webmaster offer your URL replacement.
✅ Cách check: Ahrefs "Broken Backlinks" cho competitor URL. Hoặc manual: Google cache cũ + check 404. Outreach email template.
Lost Links + Redirect Decay (18-20 — 3 check)
[18]
🟡 Important
Lost backlinks last 90 ngày + outreach recovery?
💡 Tại sao: Lost link reflect ranking drop 7-14 ngày sau (2026 accelerated). Detect nhanh + outreach restore = giữ rank stable.
✅ Cách check: Ahrefs "Lost backlinks" tab 90-day filter. Outreach email referring page owner.
[19]
🟡 Important
Redirect chain backlinks (link signal dilution)?
💡 Tại sao: Backlink → URL A → 301 → URL B → 301 → URL C dilute signal 10-15% mỗi hop. Multiple hops = significant authority loss.
✅ Cách check: Ahrefs filter backlinks có "Redirect chain length > 2". Update target URL canonical. Direct link better.
[20]
🟢 Recommended
Broken referring page (404)?
💡 Tại sao: Referring page bị 404 = your backlink lost permanently. Contact webmaster restore page hoặc move link elsewhere.
✅ Cách check: Ahrefs lost backlinks "Reason: Page not found". Outreach if high-DR referring domain.
Disavow Nuance + Topical Relevance (21-22 — 2 check)
[21]
🟡 Important
Chỉ disavow link toxic rõ ràng (PBN/negative SEO), không disavow hàng loạt?
💡 Tại sao: Google (Mueller): algorithm phần lớn tự xử bad link. Disavow indiscriminately gây false-positive mất link tốt.
✅ Cách check: Chỉ disavow khi toxic score cao + nhiều red flag rõ ràng (PBN footprint, negative SEO attack). Không disavow hàng loạt.
[22]
🟡 Important
Ưu tiên topical relevance của linking domain hơn chỉ DR cao?
💡 Tại sao: 2026 Google ngày càng tính topical relevance của linking domain, không chỉ DR. Link từ site cùng ngành DR thấp có thể giá trị hơn DR cao khác ngành.
✅ Cách check: Audit top referring domain có cùng/liên quan ngành không. Ưu tiên outreach site topical-relevant hơn chỉ săn DR cao.
0 / 17
6 🔴
8 🟡
3 🟢
Brand Mention Monitoring + Sentiment (1-4 — 4 check)
[1]
🔴 Critical
Brand mention rate per month (10+ unique sources)?
💡 Tại sao: 10+ unique source mention/tháng = signal brand active trong category. < 5 mention = entity weak, AI not confident cite.
✅ Cách check: [Google Alerts](https://www.google.com/alerts) brand name + [Brand24](https://brand24.com/) trial 14 ngày. Hoặc DataForSEO Mention API. Count unique source 30 ngày.
[2]
🟡 Important
Brand sentiment positive > 70% mentions?
💡 Tại sao: Negative sentiment > 30% = reputation risk, AI cite mention warning. Monitor sentiment auto-classify positive/neutral/negative.
✅ Cách check: Brand24 / Mention sentiment dashboard. Manual review 20-30 mention random. Reply + manage negative active.
[3]
🟡 Important
Source authority distribution (high DR sources)?
💡 Tại sao: 5 mention từ DR 70+ source > 50 mention từ DR < 20. Authority distribution quan trọng hơn raw count.
✅ Cách check: Brand24 / Mention filter "Source authority". Hoặc DataForSEO Backlinks API check DR mỗi referring source.
[4]
🟡 Important
Geographic distribution mention (target market focus)?
💡 Tại sao: Site VN target audience VN, mention 90% từ EU/US = misaligned market. Geographic distribution match target = healthy brand reach.
✅ Cách check: Brand24 filter "Country". Hoặc Google Alerts country filter. Target: 60%+ mention từ target country.
Entity Recognition (sameAs + Wiki + KG) (5-8 — 4 check)
[5]
🔴 Critical
sameAs Organization schema 5+ verified link?
💡 Tại sao: sameAs schema array link tới Wikipedia + LinkedIn + Twitter + GitHub + Facebook = AI verify entity identity. Min 5 link cho entity strong.
✅ Cách check: [Schema Validator](https://validator.schema.org/) homepage → Organization type với sameAs array ≥ 5 items. Verify mỗi link live + about brand.
[6]
🔴 Critical
Wikipedia entry / Wikidata entity exist?
💡 Tại sao: Wikipedia + Wikidata là source AI engine train heavily. Brand có entry = AI cite confident; không có = AI cite hesitant.
✅ Cách check: Search Wikipedia "Ông Bố IT" trong VN + EN. Wikidata search ID. Nếu chưa có: tạo stub article + Wikidata entity (free, requires notability).
[7]
🔴 Critical
Knowledge Graph entry Google search?
💡 Tại sao: Knowledge Graph entry = side panel khi user search brand. Strong entity signal cho AI engine.
✅ Cách check: Google search brand name desktop. Right side panel có Knowledge Graph card không. Hoặc query [Google Knowledge Graph API](https://developers.google.com/knowledge-graph) với brand name → resultScore > 100 = recognized.
[8]
🟡 Important
Brand entity consistent across web (no variant)?
💡 Tại sao: "Ông Bố IT" vs "OngBoIT" vs "OBI" inconsistent = AI confused. Pick 1 canonical + standardize qua mọi mention.
✅ Cách check: Audit social profile + LinkedIn + GitHub + content. Standardize trên 1 canonical (e.g., "Ông Bố IT" full). Update branding guide.
Branded Search Demand (9-11 — 3 check)
[9]
🔴 Critical
Branded search volume Google trend tăng 6 tháng?
💡 Tại sao: Branded search volume = direct measure brand awareness. Tăng dần = brand health good; flat/declining = marketing campaign chưa work.
✅ Cách check: [Google Trends](https://trends.google.com/) brand name 12-month chart. Hoặc DataForSEO Keyword Volume API exact match brand. Target: +10-30% mỗi quý.
[10]
🟡 Important
Branded CTR vs unbranded CTR organic?
💡 Tại sao: Branded query CTR thường 30-50% (user know brand, click chính xác); unbranded CTR 5-15%. Gap quá hẹp = brand chưa stand out trong SERP.
✅ Cách check: GSC > Performance > filter "Query contains [brand]" vs not contains. So sánh CTR. Target: branded CTR ≥ 30%.
[11]
🟡 Important
Brand + modifier search combinations (brand + reviews, brand + price)?
💡 Tại sao: User search "ongboit reviews" / "ongboit price" / "ongboit vs competitor" = high commercial intent. Volume + trend = brand commercial demand.
✅ Cách check: Google Keyword Planner brand + modifier suggestions. Hoặc Ahrefs Keyword Explorer related keywords. Track top 10 modifier monthly.
Co-Occurrence Category (12-13 — 2 check)
[12]
🔴 Critical
Brand co-occurrence với category keyword trong top article?
💡 Tại sao: "Ông Bố IT" + "Claude Code", "SEO", "n8n" cùng paragraph nhiều lần = AI map brand → category group. AI cite cho query thematic.
✅ Cách check: Audit top 10 article có brand name + category keyword cùng paragraph không. Manual review + add inline mention strategic. Target: 80%+ top article có co-occurrence.
[13]
🟡 Important
Authority niche placement (guest post + interview + podcast)?
💡 Tại sao: Placement trên niche authority site (Vietcetera tech, Tinh tế, ICT News) = co-occurrence brand + category recognized by AI. Editorial mentions > paid placement.
✅ Cách check: Track guest post + interview + podcast trong 12 tháng. Target: 5-10 placement trên niche authority site mỗi năm.
AI Brand Recognition (14-15 — 2 check)
[14]
🟢 Recommended
ChatGPT brand cite rate query relevant?
💡 Tại sao: Search "best Claude Code skills" trên ChatGPT, brand bạn có được cite trong response không? Cite rate = visibility AI search era.
✅ Cách check: Manual test 20-30 query relevant trên ChatGPT. Count brand mention rate. Hoặc Profound dashboard track historical. Target: 20%+ query relevant cite brand.
[15]
🟢 Recommended
Perplexity brand mention frequency + AI Overview citation?
💡 Tại sao: Perplexity + Google AIO cite source different patterns. Brand visibility multi-platform = robust AI search readiness.
✅ Cách check: Manual test Perplexity 20-30 query + Google search query có AIO. Count brand mention. Hoặc BrandRank.ai dashboard.
E-E-A-T Author Signal + Unlinked Mention (16-17 — 2 check)
[16]
🟡 Important
Page có named author + bio + credential visible (tăng AI cite)?
💡 Tại sao: Page có named author + credential visible được AI cite nhiều hơn content brand vô danh. E-E-A-T là trục riêng của khung GEO.
✅ Cách check: Author có bio + credential visible trên page; brand có About/team page thể hiện expertise + proof (case study, kết quả thật).
[17]
🟢 Recommended
Đã reclaim unlinked brand mention (xin chuyển thành link)?
💡 Tại sao: Site nhắc tên brand mà không link là cơ hội. Reclaim tăng cả backlink lẫn entity signal.
✅ Cách check: Tìm mention Ông Bố IT không kèm link, outreach xin thêm link. Tool: Ahrefs Content Explorer / Brand24 filter no link.
0 / 32
14 🔴
14 🟡
4 🟢
GA4 + GTM Setup (1-7 — 7 check)
[1]
🔴 Critical
GA4 property cài + tag load đúng 1 lần?
💡 Tại sao: GA4 là bắt buộc (Universal Analytics sunset 07-2023). Tag load 2 lần = mọi metric gấp đôi, data vô nghĩa.
✅ Cách check: [Google Tag Assistant](https://tagassistant.google.com/) connect site → chỉ 1 GA4 config tag fire per page. Hoặc DevTools > Network > filter
collect?v=2 → 1 request page_view per load.
[2]
🔴 Critical
GTM container cài + không hardcode tag trùng?
💡 Tại sao: nếu vừa cài GA4 qua GTM vừa hardcode gtag.js trong theme = double-fire. Chọn 1 cách quản lý tag.
✅ Cách check: View source tìm cả
gtm.js lẫn gtag('config'.... Nếu có cả 2 cho cùng GA4 ID = trùng, gỡ 1.
[3]
🔴 Critical
Internal traffic + dev traffic được lọc?
💡 Tại sao: traffic của chính bạn + dev + staging đổ vào GA4 làm conversion rate + bounce sai lệch, nhất là site nhỏ.
✅ Cách check: GA4 > Admin > Data Settings > Data Filters → có internal traffic filter (theo IP) đang "Active", không phải "Testing". Staging dùng GA4 property riêng.
[4]
🟡 Important
GA4 data retention set tối đa (14 tháng)?
💡 Tại sao: mặc định GA4 chỉ giữ 2 tháng event-level data cho exploration. Đổi lên 14 tháng để so trend year-over-year.
✅ Cách check: GA4 > Admin > Data Settings > Data Retention → "14 months" (event data).
[5]
🟡 Important
Cross-domain tracking cấu hình (nếu nhiều domain)?
💡 Tại sao: nếu funnel đi qua nhiều domain (vd checkout subdomain) mà không config, session bị cắt = conversion attribution sai.
✅ Cách check: GA4 > Admin > Data Streams > Configure tag settings > Configure your domains → list đủ domain trong funnel.
[6]
🔴 Critical
GTM container size hợp lý (không phình)?
💡 Tại sao: container 100+ tag, nhiều tag chết, load đồng bộ = ăn main thread, hại INP + chậm fire event.
✅ Cách check: GTM > xem số tag active; gỡ tag paused/không dùng. DevTools đo
gtm.js size, defer load 3rd-party tag không critical.
[7]
🔴 Critical
Debug mode tắt trên production?
💡 Tại sao: để GTM Preview / debug mode bật trên live = data test lẫn data thật, méo report.
✅ Cách check: Tag Assistant trên live không hiện "debug"; GTM đã Submit version, không ở Preview.
Event + Conversion Tracking (8-14 — 7 check)
[8]
🔴 Critical
Key event (conversion) được định nghĩa đúng business goal?
💡 Tại sao: "key event" của GA4 phải map đúng kết quả kinh doanh (lead, mua, đăng ký), không phải vanity (page_view). Sai = tối ưu nhầm mục tiêu.
✅ Cách check: GA4 > Admin > Key events → list event đúng là outcome thật (generate_lead, purchase, sign_up, file_download), không phải scroll/page_view.
[9]
🔴 Critical
Conversion event fire đúng 1 lần per hành động (no double-count)?
💡 Tại sao: trigger lỏng (vd fire trên mọi click thay vì click thành công) = conversion ảo cao, ROI tính sai.
✅ Cách check: GA4 > Admin > DebugView, thực hiện 1 conversion thật → đúng 1 event xuất hiện, không 2-3.
[10]
🔴 Critical
Event có đủ parameter giá trị (value, currency, item)?
💡 Tại sao: purchase không có
value + currency = không tính được revenue/ROAS. Lead không có context = không chấm chất lượng.✅ Cách check: DebugView click event → có parameter
value, currency (purchase), hoặc field nhận dạng nguồn (lead). Khớp [GA4 recommended events](https://support.google.com/analytics/answer/9267735).
[11]
🔴 Critical
dataLayer push chuẩn cho các action chính?
💡 Tại sao: tracking dựa vào DOM click selector dễ vỡ khi đổi theme. dataLayer push từ code ổn định hơn.
✅ Cách check: DevTools Console gõ
dataLayer → có push cho form submit / purchase với cấu trúc nhất quán. Không chỉ dựa auto-event click toàn site.
[12]
🔴 Critical
Conversion import sang Google Ads (nếu chạy ads)?
💡 Tại sao: ads tối ưu theo conversion. Không import = Google Ads bid mù, đốt ngân sách.
✅ Cách check: GA4 > Admin > Product Links > Google Ads linked; conversion key event được import vào Ads làm conversion action.
[13]
🟡 Important
Server-side tagging cho event quan trọng?
💡 Tại sao: ad-blocker + iOS chặn client-side tag, mất khoảng 10-30% data (ước tính, tùy tỷ lệ user dùng ad-blocker). Server-side (sGTM) giữ data + kiểm soát PII trước khi gửi Google.
✅ Cách check: Có server container (Stape / Google Cloud) nhận event qua first-party endpoint cho purchase/lead. Tối thiểu cho site e-comm/lead-gen.
[14]
🟡 Important
GA4 ↔ GSC (Google Search Console) + BigQuery link?
💡 Tại sao: GA4 link GSC để xem query → landing → conversion. BigQuery export cho raw data + AI bot traffic analysis.
✅ Cách check: GA4 > Admin > Product Links → Search Console linked; BigQuery export bật (free tier đủ cho site nhỏ).
Consent Mode v2 + Privacy (15-21 — 7 check)
[15]
🔴 Critical
Consent Mode v2 triển khai (nếu có traffic EEA)?
💡 Tại sao: Google yêu cầu cho site dùng sản phẩm Google phục vụ user EEA (công bố đầu 2024, enforcement siết từ giữa 2025). Thiếu = mất remarketing audience + conversion modeling.
✅ Cách check: Tag Assistant > xem có signal
consent với ad_storage, analytics_storage, ad_user_data, ad_personalization. Hoặc DevTools tìm gtag('consent', 'default', ...).
[16]
🔴 Critical
Consent default = denied trước khi user đồng ý?
💡 Tại sao: GDPR yêu cầu opt-in. Default phải "denied" cho non-essential, chỉ "granted" sau khi user accept. Default granted = vi phạm.
✅ Cách check: Mở site incognito (EEA), trước khi bấm accept →
gtag('consent','default') có analytics_storage: denied, ad_storage: denied.
[17]
🔴 Critical
Consent update fire sau khi user chọn?
💡 Tại sao: bấm Accept mà consent không update lên "granted" = mất hết data của user đã đồng ý (đo thiếu nghiêm trọng).
✅ Cách check: DebugView / Tag Assistant: bấm Accept → có
gtag('consent','update', {analytics_storage:'granted'...}) fire ngay.
[18]
🟡 Important
Chuẩn bị cho thay đổi Google Signals 15-06-2026?
💡 Tại sao: từ 15-06-2026 Google Signals chỉ còn dùng cho behavioral reporting (user đã đăng nhập) trong GA4; thu thập dữ liệu Google Ads chuyển sang Consent Mode (ad_storage). Site chạy Ads phụ thuộc Signals cho cross-device/remarketing cần đảm bảo Consent Mode v2 Advanced; site không chạy Ads ít bị ảnh hưởng.
✅ Cách check: Review GA4 Admin > Data Collection (Google Signals). Đảm bảo Consent Mode v2 + first-party data + Customer Match thay thế đúng luồng.
[19]
🔴 Critical
No PII trong URL parameter / event label?
💡 Tại sao: email/phone/tên trong URL hoặc event = vi phạm chính sách GA4 (Google có thể xoá data) + GDPR/PDPD.
✅ Cách check: GA4 > Reports > tìm page path / event param chứa
@, số điện thoại, tên. Redact ở GTM trước khi gửi, hoặc dùng sGTM lọc PII.
[20]
🟡 Important
Cookie/tracking gắn đúng category trong consent banner?
💡 Tại sao: GA4/Ads tag phải nằm trong category "analytics"/"marketing" của CMP, block tới khi consent. Tag fire trước consent = banner làm cảnh.
✅ Cách check: Trước khi accept, DevTools > Network → không có request
collect?v=2 (GA4) hay google-analytics/doubleclick fire. Chỉ fire sau Accept.
[21]
🟡 Important
IP anonymization + data location phù hợp?
💡 Tại sao: GA4 anonymize IP mặc định nhưng nên verify; site VN/EU cần biết data region để khớp tuyên bố privacy notice.
✅ Cách check: GA4 mặc định không log full IP; privacy notice mô tả đúng công cụ analytics + data xử lý. Khớp checklist [Security + PDPD](/claude-code-audit-security-pdpd/).
CRO + Funnel Optimization (22-27 — 6 check)
[22]
🟡 Important
CTA chính rõ ràng + above-the-fold?
💡 Tại sao: user không cuộn để tìm hành động. CTA mờ nhạt hoặc nằm dưới fold = mất conversion ngay từ đầu.
✅ Cách check: Mở trang đích trên mobile → CTA chính (mua, đăng ký, liên hệ) thấy ngay không cần cuộn, dùng action verb + màu tương phản.
[23]
🟡 Important
Form chỉ hỏi field cần thiết?
💡 Tại sao: mỗi field thừa giảm completion rate. Form 3 field convert tốt hơn form 8 field rõ rệt.
✅ Cách check: Đếm field bắt buộc; bỏ field không thật sự cần lúc này (lấy sau). Field dùng
type đúng (email/tel/number) cho mobile keyboard.
[24]
🟡 Important
Form abandonment + funnel step được track?
💡 Tại sao: không biết user rớt ở bước nào của checkout/đăng ký thì không fix được. Funnel exploration là chìa khoá.
✅ Cách check: GA4 > Explore > Funnel exploration cho luồng chính (view → add → checkout → purchase, hoặc form_start → form_submit). Xác định step drop cao nhất.
[25]
🟡 Important
Thank-you / success page + conversion confirm?
💡 Tại sao: conversion nên fire ở trang xác nhận thật (sau khi submit thành công), không phải lúc bấm nút. Đây cũng là nơi đặt remarketing tag chuẩn.
✅ Cách check: Có trang/sự kiện success riêng; conversion event fire ở đó, không fire ở click.
[26]
🟡 Important
Conversion rate baseline được thiết lập?
💡 Tại sao: không có baseline thì không biết thay đổi có hiệu quả không. Cần con số gốc per traffic source.
✅ Cách check: GA4 > Reports > có conversion rate theo channel/landing page làm baseline để so sau mỗi lần tối ưu.
[27]
🟢 Recommended
A/B testing setup (nếu đủ traffic)?
💡 Tại sao: Google Optimize đã sunset; cần tool thay thế (VWO, Optimizely, AB Tasty, hoặc GA4 + server-side) để test có cơ sở thống kê. Chỉ ý nghĩa khi traffic đủ.
✅ Cách check: Có công cụ A/B test cài + test đang chạy với sample size đủ; không "đổi đại rồi nhìn".
Engagement + QA Debug (28-32 — 5 check)
[28]
🟡 Important
Engagement signal track (scroll, internal search, video)?
💡 Tại sao: GA4 enhanced measurement bắt scroll/outbound/site search tự động nhưng cần bật + verify; site search query cho insight content gap.
✅ Cách check: GA4 > Admin > Data Streams > Enhanced measurement → bật scroll, site search, video, outbound click. Verify event xuất hiện trong Realtime.
[29]
🟡 Important
Microsoft Clarity (hoặc tương đương) cho heatmap + session recording?
💡 Tại sao: GA4 cho "cái gì" (số), Clarity cho "tại sao" (xem user thật bấm/cuộn/rage-click). Clarity free.
✅ Cách check: [Microsoft Clarity](https://clarity.microsoft.com/) cài + có recording. Xem rage click / dead click trên trang đích chính.
[30]
🟢 Recommended
Realtime + DebugView verify định kỳ (tracking không vỡ)?
💡 Tại sao: deploy theme/plugin mới hay vỡ tracking âm thầm. Không ai phát hiện tới khi report tụt bất thường.
✅ Cách check: Sau mỗi deploy lớn, mở GA4 Realtime + DebugView thực hiện 1 conversion → xác nhận vẫn fire đúng.
[31]
🟢 Recommended
AI bot / AI search referral được segment?
💡 Tại sao: 2026 cần biết GEO có ra traffic không. ChatGPT/Perplexity referral lẫn trong "direct"/"referral" nếu không tách.
✅ Cách check: GA4 tạo segment/exploration filter referrer chứa
chatgpt.com, perplexity.ai, gemini → đo AI-sourced traffic + conversion. Bổ trợ [bài GEO](/claude-code-audit-geo-ai-search/).
[32]
🟢 Recommended
No duplicate / no PII trong custom event (QA cuối)?
💡 Tại sao: rà soát cuối tránh event trùng tên/double-fire + PII lọt qua custom dimension.
✅ Cách check: GA4 > Admin > Custom definitions + Debug-View toàn luồng chính 1 lượt; đối chiếu event count với hành động thực tế.
0 / 49
18 🔴
25 🟡
6 🟢
Setup + Quality + E-E-A-T (1-10 — 10 check)
[1]
🔴 Critical
Audit có goal rõ ràng (rankings / conversion / AI visibility)?
💡 Tại sao: Audit không goal = liệt kê hàng trăm URL rồi không biết làm gì tiếp. Goal quyết định ưu tiên phần nào của checklist (recover ranking → tập trung performance + decay; conversion → tập trung ICP + CTA; AI visibility → tập trung GEO).
✅ Cách check: Trước khi mở GSC, viết ra 1 câu goal chính. Nếu có nhiều goal, xếp thứ tự ưu tiên.
[2]
🟡 Important
Content inventory đầy đủ, crawl toàn site lấy URL status 200?
💡 Tại sao: Không thấy thì không audit được. Đa số quy trình content audit quá sơ sài vì không pull đủ data, dẫn tới recommendation gây hại.
✅ Cách check: Site < 100 bài export GSC Performance → Pages. Site > 100 bài dùng [Screaming Frog](https://www.screamingfrog.co.uk/) (free < 500 URL) hoặc Ahrefs Site Audit, export Internal HTML URLs status 200.
[3]
🟡 Important
Spreadsheet đủ field per-URL?
💡 Tại sao: Quyết định Keep/Merge/Prune cần data đầy đủ, không thể đoán bằng cảm giác.
✅ Cách check: Mỗi URL ghi: full URL, title, target keyword, GSC position (TB 3 tháng), sessions/tháng, impressions, CTR, ngày publish/update, số backlink, CTA y/n, conversion data (nếu track).
[4]
🟡 Important
Loại đúng scope khỏi audit?
💡 Tại sao: Audit nhầm page hệ thống làm loãng kết quả + tốn thời gian.
✅ Cách check: Bỏ ra ngoài scope: noindex pages, thank-you/confirmation pages, pricing/homepage (thuộc SEO audit riêng), press release/event one-off không định rank.
[5]
🔴 Critical
Author byline visible + bio link?
💡 Tại sao: Google + AI engine verify author entity. Bài no author = anonymous content, E-E-A-T Experience signal weak. Generic advice từ author vô danh bị bỏ qua; chuyên gia có credential thật được cite.
✅ Cách check: Mỗi bài có byline + link tới author bio page. View source
<meta name="author"> + Article schema author property.
[6]
🔴 Critical
Content freshness datePublished + dateModified < 12 tháng?
💡 Tại sao: Google ranking signal freshness, đặc biệt cho "year" intent query. Content > 12 tháng không update = down-rank.
✅ Cách check: Article schema dateModified property. View source
<time datetime="...">. Update dateModified khi refresh thật (không chỉ touch).
[7]
🔴 Critical
Topical depth ≥ 1500 words cho competitive niche?
💡 Tại sao: Thin content là target Core Update. Depth 1500-3000w cho competitive niche (SEO, finance, health) là baseline.
✅ Cách check: Word count tool. Niche less-competitive 800-1200w đủ; competitive ≥ 1500w. Benchmark theo competitor top 3.
[8]
🔴 Critical
Citation count ≥ 3 inline authority source link?
💡 Tại sao: Authority signal + E-E-A-T Trustworthiness. AI engine verify claim qua inline source → cite content có source link.
✅ Cách check: Count external link tới authority domain (.gov, .edu, Wikipedia, official site). Min 3 per article.
[9]
🟡 Important
First-person experience signal (case study, data, anecdote)?
💡 Tại sao: E-E-A-T Experience boost. "Mình audit ongboit 170 bài thấy…" = signal mạnh hơn generic tutorial. Bài có gì chỉ-mình-mới-viết-được không (client example, framework tự phát triển, quan sát ngược đời)?
✅ Cách check: Manual review intro + body có "mình/tôi/I" + ORIGINAL DATA reference không.
[10]
🟡 Important
AI detection risk < 50%?
💡 Tại sao: Google penalize "scaled content abuse". Portfolio AI detect cao = manual action risk. Threshold safe < 50%.
✅ Cách check: [Originality.ai](https://originality.ai/) batch scan, hoặc GPTZero, Copyleaks. Top traffic article ưu tiên < 30%.
SEO On-Page Optimization (11-16 — 6 check)
[11]
🔴 Critical
Primary keyword in title + H1 + first 100 words?
💡 Tại sao: Google parse 3 location này weight nhất. KW không xuất hiện = low relevance signal.
✅ Cách check: View source
<title> + first <h1> + first 100 words. Primary KW phải xuất hiện cả 3.
[12]
🔴 Critical
Meta description 150-160 chars + CTA?
💡 Tại sao: Không phải direct ranking factor nhưng impact CTR. Optimal 150-160 chars.
✅ Cách check: View source
<meta name="description">. Char count + power word + CTA.
[13]
🔴 Critical
H2 structure logical + 60%+ question format?
💡 Tại sao: H2 question match user query intent. AI engine extract H2 làm answer summary, question H2 cite probability cao hơn.
✅ Cách check: Count H2 questions (kết "?") / total H2. Target ≥ 60%.
[14]
🔴 Critical
Internal links ≥ 3 outbound + 2 inbound + anchor relevance?
💡 Tại sao: Internal link pass authority + topical relevance. Anchor text phải mô tả đúng đích, không phải "click here".
✅ Cách check: Count internal link body. Verify inbound qua Ahrefs Internal backlinks. Check anchor có chứa keyword/mô tả target không. Phát hiện orphan page (0 inbound).
[15]
🟡 Important
Image alt text on every image + descriptive?
💡 Tại sao: Accessibility + image SEO.
✅ Cách check: View source
<img> mỗi tag có alt="..." descriptive (not "image1.jpg").
[16]
🟡 Important
URL slug ≤ 75 chars + primary keyword?
💡 Tại sao: Short slug improves CTR + Google parse keyword. URL dài bị truncate trong SERP.
✅ Cách check: URL length + primary KW present. Avoid date/stop word trong slug.
GEO + Citability AI Cite (17-23 — 7 check)
[17]
🔴 Critical
Definition-first sentence each H2 section?
💡 Tại sao: AI extract first sentence H2 làm answer. "X là Y" = citation perfect.
✅ Cách check: Audit 5-10 section đầu, sentence 1 có pattern "X là…" không. Target ≥ 60%.
[18]
🔴 Critical
Block-level standalone (1-3 paragraph cite-able)?
💡 Tại sao: AI cite nguyên block. Paragraph "as mentioned above" = AI skip.
✅ Cách check: Đọc 3 paragraph random không context, standalone meaningful không.
[19]
🔴 Critical
Stats inline source link (≥ 9 per article)?
💡 Tại sao: AI verify stat qua source. Stats không link = AI skip.
✅ Cách check: Grep stats (%, số) trong body. Mỗi stats có markdown link tới nguồn thật không. **Lưu ý**: kiểm tra không còn placeholder URL chưa thay (lỗi hay gặp khi publish vội). Min 9 inline link.
[20]
🔴 Critical
FAQPage schema cho FAQ section?
💡 Tại sao: Google deprecated rich result nhưng AI engine vẫn cite FAQPage heavily. Microsoft Bing đã xác nhận dùng schema cho LLM.
✅ Cách check: [Schema Validator](https://validator.schema.org/) → FAQPage với mainEntity array.
[21]
🔴 Critical
robots.txt không chặn AI crawler?
💡 Tại sao: Nếu robots.txt chặn GPTBot, ClaudeBot, PerplexityBot, Google-Extended thì mọi GEO work khác vô nghĩa, AI không đọc được. Nhiều site thêm rule chặn bot từ 2023 rồi quên.
✅ Cách check: Mở yourdomain.com/robots.txt, tìm Disallow áp dụng cho AI crawler, gỡ cho page muốn discoverable.
[22]
🟡 Important
Article schema với author + datePublished + dateModified?
💡 Tại sao: Map entity properties cho AI parsing. 3 properties mandatory cho E-E-A-T + freshness.
✅ Cách check: Schema Validator nhập URL → Article type với 3 property.
[23]
🟡 Important
First 100 words include primary keyword + definition?
💡 Tại sao: AI ưu tiên first 100 words làm summary. KW + definition front-loaded = citation higher.
✅ Cách check: First paragraph có primary KW + 1 sentence definition không.
UX + Readability Scannable (24-28 — 5 check)
[24]
🟡 Important
Sentence length avg 16-22 words?
💡 Tại sao: Sentence > 30 words = AI compress sai meaning + reader skim miss.
✅ Cách check: [Hemingway Editor](https://hemingwayapp.com/) → avg sentence length. Sweet spot 16-22.
[25]
🟡 Important
Paragraph length < 120 words?
💡 Tại sao: Wall of text = mobile reader bounce + AI khó parse từng block.
✅ Cách check: Break paragraph mỗi 2-4 sentence (3-4 sentence max cho AI extract).
[26]
🟡 Important
Bullet list 3-7 items per list?
💡 Tại sao: AI extract list nguyên block. List 10+ bị truncate, list 1-2 không meaningful.
✅ Cách check: Refactor list > 7 thành 2 list hoặc table.
[27]
🟡 Important
TL;DR callout near top of article?
💡 Tại sao: Cho scanning user value ngay + AI extract làm summary.
✅ Cách check: Article có TL;DR trong first 500 words, styled callout box.
[28]
🟢 Recommended
Stats Banner visual (4-card grid)?
💡 Tại sao: Aggregate key numbers, scannable, AI parse easily.
✅ Cách check: Top section có 4-card grid stats, mỗi card 1 number + 1 source link.
Content Decay + Refresh (29-33 — 5 check)
[29]
🟡 Important
GSC clicks trend last 90 ngày (no decline > 30%)?
💡 Tại sao: GSC clicks trend = direct measure article health.
✅ Cách check: GSC > Performance > filter by Page → clicks trend 90 ngày. Threshold alert: -30%.
[30]
🟡 Important
GSC impressions trend (no decline > 50%)?
💡 Tại sao: Impressions reflect SERP visibility. Drop > 50% = rank position drop major.
✅ Cách check: GSC Impressions metric, filter by page. Threshold: -50%.
[31]
🟡 Important
Ranking position GSC target query stable?
💡 Tại sao: Drop position 3 → 8 = competitor catch up.
✅ Cách check: GSC Position metric, track top 5 queries 90 ngày.
[32]
🟡 Important
Bài rank vị trí 4-20 có low CTR → fix metadata trước?
💡 Tại sao: Bài rank 4-10 mà CTR < 1% = lỗi title/meta, không phải lỗi content. Vị trí tốt mà không ai click = headline yếu. Sửa title rẻ hơn rewrite nhiều.
✅ Cách check: GSC filter position 4-20 + CTR thấp. Thử update title cụ thể/benefit-driven hơn trước khi rewrite.
[33]
🟢 Recommended
Content older > 18 tháng = refresh tier?
💡 Tại sao: AI engine recency bias. Refresh tier: lightweight / medium / heavy.
✅ Cách check: Schema dateModified > 18 tháng → flag. Categorize theo traffic + rank.
Decision + Prioritization (xương sống audit) (34-43 — 10 check)
[34]
🔴 Critical
Bài 6+ tháng mà < 50 sessions/tháng → flag review?
💡 Tại sao: Ngưỡng cụ thể để flag underperformer thay vì cảm giác. Bài live lâu mà không traffic = candidate improve hoặc prune.
✅ Cách check: Filter spreadsheet: ngày publish > 6 tháng AND sessions < 50/tháng. Đánh dấu review.
[35]
🔴 Critical
Bài < 4 tháng tuổi → HOLD, không đụng?
💡 Tại sao: Content cần 4-6 tháng build ranking momentum. Giết bài non là lỗi audit phổ biến nhất. Đa số page top 10 là page > 2 năm tuổi.
✅ Cách check: Filter ngày publish < 4 tháng → để yên, chưa kết luận. Bài có backlink dù traffic thấp cũng giữ (link equity).
[36]
🔴 Critical
Mỗi URL được gán 1 status: Keep / Improve / Merge / Prune?
💡 Tại sao: Đây là trái tim của audit. Không gán status = không thực thi được.
✅ Cách check: Cột "Decision" trong spreadsheet. Keep (rank 1-10, traffic ổn, có backlink, hoặc < 4 tháng). Improve (rank 4-20 sai intent → light update hoặc full rewrite). Merge (cùng keyword/intent, gộp). Prune (< 50 sessions 6+ tháng + 0 backlink).
[37]
🔴 Critical
Bài Merge/Prune đã đặt 301 redirect?
💡 Tại sao: Xóa trắng = mất link equity + tạo 404. Luôn 301.
✅ Cách check: Mỗi URL merge → 301 về bài sống sót. Mỗi URL prune → 301 về category/homepage gần nhất.
[38]
🟡 Important
Cannibalization cùng intent đã xử lý?
💡 Tại sao: 2 bài cùng keyword cùng intent → Google chọn sai, cả 2 tụt. Khác với topic liên quan (không sao). Bài "X vs Y" và homepage X là 2 intent khác, không cannibalize.
✅ Cách check: Sort target keyword tìm trùng.
site:domain.com [keyword] xem mấy URL của mình lên. Ahrefs Organic Keywords filter URL trùng top 20. Gộp bài yếu vào mạnh + 301.
[39]
🟡 Important
Scoring có ngưỡng cắt rõ?
💡 Tại sao: Scorecard không ngưỡng = không actionable.
✅ Cách check: Chấm 100đ theo E-E-A-T + depth + freshness + engagement + technical. Page < 60 → rework. Page < 40 → consolidate hoặc prune.
[40]
🟡 Important
Internal link trỏ về URL đã xóa/redirect đã dọn?
💡 Tại sao: Sau merge/prune, link nội bộ cũ thành broken hoặc qua redirect chain.
✅ Cách check: Crawl lại tìm link trỏ về URL đã redirect → update trỏ thẳng đích mới.
[41]
🟡 Important
Prioritize theo Impact vs Effort matrix?
💡 Tại sao: Hàng trăm task → lao đầu vào = burnout. Cân gain vs resource.
✅ Cách check: Xếp task vào 4 ô. Quick Win (impact cao/effort thấp): title tag, internal link bài kẹt page 2 → làm trước. Major Project (impact cao/effort cao): rewrite lớn → lên kế hoạch.
[42]
🟢 Recommended
Status mở rộng: tách Expand / Rewrite / Deindex?
💡 Tại sao: Bản 6-status chi tiết hơn 4-bucket. Deindex = hữu ích cho user nhưng không hợp search / quá gần bài chính (giữ page, noindex).
✅ Cách check: Mở rộng cột Decision: Keep / Expand (thiếu section) / Rewrite (sai intent) / Merge / Deindex / Delete.
[43]
🟢 Recommended
Có cập nhật publish date khi rework lớn?
💡 Tại sao: Rework > 50% bài = version mới trên cùng URL, nên update date hoặc hiển thị "last updated".
✅ Cách check: Nếu rewrite section lớn / đổi structure / đổi positioning → update dateModified + visible timestamp.
Topic Cluster + Conversion (44-49 — 6 check)
[44]
🟡 Important
Map bài vào topic cluster + phát hiện cluster phình/loãng?
💡 Tại sao: Content audit nên đặt trong khung topical authority. Theo thời gian cluster phình với bài cũ, thin, cannibalize → loãng authority + tốn crawl budget.
✅ Cách check: Map mỗi bài vào 3-5 core cluster (pillar + spoke). Phát hiện cluster nào quá nhiều bài chồng chéo.
[45]
🟡 Important
Content gap, cluster thiếu spoke nào competitor có?
💡 Tại sao: Không chỉ word count, mà sub-topic nào competitor cover mà mình thiếu.
✅ Cách check: So sánh cluster mình vs competitor top 3. List spoke còn thiếu → backlog viết mới.
[46]
🟡 Important
ICP alignment, ai search keyword này, buyer hay người tò mò?
💡 Tại sao: Chỗ rò rỉ lead nhiều nhất. Bài rank nhưng sai audience = traffic vô ích. Bài speak đúng tình huống của ICP hay generic advice ai cũng dùng được?
✅ Cách check: Với bài flagged, hỏi: ai thực sự search keyword này, họ là buyer của mình không? Có product context không?
[47]
🟡 Important
CTA khớp funnel stage của reader?
💡 Tại sao: Bài top-funnel đừng ép "book demo", dùng newsletter/download. Bài bottom-funnel (comparison, alternatives, pricing) mới đẩy mua/demo.
✅ Cách check: Mỗi bài map funnel stage → CTA tương ứng. Bài bottom-funnel mà không convert → soi lại CTA placement + positioning.
[48]
🟢 Recommended
Conversion attribution per-URL trong GA4?
💡 Tại sao: Chỉ ~10% bài convert trực tiếp là bình thường, phần còn lại build awareness + nuôi reader + support bài convert qua internal link. Nhưng bài bottom-funnel bắt buộc phải convert.
✅ Cách check: GA4 check conversion event (demo, trial, contact) attribute tới blog URL nào. Bài money-page không convert → priority fix.
[49]
🟢 Recommended
llms.txt + GA4 LLM traffic tracking?
💡 Tại sao: llms.txt tóm tắt page quan trọng cho AI prioritize. GA4 không tự phân loại traffic ChatGPT/Perplexity/Claude.
✅ Cách check: Set up llms.txt. GA4 custom exploration với regex filter Session source/medium bắt traffic AI tool.