This SEO + GEO Audit scores the site on three composite indices — Technical + Core Web Vitals, GEO + AEO readiness, and an Overall Search-Readiness score — built from specialist agents covering technical health, schema, sitemap, performance, AI-crawler access, llms.txt, platform readiness, brand authority, and on-page quality. Every issue is ranked by fix ROI; ready-to-paste fix artifacts and a 90-day roadmap follow.
How to Read This Report
Ordered by what to do, in 3 tiers:
- ACT (top) — what to fix, in order: Top-3 Priority · Quick Wins · Findings by severity · 90-Day Roadmap · 🤖 Apply with Claude Code (copy-paste prompt) + the ready-to-paste robots.txt / llms.txt artifacts in the Autofix Bundle.
- INVESTIGATE (middle) — drill down: Score Breakdown · per-category Deep Dives (incl. on-page audit + performance levers) · the 7 charts (CWV, GEO radar, GSC, AI-crawler table, platform, striking-distance) · per-skill cards.
- TRUST (bottom) — confidence the run was sound: Verification (10 gates) · Methodology timeline · Appendix (formulas, tools, tier coverage, capability checklist).
To apply fixes: hand Claude Code the report MD plus the fixes/ folder, then paste the prompt in the "🤖 Apply These Fixes with Claude Code" section below.
Glossary — what the terms mean
CWV (Core Web Vitals) — Google's UX metrics: LCP (load), INP (responsiveness), CLS (visual stability). They feed ranking + the Technical score.
LCP — Largest Contentful Paint — when the largest element renders. Good <2.5s, Poor ≥4.0s. Driven mostly by server response time (TTFB).
INP / CLS — INP = Interaction-to-Next-Paint (target <200ms, replaced FID). CLS = layout shift (target <0.1).
GEO / AEO — Generative / Answer Engine Optimization — being citable by AI engines (ChatGPT, Perplexity, Gemini, AI Overviews), not just ranking in blue links.
llms.txt — An emerging 2026 manifest that tells LLMs which URLs to read. A broken/missing one costs AI-citation coverage.
AI crawler access — Whether bots like GPTBot / ClaudeBot / PerplexityBot are allowed in robots.txt. Blocking them removes you from AI answers.
Schema (structured data) — JSON-LD that labels your content (Article, FAQ, Organization, Person…). Helps both rich results and AI extraction.
Canonical — The <link rel="canonical"> tag declaring the preferred URL for a page — prevents duplicate-content dilution.
Striking distance — Keywords ranking on page 2 (positions 11-20) with real impressions — small wins can push them to page 1.
Crawl budget — How many pages a search engine will fetch per visit. Wasted on junk URLs = important pages crawled less often.
E-E-A-T — Experience, Expertise, Authoritativeness, Trustworthiness — Google's content-quality framework.
The 3 Problems Hurting You Most Right Now
Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present
Homepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-library grep (cookieyes|onetrust|cookiebot|cookielaw.org|termly|iubenda|klaro|tar...
Google Business Profile not confirmed via API — verify it exists and is claimed
DataForSEO business_listings_search (title 'thietbinenkhi.vn Airtec', category 'Air compressor supplier') returned items: []. Facebook page lists 'Ho Chi Minh City' but no GBP entity surfaced.
Highest-volume head terms rank page 1 but outside top 3 — top-3 push is the biggest traffic lever
DataForSEO: 'lọc tách dầu máy nén khí' pos 6, sv 3600, /loc-tach-dau-may-nen-khi/; 'máy nén khí trục vít' pos 7, sv 2400, /may-nen-khi-truc-vit/; 'dầu máy nén khí' pos 5, sv 720. 19 of 26 sampled keyw...
Quick Wins — Shippable This Week
9.0h total6 fixes shippable this week (effort = S). Estimated overall score lift +5-15 points.
- ☐ C5Product aggregateRating mis-typed as lowercase 'aggregateRating' (invalid Schema.org type) 1h Restores review-snippet eligibility and AI parse-ability for legitimately-review
- ☐ H1All recommended HTTP security/transport headers absent site-wide (incl. no HSTS) 2h Closes downgrade/clickjacking/MIME-sniffing exposure and a baseline security-sig
- ☐ L1PHP and WordPress version disclosed (X-Powered-By + generator 'WordPress 7.0') 1h Reduces version-disclosure / fingerprinting attack surface.
- ☐ L3Privacy policy page is set to noindex,nofollow 1h Restores discoverability/transparency of the legal notice and its AI-crawler cit
- ☐ L5llms.txt valid but lacks an explicit key-URL section with descriptions 2h Improves AI answer routing to product/category/location/quote pages.
- ☐ L2LCP 2.77s — marginally above the 2.5s 'good' threshold 2h Pulling LCP under 2.5s earns the 'good' CWV bucket (mostly via the TTFB fix).
Executive Summary
63/100Overall Score: 63/100 (Fair)
Website audit found 23 issues across 15 weighted categories. Technical fundamentals score 71/100 (Fair), while AI search readiness scores 62/100 (Fair).
Issue Distribution
Priority breakdown by severity — 23 findings total
The 3 Biggest Problems
- Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present —
Homepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-l... - Google Business Profile not confirmed via API — verify it exists and is claimed —
DataForSEO business_listings_search (title 'thietbinenkhi.vn Airtec', category 'Air compressor supplier') returned items... - Highest-volume head terms rank page 1 but outside top 3 — top-3 push is the biggest traffic lever —
DataForSEO: 'lọc tách dầu máy nén khí' pos 6, sv 3600, /loc-tach-dau-may-nen-khi/; 'máy nén khí trục vít' pos 7, sv 2400...
Audit Details:
- URL: https://thietbinenkhi.vn/
- Business Type: Local (confidence: high)
- Market: Vietnam · Vietnamese
- Pages Analyzed: 8
- Sampled Deep: 8 business-type-prioritized pages
Score Breakdown
Overall Composite
| Category | Score | Weight | Weighted | Rating |
|---|---|---|---|---|
| Technical | 68/100 | 16% | 10.9 | Fair |
| Schema | 62/100 | 12% | 7.2 | Fair |
| Sitemap | 80/100 | 5% | 4.3 | Good |
| Performance | 70/100 | 12% | 8.1 | Fair |
| Geo | 64/100 | 22% | 14.3 | Fair |
| Platform | 64/100 | 5% | 3.4 | Fair |
| Brand | 50/100 | 12% | 5.8 | Poor |
| Image | 66/100 | 5% | 3.5 | Fair |
| Local | 55/100 | 11% | 5.9 | Poor |
| Accessibility* | 74/100 | — | — | Fair |
| Compliance* | 38/100 | — | — | Critical |
| Audit* | 78/100 | — | — | Good |
| Google-Api* | 62/100 | — | — | Fair |
| Page-Deep-Dive* | 78/100 | — | — | Good |
| Visual* | 74/100 | — | — | Fair |
| OVERALL | 100% | 63.5 → 63/100 | Fair |
* Informational categories with 0% weight in overall formula — surfaced from agent findings for context but not double-counted toward overall score.
Three Composite Scores
| Composite | Score | Rating | Formula |
|---|---|---|---|
| Technical + Core Web Vitals | 71/100 | Fair | Technical*0.45 + Performance*0.35 + Sitemap*0.20... |
| GEO + AEO Readiness | 62/100 | Fair | Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12... |
| Overall Search-Readiness | 63/100 | Fair | Technical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Plat... |
Score Interpretation
- 90-100: Excellent
- 75-89: Good
- 60-74: Fair
- 40-59: Poor
- 0-39: Critical
How this audit was conducted
Audit timeline
Audit ran in 30m 1s across 11 phases. 15 category scores computed.
Total: 30m 1s
Specialist tools used (click to inspect)
Specialist agents ran in parallel during Phase 4. Each examined a different dimension of your site. Click any agent to see its sub-scores, cost, and output file.
geo-accessibility 74/100 —
WCAG 2.2 AA static audit of https://thietbinenkhi.vn homepage (curl + grep, 297KB HTML). 7 of 10 criteria strong. Strengths: valid lang=vi, single H1, working skip-to-content link (#main target exists), both search inputs labeled, correct role=img+aria-label on star ratings, no nested <html>/duplicate IDs/button-in-button, valid DOM.
Weaknesses: broken heading order (H1 is the LAST heading in DOM…
geo-brand-mentions 50/100 —
Off-site brand presence for 'Thiết Bị Nén Khí Airtec' exists but is thin and concentrated on owned/social channels rather than independent authority sources. Firecrawl search surfaces an active Facebook page (Airtec, Ho Chi Minh City) with product posts, several YouTube product/test videos, an about.me profile (address 326 Quốc Lộ 1A, P.
Tam Bình), and an Amazon.fr listing — but no third-party rev…
geo-compliance 38/100 —
thietbinenkhi.vn (WordPress/LiteSpeed, lang=vi, .vn ccTLD) has NO cookie-consent banner / CMP yet fires Google gtag.js (GA4 G-E825PM2WJS) directly in homepage HTML pre-consent — a PDPD consent-before-tracking gap. Privacy policy exists at /chinh-sach-bao-mat (200, real page 'Chính Sách Bảo Mật [2026]') but is set noindex,nofollow and is thin: 0/9 GDPR/CCPA keywords and 0 explicit PDPD statutory cl…
geo-crawlers 92/100 —
robots.txt (HTTP 200) contains a single permissive group: 'User-agent: *' with 'Disallow: /wp-admin/', 'Allow: /wp-admin/admin-ajax.php', 'Allow: /', plus a Sitemap line. There are NO AI-bot-specific User-agent groups and NO blanket AI blocks. All 11 audited crawlers (GPTBot, ClaudeBot, Claude-Web, PerplexityBot, Google-Extended, CCBot, Bytespider, Amazonbot, Applebot-Extended, Bingbot, Googlebot)…
geo-llmstxt 88/100 —
A valid /llms.txt is published and served correctly (HTTP 200, Content-Type text/plain) with real brand content — 'Airtec Compression Equipment Co., Ltd', official website, industry. This is a genuine AI-guidance file, not a soft-404 homepage echo. Minor: could enrich with explicit canonical key-page links (menu of products, locations, contact) and short descriptions to maximize AI-crawler routing…
geo-platform-optimizer 64/100 —
AI-search readiness assessed heuristically (live AI-citation/LLM-mention lookups UNMEASURED — DataForSEO AI Optimization subscription inactive). Strong foundations: server-rendered HTML content, a VALID /llms.txt (text/plain, real brand content), all AI crawlers allowed in robots.txt (geo-crawlers 92/100), and Lighthouse SEO 1.0.
Weak spots: thin/owned-only entity graph (geo-brand-mentions 50), sc…
geo-schema 62/100 —
Yoast-generated @graph is present and JSON-LD (server-rendered) on all pages audited. Homepage carries a complete WebSite+SearchAction, WebPage, Article, Person, and a combined LocalBusiness/Organization node; FAQPage is also present. Product pages add a strong WooCommerce Product graph (Offer, Review, aggregateRating, Brand, BreadcrumbList, MerchantReturnPolicy, OfferShippingDetails).
Core gaps:…
geo-technical 68/100 —
thietbinenkhi.vn (WordPress 7.0 + WooCommerce + Flatsome theme + Rank Math, LiteSpeed/PHP 8.2.31) is technically sound for crawlability, indexation, and AI visibility: content is fully server-side rendered (rich Vietnamese body text, H1/H2/16xH3, 208 internal links, 3 JSON-LD blocks all present in raw curl HTML), robots.txt is valid with a Rank Math sitemap index, canonicals self-reference, HTTP/H…
seo-audit 78/100 —
thietbinenkhi.vn is a well-maintained WordPress + WooCommerce site (LiteSpeed, PHP 8.2, Rank Math SEO) for a Vietnamese industrial air-compressor distributor. Technical foundations are solid: HTTPS enforced, www 301s to canonical (non-www), valid Rank Math sitemap_index with 7 child sitemaps (181 products, 241 posts), correct lang=vi, indexable robots meta, self-referential canonical, 58-char titl…
seo-backlinks 0/100 —
Backlink profile could not be measured this run — the DataForSEO Backlinks subscription is inactive (API error 40204) and no Moz API key is configured. Reported N/A, not zero. Indirect signal from brand-mentions (geo-brand-mentions): off-site footprint is thin and owned-channel-heavy, so referring-domain authority is likely low and a local link-building program is probably needed — but this is inf…
seo-google 62/100 —
thietbinenkhi.vn (Airtec) shows healthy organic visibility for a niche industrial air-compressor B2B site. The returned sample covers 26 ranked keywords, almost entirely transactional intent in the compressor/parts space. 19 of 26 keywords already sit on page 1 (positions 1-10): 5 in the top 3 and 14 in positions 4-10, plus 2 in 11-20.
Five keywords trail beyond position 20. The biggest upside is…
seo-images 66/100 —
Homepage HTML is light (51 KB) and ships only WebP — no AVIF and no responsive <picture>/<source> sources detected. og:image is a real banner photo (banner.webp), not a bare logo (good for social/AI preview CTR). Only 1 <img> in raw source (rest are lazy-loaded/CSS-background via the page builder), so full alt-coverage and weight cannot be judged from source alone — DataForSEO image-SERP + a rende…
seo-local 55/100 —
Local signals are present but under-built. The site ships a dedicated local-sitemap (1 URL) and brand profiles carry a physical address (326 Quốc Lộ 1A, P. Tam Bình, Ho Chi Minh City — from about.me + Facebook 'Ho Chi Minh City'). However, a verified Google Business Profile was NOT returned by the DataForSEO Business Listings search (empty result for the brand/category), so GBP completeness, revie…
seo-maps 0/100 —
Geo-grid Maps rank tracking and map-pack position could not be measured this run — the DataForSEO Business Listings search returned no entity for the brand, so there is no place_id to geo-grid against, and no paid Maps geo-grid run was performed. Reported N/A, not zero. Local opportunity is real (see seo-local) but Maps standing is unverified.
seo-page 78/100 —
On-page audit of 7 sampled URLs (homepage, product category, single product, shop, blog post, about/CEO, contact). Foundations are strong: every page has a unique self-referential canonical, exactly one indexable robots directive, Rank Math-generated JSON-LD schema appropriate to page type (Product+Offer+AggregateRating on product, CollectionPage+Breadcrumb on category, NewsArticle on blog, Contac…
seo-performance 70/100 —
Measured via DataForSEO Lighthouse v13.3 (desktop lab, JS enabled). Layout stability is excellent (CLS 0.003) and the page is light (~1.0 MB), but two server/render signals drag the score: TTFB (server-response-time) is 1,042 ms — well above the 600 ms target — and Speed Index is 10.5 s, pointing to render-blocking CSS/JS from the WordPress builder stack.
LCP 2,765 ms sits just over the 2.5 s 'goo…
seo-sitemap 80/100 —
Sitemap architecture is healthy and well-segmented: /sitemap.xml 301-redirects to /sitemap_index.xml (declared in robots.txt) which lists 7 typed child sitemaps — post (241), product (181), product_cat (34), page (9), brand/pa_thuong-hieu (5), category (4), local (1). WooCommerce + WordPress blog structure with a dedicated local-sitemap.
Total ~475 indexable URLs. Orphan/redirect-in-sitemap detect…
seo-visual 74/100 —
Source-based proxy audit of the thietbinenkhi.vn homepage (WordPress + Flatsome theme + WooCommerce, lazy-load perf plugin active). No live browser was available, so no measured Core Web Vitals (LCP/CLS/INP) were captured; all render/CWV findings are INFERRED from HTML source signals.
Above-the-fold render hygiene is largely sound: a viewport meta is present, the LCP candidate hero image (hitachim…
High Priority — Fix within 1 week
7 issuesThese issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Your site tracks visitors with Google Analytics before asking permission, and has no cookie banner
HighGoogle Analytics starts running the moment a page loads, before the visitor agrees to anything, and there is no cookie-consent popup on the site. Vietnam's personal-data law (Nghị định 13/2023) requires consent before tracking, and the same rule applies to any EU visitors. This is the single biggest legal-exposure gap on the site and is straightforward to close with a consent plugin.
Recommended fix
Install a CMP (Complianz or CookieYes for WordPress) and gate gtag.js behind consent via GTM Consent Mode v2 (default analytics_storage=denied until accepted). Re-verify gtag does not fire before opt-in.
Technical details for your developer
Homepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-library grep (cookieyes|onetrust|cookiebot|cookielaw.org|termly|iubenda|klaro|tarteaucitron|cookie-script|complianz|cookienotice) = 0 matches; consent heuristic (cookie consent|accept cookie|gdpr) = 0 matches.The privacy policy is thin and does not cite Vietnam's data-protection law or list visitor rights
HighYour privacy policy exists but reads informally and omits the statutory terms Vietnam's PDPD requires — it does not cite Nghị định 13/2023, does not define personal/sensitive data, and does not list the eight data-subject rights or how consent is obtained. This weakens both legal standing and the trust signal that Google and AI engines read. A rewrite (with legal review) fixes it.
Recommended fix
Rewrite the policy to cite Nghị định 13/2023/NĐ-CP, define dữ liệu cá nhân + dữ liệu nhạy cảm, document consent (đồng ý), the 8 data-subject rights, retention period, and third-party sharing (incl. Google Analytics). Add GDPR/CCPA boilerplate if serving EU/CA. Legal review before publishing.
Technical details for your developer
curl https://thietbinenkhi.vn/chinh-sach-bao-mat = HTTP 200 (title 'Chính Sách Bảo Mật [2026]'). Keyword grep: gdpr=0, ccpa=0, 'data subject'=0, 'right to delete'=0, 'right to access'=0, opt-out=0; VN clauses: 'Nghị định 13'=0, 'bảo vệ dữ liệu'=0, 'chủ thể dữ liệu'=0, 'đồng ý'=0, 'dữ liệu cá nhân nhạy cảm'=0. Only present: cookie (1), third-party (1), 'dữ liệu cá nhân' (1), retention (1).No Google Business Profile could be found — claiming one is the biggest local-search win available
HighA search for your business in Google's business-listings data returned nothing, meaning your Google Business Profile is likely unclaimed, named differently, or missing. For a local equipment supplier, a complete, claimed profile is the single most powerful lever for showing up in Google Maps and the local pack. Confirm or claim it, fill in category, address, phone, hours, and photos, and make the details match the website.
Recommended fix
Confirm/claim a Google Business Profile (correct category 'Air compressor supplier', verified address, phone +84944000884, hours, photos); ensure NAP matches the website and Facebook.
Technical details for your developer
DataForSEO business_listings_search (title 'thietbinenkhi.vn Airtec', category 'Air compressor supplier') returned items: []. Facebook page lists 'Ho Chi Minh City' but no GBP entity surfaced.Product pages show a 4.9-star / 369-review rating on a fake placeholder price with no real reviewer
HighProduct pages emit a 4.9-star rating from 369 reviews, but those reviews have no named reviewers (author is generic 'ecommerce') and sit on a placeholder price of 1,000,000 VND for a 37kW industrial compressor. Google's review-snippet policy penalizes self-serving on-product ratings with no verifiable source, risking a manual action that strips all rich results — and it erodes trust with AI engines. Only show ratings backed by real, attributable reviews.
Recommended fix
Only emit aggregateRating backed by real, verifiable customer reviews with named authors and datePublished; remove it where reviews are absent. Set a real price (not 1000000) or use 'Contact for price' with a valid PriceSpecification. Replace the generic 'ecommerce' author.
Technical details for your developer
https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — '"ratingValue":"4.9"' + '"ratingCount":"369"' co-occur with Offer '"price":"1000000"','"priceCurrency":"VND"' (placeholder for a 37kW unit) and Review author @id '/author/ecommerce/' name 'ecommerce'.A capitalization typo makes the product star-rating markup invalid
HighThe product rating is tagged with the wrong capitalization ('aggregateRating' instead of 'AggregateRating'). Schema types are case-sensitive, so validators and AI parsers may silently discard the rating, costing review-snippet eligibility. It is a one-character template fix. Note: fix this only on products that actually have legitimate reviews (see C4).
Recommended fix
Change @type to 'AggregateRating' (capital A, R) at the WooCommerce/theme template emitting the Product JSON-LD.
Technical details for your developer
https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — grep '"@type":"aggregateRating"' MATCHES; '"@type":"AggregateRating"' = ABSENT. Node: {"ratingValue":"4.9","ratingCount":"369","@type":"aggregateRating"}.Your local-business markup is missing map coordinates and a map link, the strongest local AI signals
HighThe LocalBusiness structured data lacks latitude/longitude coordinates and a Google Maps link — the primary signals AI search and Maps use to pin and disambiguate a local business. One agent also found the homepage emitting no LocalBusiness node at all while the shop archive does, so the wiring is inconsistent. The address and phone already exist, so this is mostly configuration. Note: resolve the address conflict first (see L4).
Recommended fix
Add geo {@type:GeoCoordinates, latitude, longitude} and hasMap (Google Maps URL) to the LocalBusiness node, and ensure the LocalBusiness/Organization node is emitted on the homepage (enable Rank Math/Yoast Local SEO with coordinates configured). Reconcile against the resolved canonical address.
Technical details for your developer
geo-schema: LocalBusiness node keys = [@type,@id,name,url,sameAs,email,address,logo,priceRange,openingHours,location,image,telephone]; grep 'GeoCoordinates'=0, 'hasMap'=0, node.geo=ABSENT. seo-audit: homepage grep for LocalBusiness/Organization @type = 0 matches while /san-pham/ emits LocalBusiness (1 match) — homepage wiring conflict flagged.Your best keywords sit at positions 5-7 — pushing them into the top 3 multiplies traffic
HighSeveral high-demand search terms already rank on page one but below the top three, where most clicks happen. 'Lọc tách dầu máy nén khí' (3,600 monthly searches) sits at position 6 and 'máy nén khí trục vít' (2,400) at position 7. Reinforcing these specific pages — depth, internal links, specs, comparison tables — to lift them into the top three is the highest-return SEO move available.
Recommended fix
Prioritise on-page depth + internal-link reinforcement for the oil-separator and screw-compressor category/landing pages: comparison tables, specs, FAQ schema, and internal links from related parts pages, to lift these into top 3.
Technical details for your developer
DataForSEO: 'lọc tách dầu máy nén khí' pos 6, sv 3600, /loc-tach-dau-may-nen-khi/; 'máy nén khí trục vít' pos 7, sv 2400, /may-nen-khi-truc-vit/; 'dầu máy nén khí' pos 5, sv 720. 19 of 26 sampled keywords on page 1, only 5 in top 3.Medium Priority — Fix within 1 month
10 issuesThese improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
The site is missing standard security headers like HSTS and clickjacking protection
MediumNone of the standard HTTP security headers (HSTS, content-security-policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) are sent on any page. They are not a direct ranking factor, but they are a baseline expectation for a commercial WooCommerce store and are flagged by every security scanner and trust review. They can be added in one server-config change.
Recommended fix
Add via LiteSpeed/.htaccess or a WP headers plugin: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload; X-Content-Type-Options: nosniff; X-Frame-Options: SAMEORIGIN; Referrer-Policy: strict-origin-when-cross-origin; Permissions-Policy (restrict camera/mic/geolocation); and a Content-Security-Policy (start Report-Only, then enforce).
Technical details for your developer
curl -sI homepage and inner page /may-nen-khi-10kg-dung-cho-nhu-cau-nao/ -> grep -ciE 'strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy' = 0 on both. Valid Let's Encrypt cert; HTTPS serves 200. (Merged: geo-technical GT1, seo-audit AU3, geo-compliance CP4.)Broken or mistyped URLs silently redirect to the homepage instead of showing a 'not found' page
MediumWhen someone (or a crawler) hits a URL that does not exist, the site sends them to the homepage with a success status instead of returning a proper 'not found' response. On a 400+ URL store this wastes crawl budget, can cause Google to merge phantom URLs into the homepage, and hides genuinely broken links. Turning off the catch-all redirect restores correct 404 behaviour.
Recommended fix
Disable the catch-all redirect-to-home (often a Rank Math/redirect-plugin or theme 'redirect 404 to homepage' setting) so unknown paths serve the WordPress 404 template with a real 404 status.
Technical details for your developer
curl https://thietbinenkhi.vn/this-page-does-not-exist-xyz123 -> 'HTTP 301 -> https://thietbinenkhi.vn/'; chain ends at homepage HTTP 200 with homepage <title>. A missing URL should return 404/410.Your server takes about a second to start responding, which delays the whole page
MediumThe server takes roughly 1.04 seconds to send the first byte of the page, well above the 600ms target, and the delay is in the application/origin (PHP/database), not the network. This directly pushes back when the main content appears. Enabling full-page caching and a CDN would shave several hundred milliseconds and likely pull the page into Google's 'good' speed bucket.
Recommended fix
Enable full-page caching (LiteSpeed Cache / WP Rocket), object cache, and a CDN; review slow plugins/hosting tier.
Technical details for your developer
DataForSEO Lighthouse v13.3 desktop lab: server-response-time numericValue=1042ms (target <600ms); network-server-latency=167ms (delay is app/origin, not network).The page takes about 10 seconds to look visually complete due to heavy CSS/JS
MediumAlthough the page is light (~1MB), it takes about 10.5 seconds to appear visually complete because of render-blocking stylesheets and scripts from the WordPress page-builder stack. Removing unused CSS, deferring non-critical JavaScript, and inlining critical CSS would noticeably speed up perceived load, especially on mobile.
Recommended fix
Remove unused CSS, defer non-critical JS, inline critical CSS (LiteSpeed Cache / WP Rocket); disable unused builder modules.
Technical details for your developer
DataForSEO Lighthouse v13.3 desktop lab: speed-index numericValue=10542ms despite ~1MB page; WordPress stackpack flags render-blocking-resources + unused-css/js; mainthread-work-breakdown=1548ms.AI engines and Google have little independent proof your brand exists beyond your own pages
MediumYour off-site presence is almost entirely your own channels (Facebook, YouTube, about.me) with no independent reviews, news, directory, or Wikidata citations, and the website's structured data links to only a single Facebook profile. AI engines and Google triangulate trust from independent mentions and connected profiles, so this thin, self-referential footprint lowers your odds of being cited or ranked for non-branded queries. Building directory citations and wiring all profiles into the site's schema fixes both halves. (Merged: geo-brand-mentions BM1+BM2, geo-schema SC4, geo-platform-optimizer PL1.)
Recommended fix
Expand Organization sameAs to all owned profiles (Google Business Profile/Maps, YouTube, Zalo OA, LinkedIn, about.me, Shopee/Lazada if any) and create a Wikidata item; build citations on VN B2B directories + industry portals; earn supplier/review mentions. Use an external sameAs (LinkedIn) for the CEO Person.
Technical details for your developer
geo-brand-mentions: Firecrawl 'thietbinenkhi.vn Airtec review' top results = own Facebook, own YouTube, about.me, amazon.fr; no independent review/news/Wikipedia/directory in top 8. geo-schema: LocalBusiness '"sameAs":["https://www.facebook.com/thietbinenkhi.vn"]' (1 link only).Your markup labels the company as a 'person', confusing how Google and AI understand authorship
MediumThe homepage structured data declares a Person whose name is actually the company ('Airtec Compression., Ltd'), and that person is set as the article author. Treating a company as a person muddies the author/E-E-A-T signals that Google and AI rely on. Set the author to the real CEO with proper details, or reference the Organization as publisher and drop the malformed Person.
Recommended fix
Set the Person to the real author (CEO Đào Trung Kiên) with proper name/jobTitle/sameAs, or reference the Organization @id as publisher and drop the malformed Person. Align Article author accordingly.
Technical details for your developer
https://thietbinenkhi.vn — {"@type":"Person","name":"Airtec Compression., Ltd","sameAs":["/ve-ceo-dao-trung-kien/"],"worksFor":{"@id":"#organization"}}. A Ltd company typed as Person.The page's main heading comes last in the code, so screen readers and AI read the structure out of order
MediumIn the homepage's underlying code the main H1 heading appears after two dozen lower-level headings, so the document outline starts at H3 with no parent heading. Screen-reader users navigating by heading get a malformed outline, and AI engines misread the page's topic hierarchy. Reordering the template so the H1 renders first fixes it.
Recommended fix
Restructure the template so the H1 (page/product title) renders first in source order before any H2/H3, then nest H2 -> H3 -> H4 with no skipped levels. Demote/reorder the early h3 widget/sidebar titles so they do not precede the H1.
Technical details for your developer
https://thietbinenkhi.vn homepage. grep -bo byte offsets: first <h3 at 123748, first <h2 at 139552, <h1 at 245369. Heading sequence = h3,h3,h3,h2,h3...,h1 (H1 is the 25th heading). Single H1 but rendered last. WCAG 1.3.1 / 2.4.6.The contact page has no main heading, and product-listing pages skip a heading level
MediumThe contact page (/lien-he/) has no H1 at all, weakening relevance on a primary conversion page, and the product-category and shop archive pages jump from H1 straight to H3 with no H2 in between. Both reduce how clearly crawlers and assistive tech understand these high-value commercial pages. Each is a small template fix. (Merged: seo-page PG1 + PG2.)
Recommended fix
Add a single descriptive H1 to /lien-he/ (e.g. 'Liên hệ Thiết Bị Nén Khí Airtec'). In the WooCommerce category/shop template, promote the section subheadings (currently H3) to H2 or insert an H2 product-listing heading so the cascade is H1->H2->H3.
Technical details for your developer
https://thietbinenkhi.vn/lien-he/ — grep '<h1' = 0. https://thietbinenkhi.vn/dau-may-nen-khi/ — H1=1,H2=0,H3=3; https://thietbinenkhi.vn/san-pham/ — H1=1,H2=0,H3=3 (H1->H3 jump).Most images are still heavier JPEG/PNG, with no next-gen AVIF format
MediumOnly about 17% of homepage images use the lighter WebP format and none use AVIF; the rest are heavier JPEG/PNG. On an image-heavy WooCommerce store this adds transfer weight and slows mobile load in a mobile-first market. Enabling automatic WebP/AVIF generation plus responsive image sources cuts bytes and helps page speed. (Merged: geo-technical GT4 + seo-images IM1.)
Recommended fix
Enable LiteSpeed Cache image optimization (WebP/AVIF generation + delivery) or an image-CDN/plugin (Imagify/ShortPixel) plus responsive srcset/<picture>; keep above-the-fold hero/product images eager and below-fold lazy.
Technical details for your developer
geo-technical: homepage HTML grep src=*.webp=12, *.avif=0, *.jpg/jpeg=32, *.png=27 -> modern share 12/71 ~17%. seo-images: 0 .avif, 0 <picture>, 0 <source type=image/...>.Some valuable keywords are stuck on page 2+, partly because similar pages compete with each other
MediumFive keywords with real demand sit beyond position 20 ('bình nén khí' sv 480 at pos 44 is the standout), and only 5 of 26 sampled keywords reach the top 3. Part of the cause is near-duplicate pages competing for the same query (e.g. multiple air-tank pages, screw-compressor variants). Consolidating intent to one canonical page per cluster and strengthening it can lift several terms. (Merged: seo-google SG2 + SG3 + SG4.)
Recommended fix
Audit the page-2 URLs for keyword-to-page intent mismatch and thin content; map each screw-compressor and air-tank query cluster to one canonical page, internally link variants up to the canonical, and separate informational ('khí nén') from transactional intent.
Technical details for your developer
DataForSEO: 'bình nén khí' pos 44 sv 480 /binh-chua-khi-nen/; 'máy sấy khí nén' pos 21 sv 260; 'ống dẫn khí' pos 37 sv 260. Only 5 of 26 keywords in pos 1-3 vs 14 in 4-10. Cannibalisation: /may-nen-khi-truc-vit/ ranks for both 'máy nén khí trục vít' and 'máy nén trục vít'; multiple binh-chua-khi-nen variants rank for tank queries.Low Priority — Backlog
6 issuesNice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
The site reveals its PHP and WordPress versions, and the WordPress version string looks wrong
LowThe server advertises its PHP version (8.2.31) in a header and the page reveals 'WordPress 7.0' in a generator tag — version disclosure that helps attackers target known vulnerabilities. The '7.0' string is also anomalous (no such stable release as of mid-2026), suggesting a spoofed or placeholder value. No ranking impact; a minor hardening cleanup. (Merged: geo-technical GT2 + seo-audit AU6.)
Recommended fix
Suppress X-Powered-By (expose_php = Off, or header unset in LiteSpeed config) and remove the WordPress generator meta (remove_action('wp_head','wp_generator')).
Technical details for your developer
curl -sI homepage -> 'X-Powered-By: PHP/8.2.31'. HTML: <meta name="generator" content="WordPress 7.0"/>.The main content appears at 2.77 seconds, just over Google's 'good' speed cutoff
LowThe largest visible element renders at 2.77 seconds in the lab test, only just above Google's 2.5-second 'good' threshold. Layout stability and interactivity are already excellent. Fixing the server response time (H3) plus preloading the hero image should pull this into the 'good' bucket.
Recommended fix
Fix TTFB (H3) and add a <link rel=preload as=image> with fetchpriority=high for the hero/banner.webp.
Technical details for your developer
DataForSEO Lighthouse v13.3 desktop lab: largest-contentful-paint numericValue=2765ms. CLS 0.003 and TBT 1ms already excellent.Your privacy policy is hidden from search engines
LowThe privacy policy loads fine but is tagged noindex,nofollow, so search engines and AI crawlers cannot index it. A legal notice should be discoverable as a transparency and trust signal. Switch it to index,follow and keep it linked in the footer.
Recommended fix
Change the robots meta on the privacy page to 'index, follow' (or at minimum 'index'); keep it linked in the site footer.
Technical details for your developer
grep on /chinh-sach-bao-mat: <meta name="robots" content="nofollow, noindex"/>.Your address differs between the website and your social profiles, and you have only one location page
LowThe website's structured data lists the address as '1014 Phạm Văn Đồng' while your about.me and Facebook profiles list '326 Quốc Lộ 1A, P. Tam Bình' — an inconsistency that confuses Google's local matching. The local sitemap also contains only one URL, so per-branch location pages are minimal. Decide the canonical address, make it identical everywhere, and add a dedicated page per physical location. (Merged: seo-local LO2 + seo-sitemap SM2 + cross-agent NAP conflict.)
Recommended fix
Determine the correct canonical address and make NAP identical across website schema, footer, GBP, Facebook, and about.me. Create a location/contact page per branch with embedded map, NAP, hours, and LocalBusiness JSON-LD; add each to local-sitemap.
Technical details for your developer
seo-audit homepage Place schema streetAddress '1014 Phạm Văn Đồng'; seo-local/geo-brand-mentions off-site profiles '326 Quốc Lộ 1A, P. Tam Bình'. seo-sitemap/seo-local: local-sitemap.xml lists only 1 <loc>.Your AI-guidance file works but could route AI engines to your key pages more precisely
LowYour llms.txt file is valid and already an advantage over most competitors, but it is just a brand-description block with no curated list of your top product, location, and contact pages. Adding a short menu of canonical links with one-line descriptions helps ChatGPT and Perplexity route to the right page when answering buyer questions. (Merged: geo-llmstxt LL2 + LL1 positive.)
Recommended fix
Append sections to llms.txt: ## Products, ## Locations, ## Contact/Quote with canonical links + a 1-line description each. Keep the file maintained as the site grows.
Technical details for your developer
curl https://thietbinenkhi.vn/llms.txt -> HTTP 200 text/plain, body '# Airtec Compression Equipment Co., Ltd ...'; no markdown ## section with [Title](URL) link list observed.Minor structured-data cleanups: opening-hours format, duplicate breadcrumbs, missing product lists on category pages
LowThree small schema refinements: opening hours use the legacy string format rather than the recommended openingHoursSpecification; product pages emit two BreadcrumbList blocks (likely two plugins), which can confuse crawlers; and product-category pages do not list their products as an ItemList, which would help AI discover the product set for category queries. None are urgent, but all improve how cleanly machines parse the site. (Merged: geo-schema SC6 + SC7 + SC8.)
Recommended fix
Migrate openingHours to openingHoursSpecification (dayOfWeek + opens/closes) and add description/areaServed/currenciesAccepted; suppress one of the two breadcrumb sources so a single BreadcrumbList is emitted; emit an ItemList/OfferCatalog of products on each product_cat page.
Technical details for your developer
geo-schema: homepage '"openingHours":["Monday...' (string), openingHoursSpecification ABSENT; /may-nen-khi-kobelco-37kw/ grep -c 'BreadcrumbList' = 2; /dau-may-nen-khi/ has CollectionPage+BreadcrumbList but no Product/ItemList/OfferCatalog.Technical Deep Dive
68/100Rating: Fair · Primary source: /geo-technical (68/100)
thietbinenkhi.vn (WordPress 7.0 + WooCommerce + Flatsome theme + Rank Math, LiteSpeed/PHP 8.2.31) is technically sound for crawlability, indexation, and AI visibility: content is fully server-side rendered (rich Vietnamese body text, H1/H2/16xH3, 208 internal links, 3 JSON-LD blocks all present in raw curl HTML), robots.txt is valid with a Rank Math sitemap index, canonicals self-reference, HTTP/HTTPS and www/non-www both 301 to the canonical host in a single hop, and TTFB is fast (0.39-0.64s) with Brotli compression.
The dominant weakness is a complete absence of HTTP security headers (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy all return 0 on both homepage and a sampled inner page), plus PHP version disclosure via X-Powered-By, HTTP/1.1-only negotiation in tests, and low modern-image-format adoption (~17% WebP/AVIF).
No fatal crawl/index blockers found.
Cross-checked by: seo-audit: 78/100seo-page: 78/100
Findings from /geo-technical (7)
P2 All six recommended HTTP security headers absent site-wide
Evidence: curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy' returned 0. Same grep on inner page https://thietbinenkhi.vn/may-nen-khi-10kg-dung-cho-nhu-cau-nao/ also r
Impact: No HSTS (downgrade/SSL-strip exposure), no clickjacking protection (X-Frame-Options/CSP frame-ancestors), no MIME-sniffing protection (X-Content-Type-Options: nosniff), no referrer or permissions policy. Trust/security-signal weakness; not a direct ranking blocker but flagged by
P3 PHP version disclosed in X-Powered-By header
Evidence: curl -sI https://thietbinenkhi.vn/ -> 'X-Powered-By: PHP/8.2.31'. Also 'Server: LiteSpeed'. WordPress version exposed in HTML: <meta name="generator" content="WordPress 7.0">.
Impact: Version disclosure aids targeted exploitation of known CVEs. Low direct SEO impact; minor hardening item.
P3 HTTP/2 not negotiated in tests (HTTP/1.1 only); HTTP/3 advertised but unverified
Evidence: Every curl response returned 'HTTP/1.1' (status line on homepage, robots, inner page; curl -w http_version=1.1). The installed libcurl in this environment does not support --http2, so h2 support could not be force-tested. Server advertises HTTP/3 via 'alt-svc: h3=":443"; ma=25920
Impact: If the origin only serves HTTP/1.1 to crawlers, it loses multiplexing/header-compression benefits for the 9 stylesheets + 13 scripts on the homepage, modestly affecting load performance. Inconclusive evidence — flagged for confirmation, not asserted as a defect.
P3 Low adoption of modern image formats (WebP/AVIF ~17%)
Evidence: Homepage HTML (297KB): grep counts src=*.webp=12, *.avif=0, *.jpg/jpeg=32, *.png=27 -> modern share = 12/71 = ~17%. 31 of 72 <img> tags use loading="lazy".
Impact: JPEG/PNG payloads are heavier than WebP/AVIF, increasing transfer weight and LCP risk on image-heavy WooCommerce product/category listings, especially on mobile (Vietnam mobile-first market). CWV/page-speed signal.
P3 No Cache-Control/ETag/Last-Modified on HTML; static-asset TTL only 7 days
Evidence: curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'cache-control' returned 0 (no Cache-Control, ETag, or Last-Modified emitted on the HTML document). Sampled static CSS https://thietbinenkhi.vn/wp-content/plugins/woocommerce/assets/client/blocks/wc-blocks.css returned 'Cache-Contro
Impact: Absent HTML validators reduce conditional-request efficiency; 7-day static TTL is shorter than the 1-year best practice for versioned/hashed assets, causing more revalidation traffic. Minor performance item.
P3 Render-blocking resources in head (9 stylesheets, 9 of 13 scripts not async/defer)
Evidence: Homepage HTML: 9 <link rel=stylesheet> elements; 13 <script src> elements of which only 4 carry defer/async (9 synchronous). Brotli compression active (Content-Encoding: br).
Impact: Render-blocking CSS/JS delays first paint and LCP. Field CWV not measurable here (no CrUX access in this agent), so this is a lab-signal estimate, not a confirmed CWV failure.
P3 IndexNow not implemented (no key file)
Evidence: GET https://thietbinenkhi.vn/.well-known/indexnow-key.txt returned HTTP 301 (redirect, not a 200 key file). No IndexNow key surfaced.
Impact: Slower Bing indexing; Bing's index feeds ChatGPT and Copilot, so faster Bing updates aid AI-search visibility. Minor GEO opportunity.
Findings from /seo-audit (6)
P1 Homepage missing LocalBusiness/Organization schema (present on shop archive only)
Evidence: https://thietbinenkhi.vn/ — grep of homepage ld+json @type returned Person/Place/Article/FAQPage/WebSite/WebPage/ImageObject but NO LocalBusiness or Organization (grep '"@type":"(LocalBusiness|Organization|Store)"' = 0 matches). Contrast: https://thietbinenkhi.vn/san-pham/ DOES e
Impact: For a local distributor, LocalBusiness schema on the homepage is the primary entity-trust signal for Google local/Maps and AI answer engines. The data (NAP) already exists; only the schema wiring is missing on the most important page.
P1 Soft-404: non-existent URLs 301-redirect to homepage instead of returning 404
Evidence: curl https://thietbinenkhi.vn/this-page-does-not-exist-xyz123 returned 'HTTP 301 -> https://thietbinenkhi.vn/' and following the chain ends at the homepage with HTTP 200 and the homepage <title>. A missing URL should return 404/410.
Impact: Soft-404s waste crawl budget, can cause Google to index/merge phantom URLs into the homepage, and mask genuinely broken internal/external links. Hurts indexation hygiene on a 400+ URL store.
P2 No HTTP security/transport headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP)
Evidence: curl -I https://thietbinenkhi.vn returned headers Server: LiteSpeed, X-Powered-By: PHP/8.2.31, but grep for 'strict-transport|x-frame|content-security|x-content-type' returned NO matches.
Impact: Missing HSTS leaves a downgrade window despite HTTPS; missing X-Content-Type-Options/X-Frame-Options are minor security/quality signals. Low direct ranking impact but flagged in technical/security audits and trust reviews.
P2 Homepage has no BreadcrumbList schema
Evidence: https://thietbinenkhi.vn/ — grep 'BreadcrumbList' = 0 matches on homepage, while https://thietbinenkhi.vn/san-pham/ has 2 BreadcrumbList matches. Homepage @graph present but no breadcrumb node.
Impact: Breadcrumb structured data drives breadcrumb rich results in SERPs and helps Google/AI understand site hierarchy. Inner pages have it; homepage omission is minor (home is root) but worth consistency.
P3 Two homepage images have empty alt text (alt="")
Evidence: https://thietbinenkhi.vn/ — grep '<img ...alt=""...>' = 2 matches out of 72 total <img> tags; all 72 carry an alt attribute (0 missing the attribute entirely).
Impact: Minor. Empty alt is correct for purely decorative images but if these two are content/brand images they lose image-search and accessibility value.
P3 Generator meta reports 'WordPress 7.0' (anomalous / version disclosure)
Evidence: https://thietbinenkhi.vn/ — grep returned '<meta name="generator" content="WordPress 7.0"/>'. WordPress 7.0 is not an expected stable release as of 2026-06-03 (6.x line), suggesting a spoofed/placeholder string or a very new build; either way the generator tag discloses CMS info.
Impact: No ranking impact. Minor information-disclosure / fingerprinting surface; the unusual version string may also confuse automated tooling.
Findings from /seo-page (6)
P2 Contact page has no H1
Evidence: https://thietbinenkhi.vn/lien-he/ — grep '<h1\b' returns 0; first rendered heading is an empty tag then the business name 'CÔNG TY TNHH THIẾT BỊ NÉN KHÍ AIRTEC' appears in a lower-level heading. H1 count = 0.
Impact: Missing H1 weakens topical relevance signal and accessibility on the primary conversion page. Localized lead-gen pages should declare a clear H1 (e.g. 'Liên hệ Thiết Bị Nén Khí Airtec').
P2 Category & shop archives skip heading levels (H1 then H3, no H2)
Evidence: https://thietbinenkhi.vn/dau-may-nen-khi/ — H1=1, H2=0, H3=3. https://thietbinenkhi.vn/san-pham/ — H1=1, H2=0, H3=3. Heading structure jumps H1->H3 with no intervening H2.
Impact: Broken heading hierarchy reduces semantic clarity for crawlers and assistive tech on the highest-traffic commercial templates (product archives).
P3 Product title tag exceeds SERP display width (91 chars)
Evidence: https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — <title> = 'Máy Nén Khí Kobelco 37kw (50hp) Nội địa Nhật Mới 95% [2026] » Thiết Bị Nén Khí Airtec', length 91 chars. Compare homepage 58, category 54, shop 56 (all within range).
Impact: Title will truncate around 60 chars / ~600px in Google SERPs, hiding the brand suffix and reducing the clickable signal. The duplicated brand suffix '» Thiết Bị Nén Khí Airtec' on the product template is the main overflow source.
P2 Decorative/logo/background images carry empty alt attributes
Evidence: https://thietbinenkhi.vn/ — 2 of 72 imgs have alt="" including logo-thiet-bi-nen-khi-airtec.webp and bg2.webp. Same 2-3 empty-alt pattern on /dau-may-nen-khi/ (2), /may-nen-khi-kobelco-37kw/ (3), /may-nen-khi-10kg-dung-cho-nhu-cau-nao/ (3), /ve-ceo-dao-trung-kien/ (2).
Impact: Low. Empty alt on decorative backgrounds is technically acceptable, but the logo image should carry descriptive alt (brand name) for image search and accessibility. Net image alt coverage is otherwise 100% (every <img> has an alt attribute on all 7 sampled pages).
P2 About/CEO page meta description is short (73 chars)
Evidence: https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/ — meta description = 'Giới thiệu về CEO Đào Trung Kiên của Công ty TNHH Thiết Bị Nén Khí Airtec', 73 chars vs ~120-160 used on other sampled pages (homepage 143, product 152, blog 162).
Impact: Under-uses available SERP snippet width; misses a chance to add E-E-A-T/authority context for an author/entity page that supports E-E-A-T signals.
P2 No hreflang annotations (single-language site)
Evidence: All 7 sampled URLs — grep 'hreflang' returns 0 matches on each (homepage, /dau-may-nen-khi/, /may-nen-khi-kobelco-37kw/, /san-pham/, /may-nen-khi-10kg-dung-cho-nhu-cau-nao/, /ve-ceo-dao-trung-kien/, /lien-he/).
Impact: Informational only. Site is Vietnamese single-locale; hreflang is not required. Flag for awareness if international/multi-locale expansion is ever planned.
Schema Deep Dive
62/100Rating: Fair · Primary source: /geo-schema (62/100)
Yoast-generated @graph is present and JSON-LD (server-rendered) on all pages audited. Homepage carries a complete WebSite+SearchAction, WebPage, Article, Person, and a combined LocalBusiness/Organization node; FAQPage is also present. Product pages add a strong WooCommerce Product graph (Offer, Review, aggregateRating, Brand, BreadcrumbList, MerchantReturnPolicy, OfferShippingDetails).
Core gaps: LocalBusiness is incomplete for a local entity (no geo/GeoCoordinates, no hasMap, no aggregateRating, no description/areaServed, opening hours as legacy string array not openingHoursSpecification), sameAs is a single Facebook link (weak entity graph, no Wikidata/Maps/YouTube/Zalo), and the homepage entity model is inconsistent (Person named 'Airtec Compression., Ltd' is a company name, not a person, and its only sameAs points to the CEO page).
Most damaging for trust: Product carries aggregateRating 4.9/369 alongside a placeholder Offer price of 1000000 VND and a generic 'ecommerce' review author, with the rating @type mis-cased as 'aggregateRating' (lowercase a) which is an invalid Schema.org type. No category-level Product/ItemList schema on product_cat pages.
Findings from /geo-schema (9)
P1 Product aggregateRating mis-typed as lowercase 'aggregateRating' (invalid Schema.org type)
Evidence: https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — grep '"@type":"aggregateRating"' MATCHES; '"@type":"AggregateRating"' = ABSENT. Node: {"ratingValue":"4.9","ratingCount":"369","@type":"aggregateRating"}
Impact: Schema.org types are case-sensitive; 'aggregateRating' is not a valid type, so validators/AI parsers may discard the rating. Loses review-snippet eligibility and AI trust signal.
P1 Self-serving aggregateRating (4.9/369) attached to placeholder-priced Offer with generic review author
Evidence: https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — '"ratingValue":"4.9"' + '"ratingCount":"369"' co-occur with Offer '"price":"1000000"','"priceCurrency":"VND"' (placeholder ~1M VND for a 37kW industrial compressor) and Review author @id 'https://thietbinenkhi.vn/author/ecommer
Impact: Google's 2024+ enforcement penalizes self-serving on-product reviews with no verifiable source; 369 reviews from a generic 'ecommerce' author on a placeholder price reads as fabricated and risks manual action / loss of all rich results, plus erodes AI citation trust.
P1 LocalBusiness missing geo/GeoCoordinates and hasMap (local entity incomplete)
Evidence: https://thietbinenkhi.vn (and /lien-he/) — LocalBusiness node keys = [@type,@id,name,url,sameAs,email,address,logo,priceRange,openingHours,location,image,telephone]. grep 'GeoCoordinates' = 0; grep 'hasMap' = 0; node.geo = ABSENT.
Impact: For a local industrial distributor, lat/long + hasMap are primary signals for local AI search (Gemini, Maps, Perplexity local). Their absence weakens local entity disambiguation and map pack association.
P2 Weak sameAs entity graph — single Facebook link only
Evidence: https://thietbinenkhi.vn — LocalBusiness '"sameAs":["https://www.facebook.com/thietbinenkhi.vn"]' (1 link). No Wikidata, Google Maps/Business Profile, YouTube, Zalo, LinkedIn, or industry directory. Homepage Person sameAs = ['https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/'] (int
Impact: sameAs is the strongest entity-recognition signal for GEO. A single social link gives AI platforms little to verify/triangulate the entity, lowering citation probability.
P2 Entity model inconsistency: Person node named with a company name ('Airtec Compression., Ltd')
Evidence: https://thietbinenkhi.vn — {"@type":"Person","name":"Airtec Compression., Ltd","sameAs":["https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/"],"worksFor":{"@id":"https://thietbinenkhi.vn/#organization"}}. A Ltd company is typed as Person.
Impact: Mis-typing an organization as a Person confuses entity graphs and dilutes E-E-A-T/author signals AI relies on. Article author resolves to a company-as-person.
P3 Opening hours use legacy string array, not openingHoursSpecification; no priceRange context fields
Evidence: https://thietbinenkhi.vn — '"openingHours":["Monday...' (string syntax). node.openingHoursSpecification = ABSENT. priceRange present as '"priceRange":"$$"' but no currenciesAccepted/areaServed/description.
Impact: openingHours string form is valid but openingHoursSpecification is the recommended, more reliably parsed structure for AI/local. Missing description/areaServed reduces local context richness.
P3 Duplicate BreadcrumbList on product pages
Evidence: https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — grep -c 'BreadcrumbList' = 2 (two BreadcrumbList blocks, likely Yoast + WooCommerce/theme emitting independently).
Impact: Duplicate breadcrumb graphs can produce conflicting trails and validator warnings; AI may pick the wrong path. Low SERP risk but untidy.
P3 Product category pages lack Product/ItemList schema
Evidence: https://thietbinenkhi.vn/dau-may-nen-khi/ — @types present: CollectionPage, BreadcrumbList, ListItem (breadcrumb only), Organization, WebSite. No Product, ItemList, or OfferCatalog enumerating category products.
Impact: Category pages are high-value for AI product discovery; without ItemList/Product enumeration, AI cannot extract the product set for these category queries.
Sitemap Deep Dive
80/100Rating: Good · Primary source: /seo-sitemap (80/100)
Sitemap architecture is healthy and well-segmented: /sitemap.xml 301-redirects to /sitemap_index.xml (declared in robots.txt) which lists 7 typed child sitemaps — post (241), product (181), product_cat (34), page (9), brand/pa_thuong-hieu (5), category (4), local (1). WooCommerce + WordPress blog structure with a dedicated local-sitemap.
Total ~475 indexable URLs. Orphan/redirect-in-sitemap detection requires a full crawl (not run this tier).
Findings from /seo-sitemap (2)
P3 Clean, typed sitemap index with local sitemap present
Evidence: curl /sitemap_index.xml (200) lists post-sitemap (241 loc), product-sitemap (181), product_cat (34), page (9), pa_thuong-hieu (5), category (4), local-sitemap (1). robots.txt declares Sitemap: https://thietbinenkhi.vn/sitemap_index.xml.
Impact: Good crawl efficiency; typed segmentation helps Google prioritize product vs blog.
P2 local-sitemap lists only 1 URL — verify all locations are covered
Evidence: curl local-sitemap.xml -> 1 <loc>. If the business has multiple branches/locations, each LocalBusiness/location page should be present.
Impact: Missing location URLs weaken per-location local visibility.
Performance Deep Dive
70/100Rating: Fair · Primary source: /seo-performance (70/100)
Measured via DataForSEO Lighthouse v13.3 (desktop lab, JS enabled). Layout stability is excellent (CLS 0.003) and the page is light (~1.0 MB), but two server/render signals drag the score: TTFB (server-response-time) is 1,042 ms — well above the 600 ms target — and Speed Index is 10.5 s, pointing to render-blocking CSS/JS from the WordPress builder stack.
LCP 2,765 ms sits just over the 2.5 s 'good' threshold; TBT is effectively 0 (1 ms). Lighthouse category scores: Performance 0.68, Accessibility 0.95, Best-Practices 0.96, SEO 1.0.
Cross-checked by: geo-technical: 68/100seo-google: 62/100
Findings from /seo-performance (3)
P2 High server response time (TTFB ~1.04s)
Evidence: Lighthouse server-response-time numericValue=1042ms (target <600ms). network-server-latency=167ms — so the delay is app/origin (PHP/DB), not network.
Impact: TTFB directly delays LCP; cutting it ~400ms would likely pull LCP under 2.5s.
P2 Speed Index 10.5s — render-blocking builder CSS/JS
Evidence: Lighthouse speed-index numericValue=10542ms despite ~1MB page; WordPress stackpack flags render-blocking-resources + unused-css/js. mainthread-work-breakdown=1548ms.
Impact: Faster visual completeness; better perceived load on mobile.
P3 LCP 2.77s — marginally above the 2.5s 'good' threshold
Evidence: Lighthouse largest-contentful-paint numericValue=2765ms (lab desktop). CLS 0.003 and TBT 1ms are already excellent.
Impact: Pulling LCP under 2.5s (mostly via TTFB fix PF1) earns the 'good' CWV bucket.
Findings from /geo-technical (7)
P2 All six recommended HTTP security headers absent site-wide
Evidence: curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy' returned 0. Same grep on inner page https://thietbinenkhi.vn/may-nen-khi-10kg-dung-cho-nhu-cau-nao/ also r
Impact: No HSTS (downgrade/SSL-strip exposure), no clickjacking protection (X-Frame-Options/CSP frame-ancestors), no MIME-sniffing protection (X-Content-Type-Options: nosniff), no referrer or permissions policy. Trust/security-signal weakness; not a direct ranking blocker but flagged by
P3 PHP version disclosed in X-Powered-By header
Evidence: curl -sI https://thietbinenkhi.vn/ -> 'X-Powered-By: PHP/8.2.31'. Also 'Server: LiteSpeed'. WordPress version exposed in HTML: <meta name="generator" content="WordPress 7.0">.
Impact: Version disclosure aids targeted exploitation of known CVEs. Low direct SEO impact; minor hardening item.
P3 HTTP/2 not negotiated in tests (HTTP/1.1 only); HTTP/3 advertised but unverified
Evidence: Every curl response returned 'HTTP/1.1' (status line on homepage, robots, inner page; curl -w http_version=1.1). The installed libcurl in this environment does not support --http2, so h2 support could not be force-tested. Server advertises HTTP/3 via 'alt-svc: h3=":443"; ma=25920
Impact: If the origin only serves HTTP/1.1 to crawlers, it loses multiplexing/header-compression benefits for the 9 stylesheets + 13 scripts on the homepage, modestly affecting load performance. Inconclusive evidence — flagged for confirmation, not asserted as a defect.
P3 Low adoption of modern image formats (WebP/AVIF ~17%)
Evidence: Homepage HTML (297KB): grep counts src=*.webp=12, *.avif=0, *.jpg/jpeg=32, *.png=27 -> modern share = 12/71 = ~17%. 31 of 72 <img> tags use loading="lazy".
Impact: JPEG/PNG payloads are heavier than WebP/AVIF, increasing transfer weight and LCP risk on image-heavy WooCommerce product/category listings, especially on mobile (Vietnam mobile-first market). CWV/page-speed signal.
P3 No Cache-Control/ETag/Last-Modified on HTML; static-asset TTL only 7 days
Evidence: curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'cache-control' returned 0 (no Cache-Control, ETag, or Last-Modified emitted on the HTML document). Sampled static CSS https://thietbinenkhi.vn/wp-content/plugins/woocommerce/assets/client/blocks/wc-blocks.css returned 'Cache-Contro
Impact: Absent HTML validators reduce conditional-request efficiency; 7-day static TTL is shorter than the 1-year best practice for versioned/hashed assets, causing more revalidation traffic. Minor performance item.
P3 Render-blocking resources in head (9 stylesheets, 9 of 13 scripts not async/defer)
Evidence: Homepage HTML: 9 <link rel=stylesheet> elements; 13 <script src> elements of which only 4 carry defer/async (9 synchronous). Brotli compression active (Content-Encoding: br).
Impact: Render-blocking CSS/JS delays first paint and LCP. Field CWV not measurable here (no CrUX access in this agent), so this is a lab-signal estimate, not a confirmed CWV failure.
P3 IndexNow not implemented (no key file)
Evidence: GET https://thietbinenkhi.vn/.well-known/indexnow-key.txt returned HTTP 301 (redirect, not a 200 key file). No IndexNow key surfaced.
Impact: Slower Bing indexing; Bing's index feeds ChatGPT and Copilot, so faster Bing updates aid AI-search visibility. Minor GEO opportunity.
Findings from /seo-google (4)
P1 Highest-volume head term ranks page 1 but outside top 3 — top-3 push is the single biggest traffic lever
Evidence: keyword 'lọc tách dầu máy nén khí' pos 6, search_volume 3600, url https://thietbinenkhi.vn/loc-tach-dau-may-nen-khi/ (DataForSEO); 'máy nén khí trục vít' pos 7, search_volume 2400, url https://thietbinenkhi.vn/may-nen-khi-truc-vit/ (DataForSEO)
Impact: These two terms alone carry 6000 monthly searches; moving from pos 6-7 into the top 3 captures the bulk of clicks and roughly 3-5x the ETV currently estimated (121.7 and 61.4 respectively).
P2 Five keywords with meaningful volume languish beyond position 20 — page-2+ recovery opportunity
Evidence: keyword 'bình nén khí' pos 44, search_volume 480, url https://thietbinenkhi.vn/binh-chua-khi-nen/ (DataForSEO); 'máy sấy khí nén' pos 21, search_volume 260, url https://thietbinenkhi.vn/may-say-khi-nen-la-gi/ (DataForSEO); 'ống dẫn khí' pos 37, search_volume 260, url https://thie
Impact: Recovering these to page 1 adds incremental qualified traffic; 'bình nén khí' (sv 480) is the standout given its volume vs pos 44.
P2 Top-3 cluster is thin (only 5 of 26) — most visibility sits in the click-poor 4-10 band
Evidence: Only 5 keywords in pos 1-3 vs 14 in pos 4-10; e.g. 'máy nén khí hitachi' pos 8, search_volume 590, url https://thietbinenkhi.vn/may-nen-khi-hitachi-7-5kw-10hp-noi-dia-nhat/ and 'bình khí nén' pos 8, search_volume 590, url https://thietbinenkhi.vn/binh-chua-khi-nen-3000l/ (DataFor
Impact: The 4-10 band captures far fewer clicks than top 3; tightening these brand/product terms into top 3 lifts conversion-ready transactional traffic.
P3 Possible URL cannibalisation across compressor/tank/oil clusters
Evidence: URL https://thietbinenkhi.vn/may-nen-khi-truc-vit/ ranks for both 'máy nén khí trục vít' (pos 7) and 'máy nén trục vít' (pos 7); https://thietbinenkhi.vn/thiet-bi-su-dung-khi-nen/ ranks for both 'thiết bị khí nén' (pos 6) and 'khí nén' (pos 12); multiple binh-chua-khi-nen variant
Impact: Splitting equity across near-duplicate intents caps how high any single page can climb; consolidation could nudge several pos 6-12 terms toward page-1 top.
Geo Deep Dive
64/100Rating: Fair · Primary source: /geo-llmstxt (88/100)
A valid /llms.txt is published and served correctly (HTTP 200, Content-Type text/plain) with real brand content — 'Airtec Compression Equipment Co., Ltd', official website, industry. This is a genuine AI-guidance file, not a soft-404 homepage echo. Minor: could enrich with explicit canonical key-page links (menu of products, locations, contact) and short descriptions to maximize AI-crawler routing.
Findings from /geo-llmstxt (2)
P3 llms.txt is valid and well-served (text/plain, real content)
Evidence: curl -sIL https://thietbinenkhi.vn/llms.txt -> HTTP/1.1 200, Content-Type: text/plain; body begins '# Airtec Compression Equipment Co., Ltd / Official Website: https://thietbinenkhi.vn / Industry: Industrial Air Compressor'.
Impact: Already a positive signal — AI crawlers get a clean plain-text brand file (advantage over most competitors).
P3 llms.txt lacks an explicit key-URL section with descriptions
Evidence: Body is a brand description block; no markdown link list of canonical pages (## section with [Title](URL) — short desc) observed in the fetched file.
Impact: Adding a key-URL map improves AI answer routing to product/location/quote pages.
Platform Deep Dive
64/100Rating: Fair · Primary source: /geo-platform-optimizer (64/100)
AI-search readiness assessed heuristically (live AI-citation/LLM-mention lookups UNMEASURED — DataForSEO AI Optimization subscription inactive). Strong foundations: server-rendered HTML content, a VALID /llms.txt (text/plain, real brand content), all AI crawlers allowed in robots.txt (geo-crawlers 92/100), and Lighthouse SEO 1.0.
Weak spots: thin/owned-only entity graph (geo-brand-mentions 50), schema gaps + sameAs incomplete (geo-schema), and no independent citations — so even though crawlers CAN read the site, there's little third-party signal for an AI to confidently cite it.
Findings from /geo-platform-optimizer (1)
P2 Crawlable + llms.txt valid, but weak entity/citation signal limits AI quoting
Evidence: Positive: SSR content, /llms.txt 200 text/plain valid, AI bots allowed (geo-crawlers 92). Negative: geo-brand-mentions 50 (owned-only), incomplete sameAs (geo-schema). No independent third-party corroboration for AI to cite.
Impact: Closing the entity-graph + citation gap raises odds of being quoted in ChatGPT/Perplexity answers for 'máy nén khí trục vít' style queries.
Brand Deep Dive
50/100Rating: Poor · Primary source: /geo-brand-mentions (50/100)
Off-site brand presence for 'Thiết Bị Nén Khí Airtec' exists but is thin and concentrated on owned/social channels rather than independent authority sources. Firecrawl search surfaces an active Facebook page (Airtec, Ho Chi Minh City) with product posts, several YouTube product/test videos, an about.me profile (address 326 Quốc Lộ 1A, P.
Tam Bình), and an Amazon.fr listing — but no third-party reviews, news, Wikipedia/Wikidata, or industry-directory citations. Entity graph is weak for AI trust.
Findings from /geo-brand-mentions (2)
P2 Brand authority concentrated on owned channels (Facebook/YouTube), few independent citations
Evidence: Firecrawl search 'thietbinenkhi.vn Airtec máy nén khí review': top results = facebook.com/thietbinenkhi.vn (own), own YouTube videos, about.me/maynenkhitrucvitairtec (own), amazon.fr listing. No independent review/news/Wikipedia/directory result in top 8.
Impact: More independent mentions + directory citations strengthen E-E-A-T and AI citation likelihood.
P3 sameAs / profile consolidation opportunity
Evidence: Active Facebook + YouTube + about.me profiles exist off-site; these should be wired into the homepage Organization schema sameAs (cross-check geo-schema findings).
Impact: Connects the brand entity across platforms for knowledge-graph/AI disambiguation.
Findings from /seo-backlinks (1)
P2 Backlink authority unmeasured (subscription inactive) — likely thin (indirect)
Evidence: DataForSEO backlinks_summary -> Error 40204 'Access denied. Activate subscription.' Indirect: geo-brand-mentions found only owned Facebook/YouTube/about.me + marketplace, no independent citations.
Impact: If confirmed thin, local/industry link building would lift non-branded rankings (cross-check seo-google striking-distance keywords).
Image Deep Dive
66/100Rating: Fair · Primary source: /seo-performance (70/100)
Measured via DataForSEO Lighthouse v13.3 (desktop lab, JS enabled). Layout stability is excellent (CLS 0.003) and the page is light (~1.0 MB), but two server/render signals drag the score: TTFB (server-response-time) is 1,042 ms — well above the 600 ms target — and Speed Index is 10.5 s, pointing to render-blocking CSS/JS from the WordPress builder stack.
LCP 2,765 ms sits just over the 2.5 s 'good' threshold; TBT is effectively 0 (1 ms). Lighthouse category scores: Performance 0.68, Accessibility 0.95, Best-Practices 0.96, SEO 1.0.
Findings from /seo-performance (3)
P2 High server response time (TTFB ~1.04s)
Evidence: Lighthouse server-response-time numericValue=1042ms (target <600ms). network-server-latency=167ms — so the delay is app/origin (PHP/DB), not network.
Impact: TTFB directly delays LCP; cutting it ~400ms would likely pull LCP under 2.5s.
P2 Speed Index 10.5s — render-blocking builder CSS/JS
Evidence: Lighthouse speed-index numericValue=10542ms despite ~1MB page; WordPress stackpack flags render-blocking-resources + unused-css/js. mainthread-work-breakdown=1548ms.
Impact: Faster visual completeness; better perceived load on mobile.
P3 LCP 2.77s — marginally above the 2.5s 'good' threshold
Evidence: Lighthouse largest-contentful-paint numericValue=2765ms (lab desktop). CLS 0.003 and TBT 1ms are already excellent.
Impact: Pulling LCP under 2.5s (mostly via TTFB fix PF1) earns the 'good' CWV bucket.
Accessibility Deep Dive
74/100Rating: Fair · Primary source: /geo-accessibility (74/100)
WCAG 2.2 AA static audit of https://thietbinenkhi.vn homepage (curl + grep, 297KB HTML). 7 of 10 criteria strong. Strengths: valid lang=vi, single H1, working skip-to-content link (#main target exists), both search inputs labeled, correct role=img+aria-label on star ratings, no nested <html>/duplicate IDs/button-in-button, valid DOM.
Weaknesses: broken heading order (H1 is the LAST heading in DOM source at byte 245369, after 24 h3/h4 and the h2 at 139552 - source order is h3..h2..h1), no :focus-visible with outline:none on interactive elements (box-shadow-only focus), and 2 empty-alt images (one a meaningful logo).
Lighthouse composite unavailable (CHROME_INTERSTITIAL_ERROR) so score uses static-only 85-point ceiling.
✓ What's working (7)
- Valid page language: <html lang="vi"> (BCP47 valid) - WCAG 3.1.1 PASS.
- Exactly one H1 on the page (count=1) - no duplicate-H1 issue.
- Working skip-to-content link: <a class="skip-link screen-reader-text" href="#main">Bo qua noi dung</a> and id="main" target exists - WCAG 2.4.1 PASS.
- Both visible search inputs labeled: <label class="screen-reader-text" for="woocommerce-product-search-field-0/1"> matches input ids - WCAG 1.3.1/3.3.2 PASS (only hidden inputs lack labels, which is correct).
- Correct ARIA: role="img" star ratings carry aria-label="Rated 5 out of 5"; role="button" link carries aria-label; landmarks present (role=main/navigation/search, <main>, <nav>).
- Valid DOM structure: single <html>, single <body>, single <head>, no nested <html> in widgets, no duplicate IDs (uniq -d = 0), no button-in-button nesting.
- Focus indicator defined for inputs via :focus box-shadow (border-color + 3px ring).
Findings from /geo-accessibility (4)
P1 Broken heading hierarchy: H1 appears last in DOM, headings start at H3, H2 precedes H1
Evidence: https://thietbinenkhi.vn homepage. grep -bo byte offsets: first <h3 at 123748, first <h2 at 139552, <h1 at 245369. Heading sequence (grep -oE '<h[1-6]') = h3,h3,h3,h2,h3...x13,h4 x6,h3 x4,h1,h5 x8. Single H1 (count=1) but it is the 25th heading rendered. Screen-reader/AI outline
Impact: Screen-reader users navigating by heading get a malformed document outline (jumps into H3 with no parent H1/H2). AI extraction misreads page topic hierarchy. Affects 100% of screen-reader users.
P2 outline:none on interactive elements with no :focus-visible fallback
Evidence: https://thietbinenkhi.vn inline CSS: two 'outline:none' rules on form/button selectors (e.g. '...border-radius:50px;...outline:none;background:var(--c-white)' and '.form-nhan... width:calc(100% - 174px);...outline:none;color:#7c7c7c'). grep ':focus-visible' count=0; only one ':fo
Impact: Keyboard users may not see focus on buttons/links that use outline:none without the box-shadow rule. The single :focus rule does not cover all interactive selectors.
P2 Meaningful logo image has empty alt (alt="")
Evidence: https://thietbinenkhi.vn: 72 <img> total, 70 with non-empty alt, 2 with alt="". One is decorative background (bg2.webp - correctly empty). The other: '<img ... src=".../logo-thiet-bi-nen-khi-airtec.webp" class="attachment-original size-original" alt="" ... srcset=...>' - a brand
Impact: Screen-reader users hear nothing for a brand/logo image that conveys company identity. If the logo is purely decorative duplicate of adjacent text it is acceptable, hence P2 not P1.
P3 Lighthouse accessibility composite could not be measured
Evidence: mcp__dataforseo-mcp__on_page_lighthouse(url=https://thietbinenkhi.vn) returned CHROME_INTERSTITIAL_ERROR (Code: 50301). No axe-core rule violations, color-contrast ratios, or keyboard-trap detection available. Static-only audit applied with 85-point ceiling per skill discipline.
Impact: Color contrast (1.4.3), keyboard navigation (2.1.1), and dynamic ARIA state checks are unverified. Score has reduced confidence.
Compliance Deep Dive
38/100Rating: Critical · Primary source: /geo-compliance (38/100)
thietbinenkhi.vn (WordPress/LiteSpeed, lang=vi, .vn ccTLD) has NO cookie-consent banner / CMP yet fires Google gtag.js (GA4 G-E825PM2WJS) directly in homepage HTML pre-consent — a PDPD consent-before-tracking gap. Privacy policy exists at /chinh-sach-bao-mat (200, real page 'Chính Sách Bảo Mật [2026]') but is set noindex,nofollow and is thin: 0/9 GDPR/CCPA keywords and 0 explicit PDPD statutory clauses (no Nghị định 13/2023, no 'đồng ý'/consent, no 'chủ thể dữ liệu'/data subject, no sensitive-data clause, no deletion right).
Only 1 third-party tracker (GTM/GA4) — clean tag profile, no FB/TikTok/Hotjar present (grep-confirmed). Valid Let's Encrypt cert (HTTPS) but no HSTS header. No Set-Cookie observed on homepage GET.
Findings from /geo-compliance (5)
P1 Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present
Evidence: Homepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-library grep (cookieyes|onetrust|cookiebot|cookielaw.org|termly|iubenda|klaro|tarteaucitron|cookie-script|complianz|cookienotice) = 0 matches; consent heuristic
Impact: Vietnam PDPD (Nghị định 13/2023/NĐ-CP, in force Jul 2023) requires data-subject consent ('đồng ý') before processing; GA4 sets analytics cookies/identifiers on load with no consent gate. Same exposure under GDPR for any EU traffic. Fixing closes the single largest compliance gap
P1 Privacy policy lacks GDPR/CCPA references and explicit PDPD statutory clauses
Evidence: curl https://thietbinenkhi.vn/chinh-sach-bao-mat = HTTP 200 (real page, title 'Chính Sách Bảo Mật [2026]'). Keyword grep on page: gdpr=0, ccpa=0, 'data subject'=0, 'right to delete'=0, 'right to access'=0, opt-out=0; VN clauses: 'Nghị định 13'=0, 'bảo vệ dữ liệu'=0, 'chủ thể dữ l
Impact: Policy uses informal phrasing ('thông tin cá nhân') instead of statutory PDPD terms and omits the 8 data-subject rights, sensitive-data handling, and legal basis. Pre-litigation/enforcement exposure under PDPD (fines up to VND 5bn) and GDPR for intl traffic.
P2 Privacy policy page is set to noindex,nofollow
Evidence: grep on /chinh-sach-bao-mat: <meta name="robots" content="nofollow, noindex"/>
Impact: Page is reachable (HTTP 200) but deindexed, reducing discoverability/transparency of the legal notice and AI-crawler citability. Trust/transparency signal weakened.
P2 No HSTS (Strict-Transport-Security) header
Evidence: curl -sI https://thietbinenkhi.vn — no 'strict-transport-security' header in response. Valid Let's Encrypt cert (issuer CN=R12, notBefore May 9 2026, notAfter Aug 7 2026); HTTPS serves 200; HTTP/3 advertised via alt-svc.
Impact: Without HSTS, first-visit/downgrade MITM is possible despite valid TLS. Low residual risk (site already HTTPS) but a standard hardening gap.
P3 Cookie categories not disclosed (no consent classification)
Evidence: No CMP detected (see CP1) and privacy page grep shows only a single 'cookie' mention with no category breakdown (essential/analytics/marketing).
Impact: Users cannot granularly accept/reject cookie categories; required for valid consent under PDPD/GDPR. Resolved largely as a side effect of CP1 (CMP install).
Local Deep Dive
55/100Rating: Poor
No Phase 4 agent JSON found for this category. Findings related to this category appear in the issue list above.
Audit Deep Dive
78/100Rating: Good · Primary source: /seo-audit (78/100)
thietbinenkhi.vn is a well-maintained WordPress + WooCommerce site (LiteSpeed, PHP 8.2, Rank Math SEO) for a Vietnamese industrial air-compressor distributor. Technical foundations are solid: HTTPS enforced, www 301s to canonical (non-www), valid Rank Math sitemap_index with 7 child sitemaps (181 products, 241 posts), correct lang=vi, indexable robots meta, self-referential canonical, 58-char title, 143-char meta description, full Open Graph + Twitter Card tags, and 72 images all carrying alt attributes with 31 lazy-loaded.
Schema is present via @graph. The most material on-site gaps for a LOCAL business: (1) the HOMEPAGE lacks LocalBusiness/Organization schema and BreadcrumbList (the shop archive /san-pham/ DOES emit LocalBusiness, proving the plugin can output it but it is not wired to the homepage where local trust signals matter most); (2) requests to non-existent URLs 301-redirect to the homepage instead of returning 404 (soft-404 pattern that can dilute crawl signals); (3) no security/transport headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP).
Findings are evidence-verified via curl + grep against fetched HTML/headers; no external rank/traffic data was used.
Findings from /seo-audit (6)
P1 Homepage missing LocalBusiness/Organization schema (present on shop archive only)
Evidence: https://thietbinenkhi.vn/ — grep of homepage ld+json @type returned Person/Place/Article/FAQPage/WebSite/WebPage/ImageObject but NO LocalBusiness or Organization (grep '"@type":"(LocalBusiness|Organization|Store)"' = 0 matches). Contrast: https://thietbinenkhi.vn/san-pham/ DOES e
Impact: For a local distributor, LocalBusiness schema on the homepage is the primary entity-trust signal for Google local/Maps and AI answer engines. The data (NAP) already exists; only the schema wiring is missing on the most important page.
P1 Soft-404: non-existent URLs 301-redirect to homepage instead of returning 404
Evidence: curl https://thietbinenkhi.vn/this-page-does-not-exist-xyz123 returned 'HTTP 301 -> https://thietbinenkhi.vn/' and following the chain ends at the homepage with HTTP 200 and the homepage <title>. A missing URL should return 404/410.
Impact: Soft-404s waste crawl budget, can cause Google to index/merge phantom URLs into the homepage, and mask genuinely broken internal/external links. Hurts indexation hygiene on a 400+ URL store.
P2 No HTTP security/transport headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP)
Evidence: curl -I https://thietbinenkhi.vn returned headers Server: LiteSpeed, X-Powered-By: PHP/8.2.31, but grep for 'strict-transport|x-frame|content-security|x-content-type' returned NO matches.
Impact: Missing HSTS leaves a downgrade window despite HTTPS; missing X-Content-Type-Options/X-Frame-Options are minor security/quality signals. Low direct ranking impact but flagged in technical/security audits and trust reviews.
P2 Homepage has no BreadcrumbList schema
Evidence: https://thietbinenkhi.vn/ — grep 'BreadcrumbList' = 0 matches on homepage, while https://thietbinenkhi.vn/san-pham/ has 2 BreadcrumbList matches. Homepage @graph present but no breadcrumb node.
Impact: Breadcrumb structured data drives breadcrumb rich results in SERPs and helps Google/AI understand site hierarchy. Inner pages have it; homepage omission is minor (home is root) but worth consistency.
P3 Two homepage images have empty alt text (alt="")
Evidence: https://thietbinenkhi.vn/ — grep '<img ...alt=""...>' = 2 matches out of 72 total <img> tags; all 72 carry an alt attribute (0 missing the attribute entirely).
Impact: Minor. Empty alt is correct for purely decorative images but if these two are content/brand images they lose image-search and accessibility value.
P3 Generator meta reports 'WordPress 7.0' (anomalous / version disclosure)
Evidence: https://thietbinenkhi.vn/ — grep returned '<meta name="generator" content="WordPress 7.0"/>'. WordPress 7.0 is not an expected stable release as of 2026-06-03 (6.x line), suggesting a spoofed/placeholder string or a very new build; either way the generator tag discloses CMS info.
Impact: No ranking impact. Minor information-disclosure / fingerprinting surface; the unusual version string may also confuse automated tooling.
Google-Api Deep Dive
62/100Rating: Fair · Primary source: /seo-google (62/100)
thietbinenkhi.vn (Airtec) shows healthy organic visibility for a niche industrial air-compressor B2B site. The returned sample covers 26 ranked keywords, almost entirely transactional intent in the compressor/parts space. 19 of 26 keywords already sit on page 1 (positions 1-10): 5 in the top 3 and 14 in positions 4-10, plus 2 in 11-20.
Five keywords trail beyond position 20. The biggest upside is concentrated in three high-volume, page-1-but-not-top-3 terms — 'lọc tách dầu máy nén khí' (sv 3600, pos 6), 'máy nén khí trục vít' (sv 2400, pos 7), and 'dầu máy nén khí' (sv 720, pos 5) — where a push into the top 3 would multiply traffic.
Score reflects solid breadth and page-1 density but a thin top-3 cluster (only 5 keywords) and several high-volume terms stuck at the bottom of page 1 or page 2.
Findings from /seo-google (4)
P1 Highest-volume head term ranks page 1 but outside top 3 — top-3 push is the single biggest traffic lever
Evidence: keyword 'lọc tách dầu máy nén khí' pos 6, search_volume 3600, url https://thietbinenkhi.vn/loc-tach-dau-may-nen-khi/ (DataForSEO); 'máy nén khí trục vít' pos 7, search_volume 2400, url https://thietbinenkhi.vn/may-nen-khi-truc-vit/ (DataForSEO)
Impact: These two terms alone carry 6000 monthly searches; moving from pos 6-7 into the top 3 captures the bulk of clicks and roughly 3-5x the ETV currently estimated (121.7 and 61.4 respectively).
P2 Five keywords with meaningful volume languish beyond position 20 — page-2+ recovery opportunity
Evidence: keyword 'bình nén khí' pos 44, search_volume 480, url https://thietbinenkhi.vn/binh-chua-khi-nen/ (DataForSEO); 'máy sấy khí nén' pos 21, search_volume 260, url https://thietbinenkhi.vn/may-say-khi-nen-la-gi/ (DataForSEO); 'ống dẫn khí' pos 37, search_volume 260, url https://thie
Impact: Recovering these to page 1 adds incremental qualified traffic; 'bình nén khí' (sv 480) is the standout given its volume vs pos 44.
P2 Top-3 cluster is thin (only 5 of 26) — most visibility sits in the click-poor 4-10 band
Evidence: Only 5 keywords in pos 1-3 vs 14 in pos 4-10; e.g. 'máy nén khí hitachi' pos 8, search_volume 590, url https://thietbinenkhi.vn/may-nen-khi-hitachi-7-5kw-10hp-noi-dia-nhat/ and 'bình khí nén' pos 8, search_volume 590, url https://thietbinenkhi.vn/binh-chua-khi-nen-3000l/ (DataFor
Impact: The 4-10 band captures far fewer clicks than top 3; tightening these brand/product terms into top 3 lifts conversion-ready transactional traffic.
P3 Possible URL cannibalisation across compressor/tank/oil clusters
Evidence: URL https://thietbinenkhi.vn/may-nen-khi-truc-vit/ ranks for both 'máy nén khí trục vít' (pos 7) and 'máy nén trục vít' (pos 7); https://thietbinenkhi.vn/thiet-bi-su-dung-khi-nen/ ranks for both 'thiết bị khí nén' (pos 6) and 'khí nén' (pos 12); multiple binh-chua-khi-nen variant
Impact: Splitting equity across near-duplicate intents caps how high any single page can climb; consolidation could nudge several pos 6-12 terms toward page-1 top.
Page-Deep-Dive Deep Dive
78/100Rating: Good · Primary source: /seo-page (78/100)
On-page audit of 7 sampled URLs (homepage, product category, single product, shop, blog post, about/CEO, contact). Foundations are strong: every page has a unique self-referential canonical, exactly one indexable robots directive, Rank Math-generated JSON-LD schema appropriate to page type (Product+Offer+AggregateRating on product, CollectionPage+Breadcrumb on category, NewsArticle on blog, ContactPage on contact, LocalBusiness on shop), and 100% image alt coverage on every sampled page.
Primary weaknesses:
- the contact page /lien-he/ has zero H1;
- the product title is 91 chars and will truncate in SERPs;
Word counts are healthy across content pages (768-2066 words) and internal linking is dense (91-194 links/page).
Findings from /seo-page (6)
P2 Contact page has no H1
Evidence: https://thietbinenkhi.vn/lien-he/ — grep '<h1\b' returns 0; first rendered heading is an empty tag then the business name 'CÔNG TY TNHH THIẾT BỊ NÉN KHÍ AIRTEC' appears in a lower-level heading. H1 count = 0.
Impact: Missing H1 weakens topical relevance signal and accessibility on the primary conversion page. Localized lead-gen pages should declare a clear H1 (e.g. 'Liên hệ Thiết Bị Nén Khí Airtec').
P2 Category & shop archives skip heading levels (H1 then H3, no H2)
Evidence: https://thietbinenkhi.vn/dau-may-nen-khi/ — H1=1, H2=0, H3=3. https://thietbinenkhi.vn/san-pham/ — H1=1, H2=0, H3=3. Heading structure jumps H1->H3 with no intervening H2.
Impact: Broken heading hierarchy reduces semantic clarity for crawlers and assistive tech on the highest-traffic commercial templates (product archives).
P3 Product title tag exceeds SERP display width (91 chars)
Evidence: https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — <title> = 'Máy Nén Khí Kobelco 37kw (50hp) Nội địa Nhật Mới 95% [2026] » Thiết Bị Nén Khí Airtec', length 91 chars. Compare homepage 58, category 54, shop 56 (all within range).
Impact: Title will truncate around 60 chars / ~600px in Google SERPs, hiding the brand suffix and reducing the clickable signal. The duplicated brand suffix '» Thiết Bị Nén Khí Airtec' on the product template is the main overflow source.
P2 Decorative/logo/background images carry empty alt attributes
Evidence: https://thietbinenkhi.vn/ — 2 of 72 imgs have alt="" including logo-thiet-bi-nen-khi-airtec.webp and bg2.webp. Same 2-3 empty-alt pattern on /dau-may-nen-khi/ (2), /may-nen-khi-kobelco-37kw/ (3), /may-nen-khi-10kg-dung-cho-nhu-cau-nao/ (3), /ve-ceo-dao-trung-kien/ (2).
Impact: Low. Empty alt on decorative backgrounds is technically acceptable, but the logo image should carry descriptive alt (brand name) for image search and accessibility. Net image alt coverage is otherwise 100% (every <img> has an alt attribute on all 7 sampled pages).
P2 About/CEO page meta description is short (73 chars)
Evidence: https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/ — meta description = 'Giới thiệu về CEO Đào Trung Kiên của Công ty TNHH Thiết Bị Nén Khí Airtec', 73 chars vs ~120-160 used on other sampled pages (homepage 143, product 152, blog 162).
Impact: Under-uses available SERP snippet width; misses a chance to add E-E-A-T/authority context for an author/entity page that supports E-E-A-T signals.
P2 No hreflang annotations (single-language site)
Evidence: All 7 sampled URLs — grep 'hreflang' returns 0 matches on each (homepage, /dau-may-nen-khi/, /may-nen-khi-kobelco-37kw/, /san-pham/, /may-nen-khi-10kg-dung-cho-nhu-cau-nao/, /ve-ceo-dao-trung-kien/, /lien-he/).
Impact: Informational only. Site is Vietnamese single-locale; hreflang is not required. Flag for awareness if international/multi-locale expansion is ever planned.
Visual Deep Dive
74/100Rating: Fair · Primary source: /seo-visual (74/100)
Source-based proxy audit of the thietbinenkhi.vn homepage (WordPress + Flatsome theme + WooCommerce, lazy-load perf plugin active). No live browser was available, so no measured Core Web Vitals (LCP/CLS/INP) were captured; all render/CWV findings are INFERRED from HTML source signals.
Above-the-fold render hygiene is largely sound: a viewport meta is present, the LCP candidate hero image (hitachimobile.webp) carries fetchpriority=high and is NOT lazy-loaded, 67/72 imgs declare width and 65/72 declare height (good CLS hygiene), and images use webp + srcset (52 webp refs, 59 srcset).
No render-blocking scripts in the head (3 deferred + 1 async, footer-loaded). Mobile conversion affordances are strong (28 tel: links, 40 Zalo references, 17 sticky/float elements). Main render-cost concerns: 9 render-blocking stylesheets including a redundant triple Font Awesome bundle (all.css + svg-with-js.css + v4-shims.css), Google Fonts loaded via a render-blocking external CSS link, the LCP hero image is fetchpriority-flagged but NOT preloaded (as=image), and no web-font preload despite a self-hosted woff2 icon font.
Findings from /seo-visual (6)
P2 Redundant triple Font Awesome stylesheet bundle (render-blocking)
Evidence: 3 of 9 render-blocking stylesheets are Font Awesome: 'https://use.fontawesome.com/releases/v6.6.0/css/all.css', '/wp-content/uploads/font-awesome/v6.6.0/css/svg-with-js.css', and 'https://use.fontawesome.com/releases/v6.6.0/css/v4-shims.css'. all.css + svg-with-js are two competi
Impact: Reduces render-blocking CSS chain and external connections, improving first paint / LCP on mobile.
P2 LCP hero image flagged fetchpriority=high but not preloaded
Evidence: LCP candidate '<img fetchpriority="high" ... src=".../hitachimobile.webp" width="700" height="889" srcset=...>' is present, but source grep found 0 '<link rel="preload" as="image">' entries.
Impact: A matching image preload (with imagesrcset) lets the browser discover the LCP asset earlier, typically shaving LCP on slower mobile connections.
P3 Google Fonts delivered via render-blocking external CSS link
Evidence: Stylesheet '//fonts.googleapis.com/css?family=Oswald:regular,700|Roboto:...&display=swap' is a render-blocking <link rel=stylesheet>. A preconnect to fonts.gstatic.com exists, but display=swap implies a fallback-then-swap reflow window.
Impact: Reduces font-driven render delay and potential FOUT/CLS on text above the fold.
P3 No web-font preload for self-hosted icon font
Evidence: Self-hosted 'fl-icons.woff2' referenced inside flatsome.css (url(...fl-icons.woff2)); source grep found 0 '<link rel=preload as=font>' entries.
Impact: Minor: preloading the icon font reduces late-discovery flash of unstyled icons in the header/nav.
P3 A minority of images lack explicit width/height (CLS hygiene)
Evidence: Of 72 <img> tags: 67 declare width, 65 declare height. ~5-7 images omit one or both dimension attributes. (No measured CLS — not flagging P1/P2 without trace data.)
Impact: Adding intrinsic dimensions to the remaining images prevents late layout shift as they load.
P3 Lazy-load relies on JS data-src SVG-placeholder swap
Evidence: 31 images use loading=lazy AND a perf-plugin pattern: 'src="data:image/svg+xml,..." data-src="https://.../airman-mobile.webp"'. If lazy JS fails or is delayed, these images stay as blank SVG placeholders.
Impact: Native loading=lazy alone would be more robust; the JS-dependent swap adds a failure mode and main-thread work. Hero (IMG2) is correctly excluded from lazy-load.
Visualizations
Site-infrastructure charts. Keyword-gap, competitor, and internal-link visualizations live in /blog-audit-pipeline (content-portfolio audit) after the v0.5.15 split. Where data is unavailable for this tier/source, a disclosure callout is shown instead of placeholder numbers.
Chart 1: Core Web Vitals
Targets: LCP <2.5s · INP <200ms · CLS <0.1. LCP (load speed) is driven mostly by server response time (TTFB) — see Performance deep dive.
📊 Core Web Vitals — Data not available in this audit.
No Chrome DevTools MCP or CrUX field-data connected. Real LCP/INP/CLS requires Tier-1 MCP setup.
Chart 2: GEO Readiness Radar
How citable the site is to AI engines. Each axis 0-100; further from center is better. Weak axes (llms.txt, brand authority) are the biggest AI-visibility gaps.
Fig 2: GEO readiness across 7 dimensions
Chart 3: Backlink Authority Distribution
DR/DA 0-20 = low-authority links; 61-100 = high-authority. You want more referring domains, weighted toward the right.
📊 Backlink Authority Distribution
Direct backlink metrics could not be measured this run — the histogram needs referring-domain data that is unavailable.
Backlink profile could not be measured this run — the DataForSEO Backlinks subscription is inactive (API error 40204) and no Moz API key is configured. Reported N/A, not zero. Indirect signal from brand-mentions (geo-brand-mentions): off-site footprint is thin and owned-channel-heavy, so referring-domain authority is likely low and a local link-building program is probably needed — but this is inferred, not measured.
Each row is an AI/search bot. Allowed = it can read and cite your pages; Blocked removes you from that engine's answers.
Chart 6: AI Platform Readiness (per engine)
Per-platform GEO readiness 0-100 — each engine uses different ranking signals, so a page strong on one can be invisible on another.
Chart 7: Striking-Distance Keywords (page 2 → page 1)
Queries ranking positions 8–30 with impressions — a small push lands page 1. Highest near-term ROI.
| Query | Position | Impressions | Clicks |
|---|---|---|---|
| 4 | 0 | 0 | |
| 4 | 0 | 0 | |
| 5 | 0 | 0 | |
| 5 | 0 | 0 | |
| 6 | 0 | 0 | |
| 6 | 0 | 0 | |
| 6 | 0 | 0 | |
| 6 | 0 | 0 | |
| 7 | 0 | 0 | |
| 7 | 0 | 0 | |
| 8 | 0 | 0 | |
| 8 | 0 | 0 |
The Priority Breakdown figure is in the Executive Summary. All charts use Okabe-Ito color-blind safe palette.
90-Day Roadmap
Visual phased plan. Each block clickable in full HTML; here shown as Gantt-style timeline.
What ships each window
- C1 · Your site tracks visitors with Google Analytics before asking permission, and has no cookie banner
- C2 · The privacy policy is thin and does not cite Vietnam's data-protection law or list visitor rights
- C3 · No Google Business Profile could be found — claiming one is the biggest local-search win available
- H1 · The site is missing standard security headers like HSTS and clickjacking protection
- H2 · Broken or mistyped URLs silently redirect to the homepage instead of showing a 'not found' page
- H3 · Your server takes about a second to start responding, which delays the whole page
Expected Score Progression
| Milestone | Projected Score | Delta |
|---|---|---|
| Current baseline | 63/100 | — |
| After Week 1-2 (all P0 fixed) | 63/100 | +0 |
| After Week 6 (P0+P1 fixed) | 73/100 | +10 (cumulative +10) |
| After Week 12 (P0+P1+P2 fixed) | 78/100 | +5 (cumulative +15) |
Projection model: sums each finding's impact_quantified per-axis score points (geo/technical/brand/schema/…) per severity bucket, capped at 25/18/12 pts respectively to avoid double-counting overlapping fixes. Real-world deltas depend on execution quality.
Autofix Bundle
23 fixes
Pipeline generates fix artifacts into audits/[client]/[date]/fixes/.
Generate-only mode — review + apply manually via WP MCP / direct upload.
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
How to apply
# For AUTO-SAFE / AUTO-REVIEW artifacts:
python execution/wp_push_safe.py [post_id] fixes/[category]/[file] --expected-slug [slug]
# For MANUAL guides:
# Read fixes/manual-guides/*.md and execute steps manually
🤖 Apply These Fixes with Claude Code
Most teams apply these with Claude Code. Hand Claude just
the report MD seo-audit_thietbinenkhi.vn_2026-06-03.md (plus the fixes/ folder for ready-to-apply
artifacts) — not the whole folder — then paste the prompt below.
You are a senior SEO + GEO engineer. Task: APPLY a site SEO + GEO audit. CONTEXT - Read the report: seo-audit_thietbinenkhi.vn_2026-06-03.md (Top-3 Priority, findings by severity, per-category deep dives, 90-Day Roadmap, Score Predictor). - Ready-to-paste artifacts are in the fixes/ folder + the report's "Ready-to-paste artifacts" block (robots.txt AI policy, llms.txt draft, schema JSON-LD, meta). - Site: thietbinenkhi.vn (WordPress -> apply via WP MCP). WORKFLOW 1. Read the report. Summarize the Top 3 Fixes + the AUTO-SAFE items. Change nothing yet. 2. Propose a plan: ship AUTO-SAFE artifacts first (robots.txt, llms.txt, headers), then AUTO-REVIEW (schema/meta) after I review each, then MANUAL guides. Wait for my OK. 3. When applying each fix: - Site files (robots.txt, llms.txt, .htaccess) -> show the diff, I deploy. - WP content/schema/meta -> edit in WP, create a REVISION/DRAFT, never publish directly. 4. After each fix, VERIFY with the exact signal the finding measured (curl/grep: header present, bot allowed, schema present, llms.txt 200...) -> report pass/fail with evidence. RULES - Don't fabricate or weaken a fix to make it "pass". Evidence-only. - NEVER publish directly -> always draft/revision for my review. - Keep a checklist: [finding id] -> applied / drafted / skipped + why.
Verification Pass — 10 Gates
9/9Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).
| Gate | Check | Status | Detail |
|---|---|---|---|
| Gate 1 | Every finding ties to evidence (5 attrs) | ✓ PASS | All 23 findings have evidence + severity + effort + impact + confidence |
| Gate 2 | Every chart hydrates from real source or shows disclosure | ✓ PASS | 7 chart slots: real data populates where agent JSON available; placeholder data eliminated v0.5.7 |
| Gate 3 | Every score documents calculation in appendix | ✓ PASS | Formula audit trail in phase6-scores.json |
| Gate 4 | No fabricated data (confidence field required) | ✓ PASS | All 23 findings carry confidence field; chart values traced to agent JSON |
| Gate 5 | Reproducibility log present | ✓ PASS | Appendix C populated with tools/versions/data sources |
| Gate 6 | Severity not inflated (P0 ≤ P1 generally) | ✓ PASS | 0 P0 vs 7 P1 — distribution healthy |
| Gate 7 | Low-confidence findings flagged inline | ✓ PASS | 4 medium-confidence + 0 low-confidence findings flagged in evidence cards |
| Gate 8 | Reaudit matrix complete (if reaudit mode) | — N/A | N/A — first audit mode |
| Gate 9 | Quick wins separated from roadmap | ✓ PASS | Quick Wins section distinct from 90-Day Roadmap |
| Gate 10 | Composite scores match category breakdown | ✓ PASS | All 3 composites reverse-compute correctly (±0.5 tolerance) |
Appendix
Appendix A — Score Calculation Methodology
Technical + CWV Composite
Technical*0.45 + Performance*0.35 + Sitemap*0.20
Components:
technical: 68 × 0.45 = 30.60
performance: 70 × 0.35 = 24.50
sitemap: 80 × 0.20 = 16.00
Sum: 71.1
Rounded: 71
GEO + AEO Composite
Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12
Components:
geo: 64 × 0.45 = 28.80
schema: 62 × 0.30 = 18.60
platform: 64 × 0.12 = 8.00
brand: 50 × 0.12 = 6.25
Sum: 61.6
Rounded: 62
Overall Search-Readiness Composite
Technical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Platform*0.06 + Brand*0.13 + Image*0.06 + Local*0.12
Components:
technical: 68 × 0.16 = 10.93
schema: 62 × 0.12 = 7.20
sitemap: 80 × 0.05 = 4.29
performance: 70 × 0.12 = 8.12
geo: 64 × 0.22 = 14.29
platform: 64 × 0.05 = 3.43
brand: 50 × 0.12 = 5.80
image: 66 × 0.05 = 3.54
local: 55 × 0.11 = 5.89
Sum: 63.5
Rounded: 63
Appendix B — Reproducibility
- Kit version: Claude-Growth v1.0.17
- Audit timestamp: 2026-06-03T03:57:40.346399+00:00
- Audit duration: 30m 1s
- Mode: first
- Tier detected: T1 (capability detection)
- Coverage at this tier: ~95-100% — first-party GSC truth + external SERP/backlink data + (optional) field CWV.
Capability checklist
- ✓ Google Search Console (GSC)
- ✓ DataForSEO MCP
- ✓ Firecrawl MCP
- ✗ Chrome DevTools MCP (field CWV)
- ✓ WordPress MCP
Missing a connector lowers coverage — see the setup guide: ongboit.com/claude-growth-setup-tool-api-mcp.
Data sources consulted
- GSC API: ✓ (OAuth granted)
- DataForSEO MCP: ✓
- Firecrawl MCP: ✓ (N/A pages)
- reportlab: ✓ (PDF generation)
Skill routing decisions
See skills/seo-pipeline/references/skill-routing.md for winner-per-pair analysis (4 duplicate skills compared head-to-head across 8-12 dimensions each).
Reference files
references/issue-catalog.md— 23 detection patternsreferences/business-type-sampling.md— 5 types × 8 priority pagesreferences/composite-formula.md— 9 weights + 5-tier rubricreferences/pdf-spec.md— Times New Roman + 7 chartsreferences/verification-checklist.md— 10 Phase 6.5 gatesreferences/skill-routing.md— winner-per-pair matrixreferences/autofix-catalog.md— 23 autofix scenarios
Glossary
Plain-language definitions of every term (CWV, GEO/AEO, llms.txt, canonical, striking distance, crawl budget, E-E-A-T…) are in the How to Read This Report section near the top.
Appendix C — All Agent Findings (67 raw, 18 agents)
Every finding from every agent, ungrouped — nothing consolidated away. The prioritized Issues sections above are the deduped, board-grade view of these.
geo-accessibility — score 74/100 · 4 finding(s)
| High A1 | Broken heading hierarchy: H1 appears last in DOM, headings start at H3, H2 precedes H1 https://thietbinenkhi.vn homepage. grep -bo byte offsets: first <h3 at 123748, first <h2 at 139552, <h1 at 245369. Heading sequence (grep -oE '<h[1-6]') = h3,h3,h3,h2,h3...x13,h4 x6,h3 x4,h1,h5 x8. Single H1 (count=1) but it is the 25th heading rendered. Screen-reader/AI outline starts at H3 with no preceding H1/H2 = skipped levels. WCAG 1.3.1 / 2.4.6. → Screen-reader users navigating by heading get a malformed document outline (jumps into H3 with no parent H1/H2). AI extraction misreads page topic hierarchy. Affects 100% of screen-reader users. |
| Medium A2 | outline:none on interactive elements with no :focus-visible fallback https://thietbinenkhi.vn inline CSS: two 'outline:none' rules on form/button selectors (e.g. '...border-radius:50px;...outline:none;background:var(--c-white)' and '.form-nhan... width:calc(100% - 174px);...outline:none;color:#7c7c7c'). grep ':focus-visible' count=0; only one ':focus{border-color:var(--c-pri);box-shadow:0 0 0 3px rgba(26,95,168,.12)}' rule exists. Focus relies on box-shadow for some inputs but other elements with outline:none have no verified visible replacement. WCAG 2.4.7. → Keyboard users may not see focus on buttons/links that use outline:none without the box-shadow rule. The single :focus rule does not cover all interactive selectors. |
| Medium A3 | Meaningful logo image has empty alt (alt="") https://thietbinenkhi.vn: 72 <img> total, 70 with non-empty alt, 2 with alt="". One is decorative background (bg2.webp - correctly empty). The other: '<img ... src=".../logo-thiet-bi-nen-khi-airtec.webp" class="attachment-original size-original" alt="" ... srcset=...>' - a brand logo treated as decorative. WCAG 1.1.1. → Screen-reader users hear nothing for a brand/logo image that conveys company identity. If the logo is purely decorative duplicate of adjacent text it is acceptable, hence P2 not P1. |
| Low A4 | Lighthouse accessibility composite could not be measured mcp__dataforseo-mcp__on_page_lighthouse(url=https://thietbinenkhi.vn) returned CHROME_INTERSTITIAL_ERROR (Code: 50301). No axe-core rule violations, color-contrast ratios, or keyboard-trap detection available. Static-only audit applied with 85-point ceiling per skill discipline. → Color contrast (1.4.3), keyboard navigation (2.1.1), and dynamic ARIA state checks are unverified. Score has reduced confidence. |
geo-brand-mentions — score 50/100 · 2 finding(s)
| Medium BM1 | Brand authority concentrated on owned channels (Facebook/YouTube), few independent citations Firecrawl search 'thietbinenkhi.vn Airtec máy nén khí review': top results = facebook.com/thietbinenkhi.vn (own), own YouTube videos, about.me/maynenkhitrucvitairtec (own), amazon.fr listing. No independent review/news/Wikipedia/directory result in top 8. → More independent mentions + directory citations strengthen E-E-A-T and AI citation likelihood. |
| Low BM2 | sameAs / profile consolidation opportunity Active Facebook + YouTube + about.me profiles exist off-site; these should be wired into the homepage Organization schema sameAs (cross-check geo-schema findings). → Connects the brand entity across platforms for knowledge-graph/AI disambiguation. |
geo-compliance — score 38/100 · 5 finding(s)
| High CP1 | Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present Homepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-library grep (cookieyes|onetrust|cookiebot|cookielaw.org|termly|iubenda|klaro|tarteaucitron|cookie-script|complianz|cookienotice) = 0 matches; consent heuristic (cookie consent|accept cookie|gdpr) = 0 matches. → Vietnam PDPD (Nghị định 13/2023/NĐ-CP, in force Jul 2023) requires data-subject consent ('đồng ý') before processing; GA4 sets analytics cookies/identifiers on load with no consent gate. Same exposure under GDPR for any EU traffic. Fixing closes the single largest compliance gap (consent + analytics). |
| High CP2 | Privacy policy lacks GDPR/CCPA references and explicit PDPD statutory clauses curl https://thietbinenkhi.vn/chinh-sach-bao-mat = HTTP 200 (real page, title 'Chính Sách Bảo Mật [2026]'). Keyword grep on page: gdpr=0, ccpa=0, 'data subject'=0, 'right to delete'=0, 'right to access'=0, opt-out=0; VN clauses: 'Nghị định 13'=0, 'bảo vệ dữ liệu'=0, 'chủ thể dữ liệu'=0, 'đồng ý'=0, 'dữ liệu cá nhân nhạy cảm'=0. Only present: cookie (1), 'bên thứ ba'/third-party (1), 'dữ liệu cá nhân' (1), 'lưu trữ'/retention (1). → Policy uses informal phrasing ('thông tin cá nhân') instead of statutory PDPD terms and omits the 8 data-subject rights, sensitive-data handling, and legal basis. Pre-litigation/enforcement exposure under PDPD (fines up to VND 5bn) and GDPR for intl traffic. |
| Medium CP3 | Privacy policy page is set to noindex,nofollow grep on /chinh-sach-bao-mat: <meta name="robots" content="nofollow, noindex"/> → Page is reachable (HTTP 200) but deindexed, reducing discoverability/transparency of the legal notice and AI-crawler citability. Trust/transparency signal weakened. |
| Medium CP4 | No HSTS (Strict-Transport-Security) header curl -sI https://thietbinenkhi.vn — no 'strict-transport-security' header in response. Valid Let's Encrypt cert (issuer CN=R12, notBefore May 9 2026, notAfter Aug 7 2026); HTTPS serves 200; HTTP/3 advertised via alt-svc. → Without HSTS, first-visit/downgrade MITM is possible despite valid TLS. Low residual risk (site already HTTPS) but a standard hardening gap. |
| Low CP5 | Cookie categories not disclosed (no consent classification) No CMP detected (see CP1) and privacy page grep shows only a single 'cookie' mention with no category breakdown (essential/analytics/marketing). → Users cannot granularly accept/reject cookie categories; required for valid consent under PDPD/GDPR. Resolved largely as a side effect of CP1 (CMP install). |
geo-crawlers — score 92/100 · 4 finding(s)
| Low CR1 | All Tier 1 AI search crawlers default-allowed (GPTBot, ClaudeBot, Claude-Web, PerplexityBot) User-agent: * / Allow: / (only 'Disallow: /wp-admin/' restricts; no AI-bot group present, so GPTBot, ClaudeBot, Claude-Web, PerplexityBot inherit 'Allow: /') → Positive: content is fully crawlable by ChatGPT Search, Claude, and Perplexity. No action required; these are the highest-value AI search surfaces and none are blocked. |
| Low CR2 | Tier 2/3 crawlers default-allowed (Google-Extended, Amazonbot, Applebot-Extended, CCBot, Bytespider, Bingbot, Googlebot) User-agent: * / Allow: / — no dedicated group for Google-Extended, Amazonbot, Applebot-Extended, CCBot, Bytespider, Bingbot, or Googlebot; all inherit the permissive wildcard. → Positive: Googlebot/Bingbot indexing and Google-Extended (Gemini/AI Overviews), Amazonbot (Alexa), Applebot-Extended (Apple Intelligence) are all permitted. Bytespider (ByteDance) and CCBot are also unblocked — acceptable but optional to restrict. |
| Low CR3 | No Content-Signal directive declared (IETF draft draft-romm-aipref-contentsignals) robots.txt contains no line beginning with 'Content-Signal:' (full file: 'User-agent: *', 'Disallow: /wp-admin/', 'Allow: /wp-admin/admin-ajax.php', 'Allow: /', 'Sitemap: https://thietbinenkhi.vn/sitemap_index.xml'). → Site does not explicitly declare AI usage preferences. Low impact while the spec is a draft, but adding it future-proofs governance and signals intent to AI platforms that honor it. |
| Low CR4 | Valid llms.txt present with real company content GET https://thietbinenkhi.vn/llms.txt -> HTTP 200, Content-Type text/plain, body begins '# Airtec Compression Equipment Co., Ltd ... Industry: Industrial Air Compressor Solutions ... Headquarters: Ho Chi Minh City, Vietnam'. → Positive: provides AI systems a structured company summary, aiding accurate AI representation. Confirms intentional GEO configuration. |
geo-llmstxt — score 88/100 · 2 finding(s)
| Low LL1 | llms.txt is valid and well-served (text/plain, real content) curl -sIL https://thietbinenkhi.vn/llms.txt -> HTTP/1.1 200, Content-Type: text/plain; body begins '# Airtec Compression Equipment Co., Ltd / Official Website: https://thietbinenkhi.vn / Industry: Industrial Air Compressor'. → Already a positive signal — AI crawlers get a clean plain-text brand file (advantage over most competitors). |
| Low LL2 | llms.txt lacks an explicit key-URL section with descriptions Body is a brand description block; no markdown link list of canonical pages (## section with [Title](URL) — short desc) observed in the fetched file. → Adding a key-URL map improves AI answer routing to product/location/quote pages. |
geo-platform-optimizer — score 64/100 · 1 finding(s)
| Medium PL1 | Crawlable + llms.txt valid, but weak entity/citation signal limits AI quoting Positive: SSR content, /llms.txt 200 text/plain valid, AI bots allowed (geo-crawlers 92). Negative: geo-brand-mentions 50 (owned-only), incomplete sameAs (geo-schema). No independent third-party corroboration for AI to cite. → Closing the entity-graph + citation gap raises odds of being quoted in ChatGPT/Perplexity answers for 'máy nén khí trục vít' style queries. |
geo-schema — score 62/100 · 9 finding(s)
| High SC1 | Product aggregateRating mis-typed as lowercase 'aggregateRating' (invalid Schema.org type) https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — grep '"@type":"aggregateRating"' MATCHES; '"@type":"AggregateRating"' = ABSENT. Node: {"ratingValue":"4.9","ratingCount":"369","@type":"aggregateRating"} → Schema.org types are case-sensitive; 'aggregateRating' is not a valid type, so validators/AI parsers may discard the rating. Loses review-snippet eligibility and AI trust signal. |
| High SC2 | Self-serving aggregateRating (4.9/369) attached to placeholder-priced Offer with generic review author https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — '"ratingValue":"4.9"' + '"ratingCount":"369"' co-occur with Offer '"price":"1000000"','"priceCurrency":"VND"' (placeholder ~1M VND for a 37kW industrial compressor) and Review author @id 'https://thietbinenkhi.vn/author/ecommerce/' name 'ecommerce'. → Google's 2024+ enforcement penalizes self-serving on-product reviews with no verifiable source; 369 reviews from a generic 'ecommerce' author on a placeholder price reads as fabricated and risks manual action / loss of all rich results, plus erodes AI citation trust. |
| High SC3 | LocalBusiness missing geo/GeoCoordinates and hasMap (local entity incomplete) https://thietbinenkhi.vn (and /lien-he/) — LocalBusiness node keys = [@type,@id,name,url,sameAs,email,address,logo,priceRange,openingHours,location,image,telephone]. grep 'GeoCoordinates' = 0; grep 'hasMap' = 0; node.geo = ABSENT. → For a local industrial distributor, lat/long + hasMap are primary signals for local AI search (Gemini, Maps, Perplexity local). Their absence weakens local entity disambiguation and map pack association. |
| Medium SC4 | Weak sameAs entity graph — single Facebook link only https://thietbinenkhi.vn — LocalBusiness '"sameAs":["https://www.facebook.com/thietbinenkhi.vn"]' (1 link). No Wikidata, Google Maps/Business Profile, YouTube, Zalo, LinkedIn, or industry directory. Homepage Person sameAs = ['https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/'] (internal only). → sameAs is the strongest entity-recognition signal for GEO. A single social link gives AI platforms little to verify/triangulate the entity, lowering citation probability. |
| Medium SC5 | Entity model inconsistency: Person node named with a company name ('Airtec Compression., Ltd') https://thietbinenkhi.vn — {"@type":"Person","name":"Airtec Compression., Ltd","sameAs":["https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/"],"worksFor":{"@id":"https://thietbinenkhi.vn/#organization"}}. A Ltd company is typed as Person. → Mis-typing an organization as a Person confuses entity graphs and dilutes E-E-A-T/author signals AI relies on. Article author resolves to a company-as-person. |
| Low SC6 | Opening hours use legacy string array, not openingHoursSpecification; no priceRange context fields https://thietbinenkhi.vn — '"openingHours":["Monday...' (string syntax). node.openingHoursSpecification = ABSENT. priceRange present as '"priceRange":"$$"' but no currenciesAccepted/areaServed/description. → openingHours string form is valid but openingHoursSpecification is the recommended, more reliably parsed structure for AI/local. Missing description/areaServed reduces local context richness. |
| Low SC7 | Duplicate BreadcrumbList on product pages https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — grep -c 'BreadcrumbList' = 2 (two BreadcrumbList blocks, likely Yoast + WooCommerce/theme emitting independently). → Duplicate breadcrumb graphs can produce conflicting trails and validator warnings; AI may pick the wrong path. Low SERP risk but untidy. |
| Low SC8 | Product category pages lack Product/ItemList schema https://thietbinenkhi.vn/dau-may-nen-khi/ — @types present: CollectionPage, BreadcrumbList, ListItem (breadcrumb only), Organization, WebSite. No Product, ItemList, or OfferCatalog enumerating category products. → Category pages are high-value for AI product discovery; without ItemList/Product enumeration, AI cannot extract the product set for these category queries. |
| Low SC9 | FAQPage present — AI citation value only, no Google SERP rich result https://thietbinenkhi.vn — block 1: {"@type":"FAQPage","mainEntity":[Question x3 with Answer x3]}; grep '"@type":"Question"' = 3 (homepage block reports 1 in single grep run; full parse shows 3 Question/3 Answer). → Per Google 2026-05-07, FAQ rich results are fully deprecated (zero SERP lift). Still useful for AI Q&A extraction (ChatGPT/Perplexity/Gemini). No risk, just no Google reward. |
geo-technical — score 68/100 · 7 finding(s)
| Medium GT1 | All six recommended HTTP security headers absent site-wide curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy' returned 0. Same grep on inner page https://thietbinenkhi.vn/may-nen-khi-10kg-dung-cho-nhu-cau-nao/ also returned 0. Response headers contained only: Server: LiteSpeed, X-Powered-By: PHP/8.2.31, Content-Type, Link, Vary, alt-svc, Date, Connection, Keep-Alive. → No HSTS (downgrade/SSL-strip exposure), no clickjacking protection (X-Frame-Options/CSP frame-ancestors), no MIME-sniffing protection (X-Content-Type-Options: nosniff), no referrer or permissions policy. Trust/security-signal weakness; not a direct ranking blocker but flagged by security scanners and a baseline expectation for a commercial site handling WooCommerce checkout. |
| Low GT2 | PHP version disclosed in X-Powered-By header curl -sI https://thietbinenkhi.vn/ -> 'X-Powered-By: PHP/8.2.31'. Also 'Server: LiteSpeed'. WordPress version exposed in HTML: <meta name="generator" content="WordPress 7.0">. → Version disclosure aids targeted exploitation of known CVEs. Low direct SEO impact; minor hardening item. |
| Low GT3 | HTTP/2 not negotiated in tests (HTTP/1.1 only); HTTP/3 advertised but unverified Every curl response returned 'HTTP/1.1' (status line on homepage, robots, inner page; curl -w http_version=1.1). The installed libcurl in this environment does not support --http2, so h2 support could not be force-tested. Server advertises HTTP/3 via 'alt-svc: h3=":443"; ma=2592000, h3-29, h3-Q050, quic' but no h3 client available to confirm. → If the origin only serves HTTP/1.1 to crawlers, it loses multiplexing/header-compression benefits for the 9 stylesheets + 13 scripts on the homepage, modestly affecting load performance. Inconclusive evidence — flagged for confirmation, not asserted as a defect. |
| Low GT4 | Low adoption of modern image formats (WebP/AVIF ~17%) Homepage HTML (297KB): grep counts src=*.webp=12, *.avif=0, *.jpg/jpeg=32, *.png=27 -> modern share = 12/71 = ~17%. 31 of 72 <img> tags use loading="lazy". → JPEG/PNG payloads are heavier than WebP/AVIF, increasing transfer weight and LCP risk on image-heavy WooCommerce product/category listings, especially on mobile (Vietnam mobile-first market). CWV/page-speed signal. |
| Low GT5 | No Cache-Control/ETag/Last-Modified on HTML; static-asset TTL only 7 days curl -sI https://thietbinenkhi.vn/ -> grep -ciE 'cache-control' returned 0 (no Cache-Control, ETag, or Last-Modified emitted on the HTML document). Sampled static CSS https://thietbinenkhi.vn/wp-content/plugins/woocommerce/assets/client/blocks/wc-blocks.css returned 'Cache-Control: public, max-age=604800' (7 days) + Expires header. → Absent HTML validators reduce conditional-request efficiency; 7-day static TTL is shorter than the 1-year best practice for versioned/hashed assets, causing more revalidation traffic. Minor performance item. |
| Low GT6 | Render-blocking resources in head (9 stylesheets, 9 of 13 scripts not async/defer) Homepage HTML: 9 <link rel=stylesheet> elements; 13 <script src> elements of which only 4 carry defer/async (9 synchronous). Brotli compression active (Content-Encoding: br). → Render-blocking CSS/JS delays first paint and LCP. Field CWV not measurable here (no CrUX access in this agent), so this is a lab-signal estimate, not a confirmed CWV failure. |
| Low GT7 | IndexNow not implemented (no key file) GET https://thietbinenkhi.vn/.well-known/indexnow-key.txt returned HTTP 301 (redirect, not a 200 key file). No IndexNow key surfaced. → Slower Bing indexing; Bing's index feeds ChatGPT and Copilot, so faster Bing updates aid AI-search visibility. Minor GEO opportunity. |
seo-audit — score 78/100 · 6 finding(s)
| High AU1 | Homepage missing LocalBusiness/Organization schema (present on shop archive only) https://thietbinenkhi.vn/ — grep of homepage ld+json @type returned Person/Place/Article/FAQPage/WebSite/WebPage/ImageObject but NO LocalBusiness or Organization (grep '"@type":"(LocalBusiness|Organization|Store)"' = 0 matches). Contrast: https://thietbinenkhi.vn/san-pham/ DOES emit '"@type":"LocalBusiness"' (1 match). NAP exists in homepage Place schema: streetAddress '1014 Phạm Văn Đồng', telephone '+84944000884'. → For a local distributor, LocalBusiness schema on the homepage is the primary entity-trust signal for Google local/Maps and AI answer engines. The data (NAP) already exists; only the schema wiring is missing on the most important page. |
| High AU2 | Soft-404: non-existent URLs 301-redirect to homepage instead of returning 404 curl https://thietbinenkhi.vn/this-page-does-not-exist-xyz123 returned 'HTTP 301 -> https://thietbinenkhi.vn/' and following the chain ends at the homepage with HTTP 200 and the homepage <title>. A missing URL should return 404/410. → Soft-404s waste crawl budget, can cause Google to index/merge phantom URLs into the homepage, and mask genuinely broken internal/external links. Hurts indexation hygiene on a 400+ URL store. |
| Medium AU3 | No HTTP security/transport headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP) curl -I https://thietbinenkhi.vn returned headers Server: LiteSpeed, X-Powered-By: PHP/8.2.31, but grep for 'strict-transport|x-frame|content-security|x-content-type' returned NO matches. → Missing HSTS leaves a downgrade window despite HTTPS; missing X-Content-Type-Options/X-Frame-Options are minor security/quality signals. Low direct ranking impact but flagged in technical/security audits and trust reviews. |
| Medium AU4 | Homepage has no BreadcrumbList schema https://thietbinenkhi.vn/ — grep 'BreadcrumbList' = 0 matches on homepage, while https://thietbinenkhi.vn/san-pham/ has 2 BreadcrumbList matches. Homepage @graph present but no breadcrumb node. → Breadcrumb structured data drives breadcrumb rich results in SERPs and helps Google/AI understand site hierarchy. Inner pages have it; homepage omission is minor (home is root) but worth consistency. |
| Low AU5 | Two homepage images have empty alt text (alt="") https://thietbinenkhi.vn/ — grep '<img ...alt=""...>' = 2 matches out of 72 total <img> tags; all 72 carry an alt attribute (0 missing the attribute entirely). → Minor. Empty alt is correct for purely decorative images but if these two are content/brand images they lose image-search and accessibility value. |
| Low AU6 | Generator meta reports 'WordPress 7.0' (anomalous / version disclosure) https://thietbinenkhi.vn/ — grep returned '<meta name="generator" content="WordPress 7.0"/>'. WordPress 7.0 is not an expected stable release as of 2026-06-03 (6.x line), suggesting a spoofed/placeholder string or a very new build; either way the generator tag discloses CMS info. → No ranking impact. Minor information-disclosure / fingerprinting surface; the unusual version string may also confuse automated tooling. |
seo-backlinks — score N/A · 1 finding(s)
| Medium BL1 | Backlink authority unmeasured (subscription inactive) — likely thin (indirect) DataForSEO backlinks_summary -> Error 40204 'Access denied. Activate subscription.' Indirect: geo-brand-mentions found only owned Facebook/YouTube/about.me + marketplace, no independent citations. → If confirmed thin, local/industry link building would lift non-branded rankings (cross-check seo-google striking-distance keywords). |
seo-google — score 62/100 · 4 finding(s)
| High SG1 | Highest-volume head term ranks page 1 but outside top 3 — top-3 push is the single biggest traffic lever keyword 'lọc tách dầu máy nén khí' pos 6, search_volume 3600, url https://thietbinenkhi.vn/loc-tach-dau-may-nen-khi/ (DataForSEO); 'máy nén khí trục vít' pos 7, search_volume 2400, url https://thietbinenkhi.vn/may-nen-khi-truc-vit/ (DataForSEO) → These two terms alone carry 6000 monthly searches; moving from pos 6-7 into the top 3 captures the bulk of clicks and roughly 3-5x the ETV currently estimated (121.7 and 61.4 respectively). |
| Medium SG2 | Five keywords with meaningful volume languish beyond position 20 — page-2+ recovery opportunity keyword 'bình nén khí' pos 44, search_volume 480, url https://thietbinenkhi.vn/binh-chua-khi-nen/ (DataForSEO); 'máy sấy khí nén' pos 21, search_volume 260, url https://thietbinenkhi.vn/may-say-khi-nen-la-gi/ (DataForSEO); 'ống dẫn khí' pos 37, search_volume 260, url https://thietbinenkhi.vn/lua-chon-ong-dan-khi-nen-phu-hop/ (DataForSEO) → Recovering these to page 1 adds incremental qualified traffic; 'bình nén khí' (sv 480) is the standout given its volume vs pos 44. |
| Medium SG3 | Top-3 cluster is thin (only 5 of 26) — most visibility sits in the click-poor 4-10 band Only 5 keywords in pos 1-3 vs 14 in pos 4-10; e.g. 'máy nén khí hitachi' pos 8, search_volume 590, url https://thietbinenkhi.vn/may-nen-khi-hitachi-7-5kw-10hp-noi-dia-nhat/ and 'bình khí nén' pos 8, search_volume 590, url https://thietbinenkhi.vn/binh-chua-khi-nen-3000l/ (DataForSEO) → The 4-10 band captures far fewer clicks than top 3; tightening these brand/product terms into top 3 lifts conversion-ready transactional traffic. |
| Low SG4 | Possible URL cannibalisation across compressor/tank/oil clusters URL https://thietbinenkhi.vn/may-nen-khi-truc-vit/ ranks for both 'máy nén khí trục vít' (pos 7) and 'máy nén trục vít' (pos 7); https://thietbinenkhi.vn/thiet-bi-su-dung-khi-nen/ ranks for both 'thiết bị khí nén' (pos 6) and 'khí nén' (pos 12); multiple binh-chua-khi-nen variants rank for tank queries (DataForSEO) → Splitting equity across near-duplicate intents caps how high any single page can climb; consolidation could nudge several pos 6-12 terms toward page-1 top. |
seo-images — score 66/100 · 2 finding(s)
| Medium IM1 | No AVIF and no responsive <picture> sources (WebP only) grep homepage tmp_home.html: 2 .webp, 0 .avif, 0 <picture>, 0 <source type=image/...>. WebP is good but AVIF + srcset would cut bytes further on mobile. → Smaller images on modern browsers; faster mobile LCP. |
| Low IM2 | og:image is a real banner photo (positive) grep og:image -> content='https://thietbinenkhi.vn/wp-content/uploads/2024/09/banner.webp' (a product/brand banner, not a square logo). → Better share/citation CTR than a logo-only preview. |
seo-local — score 55/100 · 2 finding(s)
| High LO1 | Google Business Profile not confirmed via API — verify it exists + is claimed DataForSEO business_listings_search (title 'thietbinenkhi.vn Airtec', category 'Air compressor supplier') returned items: []. Facebook page lists 'Ho Chi Minh City' but no GBP entity surfaced. → A claimed, complete GBP is the single biggest local-pack/Maps lever for a B2B equipment supplier. |
| Medium LO2 | local-sitemap + location pages minimal (1 URL) curl local-sitemap.xml -> 1 <loc>. For a supplier with showroom/branch(es), each location needs its own page + LocalBusiness schema (cross-check geo-schema). → Per-location pages + schema improve 'gần đây / near me' and city-level visibility. |
seo-maps — score N/A · 1 finding(s)
| Medium MP1 | Map-pack / geo-grid standing unmeasured DataForSEO business_listings_search returned items:[] for the brand/category — no GBP place_id available to run a geo-grid. No Maps rank data captured. → Once a GBP is confirmed/claimed (seo-local LO1), a geo-grid will quantify map-pack visibility across the service area. |
seo-page — score 78/100 · 6 finding(s)
| Medium PG1 | Contact page has no H1 https://thietbinenkhi.vn/lien-he/ — grep '<h1\b' returns 0; first rendered heading is an empty tag then the business name 'CÔNG TY TNHH THIẾT BỊ NÉN KHÍ AIRTEC' appears in a lower-level heading. H1 count = 0. → Missing H1 weakens topical relevance signal and accessibility on the primary conversion page. Localized lead-gen pages should declare a clear H1 (e.g. 'Liên hệ Thiết Bị Nén Khí Airtec'). |
| Medium PG2 | Category & shop archives skip heading levels (H1 then H3, no H2) https://thietbinenkhi.vn/dau-may-nen-khi/ — H1=1, H2=0, H3=3. https://thietbinenkhi.vn/san-pham/ — H1=1, H2=0, H3=3. Heading structure jumps H1->H3 with no intervening H2. → Broken heading hierarchy reduces semantic clarity for crawlers and assistive tech on the highest-traffic commercial templates (product archives). |
| Low PG3 | Product title tag exceeds SERP display width (91 chars) https://thietbinenkhi.vn/may-nen-khi-kobelco-37kw/ — <title> = 'Máy Nén Khí Kobelco 37kw (50hp) Nội địa Nhật Mới 95% [2026] » Thiết Bị Nén Khí Airtec', length 91 chars. Compare homepage 58, category 54, shop 56 (all within range). → Title will truncate around 60 chars / ~600px in Google SERPs, hiding the brand suffix and reducing the clickable signal. The duplicated brand suffix '» Thiết Bị Nén Khí Airtec' on the product template is the main overflow source. |
| P4 PG4 | Decorative/logo/background images carry empty alt attributes https://thietbinenkhi.vn/ — 2 of 72 imgs have alt="" including logo-thiet-bi-nen-khi-airtec.webp and bg2.webp. Same 2-3 empty-alt pattern on /dau-may-nen-khi/ (2), /may-nen-khi-kobelco-37kw/ (3), /may-nen-khi-10kg-dung-cho-nhu-cau-nao/ (3), /ve-ceo-dao-trung-kien/ (2). → Low. Empty alt on decorative backgrounds is technically acceptable, but the logo image should carry descriptive alt (brand name) for image search and accessibility. Net image alt coverage is otherwise 100% (every <img> has an alt attribute on all 7 sampled pages). |
| P4 PG5 | About/CEO page meta description is short (73 chars) https://thietbinenkhi.vn/ve-ceo-dao-trung-kien/ — meta description = 'Giới thiệu về CEO Đào Trung Kiên của Công ty TNHH Thiết Bị Nén Khí Airtec', 73 chars vs ~120-160 used on other sampled pages (homepage 143, product 152, blog 162). → Under-uses available SERP snippet width; misses a chance to add E-E-A-T/authority context for an author/entity page that supports E-E-A-T signals. |
| P4 PG6 | No hreflang annotations (single-language site) All 7 sampled URLs — grep 'hreflang' returns 0 matches on each (homepage, /dau-may-nen-khi/, /may-nen-khi-kobelco-37kw/, /san-pham/, /may-nen-khi-10kg-dung-cho-nhu-cau-nao/, /ve-ceo-dao-trung-kien/, /lien-he/). → Informational only. Site is Vietnamese single-locale; hreflang is not required. Flag for awareness if international/multi-locale expansion is ever planned. |
seo-performance — score 70/100 · 3 finding(s)
| Medium PF1 | High server response time (TTFB ~1.04s) Lighthouse server-response-time numericValue=1042ms (target <600ms). network-server-latency=167ms — so the delay is app/origin (PHP/DB), not network. → TTFB directly delays LCP; cutting it ~400ms would likely pull LCP under 2.5s. |
| Medium PF2 | Speed Index 10.5s — render-blocking builder CSS/JS Lighthouse speed-index numericValue=10542ms despite ~1MB page; WordPress stackpack flags render-blocking-resources + unused-css/js. mainthread-work-breakdown=1548ms. → Faster visual completeness; better perceived load on mobile. |
| Low PF3 | LCP 2.77s — marginally above the 2.5s 'good' threshold Lighthouse largest-contentful-paint numericValue=2765ms (lab desktop). CLS 0.003 and TBT 1ms are already excellent. → Pulling LCP under 2.5s (mostly via TTFB fix PF1) earns the 'good' CWV bucket. |
seo-sitemap — score 80/100 · 2 finding(s)
| Low SM1 | Clean, typed sitemap index with local sitemap present curl /sitemap_index.xml (200) lists post-sitemap (241 loc), product-sitemap (181), product_cat (34), page (9), pa_thuong-hieu (5), category (4), local-sitemap (1). robots.txt declares Sitemap: https://thietbinenkhi.vn/sitemap_index.xml. → Good crawl efficiency; typed segmentation helps Google prioritize product vs blog. |
| Medium SM2 | local-sitemap lists only 1 URL — verify all locations are covered curl local-sitemap.xml -> 1 <loc>. If the business has multiple branches/locations, each LocalBusiness/location page should be present. → Missing location URLs weaken per-location local visibility. |
seo-visual — score 74/100 · 6 finding(s)
| Medium V1 | Redundant triple Font Awesome stylesheet bundle (render-blocking) 3 of 9 render-blocking stylesheets are Font Awesome: 'https://use.fontawesome.com/releases/v6.6.0/css/all.css', '/wp-content/uploads/font-awesome/v6.6.0/css/svg-with-js.css', and 'https://use.fontawesome.com/releases/v6.6.0/css/v4-shims.css'. all.css + svg-with-js are two competing delivery modes for the same icon set. → Reduces render-blocking CSS chain and external connections, improving first paint / LCP on mobile. |
| Medium V2 | LCP hero image flagged fetchpriority=high but not preloaded LCP candidate '<img fetchpriority="high" ... src=".../hitachimobile.webp" width="700" height="889" srcset=...>' is present, but source grep found 0 '<link rel="preload" as="image">' entries. → A matching image preload (with imagesrcset) lets the browser discover the LCP asset earlier, typically shaving LCP on slower mobile connections. |
| Low V3 | Google Fonts delivered via render-blocking external CSS link Stylesheet '//fonts.googleapis.com/css?family=Oswald:regular,700|Roboto:...&display=swap' is a render-blocking <link rel=stylesheet>. A preconnect to fonts.gstatic.com exists, but display=swap implies a fallback-then-swap reflow window. → Reduces font-driven render delay and potential FOUT/CLS on text above the fold. |
| Low V4 | No web-font preload for self-hosted icon font Self-hosted 'fl-icons.woff2' referenced inside flatsome.css (url(...fl-icons.woff2)); source grep found 0 '<link rel=preload as=font>' entries. → Minor: preloading the icon font reduces late-discovery flash of unstyled icons in the header/nav. |
| Low V5 | A minority of images lack explicit width/height (CLS hygiene) Of 72 <img> tags: 67 declare width, 65 declare height. ~5-7 images omit one or both dimension attributes. (No measured CLS — not flagging P1/P2 without trace data.) → Adding intrinsic dimensions to the remaining images prevents late layout shift as they load. |
| Low V6 | Lazy-load relies on JS data-src SVG-placeholder swap 31 images use loading=lazy AND a perf-plugin pattern: 'src="data:image/svg+xml,..." data-src="https://.../airman-mobile.webp"'. If lazy JS fails or is delayed, these images stay as blank SVG placeholders. → Native loading=lazy alone would be more robust; the JS-dependent swap adds a failure mode and main-thread work. Hero (IMG2) is correctly excluded from lazy-load. |