thietbinenkhi.vn — SEO + GEO Audit

URL: https://thietbinenkhi.vn/ Date: 2026-06-03 Duration: 30m 1s Business: Local Market: Vietnam · Vietnamese Mode: first Kit: Claude-Growth v1.0.17 T1 · GSC + DataForSEO MCP + Firecrawl MCP + WordPress MCP
Technical + CWV
71 /100
Fair
GEO + AEO
62 /100
Fair
Overall Search-Readiness
63 /100
Fair
68 Technical
62 Schema
80 Sitemap
70 Performance
64 GEO
64 Platform
50 Brand
66 Image
55 Local
74 Accessibility
38 Compliance
78 Audit Health
62 GSC / Google
78 On-Page
74 Visual

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

#1

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...

→ Fix: 4h · Closes the largest compliance gap: consent-before-tracking under Vietnam PDPD an
#2

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.

→ Fix: 4h · A claimed, complete GBP is the single biggest local-pack/Maps visibility lever f
#3

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...

→ Fix: 12h · These two terms alone carry ~6,000 monthly searches; top-3 captures the bulk of

Quick Wins — Shippable This Week

9.0h total

6 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/100

Overall 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

P1: 7 P2: 10 P3: 6

Priority breakdown by severity — 23 findings total

The 3 Biggest Problems

  1. Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP presentHomepage grep: 'googletagmanager.com/gtag/js?id=G-E825PM2WJS' + gtag('config','G-E825PM2WJS') present in HTML; consent-l...
  2. Google Business Profile not confirmed via API — verify it exists and is claimedDataForSEO business_listings_search (title 'thietbinenkhi.vn Airtec', category 'Air compressor supplier') returned items...
  3. Highest-volume head terms rank page 1 but outside top 3 — top-3 push is the biggest traffic leverDataForSEO: '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

CategoryScoreWeightWeightedRating
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

CompositeScoreRatingFormula
Technical + Core Web Vitals71/100FairTechnical*0.45 + Performance*0.35 + Sitemap*0.20...
GEO + AEO Readiness62/100FairGeo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12...
Overall Search-Readiness63/100FairTechnical*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.

0_setup
Setup
2s
1_discovery
Live Discovery
3s
2_sampling
Page Sampling
2s
3_issues
Issue Catalog Scan
3s
4_agents
Parallel Agents
23m46s
5_synthesis
Synthesis
6m5s
6_score
Score Calculation
0s
6.5_verification
Verification (10 gates)
0s
7_deliverable
Deliverable Generation
0s
8_pdf
PDF Generation
0s
9_cleanup
Cleanup
0s

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
Why this tool:

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
Why this tool: Off-site brand authority scan (Reddit/YouTube/Wikipedia/LinkedIn)

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
Why this tool:

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
Why this tool: AI bot robots.txt audit (11 bots)

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
Why this tool: llms.txt validate + generate

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
Why this tool: Per-platform readiness (AIO/ChatGPT/Perplexity/Gemini/Copilot)

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
Why this tool: Winner over seo-schema — sameAs 14-platform strategy, per-type GEO rules

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
Why this tool: Winner over seo-technical — 449 lines, SSR 15pt dedicated, 11-bot matrix

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
Why this tool: Master orchestrator — 15 subagents, 500-page crawl, built-in PDF

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
Why this tool: Profile health + toxic links + authority gap

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
Why this tool:

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
Why this tool:

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
Why this tool:

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
Why this tool:

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
Why this tool:

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
Why this tool: Core Web Vitals + field vs lab data

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
Why this tool: Sitemap health + URL structure analysis

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
Why this tool:

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 issues

These issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

C1

Your site tracks visitors with Google Analytics before asking permission, and has no cookie banner

High

Google 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.

4h (M) HIGH Closes the largest compliance gap: consent-before-tracking under Vietnam PDPD and GDPR for EU traffic.

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.
Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present
compliance
geo-compliance
C2

The privacy policy is thin and does not cite Vietnam's data-protection law or list visitor rights

High

Your 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.

5h (M) HIGH Reduces PDPD/GDPR enforcement exposure and strengthens the transparency/E-E-A-T signal.

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).
Privacy policy lacks GDPR/CCPA references and explicit PDPD statutory clauses
compliance
geo-compliance
C3

No Google Business Profile could be found — claiming one is the biggest local-search win available

High

A 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.

4h (M) MEDIUM A claimed, complete GBP is the single biggest local-pack/Maps visibility lever for a B2B equipment supplier.

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.
Google Business Profile not confirmed via API — verify it exists and is claimed
local
seo-local
C4

Product pages show a 4.9-star / 369-review rating on a fake placeholder price with no real reviewer

High

Product 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.

4h (M) HIGH Removes manual-action risk and restores legitimate rich-result eligibility plus AI citation trust.

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'.
Self-serving aggregateRating (4.9/369) on placeholder-priced Offer with generic review author
schema
geo-schema
C5

A capitalization typo makes the product star-rating markup invalid

High

The 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).

1h (S) HIGH Restores review-snippet eligibility and AI parse-ability for legitimately-reviewed products.

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"}.
Product aggregateRating mis-typed as lowercase 'aggregateRating' (invalid Schema.org type)
schema
geo-schema
C6

Your local-business markup is missing map coordinates and a map link, the strongest local AI signals

High

The 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).

2h (S) HIGH Adds primary local-entity signals for Maps association and local AI search (Gemini, Perplexity local).

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.
LocalBusiness schema incomplete (no geo/GeoCoordinates, no hasMap); homepage wiring inconsistent
schema
geo-schema
C7

Your best keywords sit at positions 5-7 — pushing them into the top 3 multiplies traffic

High

Several 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.

12h (M) HIGH These two terms alone carry ~6,000 monthly searches; top-3 captures the bulk of clicks (~3-5x current ETV).

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.
Highest-volume head terms rank page 1 but outside top 3 — top-3 push is the biggest traffic lever
google-api
seo-google

Medium Priority — Fix within 1 month

10 issues

These improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

H1

The site is missing standard security headers like HSTS and clickjacking protection

Medium

None 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.

2h (S) HIGH Closes downgrade/clickjacking/MIME-sniffing exposure and a baseline security-signal gap for a checkout-handling site.

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.)
All recommended HTTP security/transport headers absent site-wide (incl. no HSTS)
technical
geo-technical
H2

Broken or mistyped URLs silently redirect to the homepage instead of showing a 'not found' page

Medium

When 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.

3h (M) HIGH Improves indexation hygiene and crawl-budget efficiency; surfaces real broken links.

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.
Soft-404: non-existent URLs 301-redirect to homepage instead of returning 404
audit
seo-audit
H3

Your server takes about a second to start responding, which delays the whole page

Medium

The 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.

5h (M) HIGH Cutting TTFB ~400ms would likely pull LCP under 2.5s into the 'good' CWV 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).
High server response time (TTFB ~1.04s)
performance
seo-performance
H4

The page takes about 10 seconds to look visually complete due to heavy CSS/JS

Medium

Although 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.

6h (M) HIGH Faster visual completeness and better perceived load 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.
Speed Index 10.5s — render-blocking builder CSS/JS
performance
seo-performance
H5

AI engines and Google have little independent proof your brand exists beyond your own pages

Medium

Your 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.)

16h (L) HIGH More independent citations + a richer sameAs graph strengthen E-E-A-T, AI citation likelihood, and non-branded rankings.

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).
Brand authority concentrated on owned channels; weak sameAs entity graph and few independent citations
brand
geo-brand-mentions
H6

Your markup labels the company as a 'person', confusing how Google and AI understand authorship

Medium

The 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.

2h (S) HIGH Cleaner entity/author signal for E-E-A-T and AI attribution.

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.
Entity model inconsistency: Person node named with a company name ('Airtec Compression., Ltd')
schema
geo-schema
H7

The page's main heading comes last in the code, so screen readers and AI read the structure out of order

Medium

In 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.

4h (M) HIGH Correct document outline for 100% of screen-reader users and for AI topic extraction.

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.
Broken heading hierarchy: H1 appears last in source order, headings start at H3
accessibility
geo-accessibility
H8

The contact page has no main heading, and product-listing pages skip a heading level

Medium

The 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.)

2h (S) HIGH Restores semantic clarity on the contact conversion page and the highest-traffic commercial archive templates.

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).
Contact page has no H1; category & shop archives skip from H1 to H3 (no H2)
page-deep-dive
seo-page
H9

Most images are still heavier JPEG/PNG, with no next-gen AVIF format

Medium

Only 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.)

4h (M) HIGH Smaller image payloads and faster mobile LCP on product/category listings.

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/...>.
Low modern-image-format adoption (WebP only, ~17%); no AVIF, no responsive <picture> sources
image
geo-technical
H10

Some valuable keywords are stuck on page 2+, partly because similar pages compete with each other

Medium

Five 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.)

8h (M) HIGH Recovering page-2 terms and consolidating cannibalised clusters lifts incremental qualified traffic.

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.
Several keywords languish beyond position 20 and top-3 cluster is thin; possible cannibalisation
google-api
seo-google

Low Priority — Backlog

6 issues

Nice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

L1

The site reveals its PHP and WordPress versions, and the WordPress version string looks wrong

Low

The 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.)

1h (S) HIGH Reduces version-disclosure / fingerprinting attack surface.

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"/>.
PHP and WordPress version disclosed (X-Powered-By + generator 'WordPress 7.0')
technical
geo-technical
L2

The main content appears at 2.77 seconds, just over Google's 'good' speed cutoff

Low

The 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.

2h (S) HIGH Pulling LCP under 2.5s earns the 'good' CWV bucket (mostly via the TTFB fix).

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.
LCP 2.77s — marginally above the 2.5s 'good' threshold
performance
seo-performance
L3

Your privacy policy is hidden from search engines

Low

The 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.

1h (S) HIGH Restores discoverability/transparency of the legal notice and its AI-crawler citability.

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"/>.
Privacy policy page is set to noindex,nofollow
compliance
geo-compliance
L4

Your address differs between the website and your social profiles, and you have only one location page

Low

The 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.)

4h (M) MEDIUM Consistent NAP + per-location pages improve 'gần đây / near me' and city-level local visibility and Maps matching.

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>.
NAP address inconsistency between on-site schema and off-site profiles; location pages minimal (1 URL)
local
seo-local
L5

Your AI-guidance file works but could route AI engines to your key pages more precisely

Low

Your 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.)

2h (S) MEDIUM Improves AI answer routing to product/category/location/quote pages.

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.
llms.txt valid but lacks an explicit key-URL section with descriptions
geo
geo-llmstxt
L6

Minor structured-data cleanups: opening-hours format, duplicate breadcrumbs, missing product lists on category pages

Low

Three 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.)

4h (M) MEDIUM Cleaner, more reliably parsed local + product-discovery schema for AI/Google.

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.
LocalBusiness opening hours use legacy string array; product pages emit duplicate BreadcrumbList; category pages lack ItemList
schema
geo-schema

Technical Deep Dive

68/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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/100

Rating: 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:

  1. the contact page /lien-he/ has zero H1;
  2. 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/100

Rating: 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.

Citability(64)Brand(50)Platform(64)Crawler(92)llms.txt(88)Schema AI(62)Answer(0)

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.

Perplexity
66
ChatGPT
65
Bing Copilot
64
Gemini
62
Google AI Overviews
60

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.

QueryPositionImpressionsClicks
400
400
500
500
600
600
600
600
700
700
800
800

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.

Weeks 1-2 (Critical)
Weeks 3-6 (Schema + Perf)
Weeks 7-12 (Authority + Content)
P0 Critical fixes
P1 High fixes
P2 Medium fixes
Content expansion
Internal links
Authority building

What ships each window

Weeks 3-6 · P1
  • 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
Weeks 7-12 · P2
  • 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

MilestoneProjected ScoreDelta
Current baseline63/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.

🤖 AUTO-SAFE (upload directly) — 1 fixes
L5 · llms.txt valid but lacks an explicit key-URL section with descriptions manual-guide
👁️ AUTO-REVIEW (review carefully first) — 12 fixes
C5 · Product aggregateRating mis-typed as lowercase 'aggregateRating' (invalid Schema.org type) manual-guide
C6 · LocalBusiness schema incomplete (no geo/GeoCoordinates, no hasMap); homepage wiring inconsistent manual-guide
H1 · All recommended HTTP security/transport headers absent site-wide (incl. no HSTS) manual-guide
H2 · Soft-404: non-existent URLs 301-redirect to homepage instead of returning 404 manual-guide
H3 · High server response time (TTFB ~1.04s) manual-guide
H4 · Speed Index 10.5s — render-blocking builder CSS/JS manual-guide
H6 · Entity model inconsistency: Person node named with a company name ('Airtec Compression., Ltd') manual-guide
H9 · Low modern-image-format adoption (WebP only, ~17%); no AVIF, no responsive sources manual-guide
L1 · PHP and WordPress version disclosed (X-Powered-By + generator 'WordPress 7.0') manual-guide
L2 · LCP 2.77s — marginally above the 2.5s 'good' threshold manual-guide
L3 · Privacy policy page is set to noindex,nofollow manual-guide
L6 · LocalBusiness opening hours use legacy string array; product pages emit duplicate BreadcrumbList; category pages lack ItemList manual-guide
📋 MANUAL (step-by-step guides) — 10 fixes
C1 · Google GA4 (gtag.js) fires pre-consent with no cookie-consent banner / CMP present manual-guide
C2 · Privacy policy lacks GDPR/CCPA references and explicit PDPD statutory clauses manual-guide
C3 · Google Business Profile not confirmed via API — verify it exists and is claimed manual-guide
C4 · Self-serving aggregateRating (4.9/369) on placeholder-priced Offer with generic review author manual-guide
C7 · Highest-volume head terms rank page 1 but outside top 3 — top-3 push is the biggest traffic lever manual-guide
H5 · Brand authority concentrated on owned channels; weak sameAs entity graph and few independent citations manual-guide
H7 · Broken heading hierarchy: H1 appears last in source order, headings start at H3 manual-guide
H8 · Contact page has no H1; category & shop archives skip from H1 to H3 (no H2) manual-guide
H10 · Several keywords languish beyond position 20 and top-3 cluster is thin; possible cannibalisation manual-guide
L4 · NAP address inconsistency between on-site schema and off-site profiles; location pages minimal (1 URL) 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/9

Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).

GateCheckStatusDetail
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 patterns
  • references/business-type-sampling.md — 5 types × 8 priority pages
  • references/composite-formula.md — 9 weights + 5-tier rubric
  • references/pdf-spec.md — Times New Roman + 7 charts
  • references/verification-checklist.md — 10 Phase 6.5 gates
  • references/skill-routing.md — winner-per-pair matrix
  • references/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 A1Broken 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 A2outline: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 A3Meaningful 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 A4Lighthouse 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 BM1Brand 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 BM2sameAs / 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 CP1Google 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 CP2Privacy 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 CP3Privacy 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 CP4No 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 CP5Cookie 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 CR1All 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 CR2Tier 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 CR3No 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 CR4Valid 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 LL1llms.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 LL2llms.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 PL1Crawlable + 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 SC1Product 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 SC2Self-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 SC3LocalBusiness 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 SC4Weak 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 SC5Entity 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 SC6Opening 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 SC7Duplicate 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 SC8Product 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 SC9FAQPage 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 GT1All 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 GT2PHP 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 GT3HTTP/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 GT4Low 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 GT5No 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 GT6Render-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 GT7IndexNow 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 AU1Homepage 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 AU2Soft-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 AU3No 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 AU4Homepage 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 AU5Two 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 AU6Generator 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 BL1Backlink 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 SG1Highest-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 SG2Five 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 SG3Top-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 SG4Possible 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 IM1No 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 IM2og: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 LO1Google 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 LO2local-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 MP1Map-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 PG1Contact 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 PG2Category & 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 PG3Product 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 PG4Decorative/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 PG5About/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 PG6No 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 PF1High 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 PF2Speed 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 PF3LCP 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 SM1Clean, 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 SM2local-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 V1Redundant 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 V2LCP 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 V3Google 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 V4No 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 V5A 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 V6Lazy-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.