YANH Ratchawat · Website audit · 5 ตุลาคม 2026 · ฉบับแปลภาษาไทย

รายงานตรวจสอบเว็บไซต์ YANH Hotel — SEO, AEO, Metadata, Content และ Structure

แปลครบทุกหัวข้อ ทุกตาราง ทุกแถว จากต้นฉบับ 15 หน้า · คงศัพท์เทคนิค, URL, โค้ด และชื่อหน้าเว็บไว้เป็นภาษาอังกฤษ · ข้อความ title/description ภาษาอังกฤษที่ผู้ตรวจเสนอให้ใช้บนหน้า EN คงไว้ตามต้นฉบับพร้อมคำแปล (ตัวเอียง) · ภาคผนวกคำอธิบายศัพท์เป็นส่วนที่ผู้แปลเพิ่มเติม

81 URL (27 หน้า × EN/TH/ZH) P1 ≈ 6 วันนักพัฒนา 24 รายการในแผนปฏิบัติการ อัปเดตสถานะการแก้ไข + ผลทดสอบ 26 ต.ค. 2026
สารบัญ
  1. สถานะการแก้ไข (26 ต.ค.)
  2. เทียบกับ PDF ทีละข้อ
  3. สรุปสำหรับผู้บริหาร
  4. Technical SEO และการ crawl
  5. Metadata
  6. Structured data และ entity
  7. AEO / การมองเห็นบน AI
  8. Content
  9. Structure และ UX
  10. แผนปฏิบัติการ
  11. แหล่งข้อมูล
  12. คำอธิบายศัพท์
00 · อัปเดต 26 ตุลาคม 2026

สถานะการแก้ไข

สรุปงานที่ทำไปแล้วหลังได้รับ audit: แก้เหตุรูปเสียทั้งเว็บที่ WAF (ขึ้นระบบแล้วทั้ง prod และ UAT) และแก้โค้ด P1 รอบแรกบน branch feature/seo-audit ซึ่งmerge เข้า dev แล้ว แต่ยังไม่ deploy — canonical ภาษาไทย/จีน (T1, T4) ตัดสินใจและแก้แล้ว 21 ต.ค. SEO แยกตามภาษา (Option A) ตัดสินใจและเขียนโค้ดครบ 3 repo แล้ว 21 ต.ค. ลิงก์จอง (#7) แก้แล้ว 21 ต.ค. และ noindex ของ UAT (T3) แก้แล้ว 22 ต.ค.

887/887
รูปจาก CMS บน prod โหลดได้หลังแก้ WAF (เดิม 403 ทั้งหมด)
812/812
รูปบน UAT โหลดได้หลังแก้ WAF
58 → 443
จำนวนคำใน HTML จาก server ของหน้าแรก (EN)
114/116
เทสใน Chrome (19 หน้า, hero, จอ 6 ขนาด, drawer, ลิงก์จอง) — 2 ข้อที่เหลือเป็นตามดีไซน์
9.1 → 3.7 วิ
LCP หน้าแรกบนมือถือ (Slow 4G) หลังงาน Performance #15 · CLS 0.80 → 0
9.9 → 1.2 MB
น้ำหนักหน้าแรกบนมือถือ (prod วันนี้ → preview) · desktop 9.5 → 2.0 MB เมื่ออัปโหลดวิดีโอที่บีบอัดแล้ว
7
commit บน feature/seo-audit (web 4 · api 2 · cms 1) · push และ merge เข้า dev / develop แล้ว 26 ต.ค.
0
เรื่องที่รอตัดสินใจ — P1 ฝั่งโค้ดครบแล้ว

1) เหตุด่วน: รูปจาก CMS เสียทั้งเว็บ — แก้แล้ว ขึ้นระบบแล้ว

อาการ: รูปห้อง F&B บล็อก และ facility บน www.yanhhotel.com ไม่ขึ้น ส่วนรูป static ของเว็บยังปกติ (ไม่เกี่ยวกับ audit แต่เจอระหว่างตรวจ)

สาเหตุ (ยืนยันจาก Cloud Logging): Cloud Armor rule 10000 ส่วน rfi-v33-stable signature owasp-crs-v030301-id931130-rfi เริ่มบล็อกทุก request ที่ query string มี URL แบบ https:// — Next.js ย่อรูปผ่าน /_next/image?url=https://storage.googleapis.com/... จึงโดนทุกรูป

เวลา (UTC)สิ่งที่เกิด
ถึง 16 ต.ค. 05:00รูปผ่าน WAF ปกติ 100% (ไม่มีการบล็อกเลย)
16 ต.ค. 05:12 – 17 ต.ค. 05:04ผ่านบ้าง โดนบ้าง ปนกันข้ามหลาย IP — ลักษณะการทยอย rollout
ตั้งแต่ 17 ต.ค. 05:05โดนบล็อก 100% (13–20 ต.ค. บล็อก 4,863 ครั้ง จาก 349 IP)
20 ต.ค. 14:49 → มีผล 14:52เพิ่ม rule 9700 บน policy prod scx-yanhhotel-prod-waf-bkk-001
21 ต.ค. 08:35 → มีผล 08:36เพิ่ม rule 9700 บน policy UAT scx-yanhhotel-dev-waf-bkk-001 (regex รวม files-uat.yanhhotel.com)

ฝั่งเราไม่มีใครแก้ policy ตั้งแต่ 30 ก.ค. ไม่มี admin activity ใน project ช่วง 14–18 ต.ค. และเว็บ deploy ครั้งล่าสุดคือ 28 ก.ย. — สรุปว่าเป็นการอัปเดต signature ฝั่ง Google (อนุมานจากรูปแบบใน log ยังไม่พบประกาศทางการ)

rule 9700 (action allow, มาก่อน rule 10000) อนุญาตเฉพาะคำขอย่อรูปที่ชี้ไปโดเมนรูปของเราเท่านั้น และไม่ผูก host ของเว็บ (บทเรียนจาก rule 9600 ที่พังตอน go-live):

request.path == "/_next/image" && request.method == "GET" &&
request.query.matches("^url=https%3A%2F%2F(?:storage\\.googleapis\\.com|files(?:-prod-gcp)?\\.yanhhotel\\.com)%2F[^&]+&w=[0-9]+&q=[0-9]+$")
ผลตรวจหลังแก้: prod รูปจาก 8 หน้าหลัก 887/887 URL ได้ 200 · UAT 812/812 · WAF ยังบล็อก URL ใน query ของหน้าอื่น, โดเมนรูปที่ไม่รู้จัก และ query ที่มีพารามิเตอร์แปลกปลอมเหมือนเดิม
ถ้าเพิ่มโดเมนรูปใหม่ในอนาคต ต้องเพิ่มทั้งใน next.config.ts (images.remotePatterns) และใน regex ของ rule 9700 ทั้ง prod และ UAT

2) แก้โค้ด P1 รอบแรก — branch feature/seo-audit (merge เข้า dev แล้ว · รอ deploy)

Branch แตกจาก origin/uat (bf66065 = โค้ดที่ deploy อยู่) เพราะ dev ตามหลัง uat 27 commits · ผลตรวจ: tsc 0 error, eslint 0 error 0 warning, next build ผ่าน, runtime check กับ API prod ผ่าน 48/48, review diff ครบ · ลิงก์จองและรูปแบบ title ที่ให้คงไว้ เทียบกับ prod แล้วไม่เปลี่ยน · hreflang เหมือน prod ทุกตัว

Auditสิ่งที่แก้สถานะ
T1 / #1, T4 / #4ทุกหน้า canonical เป็น URL ของตัวเองในภาษาของตัวเอง (/th/our-story → /th/our-story เดิมชี้ /en/our-story) — เว็บเลิกอ่าน Canonical URL จาก CMS ซึ่งเป็นค่าเดียวที่ฝัง /en/ · canonical ที่ชี้หน้า 404 (/en/blog-and-review, /en/media-influencer-request) หายไปด้วย · og:url และ url ใน JSON-LD ตรงกับ canonical · hreflang ไม่เปลี่ยน (ตัดสินใจ 21 ต.ค.)แก้แล้ว · รอ deploy
#8 SEO แยกภาษา (Option A)yanh-api: เพิ่ม meta_title/meta_description/meta_keywords ในตารางแปลภาษา 16 ตาราง (เก็บคอลัมน์เดิมไว้ rollback) · service เขียน SEO ลงแถวของ languageCode · duplicate ภาษาใหม่ไม่คัดลอก SEO · SQL ย้ายข้อมูลเดิมตามอักษรที่เขียน (ไทย → TH, อื่นๆ → EN) + preview · แก้ DTO ห้องพักที่ไม่รับ metaImage
yanh-cms: การ์ด SEO กลาง (SeoFields/SeoDetailFields) แทน 15 ชุดที่ copy · Title/Description/Keywords แยกตามภาษา (ไอคอนลูกโลก) · เพิ่มการ์ด SEO ให้ห้องพัก · ความยาวแบบ Bridge: แนะนำ 60–70 / 140–175 เตือนสีเหลือง บังคับแค่ 255/500
yanh-web: อ่าน SEO จากแถวภาษาของหน้า ถ้าว่างใช้ชื่อหน้าภาษานั้น + suffix ตาม PDF (Rooms | YANH Ratchawat Hotel, Bangkok, ห้องพัก | โรงแรมย่าน ราชวัตร ดุสิต กรุงเทพฯ, 客房 | YANH Ratchawat 曼谷酒店) · หน้า privacy/terms อ่าน ogImage ได้แล้ว
แก้แล้ว · รอ migrate + deployลำดับ: preview → backup → migrate → ย้ายข้อมูล → API → CMS ทันที → เว็บ
#7 ลิงก์จองทุกลิงก์ไป SiteMinder (การ์ดห้อง, หน้าห้อง, header, banner, ลิงก์จาก CMS) ผ่าน LocaleLink → ตัดวันที่เก่า 29–31 ก.ค. ออก · ใส่ภาษาตามหน้า (th / zh-CN / en) และ currency=THB · คง rateId/จำนวนผู้เข้าพักเดิม · ใส่วันนี้→พรุ่งนี้ (เวลาไทย) ในเบราว์เซอร์หลังโหลดหน้า (HTML จาก server ไม่มีวันที่) · ส่ง event booking_click เข้า dataLayer · date picker ใน header เลื่อนไปทำทีหลังแก้แล้ว · รอ deployก่อน deploy: ลองสลับภาษาไทย/จีนใน engine ว่า property เปิดไว้
Hydration error (เจอตอนเทส)หน้ารายการห้อง, F&B และการ์ด blog/ย่าน วาง HTML จาก CMS (มี <p>) ลงใน <p> อีกชั้น → React error #418 (มีบน prod อยู่แล้ว) · เปลี่ยนเป็น <div> 5 จุด หน้าตาไม่เปลี่ยน · เทสซ้ำไม่มี hydration error ทุกหน้าแก้แล้ว · รอ deploy
T3 / #3 UAT ถูก indexnext.config.ts ส่ง X-Robots-Tag: noindex, nofollow ทุก response เมื่อโดเมนไม่ใช่ www.yanhhotel.com (www-uat, www-prod-gcp, *.run.app) · ยืนยันจาก log ของ Cloud Run แล้วว่า LB ส่งชื่อโดเมนจริงถึงแอป · เทสแล้ว: www.yanhhotel.com ไม่มี header ทุก path · robots.txt ยังเปิดให้ crawl เพื่อให้ Google เห็น noindexโค้ดแล้ว · รอ deployต่อ: marketing ลบ URL UAT ใน Search Console → infra ตั้ง IAP/รหัสผ่าน
T2 / #2robots.txt ชี้ Sitemap: https://www.yanhhotel.com/sitemap.xml (เดิมชี้ www-uat)แก้แล้ว · รอ deploy
T5 / #5ลิงก์ภายในทุกจุดติดภาษาของหน้า (helper localizeHref() + LocaleLink) รวมการ์ดห้อง, footer, ปุ่ม Learn More, ฟอร์ม, ปุ่ม hero จาก CMS · breadcrumb Home ไม่มี / ท้าย (ตัด 308) · ESLint ห้ามใช้ next/link ตรงๆ กันลิงก์หลุดภาษาในอนาคตแก้แล้ว · รอ deploy
#6หน้าแรก เมนู และ footer render ฝั่ง server: เนื้อหาหน้าแรกอยู่ใน HTML (58 → 443 คำ), เมนู desktop อยู่ใน HTML ทุกขนาดจอ, footer มีที่อยู่ อีเมล เบอร์โทร ลิงก์ Cookies Policy และรายการลิงก์ทุกหน้า รวม F&B และห้องประชุม (แก้หน้า orphan สำหรับ crawler) · "Copyright undefined" หายแล้วแก้แล้ว · รอ deploy
NAP / Contactหน้า Contact กลับมาแสดงชื่อและที่อยู่โรงแรม (บั๊กเดิม: โค้ดอ่าน translation แต่ API ส่ง translations[])แก้แล้ว · รอ deploy
#9JSON-LD: Hotel + WebSite ทุกหน้า, HotelRoom หน้าห้อง, BreadcrumbList หน้าภายในทุกหน้า · ไม่มี AggregateRating · ค่าที่โรงแรมยังไม่ยืนยัน (geo, จำนวนห้อง, check-in/out, amenities) เว้นไว้แก้แล้ว · รอ deploy
#8 (ส่วนโค้ด)H1 เดียวต่อหน้า (หน้าแรกมี H1, หน้า F&B/ห้องประชุมใช้ชื่อสถานที่จริง, Cookies Policy H1 และแท็บถูกต้อง, Terms ใช้ชื่อจาก CMS) · ตัด zero-width (U+200B) ออกจาก title/H1/JSON-LD · description ไม่ซ้ำ title · fallback title ห้องประชุม/F&B เป็นชื่อสถานที่ + ความจุ · og:site_name = "YANH Ratchawat"แก้แล้ว · รอ deploytitle ภาษา TH/ZH + suffix: ดูแถว Option A
บั๊กที่เจอระหว่างทาง"Other rooms" มีห้องตัวเองปน · รูปมี alt="t" · ข้อความ debug "Contact Page TH" ก่อน H1 ใน 16 หน้า · <a> ซ้อนใน <button> · หน้า 404 ใช้ภาษาตาม URL · การ์ด neighbourhood ที่ลิงก์ # ไม่เป็นลิงก์ตายแก้แล้ว · รอ deploy
ความเป็นส่วนตัว / ภาระ APIไม่ส่งข้อมูลดิบจาก CMS (มีชื่อคนแก้ข้อมูล) ไปฝั่ง client · เลิกเรียก /api/home-setting, /api/hero-banner, /api/general-nav, /api/contact จากเบราว์เซอร์ทุกครั้งที่เปิดหน้า (ถอด swr)แก้แล้ว · รอ deploy
CSP (เจอบน prod 21 ต.ค.)(1) อนุญาต <style> ที่ vaul (drawer เมนู) ฉีดเองด้วย hash — เดิมถูกบล็อก animation ของเมนูจึงหาย (2) เพิ่ม https://analytics.google.com ใน connect-src — เดิม hit ของ GA4 ที่ไป /g/collect ถูกบล็อกแก้แล้ว · รอ deploy

2b) Performance (#15) — โค้ดเสร็จ 22 ต.ค. (รอ deploy + อัปโหลดวิดีโอ)

วัดด้วย Lighthouse ที่หน้าแรก /en · "Slow 4G" คือจำลองเน็ตช้าจริง (--throttling-method=devtools) ซึ่งวัดวิดีโอได้ตรงกว่าแบบประเมิน

prod วันนี้ (โค้ดเก่า)ก่อนงานนี้ (มี P1)หลังงานนี้+ วิดีโอใหม่
Mobile: คะแนน / LCP40 / 19.3 วิ75 / 6.4 วิ78 / 5.7 วิ80 / 5.1 วิ
Mobile LCP (Slow 4G)—9.1 วิ3.7 วิวัดหลังอัปโหลด
CLS mobile / desktop0.80 / 0.700 / 00 / 00 / 0
Desktop: คะแนน69979999
น้ำหนักหน้า mobile / desktop9.9 / 9.5 MB1.8–2.2 / 9.1 MB1.1–1.5 / 8.4 MB1.2 / 2.0 MB
เรื่องสิ่งที่แก้สถานะ
Instagram (เคยหนัก ~8 MB)ดึง feed ฝั่ง server เหลือ 6 โพสต์ตาม PDF · รูปย่อผ่าน next/image ทาง route ของเราเอง (รูปละ 0.4–2 MB → ~30 KB) เพราะ URL ของ Instagram ใน query ถูก WAF บล็อก · โหลดเมื่อเลื่อนถึง · โพสต์วิดีโอใช้ภาพปกแทนการโหลดคลิป · alt อ่านได้ (แปลงตัวหนา Unicode เป็นตัวปกติ)แก้แล้ว · รอ deployภาพปกวิดีโอต้อง deploy yanh-api ด้วย — ก่อนนั้นโพสต์วิดีโอถูกข้าม
Hero / LCPวิดีโออยู่ใน HTML จาก server เบราว์เซอร์เลือกไฟล์มือถือ/desktop เอง (เดิมรอ JS วัดจอหลังโหลดหน้า) · section ไม่ถูกซ่อนรอ animation แล้ว (animate เฉพาะข้อความ) · preconnect ไปโดเมนของวิดีโอแก้แล้ว · รอ deploy
ไฟล์วิดีโอ herodesktop 7.8 MB → 1.3 MB (ตัด audio เปล่า, บีบอัดใหม่ ภาพแทบไม่ต่าง — มี overlay ดำ 70% ทับ) · ทั้ง 2 ไฟล์ทำ faststart — ไฟล์เดิมทำให้เบราว์เซอร์โหลดซ้ำ (mobile 340+287 KB, desktop 6.1+2.0 MB) · ไฟล์อยู่ที่ hero-video-optimized/งาน contentอัปโหลดแทนไฟล์เดิมใน CMS → Hero Banner
ฟอนต์ / cacheฟอนต์หัวข้อย้ายไป next/font (cache 1 ปี + fallback ที่ปรับขนาด) · /assets/* cache 7 วัน (เดิม 0) · รูปที่ย่อแล้ว cache 31 วัน (เดิม 4 ชม.) · ไฟล์ที่อัปโหลดเข้า GCS ใหม่ได้ cache 1 ปี (yanh-api)แก้แล้ว · รอ deployไฟล์เก่าใน bucket ต้องให้ infra ตั้ง cache (ต้องอนุมัติ)
ขนาดรูป / altแก้ sizes ของรูปที่ขอใหญ่เกิน (พื้นหลังย่านเคยขอกว้าง 3840 px, Our Story, โลโก้) · รูปตกแต่งเป็น alt="" แทน "Our Story Image 01", "line 01"แก้แล้ว · รอ deploy
ลองแล้วไม่ใช้inlineCss ของ Next.js — HTML บวม 228 KB → 1 MB และ <style> ไม่มี nonce ทำให้ CSP บล็อกทั้งหน้าไม่ทำ
ยังเหลือCSS 5 ไฟล์ที่บล็อก render (~0.3 วิ บน Slow 4G) — อยู่ใน PDF แต่ทางเดียวของ Next.js คือ inlineCss ซึ่งชนกับ CSPบางส่วน
ไม่ทำ (นอก PDF)ช่อง poster ของ hero ใน API/CMS (PDF ไม่ได้สั่ง — LCP ≤ 2.5 วิ เป็นแค่เกณฑ์ในตารางคะแนน) · JS ที่ไม่ได้ใช้ ~48 KB · TTFB 0.5–0.7 วิ (CSP nonce ทำให้ cache HTML ไม่ได้)ไม่ทำ

2c) P2 ชุดที่ไม่ต้องเพิ่มระบบ — โค้ดเสร็จ 23 ต.ค. (รอ deploy)

ทำด้วยข้อมูลที่ CMS/API มีอยู่แล้วทั้งหมด ไม่มีตาราง ฟิลด์ หรือ module ใหม่ · ตรวจด้วย build + Chrome headless กับ API prod

Auditสิ่งที่แก้สถานะ
#17 / T6sitemap ใช้วันที่แก้ไขจริงจาก CMS (ตัวหลัก + แถวภาษาของหน้านั้น หน้ารวมนับรายการที่แสดงด้วย) แทนวันนี้ · ไม่มีวันที่ก็ไม่ใส่ lastmod · sitemap index ใช้วันล่าสุดของแต่ละไฟล์ — ตรวจแล้วไม่มี URL ไหนเป็นวันนี้แก้แล้ว · รอ deploy
#14 + ArticleRestaurant (TANH) / CafeOrCoffeeShop (Groundwork) พร้อมเวลาเปิด · MeetingRoom 4 ห้อง (ความจุ พื้นที่ อุปกรณ์) · Article ในบทความ blog และย่าน · ทุกตัวผูก containedInPlace/author กับ Hotelแก้แล้ว · รอ deployservesCuisine เว้นไว้ — CMS ไม่มีข้อมูล
#16og:image ทุกหน้า: รูป SEO จาก CMS ก่อน ถ้าว่างใช้รูป header ของหน้า หรือรูปของห้อง/venue/บทความนั้น · หน้า PDPA ใช้รูป SEO ของหน้าแรกแก้แล้ว · รอ deploy
#23 + T9ฟอร์มสื่อย้ายไป /press — URL เดิม 301 ไปที่ใหม่ (เมนู, sitemap อัปเดตแล้ว) · path ที่ไม่รู้จัก (/llms.txt, /cn, /sitemap_index.xml) ได้ 404 แทน redirect ไปหน้าแรกแก้แล้ว · รอ deploy
T7 (ชั่วคราว, 26 ต.ค.)slug ไม่แยกตัวพิมพ์แล้วทั้ง 5 แบบหน้า (ห้อง, F&B, ห้องประชุม, blog, ย่าน): /food-and-drink/tanh → /food-and-drink/TANH (307) แทน 404 · URL หลักยังไม่เปลี่ยน — การย้ายไป /dining/tanh, /meetings/tanh-2nd-floor + 301 ตาม PDF ทำพร้อม #12 เพื่อให้ย้ายครั้งเดียว · ใช้ 307 ไม่ใช่ 301 เพราะเป็นของชั่วคราว (301/308 ถูกเบราว์เซอร์จำค้าง)บางส่วน
#19 alt text (26 ต.ค.)ไล่ alt ทั้ง 90 จุดในโค้ด แก้ 66 จุดใน 29 ไฟล์: พื้นหลัง/ภาพตกแต่ง (เช่น "Our Story Image 02–06" ในหน้า Our Story, "Contact Image 01–03") และไอคอนที่มีชื่อเขียนอยู่ข้างๆ → alt ว่าง · รูปร้าน/ห้อง/facility/บทความใช้ชื่อจริง (เช่น "GROUNDWORK Specialty Coffee", "Fitness 1") · ปุ่ม gallery และปุ่มแชร์มีชื่อ · แก้บั๊ก InnerHeader ที่ส่ง alt ว่างแล้วได้ "Inner header image" · ตัด HTML จากชื่อใน CMS ("Worth the Night<br/> …")แก้แล้ว · รอ deploy
#19 (ส่วน dev)ปุ่มไอคอนที่ไม่มีชื่อ (ปิด cookie banner, ปิดหน้าตั้งค่า cookie, ปิด VR) ได้ชื่อแล้ว · alt="X" ของปุ่มแชร์ Instagram แก้ · Lighthouse accessibility 89 → 95–96 ทุกหน้าบางส่วนcontrast = สีแบรนด์ รอดีไซน์

2d) ผลทดสอบ 26 ต.ค. — โค้ดที่ push แล้ว

ทดสอบบนเครื่องจาก origin/dev (web f19f4ae, api 1e58e02) และ origin/develop (cms 952943b): เว็บอ่าน API prod แบบอ่านอย่างเดียว · API/CMS รันกับ Postgres ทดลองใน Docker · 44 agent แยก 9 ด้าน และทุกข้อที่ไม่ผ่านมี agent อีกตัวทำซ้ำเพื่อยืนยัน · ไม่แตะ UAT/prod นอกจากอ่าน

ด้านผล
SEO head (81 URL)canonical, hreflang, og:url, og:image, H1, lang, X-Robots-Tag ผ่าน 81/81 · เทียบ prod: canonical ถูก 41→81, og:image 6→81, หน้าที่มี JSON-LD 0→81
JSON-LD (159 block)parse ได้ทุก block · validator.schema.org 0 error (18 หน้า) · ความจุ/พื้นที่ห้องประชุม และเวลาเปิดร้านตรงกับ API
Routing / ลิงก์482 กรณี redirect/status ผ่าน (รวม slug ตัวพิมพ์ 402 กรณี) · ลิงก์ภายใน 4,089 ตัวติด locale ถูก ไม่มีลิงก์เสีย · lastmod ตรงวันที่แก้ใน CMS ทุก URL
เบราว์เซอร์90 การโหลดหน้า (en ทุกหน้า + th/zh): hydration error 0, CSP 0, request ล้มเหลว 0, ลิงก์จองถูกทุกจุด
Unit test helper1,355 assertion — ที่ตกเป็น 2 บั๊กเล็กที่ยังไม่เกิดกับข้อมูลจริง
Migrate + backfillschema ใหม่ = 16 ALTER TABLE / 48 ADD COLUMN เท่านั้น · db push บน DB ที่มีข้อมูลไม่ลบอะไร · backfill ย้ายค่าถูกภาษา และรันซ้ำได้ · API ทำงานหลัง migrate และพังด้วย error เดียวกับ UAT ถ้ายังไม่ migrate
API 16 entity382 check: SEO ลงแถวภาษาที่ถูกทุก entity, แถวอื่นและคอลัมน์เดิมไม่เปลี่ยน, duplicate ไม่คัดลอก SEO
CMS → API → เว็บ6 ฟอร์ม 146/146 + อีก 10 entity 78/78 · หน้า /zh ที่ไม่มีค่าใช้ fallback ไม่ยืมภาษาอื่น
Performanceมือถือ (Slow 4G) หน้าแรก LCP 4.1–4.3 วิ (prod 9.3) · CLS 0 (prod 0.80) · desktop 98 (prod 70) · หน้าห้องพักและ TANH 95

บั๊กจากงานรอบนี้ (ยืนยันแล้ว — ยังไม่ได้แก้)

ระดับเรื่องที่
mediumขั้นตอน migrate ในเอกสารไม่มี --build → รัน image เก่า ไม่เพิ่มคอลัมน์แต่ขึ้นว่าสำเร็จ (แก้ในเอกสารแล้ว · comment ในไฟล์ SQL ยังต้องแก้)เอกสาร + yanh-api/prisma/sql
lowหน้า 404 ของ locale ที่ไม่มี (/cn) ปุ่ม Back to Home ชี้กลับ /cnsrc/app/not-found.tsx
lowredirect slug ตัวพิมพ์ (T7) ตัด query string (UTM หาย)src/lib/slug.ts
low/llms.txt, /foo.png ได้ 404 ถูกต้อง แต่แสดงเป็นหน้าขาวsrc/middleware.ts
lowตัด fallback title นับ UTF-16 ไม่ใช่ตัวอักษรที่เห็น และอาจตัดกลางสระ/วรรณยุกต์ (ยังไม่เกิดกับข้อมูลจริง)src/lib/utils.ts
lowRestaurant / CafeOrCoffeeShop ไม่มี address (Rich Results จะฟ้อง)src/lib/jsonld.ts
lowอ่านเวลาเปิดแบบ "a.m./p.m." (มีจุด) ผิด — ข้อมูลตอนนี้ไม่มีรูปแบบนี้src/lib/jsonld.ts
lowPOST /home-setting/save ไม่ atomic: SEO ยาวเกิน 255 ได้ 500 แต่ค่าบางส่วนถูกบันทึกไปแล้ว (CMS จำกัดความยาวไว้ จึงเกิดเฉพาะเรียก API ตรง)home-setting.service.ts
lowbackfill: เช็คค่าว่างไม่นับช่องว่างพิเศษ (NBSP, zero-width) · regex ไทยนับ ฿ เป็นภาษาไทย (ข้อมูลจริงไม่โดน)prisma/sql/*.sql

ปัญหาเดิม (มีบน prod อยู่แล้ว) ที่เจอจากการทดสอบ — ไม่อยู่ใน PDF

  • CMS (medium): ฟอร์ม Home Setting และ Contact ถ้า refresh หน้า edit ภาษาไทยแล้วคำตอบภาษาอังกฤษมาช้ากว่า ฟอร์มจะแสดงค่าอังกฤษ และกด Save จะเขียนทับแถวภาษาไทย — เดิมโดนแค่ชื่อ/ที่อยู่ ตอนนี้โดน SEO ด้วย · 2 ฟอร์มนี้ไม่มีตัวกันคำตอบเก่าแบบอีก 25 ฟอร์ม
  • หน้า /zh ที่ไม่มีแถวภาษาจีน ใช้แถวแรกที่ DB ส่งมา (อาจเป็นภาษาไทย) · title/og:title ยังมี HTML จากชื่อใน CMS (เช่น <br/>)
  • Accessibility (axe): สวิตช์ใน cookie settings ไม่มีชื่อ · drawer เมนูเปิดจาก keyboard แล้วโฟกัสหลุด · iframe VR/แผนที่ไม่มี title · animation ข้อความใส่ aria-label บน div · tab ในหน้ารายละเอียดชี้ panel ที่ไม่มี · dialog แพ็กเกจห้องประชุมเลื่อนด้วย keyboard ไม่ได้
  • วิดีโอ Facebook ในหน้าย่านเปิดไม่ได้ · ข้อความ "soft lightstay" ติดกันบนมือถือ

ตามที่ตั้งใจ: brand suffix ต่อท้าย title จาก CMS ที่ยังไม่มีชื่อโรงแรมเมื่อยังพอที่ (ไม่ตัด title จาก CMS) · title fallback ที่ยาว 54–60 ตัวอักษรไม่มี suffix · ข้อมูล CMS ที่ผิดภาษา/ซ้ำ อยู่ในแท็บงานที่ไม่ใช่ Dev

3) เรื่องที่รอตัดสินใจ

เรื่องสถานะปัจจุบันข้อเสนอ

4) ก่อนและหลัง deploy (ส่วนของ dev)

  1. ตรวจในเบราว์เซอร์: เทสอัตโนมัติด้วย Chrome headless แล้ว 114/116 (hero, animation, hydration, drawer, จอ 390–1440, ลิงก์จอง, สลับภาษา) · ที่ยังควรดูด้วยตา: ดีไซน์ footer ใหม่ · ยังไม่ได้เทส: การส่งฟอร์ม และหน้าจอ CMS (ต้องมี DB ที่ migrate แล้ว)
  2. ลำดับ deploy ของ SEO แยกภาษา (ทำบน UAT ก่อน แล้ว prod): รัน yanh-api/prisma/sql/seo-backfill-preview.sql (อ่านอย่างเดียว) → backup Cloud SQL → migrate job ต้อง build image ใหม่ จาก commit ที่มี schema ใหม่ (clean checkout ของ origin/uat ตั้งแต่ 1e58e02): UAT ./run-migrate-job.sh --build · prod CONFIRM_PROD_MIGRATE=yes ./run-migrate-job.sh --project=scx-yanhhotel-prod --build · ถ้าไม่ใส่ --build จะรัน image เก่า (schema เดิม) ไม่เพิ่มคอลัมน์แต่ขึ้นว่าสำเร็จ · ห้ามรัน image เก่าหลังเพิ่มคอลัมน์แต่ก่อน backfill เพราะคอลัมน์ใหม่ที่ยังว่างจะถูกลบเงียบๆ → seo-backfill.sql → deploy API → deploy CMS ทันที (ห้ามแก้ SEO ใน CMS ระหว่างนี้) → deploy เว็บ
  3. สถานะ UAT (26 ต.ค.): uat ถูก merge และ deploy ก่อน migrate → API UAT ตอบ 500 ในส่วนที่มี SEO แยกภาษา · ต่อมา DB ถูก migrate แล้ว (API กลับมา 200) แต่ยังไม่ได้รัน seo-backfill.sql เว็บ UAT จึงยังใช้ title fallback แทนค่าใน CMS · ขั้นต่อไป: preview SQL → seo-backfill.sql
  4. Commit / merge: เสร็จแล้ว 26 ต.ค. — feature/seo-audit ทั้ง 3 repo push แล้ว และ merge เข้า dev (web, api — api สร้าง dev ใหม่จาก uat) และ develop (cms) · ขั้นต่อไป: merge dev → uat ตอน deploy UAT (ต้อง migrate ก่อน deploy API)
  5. หลัง deploy: ตรวจ robots.txt, H1, ที่อยู่หน้า Contact, JSON-LD (Rich Results Test / validator.schema.org — รวมหน้า TANH, ห้องประชุม และบทความย่านที่เพิ่ม schema ใหม่) และส่ง sitemap ใน Search Console · เช็ค /en/blog/media-and-influencer-request ได้ 301 ไป /en/press และ /llms.txt ได้ 404
  6. T3 หลัง deploy: เช็ค curl -sI https://www.yanhhotel.com/th | grep -i x-robots ต้องว่าง และ curl -sI https://www-uat.yanhhotel.com/th | grep -i x-robots ต้องได้ noindex · ขั้นต่อของ marketing และ infra อยู่ในแท็บ งานที่ไม่ใช่ Dev
  7. Performance: หลัง deploy วัด PageSpeed Insights ซ้ำ (หลังทีม content อัปโหลดวิดีโอที่บีบอัดแล้ว — ดูแท็บ งานที่ไม่ใช่ Dev)
  8. หลัง deploy ≥ 7 วัน: ลบ route handler /api/home-setting, /api/hero-banner, /api/general-nav, /api/instagram (ไม่ใช่ /api/instagram/media) และ GET /api/contact

5) งานของ content, marketing, โรงแรม, infra, ดีไซน์ และกฎหมาย

ย้ายไปแท็บ งานที่ไม่ใช่ Dev แล้ว (แยกตามผู้รับผิดชอบ พร้อมช่วงเวลาที่ต้องทำ)

6) ความเสี่ยงที่พบนอก audit (ไม่อยู่ใน PDF · ยังไม่แก้)

  • API สาธารณะเปิดเผยชื่อคนแก้ข้อมูลใน CMS (createdByName/updatedByName ในทุก /v1/public/*) — เว็บไม่ส่งต่อแล้ว แต่ต้องแก้ที่ yanh-api
  • ปุ่ม Book Now บนการ์ดห้องกดไม่ได้บนมือถือและด้วยคีย์บอร์ด (จะแก้พร้อมเรื่องลิงก์จอง)
  • ที่เป็นงาน infra และ marketing (รูป prod อยู่ใน bucket ของ dev, GA4 ของ UAT และ PDPA) อยู่ในแท็บ งานที่ไม่ใช่ Dev
รายละเอียดเชิงเทคนิคทั้งหมดอยู่ใน SEO-AUDIT-REMEDIATION.md ที่ root ของ repo
00b · อัปเดต 26 ตุลาคม 2026

เทียบกับ PDF ทีละข้อ

แถวในรายงาน PDF ที่มีงานฝั่ง dev (ยกเว้นแผนปฏิบัติการ ซึ่งมีสถานะอยู่ในหัวข้อ 8) พร้อมสถานะปัจจุบัน "รอ deploy" หมายถึงโค้ดเสร็จบน branch feature/seo-audit แล้ว แต่ยังไม่ขึ้นระบบ · อีก 18 ข้อที่เป็นงาน content, marketing, โรงแรม/GM หรือกฎหมายล้วนๆ อยู่ในแท็บ งานที่ไม่ใช่ Dev (รวม 79 ข้อ)

แก้แล้ว · รอ deploy: 32 แก้แล้ว · รอ migrate+deploy: 2 บางส่วน: 16 ยังไม่เริ่ม: 11 รวม 61 ข้อ (+18 ข้อในแท็บงานที่ไม่ใช่ Dev)

Technical SEO (T1–T10)

ข้อใน PDFสถานะหมายเหตุ
T1 หน้า TH/ZH canonical ไป ENแก้แล้ว · รอ deployทุกหน้า self-canonical ในภาษาของตัวเอง og:url ตาม (ตัดสินใจ 21 ต.ค.)
T2 robots.txt ชี้ sitemap ของ stagingแก้แล้ว · รอ deployชี้ https://www.yanhhotel.com/sitemap.xml
T3 UAT เปิดสาธารณะ/ถูก indexบางส่วนnoindex ทุกโดเมนที่ไม่ใช่ www.yanhhotel.com (โค้ดแล้ว รอ deploy) · ลบ URL ใน Search Console = marketing · IAP/รหัสผ่าน = infra
T4 canonical ชี้หน้า 404 (6 URL)แก้แล้ว · รอ deployหายพร้อม T1
T5 ลิงก์ภายในไม่มีภาษานำหน้าแก้แล้ว · รอ deployLocaleLink ทุกจุด + ESLint กันหลุด
T6 lastmod ใน sitemap เป็นวันนี้เสมอแก้แล้ว · รอ deploy#17 ใช้วันที่แก้ไขจริงจาก CMS (ตัวหลัก + แถวภาษาของหน้า, หน้ารวมนับรายการที่แสดงด้วย) · ไม่มีวันที่ = ไม่ใส่ lastmod แทนการใส่วันนี้
T7 slug ตัวพิมพ์ใหญ่/เล็กปนบางส่วนชั่วคราว (26 ต.ค.): URL ที่พิมพ์ตัวพิมพ์ต่างกัน เช่น /food-and-drink/tanh พาไปหน้าเดิม (redirect 307) แทน 404 · ย้ายจริงไป /dining/tanh, /meetings/tanh-2nd-floor พร้อม 301 ทำพร้อม #12 ตามที่ PDF จัดไว้
T8 path แม่ /food-and-drink, /meeting-room-and-event 404ยังไม่เริ่มP2 #12 (hub)
T9 path ที่ไม่รู้จักถูก redirect ไปหน้าแรกแก้แล้ว · รอ deploy/llms.txt, /cn, /sitemap_index.xml, /de ได้ 404 · ภาษาของเว็บเอง (en/th/zh) ที่ถูกปิดใน CMS ยัง redirect ไปภาษา default
T10 โหลด Google tag 2 ตัวบางส่วนตรวจแล้วไม่ใช่การนับซ้ำ (GTM โหลด gtag.js ตามปกติ) · แก้ CSP ที่บล็อก hit GA4 + เพิ่ม event booking_click แล้ว · cross-domain ใน GA4/SiteMinder = งาน marketing

การ render และความเร็ว

ข้อใน PDFสถานะหมายเหตุ
เนื้อหาหน้าแรกโหลดฝั่ง client (~56 คำใน HTML)แก้แล้ว · รอ deployHTML จาก server มี 443 คำ
เมนูหลักและที่อยู่ footer โหลดฝั่ง client · "Copyright undefined"แก้แล้ว · รอ deployserver-render ทั้งเมนู desktop และ footer
Performance: LCP 7.9 วิ, CLS 0.705, หน้า 5.7 MB, render-blocking, cache สั้น, JS ไม่ได้ใช้บางส่วน#15 โค้ดเสร็จ (ดูหัวข้อ 0 ข้อ 2b): CLS 0, LCP มือถือ 9.1 → 3.7 วิ, หน้า 1.2 MB · เหลือ: อัปโหลดวิดีโอ (content), cache ไฟล์เก่าใน bucket (infra), CSS ที่บล็อก render ~0.3 วิ
ปุ่มไม่มี accessible name, contrast ต่ำบางส่วนปุ่มไอคอนมีชื่อครบแล้ว (Lighthouse accessibility 89 → 95–96) · contrast เป็นสีแบรนด์ ต้องให้ดีไซน์อนุมัติสีใหม่

Metadata

ข้อใน PDFสถานะหมายเหตุ
title ไม่มี "Bangkok"/"hotel"บางส่วนsuffix ตาม PDF ทุกภาษา (เช่น Rooms | YANH Ratchawat Hotel, Bangkok) · title หน้าแรกจาก CMS "YANH Ratchawat" รอ content แก้
title คำเดียว / description ซ้ำ titleแก้แล้ว · รอ deployมี suffix และ description ใช้เนื้อหาจริงแทน
tag ผิดภาษา (title ไทยบนหน้า EN ฯลฯ)แก้แล้ว · รอ migrate+deploySEO แยกตามภาษา (Option A) ทั้ง 3 repo · ย้ายค่าเดิมตามอักษรที่เขียน
ใช้ tagline แทนชื่อร้าน (Groundwork, TANH)แก้แล้ว · รอ deployใช้ displayName
ห้องประชุมไม่มีชื่อห้อง/ความจุใน titleแก้แล้ว · รอ deployเช่น Unwind Room – TANH, 3rd Floor (18 seats)
อักขระซ่อน U+200Bแก้แล้ว · รอ deployตัดออกจาก title/H1/JSON-LD
ความยาว title/descriptionบางส่วนfallback ตัดที่ 60/145 · CMS เตือนแบบ Bridge · ค่าที่ยาวเกินใน CMS = content
brand suffix ไม่สม่ำเสมอแก้แล้ว · รอ deployกติกาเดียวทุกหน้า (title ที่มีแบรนด์แล้ว เช่น "Contact | YANH Hotel" คงไว้จน content แก้)
ไม่มี og:image 75/81 URLแก้แล้ว · รอ deploy#16 ทุกหน้ามีรูป: รูป SEO จาก CMS ก่อน ถ้าว่างใช้รูป header/รูปของห้อง venue บทความนั้น · หน้า PDPA ที่ไม่มีรูปใช้รูป SEO ของหน้าแรก
H1 หาย/ซ้ำ/ผิด (หน้าแรก, F&B, ห้องประชุม, Cookies)แก้แล้ว · รอ deployH1 เดียวต่อหน้า
title ไทย (แบรนด์ไทย + เขต) และจีน (曼谷 + 酒店)บางส่วนsuffix ไทย/จีนตาม PDF แล้ว · ข้อความโดยเจ้าของภาษา = content

Structured data และ entity

ข้อใน PDFสถานะหมายเหตุ
Hotel + WebSite ในทุกหน้าบางส่วนทำแล้ว · พิกัด, จำนวนห้อง, check-in/out, amenities รอโรงแรมยืนยัน
HotelRoom (6 หน้าห้อง)แก้แล้ว · รอ deploy—
Restaurant (TANH) / CafeOrCoffeeShop (Groundwork)แก้แล้ว · รอ deployเวลาเปิดอ่านจากข้อความ "Open daily" ภาษาอังกฤษ · servesCuisine เว้นไว้ เพราะ CMS ไม่มีข้อมูลประเภทอาหาร
MeetingRoom (4 หน้า)แก้แล้ว · รอ deployความจุ 8/10/20/18 และพื้นที่ 23/28/95/90 ตร.ม. ตรงกับ PDF · amenityFeature จากรายการอุปกรณ์ในหน้า
Article (บทความย่าน, blog)แก้แล้ว · รอ deployheadline, datePublished, dateModified, author/publisher = โรงแรม, image · บทความย่านมี about → Place (ที่อยู่ + แผนที่จาก CMS) · blog ไม่มีข้อมูลสถานที่จึงไม่มี about
BreadcrumbList (หน้าภายใน)แก้แล้ว · รอ deploy—
FAQPageยังไม่เริ่มต้องมีหน้า FAQ ก่อน (P2 #13)
ที่อยู่ไม่อยู่ใน server HTML และหน้า Contactแก้แล้ว · รอ deployfooter + หน้า Contact (บั๊ก translation/translations)
ตรวจด้วย Rich Results Test / Schema validatorยังไม่เริ่มหลัง deploy

AEO / การมองเห็นบน AI

ข้อใน PDFสถานะหมายเหตุ
2. server-render หน้าแรกและเมนูแก้แล้ว · รอ deploy—
3. หน้า FAQ (EN/TH/ZH)ยังไม่เริ่มP2 #13
4. หน้า Location & Getting Hereยังไม่เริ่มP2 #13
5. หน้า Press + เครดิต CHAT Architectsยังไม่เริ่มP2 #20
6. แสดงคะแนนรีวิวแขกยังไม่เริ่มP2 #20
llms.txt (ไม่บังคับ)ยังไม่เริ่มความสำคัญต่ำ

Content

ข้อใน PDFสถานะหมายเหตุ
หน้าแรก: H1แก้แล้ว · รอ deployH1 แบบซ่อน (ตั้งค่าผ่าน Language Variable web.home.heading)
Offers: title EN เป็นภาษาไทยแก้แล้ว · รอ migrate+deployค่าภาษาไทยย้ายไปแถว TH · หน้า EN ใช้ "Special Offers" + suffix
Offers: โชว์ข้อเสนอหลักบนหน้าแรก/หน้าห้องยังไม่เริ่ม—
Blog: ย้ายฟอร์มสื่อไป /pressแก้แล้ว · รอ deploy#23 หน้าอยู่ที่ /press · URL เดิม 301 ไป /press
H1 Cookies Policy / Termsแก้แล้ว · รอ deploy—
"Copyright undefined"แก้แล้ว · รอ deploy—
alt text ทั่วไป ("Our Story Image 01", "WELCOME TO")แก้แล้ว · รอ deployไล่ครบทุก alt ในโค้ด (26 ต.ค.): รูปพื้นหลัง/ตกแต่ง และไอคอนที่มีชื่อเขียนอยู่ข้างๆ → alt ว่าง · รูปจริงใช้ชื่อห้อง ร้าน facility หรือบทความ · ปุ่มที่มีแต่รูป (gallery, แชร์) มีชื่อเสมอ · ตัด HTML ที่ติดมาจากชื่อใน CMS · ตรวจ 18 หน้าแล้วไม่เหลือ alt กว้างๆ และไม่มีรูปที่ขาด alt
caption Instagram ตัวหนาแบบ Unicodeบางส่วนบนเว็บแปลงเป็นตัวปกติใน alt แล้ว · caption บน Instagram เอง = งาน content

Structure และ UX

ข้อใน PDFสถานะหมายเหตุ
หน้าสร้างรายได้ไม่มีลิงก์เข้า (orphan)บางส่วนcrawler เข้าถึงผ่าน footer แล้ว · hub P2 #12 ยังไม่ทำ
เมนูหลักบางส่วนserver-render แล้ว · ยังเป็น 5 รายการ ไม่ใช่โครงสร้าง 8 ส่วน
ลิงก์จอง: วันที่ผ่านแล้ว, locale=enแก้แล้ว · รอ deployวันนี้→พรุ่งนี้ (เวลาไทย), th / zh-CN, THB
date picker ใน headerยังไม่เริ่มเลื่อนไปทำทีหลัง (ตามที่ตกลง)
Attribution / GA4 cross-domainบางส่วนevent booking_click + แก้ CSP แล้ว · ตั้งค่า GA4/SiteMinder = งาน marketing
ภาษารั่ว (ลิงก์ไม่มีภาษา)แก้แล้ว · รอ deploy—
ฟอร์มสื่ออยู่ใต้ /blog/แก้แล้ว · รอ deploy#23 ย้ายไป /press พร้อม 301 · เมนูยังอยู่ใต้ Blog (ย้ายไปใต้ Our Story ตามแผนภาพ PDF รวมกับงานเมนู 8 ส่วน)
slug ตัวพิมพ์เล็ก + 301บางส่วนดู T7 — ลิงก์ตัวเล็กไม่ 404 แล้ว · ย้าย URL จริงรอ #12
หน้า Contact: ที่อยู่, แผนที่, ปุ่ม LINE/โทรบางส่วนที่อยู่กลับมาแล้ว (แผนที่มีอยู่) · ปุ่ม LINE/โทรเด่นๆ ยังไม่ทำ
น้ำหนักหน้าแรก (Instagram 26 โพสต์)แก้แล้ว · รอ deploy6 โพสต์ · รูปย่อ ~30 KB · โหลดเมื่อเลื่อนถึง
Footer (ที่อยู่, เบอร์, LINE, หน้าหลัก)แก้แล้ว · รอ deploy—
Accessibilityบางส่วนalt="t", <a> ซ้อน <button>, label ปุ่มไอคอน (ปิด cookie, ตั้งค่า cookie, VR), alt ทุกจุด แก้แล้ว · contrast รอดีไซน์
โครงสร้างเว็บใหม่ 8 ส่วน + hub 3 หน้ายังไม่เริ่มP2/P3
ข้อมูลที่ต้องได้จากโรงแรม (PDF หน้า 15) ทั้ง 4 ข้อเป็นงานของโรงแรม — อยู่ในแท็บ งานที่ไม่ใช่ Dev
01

สรุปสำหรับผู้บริหาร (Executive summary)

yanhhotel.com ดูดี แต่ยังไม่ได้ทำหน้าที่เชิงพาณิชย์ของมัน ข้อผิดพลาดในการตั้งค่าทำให้ Google มองไม่เห็นเว็บภาษาไทยและภาษาจีน และเปิดสำเนาเว็บ staging ให้สาธารณะเข้าถึงได้ เนื้อหาหน้าแรก เมนู และที่อยู่ ไม่ปรากฏต่อ AI crawler และเมื่อค้นหาด้วยชื่อแบรนด์ ผลที่ได้คือ OTA และเว็บจองลอกเลียนแบบที่ไม่เป็นทางการ แทนที่จะเป็นเว็บของโรงแรมเอง งานแก้ระดับ P1 ใช้เวลาประมาณ 6 วันทำงานของนักพัฒนา

38/54
หน้า TH/ZH ที่ตั้ง canonical ไปหน้า EN
0/27
title EN ที่มีคำว่า "Bangkok"
75/81
URL ที่ไม่มีรูปสำหรับแชร์ (og:image)
0
บล็อก JSON-LD ทั้งเว็บ
0/4
คำค้นชื่อแบรนด์ที่เว็บทางการติดผล
7.9 วิ
LCP บน mobile (เกณฑ์ ≤ 2.5 วิ)
Technical SEOอ่อน · Weak

หน้า TH/ZH 38 จาก 54 หน้าตั้ง canonical ไปที่หน้าภาษาอังกฤษ · robots.txt ประกาศ sitemap ของ staging · เว็บ staging เปิดสาธารณะและถูก index ได้

Metadataอ่อน · Weak

title ภาษาอังกฤษ 0 จาก 27 หน้ามีคำว่า "Bangkok" · มี title ภาษาไทยอยู่บนหน้าภาษาอังกฤษ · 75 จาก 81 URL ไม่มีรูปสำหรับแชร์

Structured data & entityอ่อน · Weak

ไม่มี schema บนหน้าใดเลย · ไม่มีที่อยู่ทั้งใน server HTML และในหน้า Contact

AEO / การมองเห็นบน AIอ่อน · Weak

เว็บทางการไม่ปรากฏเลยในการค้นหาชื่อแบรนด์ทั้ง 4 ครั้งที่ทดสอบ · เว็บจองลอกเลียนแบบที่ไม่เป็นทางการขึ้นมาแทน

Contentพอใช้ · Fair

เรื่องราวของอาคารและย่านแข็งแรง · หน้า meetings และ dining มีเนื้อหาน้อย · มีบทความ blog เพียง 1 บทความตั้งแต่ปี 2023

Structure & UXอ่อน · Weak

หน้า dining และ meeting เป็นหน้า orphan (ไม่มีลิงก์ใดชี้เข้า) · ลิงก์จองห้องพักเปิดด้วยวันที่ที่ผ่านไปแล้ว

Speedพอใช้ · Fair

คะแนน mobile 64, LCP 7.9 วินาที · layout shift บน desktop 0.705

ควรแก้ก่อน และเหตุผลที่ทำให้เสียเงินอยู่ทุกวันนี้

  1. หน้าภาษาไทยและจีนตั้ง canonical ไปที่ภาษาอังกฤษ (T1) — แขกชาวไทย ซึ่งเป็นกลุ่มที่อยู่เบื้องหลังข่าวสื่อไทยเกี่ยวกับ YANH และโพสต์ staycation บน Lemon8 หาหน้าภาษาไทยไม่เจอ จึงไปจองผ่าน OTA
  2. เว็บ staging และ sitemap ของ staging เปิดสาธารณะ (T2, T3) — เว็บซ้ำอีกชุดหนึ่งแย่งผลการค้นหาชื่อแบรนด์กับเว็บ production
  3. หน้าแรก เมนู และที่อยู่ render ฝั่ง client และไม่มี schema — ผู้ช่วย AI ไม่สามารถอธิบายหรือแนะนำโรงแรมจากเว็บของโรงแรมเองได้
  4. หน้า dining และ meeting ไม่มีลิงก์เข้า และปุ่มจองแนบวันที่ที่ผ่านไปแล้ว — รายได้ที่ไม่ใช่ห้องพักจึงมองไม่เห็น และ conversion ของการจองตรงรั่วไหลตรงคลิกสุดท้าย
ยังไม่ได้วัดผลกระทบเป็นตัวเลข เนื่องจากไม่มีสิทธิ์เข้าถึง Search Console หรือ GA4 งานแรกคือ export ข้อมูล Search Console ย้อนหลัง 16 เดือน เพื่อตั้ง baseline ของจำนวนคลิกจากชื่อแบรนด์, impressions ของหน้า TH/ZH และ conversion ของการจองตรง

ขอบเขตการตรวจ: URL ทั้ง 81 รายการใน sitemap (EN, TH, ZH) ถูก crawl ทั้งแบบ raw server HTML และแบบหน้าที่ render แล้ว, robots.txt, sitemaps, staging host, PageSpeed Insights (หน้าแรก ทั้ง mobile และ desktop), การค้นหาชื่อแบรนด์ 4 คำค้น และการตรวจเทียบกับรายการบน OTA และข่าวในสื่อ

02

Technical SEO และการ crawl

ตัว build เองไม่มีปัญหา — เป็น Next.js แบบ server-rendered, ใช้ HTTPS, มี hreflang ทุกหน้า, มีหน้า 404 จริง — แต่มี ข้อผิดพลาดในการตั้งค่า 3 จุด ที่บอกให้ Google เพิกเฉยต่อเว็บภาษาไทยและจีน แล้วชี้ไปที่สำเนา staging ที่เปิดสาธารณะแทน ทั้ง 3 จุดเป็นงานแก้ของนักพัฒนาที่วัดเป็นชั่วโมง ไม่ใช่สัปดาห์

ขอบเขตการ crawl: URL ทั้ง 81 รายการใน XML sitemap (27 หน้า × EN/TH/ZH) ดึงเป็น raw server HTML เมื่อวันที่ 5 ตุลาคม 2026 รวมถึงการตรวจ redirect, 404 และ staging

#ปัญหาที่พบหลักฐานทำไมจึงสำคัญวิธีแก้Priority
T1หน้าภาษาไทยและจีนตั้ง canonical ไปที่ภาษาอังกฤษURL ของ TH/ZH 38 จาก 54 รายการมี rel=canonical ชี้ไปที่ URL ภาษาอังกฤษ — รวมถึง /th, /zh, Rooms, Facilities, Our Story, Contact, Offers, F&B และ Meetings มีเพียงหน้าห้องพัก 6 หน้า, บทความ blog 1 บทความ และหน้า Cookies ที่ self-canonical ส่วน og:url ก็ผิดแบบเดียวกันcanonical มีผลเหนือกว่า hreflang Google จะถือว่าหน้า TH/ZH เป็นหน้าซ้ำของภาษาอังกฤษ และส่วนใหญ่จะไม่ index — ตลาดคนไทยในประเทศและนักท่องเที่ยวจีนจึงไปลงที่หน้าภาษาอังกฤษหรือ OTAทุกหน้าต้อง self-canonical ในภาษาของตัวเอง คง hreflang ไว้ตามเดิมP1
T2robots.txt ประกาศ sitemap ของ stagingSitemap: https://www-uat.yanhhotel.com/sitemap.xmlGoogle ถูกสั่งให้ crawl URL ของ staging host แทนที่จะเป็นของ productionชี้ไปที่ https://www.yanhhotel.com/sitemap.xmlP1
T3เว็บ staging เปิดสาธารณะและถูก index ได้www-uat.yanhhotel.com ให้บริการเว็บครบทั้งเว็บ, robots.txt เป็น Allow: /, self-canonical ไปที่ www-uat, ไม่มี noindexสำเนาเว็บโรงแรมที่สมบูรณ์อีกชุดหนึ่งแข่งกับ production ในผลการค้นหาชื่อแบรนด์ตั้งรหัสผ่านป้องกัน UAT (หรือใส่ X-Robots-Tag: noindex + robots Disallow) แล้วลบ URL ของ UAT ที่ถูก index ไปแล้วผ่าน Search ConsoleP1
T4canonical ชี้ไปที่หน้า 404/en/blog → /en/blog-and-review (404); /blog/media-and-influencer-request → /en/media-influencer-request (404) บน TH/ZH ก็เป็นแบบเดียวกัน รวม 6 URLcanonical ที่ชี้ไป URL ที่ตายแล้ว อย่างดีที่สุดคือถูกเพิกเฉย อย่างแย่ที่สุดคือทั้งสอง URL หลุดจาก indexทำ self-canonicalP1
T5ลิงก์ภายในไม่มี prefix ภาษาลิงก์ในเนื้อหาและ footer ใช้ /our-story, /rooms/…, /facilities, /privacy-policy ซึ่ง redirect ไปที่ /en/… บนหน้า TH และ ZH ลิงก์ชุดเดียวกันนี้จึงส่ง crawler (และผู้ใช้ที่ไม่มี cookie) ไปหน้าภาษาอังกฤษการ์ดห้องพักและลิงก์ "Learn more" ทุกอันบนเว็บไทยพาผู้ใช้ออกจากเว็บไทย และ link equity ต้องไหลผ่าน redirect เพิ่มอีก 1 hopสร้าง href ทุกตัวพร้อม locale ปัจจุบัน (/th/rooms/…)P1
T6lastmod ใน sitemap เป็นวันนี้เสมอsitemap ของ static, rooms, F&B และ meetings ประทับวันที่ 2026-10-05 ให้ทุก URL (สร้างขึ้นตอนมี request) ส่วน Blog = 2023-03-01, neighbourhoods = 2024Google จะเรียนรู้ว่าวันที่นี้ไม่มีความหมาย และเลิกใช้ในการจัดตารางการ crawl ซ้ำส่งวันที่แก้ไขเนื้อหาจริงจาก CMSP2
T7slug ตัวพิมพ์ใหญ่-เล็กปนกัน และแยกตัวพิมพ์ (case-sensitive)/food-and-drink/TANH, /meeting-room-and-event/TANH-2nd เทียบกับ /tanh-3rd-floor ส่วนตัวพิมพ์เล็ก /food-and-drink/tanh ได้ 404ลิงก์ที่พิมพ์เองหรือแชร์ต่อจะพัง และรูปแบบไม่สม่ำเสมอเปลี่ยน slug ทั้งหมดเป็นตัวพิมพ์เล็ก (/dining/tanh, /meetings/tanh-2nd-floor) และทำ 301 จาก URL เดิมP2
T8path ระดับแม่ได้ 404/en/food-and-drink และ /en/meeting-room-and-event (ซึ่งเป็นแม่ของหน้าที่ใช้งานอยู่ 6 หน้า) ได้ 404breadcrumb ระดับนั้นตาย และไม่มี hub page ไว้ติดอันดับคำค้น "restaurant" หรือ "meeting room"สร้าง hub page 2 หน้า (ดูหัวข้อ Structure)P2
T9path ที่ไม่รู้จักระดับ root ถูก redirect ไปหน้าแรก/llms.txt, /cn, /sitemap_index.xml → ได้ 200 ที่ /en ส่วน path ภายใต้ /en/ คืน 404 ถูกต้องเป็นรูปแบบ soft-404 ปัญหาเล็กน้อยคืน 404 สำหรับ path ระดับ root ที่ไม่รู้จักP3
T10โหลด Google tag สองตัวทั้ง gtag.js และ gtm.js ทำงานตอนโหลดหน้า ส่วน booking engine อยู่บน book-directonline.comเสี่ยงนับ session ซ้ำ และ attribution ของการจองตรงผิดพลาดรวมไว้ใน GTM ที่เดียว และยืนยันการตั้งค่า GA4 cross-domain linking ไปยัง booking engineP2
ส่วนที่ทำงานถูกต้องแล้ว: HTTPS · URL ที่มี trailing slash และ ?utm_ ตั้ง canonical ไปที่ URL ที่สะอาด · มี hreflang (en, th, zh, x-default) ครบทั้ง 81 หน้า · ตั้งค่า HTML lang ตาม locale · รูปบนหน้าแรก 65 จาก 66 รูปเป็น lazy-load · มี template 404 จริงภายใต้ /en/

การ render และความเร็ว

เนื้อหาบนหน้าแรก ทั้งเรื่องราว, ส่วนแนะนำห้องพัก, ย่าน และ "Experience YANH" ถูก fetch ในเบราว์เซอร์ ไม่ได้ส่งมาใน HTML — response จาก server มีข้อความเนื้อหาราว 56 คำ เมนูหลักและที่อยู่ใน footer ก็ render ฝั่ง client เช่นกัน (footer ใน raw HTML เขียนว่า "Copyright undefined") Google render JavaScript ได้ แต่ AI crawler ส่วนใหญ่ไม่ render จึงเห็นหน้าแรกที่แทบว่างเปล่าและไม่มีเมนู ส่วนหน้าภายใน (Our Story, Rooms, หน้าห้องพัก) render ฝั่ง server ได้ถูกต้อง

PageSpeed Insights หน้าแรก วันที่ 5 ตุลาคม 2026 (lab data — Chrome UX Report ไม่มี field data ของเว็บนี้ เพราะ traffic น้อยเกินกว่าจะเข้าเกณฑ์):

ตัวชี้วัดMobileDesktopเกณฑ์ที่ดี
Performance score6445≥ 90
Largest Contentful Paint (LCP)7.9 วิ0.6 วิ≤ 2.5 วิ
First Contentful Paint (FCP)3.5 วิ0.3 วิ≤ 1.8 วิ
Total Blocking Time (TBT)130 ms700 ms≤ 200 ms
Cumulative Layout Shift (CLS)00.705≤ 0.1
Accessibility / Best practices / SEO (mobile)89 / 92 / 92—≥ 90

สาเหตุหลักที่ถูกชี้: หน้าเว็บหนัก 5.7 MB, request ที่บล็อกการ render (ประมาณ 1.5 วินาที), asset 4.3 MB ที่ตั้ง cache lifetime สั้น, JavaScript ที่ไม่ได้ใช้ 191 KB, ปุ่มที่ไม่มี accessible name และข้อความที่ contrast ต่ำ ค่า layout shift บน desktop 0.705 หมายความว่าเนื้อหากระโดดขณะที่ hero และ feed โหลด — ให้กำหนดขนาดรูปไว้ล่วงหน้า และโหลด Instagram feed ที่อยู่ใต้ fold เฉพาะเมื่อผู้ใช้เลื่อนลงมาถึง

03

Metadata

Metadata คือชั้นที่อ่อนที่สุด: title ภาษาอังกฤษทั้ง 27 หน้าไม่มีหน้าไหนมีคำว่า "Bangkok" มีเพียงหน้าเดียวที่มีคำว่า "hotel" และ title ของหน้าแรกมีแค่ "YANH Ratchawat" (14 ตัวอักษร) Google จึงต้องเดาเองว่าที่พักนี้คืออะไรและอยู่ที่ไหน

ปัญหาหน้าที่ได้รับผลกระทบ (EN เว้นแต่ระบุไว้)ตัวอย่าง
ไม่มีสถานที่หรือประเภทกิจการใน title27 จาก 27 หน้าไม่มี "Bangkok" · 26 จาก 27 หน้าไม่มี "hotel"Home: "YANH Ratchawat"
title มีคำเดียว และ description = titleRooms, Facilities, Blog, Neighborhoods, Cookies Policy, Contact, Our Story (description)title "Rooms", description "Rooms"
tag ผิดภาษาEN Our Story และ EN Special Offers มี title ภาษาไทย ("เกี่ยวกับเรา", "ข้อเสนอพิเศษ") · บทความ blog EN มี description ภาษาไทย · ZH Our Story มี title ภาษาไทย · TH Facilities, Contact, Privacy, Terms และหน้าแรก TH/ZH ยังใช้ tag ภาษาอังกฤษ/en/our-story → "เกี่ยวกับเรา"
description ก๊อปวางซ้ำบทความ Ratchawat Market ใช้ description ของ P. Look Chin Sriyan ทั้งใน EN, TH และ ZH · บทความย่านทั้งฝั่ง TH/ZH ยังใช้ description ภาษาอังกฤษ"a culinary icon with over 60 years of tradition…"
ใช้ tagline แทนชื่อร้านหน้า Groundwork และ TANHtitle "Start your day right" และ "Every plate tells a story of balance" ไม่เคยบอกเลยว่าเป็นคาเฟ่หรือร้านอาหาร
ไม่มีชื่อ venueหน้า meeting ทั้ง 4 หน้าตั้ง title ตามชั้น ("TANH, 3rd Floor") ส่วนประเภทห้องและความจุ (Meeting Room สำหรับ 8 และ 10 คน, Function Space สำหรับ 20 คน, Unwind Room สำหรับ 18 คน) อยู่แค่ในเนื้อหาไม่มีใครค้นหาคำว่า "TANH 3rd floor" — ควรตั้ง title เป็น "Unwind Room – Event Space for 18"
อักขระซ่อนtitle EN 6 หน้ามี zero-width space (U+200B)"YANH Suite", "TANH, 2nd Floor"
ความยาวtitle ของ Ratchawat Market ยาว 100 ตัวอักษร · description ของ TANH, TANH 2nd และ TANH 3rd ยาว 205–237 ตัวอักษรถูกตัดทอนในผลการค้นหา
brand suffix ไม่สม่ำเสมอ"| YANH Hotel" (Contact), "| YANH Ratchawat" (Privacy, Terms) หน้าอื่นไม่มี—
ไม่มี Open Graph image75 จาก 81 URL (มีเฉพาะหน้าแรก 3 หน้า และหน้า contact 3 หน้า)แชร์หน้าห้องพักบน LINE, WhatsApp หรือ Facebook แล้วไม่มีรูปขึ้น
H1 หายไปหรือกว้างเกินไปหน้าแรกไม่มี H1 ในทุกภาษา · หน้า F&B 2 หน้าใช้ H1 เดียวกันว่า "Food & Drink" · หน้า meeting 4 หน้าใช้ "Meeting Room & Event" เหมือนกันหมด · H1 ของ Cookies Policy เขียนว่า "Privacy Policy"—

title และ description ภาษาอังกฤษที่เสนอ

รูปแบบ: [Page topic] | YANH Ratchawat [Hotel], Bangkok — title ไม่เกิน 60 ตัวอักษร, description 110–145 ตัวอักษร ข้อเท็จจริงที่ใช้มาจากเว็บไซต์, รายการบน OTA ของโรงแรม และข่าวที่ตีพิมพ์แล้ว ส่วนข้อเสนอ (offers) ต้องตรงกับที่เปิดขายจริง

ข้อความ title/description คงเป็นภาษาอังกฤษตามต้นฉบับ เพราะเป็นข้อความที่จะใช้จริงบนหน้า EN · บรรทัดตัวเอียงสีจางคือคำแปล
หน้าtitle ที่เสนอ (จำนวนตัวอักษร)meta description ที่เสนอ
HomeYANH Ratchawat Hotel | Design Hotel in Dusit, Bangkok (53)โรงแรม YANH Ratchawat | โรงแรมดีไซน์ในดุสิต กรุงเทพฯA 78-room design hotel in Bangkok's Ratchawat neighbourhood, Dusit. Outdoor pool, gym, Groundwork café, TANH restaurant and meeting rooms.โรงแรมดีไซน์ 78 ห้องในย่านราชวัตร เขตดุสิต กรุงเทพฯ มีสระว่ายน้ำกลางแจ้ง ฟิตเนส คาเฟ่ Groundwork ร้านอาหาร TANH และห้องประชุม
RoomsRooms & Suites | YANH Ratchawat Hotel, Bangkok (46)ห้องพักและห้องสวีท | โรงแรม YANH Ratchawat กรุงเทพฯSix room types, from 27 m² twins to the 56 m² Suite with bathtub and living room, plus a bunk-bed room for four. Book direct for the best rate.ห้องพัก 6 ประเภท ตั้งแต่ห้องเตียงแฝด 27 ตร.ม. ไปจนถึง Suite 56 ตร.ม. ที่มีอ่างอาบน้ำและห้องนั่งเล่น รวมถึงห้องเตียงสองชั้นสำหรับ 4 คน จองตรงเพื่อราคาที่ดีที่สุด
SuiteSuite, 56 m² with Bathtub & Living Room | YANH Ratchawat (56)ห้องสวีท 56 ตร.ม. พร้อมอ่างอาบน้ำและห้องนั่งเล่นOur largest room: 56 m² with king bed, separate living room, bathtub and 50-inch TV, in the heart of Ratchawat, Bangkok.ห้องที่ใหญ่ที่สุดของเรา: 56 ตร.ม. เตียงคิงไซซ์ ห้องนั่งเล่นแยก อ่างอาบน้ำ และทีวี 50 นิ้ว ใจกลางย่านราชวัตร กรุงเทพฯ
Standard QuadrupleFamily Room with Bunk Beds for 4 | YANH Ratchawat Bangkok (57)ห้องครอบครัวเตียงสองชั้นสำหรับ 4 คน30 m² room for up to four guests with bunk beds and a 50-inch TV. A practical base for families and friends exploring old Bangkok.ห้อง 30 ตร.ม. รองรับได้สูงสุด 4 ท่าน มีเตียงสองชั้นและทีวี 50 นิ้ว ที่พักที่ใช้งานได้จริงสำหรับครอบครัวและกลุ่มเพื่อนที่มาเที่ยวกรุงเทพฯ ย่านเก่า
FacilitiesPool, Gym, Café & Meeting Rooms | YANH Ratchawat Hotel (54)สระว่ายน้ำ ฟิตเนส คาเฟ่ และห้องประชุมOutdoor pool, fitness room, Groundwork café, TANH restaurant, meeting rooms, free Wi-Fi, parking and a 24-hour front desk.สระว่ายน้ำกลางแจ้ง ห้องฟิตเนส คาเฟ่ Groundwork ร้านอาหาร TANH ห้องประชุม Wi-Fi ฟรี ที่จอดรถ และแผนกต้อนรับ 24 ชั่วโมง
Our StoryOur Story: A 1980s Tech Building Reborn | YANH Ratchawat (56)เรื่องราวของเรา: อาคารเทคโนโลยียุค 1980 ที่ได้ชีวิตใหม่How a white-tiled 1980s computer-business building in Ratchawat became a neighbourhood hotel, redesigned by CHAT Architects.เรื่องราวของอาคารธุรกิจคอมพิวเตอร์ยุค 1980 ที่บุกระเบื้องสีขาวในย่านราชวัตร ซึ่งกลายมาเป็นโรงแรมประจำย่าน ออกแบบใหม่โดย CHAT Architects
Our NeighborhoodsRatchawat Neighbourhood Guide: Markets & Local Food | YANH (58)คู่มือย่านราชวัตร: ตลาดและอาหารท้องถิ่นWhere to eat and walk around Ratchawat and Sriyan: Ratchawat Market, P. Look Chin Sriyan and the shophouse streets of old Dusit.กินที่ไหนและเดินเล่นที่ไหนรอบราชวัตรและศรีย่าน: ตลาดราชวัตร, P. Look Chin Sriyan และถนนห้องแถวของดุสิตเก่า
Special OffersSpecial Offers & Direct-Booking Deals | YANH Ratchawat (54)ข้อเสนอพิเศษและดีลจองตรงCurrent packages and direct-booking rates at YANH Ratchawat, Bangkok, including long-stay and early-bird offers.แพ็กเกจปัจจุบันและราคาจองตรงของ YANH Ratchawat กรุงเทพฯ รวมถึงข้อเสนอพักระยะยาวและจองล่วงหน้า (early-bird)
ContactContact & Location | YANH Ratchawat Hotel, Dusit, Bangkok (57)ติดต่อและที่ตั้ง1376/1 Nakhon Chai Si Road, Dusit, Bangkok 10300. Call +66 2 180 6450 or email stay@yanhhotel.com. Directions, parking and transport.1376/1 ถนนนครไชยศรี เขตดุสิต กรุงเทพฯ 10300 โทร +66 2 180 6450 หรืออีเมล stay@yanhhotel.com เส้นทาง ที่จอดรถ และการเดินทาง
GroundworkGroundwork Specialty Coffee | Café at YANH Ratchawat (52)Groundwork กาแฟ specialty | คาเฟ่ใน YANH RatchawatSpecialty coffee, carefully sourced and precisely brewed, with space to sit and work. Groundwork is the café at YANH Ratchawat, Bangkok.กาแฟ specialty คัดสรรเมล็ดอย่างพิถีพิถันและชงอย่างแม่นยำ พร้อมพื้นที่นั่งทำงาน Groundwork คือคาเฟ่ของ YANH Ratchawat กรุงเทพฯ
TANHTANH Restaurant | Breakfast & Dining at YANH Ratchawat (54)ร้านอาหาร TANH | อาหารเช้าและมื้ออาหารที่ YANH RatchawatTANH, the restaurant at YANH Ratchawat: breakfast and dining that balance local tradition with a modern touch.TANH ร้านอาหารของ YANH Ratchawat: อาหารเช้าและมื้ออาหารที่ผสานขนบท้องถิ่นเข้ากับความร่วมสมัยอย่างลงตัว
Meetings hub ใหม่Meeting Rooms & Event Space in Dusit, Bangkok | YANH (52)ห้องประชุมและพื้นที่จัดงานในดุสิต กรุงเทพฯFour rooms across Groundwork and TANH for meetings, workshops and private events in Ratchawat. Send an enquiry online.ห้อง 4 ห้องในโซน Groundwork และ TANH สำหรับการประชุม เวิร์กช็อป และงานส่วนตัวในย่านราชวัตร ส่งคำขอสอบถามทางออนไลน์ได้

title ภาษาไทย ควรใช้ชื่อแบรนด์ภาษาไทยที่มีอยู่แล้วบน /th/rooms คือ "โรงแรมย่าน ราชวัตร" พร้อมชื่อเขต เช่น Home → "โรงแรมย่าน ราชวัตร (YANH Ratchawat) | โรงแรมดีไซน์ ย่านดุสิต กรุงเทพฯ" title ภาษาจีน ควรมีคำว่า 曼谷 (กรุงเทพฯ) และ 酒店 (โรงแรม) ทุกหน้า ต้องมี og:image ของตัวเอง (รูป hero ของห้องหรือ venue นั้น) และมี H1 เพียงตัวเดียวที่เฉพาะเจาะจงกับหน้านั้น

04

Structured data และ entity

ไม่มี structured data เลย: JSON-LD 0 บล็อกจากทั้ง 81 URL สำหรับโรงแรม นี่คืองานแก้ที่ถูกที่สุดแต่ได้ผลสูง เพราะเป็นการส่งชื่อ ที่อยู่ ห้องพัก สิ่งอำนวยความสะดวก และ venue ให้ Knowledge Graph ของ Google และ AI answer engine ในรูปแบบที่ไม่ต้องเดา

ที่อยู่ก็หายไปจากจุดที่เครื่องมองหา — ปรากฏเฉพาะใน footer ที่ render ฝั่ง client ("1376/1 Nakornchaisri Road, Dusit, Bangkok 10300") footer ใน server HTML ไม่มีที่อยู่ หน้า Contact มีเบอร์โทรและอีเมลแต่ไม่มีที่อยู่หรือแผนที่ และ OTA สะกดชื่อถนนต่างกัน (Trip.com: "1376/1 Nakhonchaisi Rd")

Schema ที่ต้องเพิ่ม แยกตาม template

TemplateTypeproperty หลัก
ทุกหน้า (ใส่ใน layout)Hotel (มี @id เดียว อ้างอิงจากทุกที่) + WebSitename, alternateName, address, geo, telephone, email, numberOfRooms, checkinTime, checkoutTime, amenityFeature, sameAs, image
หน้าห้องพัก 6 หน้าHotelRoom, containedInPlace → Hotelname, floorSize, occupancy, bed, amenityFeature, image
TANHRestaurantservesCuisine, openingHoursSpecification, containedInPlace
GroundworkCafeOrCoffeeShopopeningHoursSpecification, containedInPlace
หน้า meeting 4 หน้าMeetingRoommaximumAttendeeCapacity (8, 10, 20, 18), floorSize (23, 28, 95, 90 m²), amenityFeature
บทความย่าน, blogArticle ที่มี about → Placeheadline, datePublished, dateModified, author, image
หน้าภายในทุกหน้าBreadcrumbList—
หน้า FAQ ใหม่FAQPageGoogle แสดง FAQ rich results ให้เฉพาะเว็บที่มี authority สูงไม่กี่เว็บ แต่ markup นี้ยังให้คู่คำถาม–คำตอบที่สะอาดแก่ AI engine

Hotel entity พร้อมวาง (EN — ทำซ้ำสำหรับแต่ละ locale โดยแปลชื่อและคำอธิบาย)

ค่าที่อยู่ในวงเล็บมุม < > (ไฮไลต์สีแดง) ต้องให้โรงแรมยืนยันก่อน release ส่วนค่าอื่นทั้งหมดนำมาจากเว็บไซต์จริงหรือรายการบน OTA ของโรงแรม (78 ห้อง)

{
  "@context": "https://schema.org",
  "@type": "Hotel",
  "@id": "https://www.yanhhotel.com/#hotel",
  "name": "YANH Ratchawat Hotel",
  "alternateName": ["YANH Ratchawat", "โรงแรมย่าน ราชวัตร"],
  "description": "A 78-room neighbourhood hotel in a restored 1980s tech building in Ratchawat, Dusit, Bangkok.",
  "url": "https://www.yanhhotel.com/en",
  "telephone": "+66 2 180 6450",
  "email": "stay@yanhhotel.com",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1376/1 <Nakhon Chai Si Road — match Google Business Profile spelling>",
    "addressLocality": "Dusit",
    "addressRegion": "Bangkok",
    "postalCode": "10300",
    "addressCountry": "TH"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": "<from GBP pin>", "longitude": "<from GBP pin>" },
  "numberOfRooms": 78,
  "checkinTime": "<14:00?>",
  "checkoutTime": "<12:00?>",
  "amenityFeature": [
    { "@type": "LocationFeatureSpecification", "name": "Outdoor swimming pool", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Fitness room", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Free Wi-Fi", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Car parking", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Meeting rooms", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "24-hour front desk", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Massage service", "value": true },
    { "@type": "LocationFeatureSpecification", "name": "Non-smoking rooms", "value": true }
  ],
  "sameAs": [
    "https://www.facebook.com/yanhratchawat",
    "https://www.instagram.com/yanhratchawat"
  ],
  "image": "<absolute URL of the hero image>"
}
ความหมายของ placeholder: <Nakhon Chai Si Road — match Google Business Profile spelling> = สะกดชื่อถนนให้ตรงกับ Google Business Profile · <from GBP pin> = พิกัดจากหมุดใน Google Business Profile · <14:00?> / <12:00?> = เวลา check-in / check-out ที่ต้องยืนยัน · <absolute URL of the hero image> = URL เต็มของรูป hero

เมื่อขึ้นระบบแล้ว ให้ตรวจสอบด้วย Rich Results Test ของ Google และ Schema.org validator และทำให้ชื่อ ที่อยู่ และเบอร์โทร (NAP) ปรากฏเหมือนกันทุกตัวอักษรใน footer (render ฝั่ง server), หน้า Contact, Google Business Profile และ extranet ของ OTA ทุกเจ้า

05

AEO / การมองเห็นบน AI

Answer engine มีวัตถุดิบที่ดีเกี่ยวกับ YANH อยู่แล้ว — สื่อไทยและสื่อสายดีไซน์เล่าเรื่องไว้ดี — แต่ไม่มีอะไรชี้พวกมันมาที่ yanhhotel.com ในการค้นหาชื่อแบรนด์ 4 ครั้ง เว็บทางการไม่ปรากฏในผลอันดับต้นเลยสักครั้ง แต่เว็บจองลอกเลียนแบบที่ไม่เป็นทางการกลับปรากฏ

คำค้น (5 ต.ค. 2026)ผลที่ได้มีเว็บทางการในผลหรือไม่
YANH RatchawatBooking.com, art4d, trivago, Facebook, Wanderlog, Trip.com, บล็อกท่องเที่ยว 1 เว็บ, เว็บ clone 2 เว็บไม่มี (top 9)
YANH Ratchawat hotel Bangkok addressGoogle Hotels entity, Traveloka, Trip.com ×2, Prestigia, VenueReport, เว็บ affiliate clone 4 เว็บ (bangkokshotels, bangkokhotel24, bangkoktophotels, bangkokihotel)ไม่มี (top 10)
โรงแรม YANH ราชวัตรThe Standard, BKKMENU, Lemon8 ×2, Trip.com TH, Pratuneung, Readthecloud และเว็บ clone ที่ติดป้ายว่า "เว็บไซต์"ไม่มี (top 9)
"yanhhotel.com"Instagram, BKKMENU, Trip.com, Readthecloudไม่พบ ตัวโดเมนเองในผลลัพธ์

วิธีการ: ใช้ดัชนีการค้นหาเว็บของ Claude ไม่ใช่ Google ให้ถือเป็นสัญญาณเบื้องต้น แล้วยืนยันใน Search Console (อันดับของคำค้นชื่อแบรนด์) และด้วยการถาม ChatGPT, Perplexity, Gemini และ Google AI Mode ว่า "What is the official website of YANH Ratchawat?" (เว็บไซต์ทางการของ YANH Ratchawat คืออะไร)

เว็บ clone มีผลเชิงพาณิชย์: yanhratchawat.com-bangkok.com ระบุใน footer ของตัวเองว่า "not an official website" (ไม่ใช่เว็บไซต์ทางการ) แต่รับจองห้อง และโฆษณาราคา "up to 10% less than Booking.com" (ถูกกว่า Booking.com สูงสุด 10%) ผู้ช่วย AI ที่ถูกถามหา "เว็บไซต์ของโรงแรม" อาจส่งแขกไปที่เว็บนี้ — ทำให้เสียค่าคอมมิชชัน และไม่ได้ข้อมูลแขก

สิ่งที่ engine รู้อยู่แล้ว เทียบกับสิ่งที่เว็บบอก

ข้อเท็จจริงในสื่อบน yanhhotel.com
YANH = "Your Average Neighborhood Hotel"; ย่าน = neighbourhoodart4dมี Our Story
อาคารของบริษัทคอมพิวเตอร์ยุคต้นทศวรรษ 1980 ผนังกระเบื้องสี่เหลี่ยมสีขาวart4dมี Our Story และหน้าแรก (แต่เนื้อหาหน้าแรก render ฝั่ง client)
สถาปนิก: CHAT Architects; ผู้พัฒนาโครงการ: SC Assetart4dไม่มี
ที่อยู่, เขต, วิธีเดินทางOTAมีเฉพาะใน footer ที่ render ฝั่ง client · ไม่มีแผนที่ ไม่มีเส้นทาง
คะแนนรีวิว (Trip.com 9.2/10 จาก 297 รีวิว)OTAไม่มี คะแนนรีวิวหรือคำพูดจากแขก
เวลา check-in/out, เวลาอาหารเช้า, เงื่อนไขที่จอดรถ, สัตว์เลี้ยง, รถรับส่งสนามบินไม่ได้ตรวจไม่มี

งานแก้ เรียงตามผลกระทบ

  1. ชี้ทุกโปรไฟล์ที่โรงแรมเป็นเจ้าของมาที่ yanhhotel.com — ช่อง website ของ Google Business Profile, ช่อง "hotel website" บน OTA, bio ของ Facebook, Instagram และ LINE — และขอให้สื่อที่กล่าวถึงข้างต้นลิงก์มาที่เว็บทางการ นี่คือวิธีที่ engine เรียนรู้ว่าโดเมนไหนคือ "ทางการ"
  2. Server-render เนื้อหาหน้าแรกและเมนูนำทาง (ดูหัวข้อ Technical → การ render) — GPTBot, ClaudeBot และ PerplexityBot โดยทั่วไปไม่รัน JavaScript ปัจจุบัน robots.txt อนุญาต bot เหล่านี้อยู่แล้ว ให้คงไว้แบบนั้น
  3. เผยแพร่หน้า FAQ (EN/TH/ZH, 15–20 คำตอบ, มี FAQPage markup) ครอบคลุม: ทำเลและการเดินทาง, สถานที่สำคัญใกล้เคียงพร้อมเวลาเดินที่วัดจริง, check-in/out, อาหารเช้าที่ TANH, เวลาเปิดสระและยิม, ที่จอดรถ, Wi-Fi และอุปกรณ์สำหรับทำงาน, ห้องสำหรับ 4 คน, การพักระยะยาว, ความจุและราคาห้องประชุม, สัตว์เลี้ยง, รถรับส่งสนามบิน แล้วนำคำตอบที่เกี่ยวข้อง 3–4 ข้อไปใส่ซ้ำในแต่ละหน้าห้องพักและหน้า meeting
  4. เพิ่มหน้า Location & Getting Here ที่มีที่อยู่ภาษาอังกฤษและภาษาไทย, แผนที่แบบฝัง, การ์ดภาษาไทยสำหรับยื่นให้คนขับแท็กซี่ และสถานที่สำคัญที่แขกค้นหา (ตลาดราชวัตร, ตลาดศรีย่าน, วัดเบญจมบพิตร, บริเวณพระราชวังดุสิต)
  5. เพิ่มหน้า Press ที่อ้างอิง art4d, The Standard, Readthecloud และ BKKMENU และให้เครดิต CHAT Architects ในหน้า Our Story — ข้อเท็จจริงที่มีหลายแหล่งยืนยันตรงกันคือสิ่งที่คำตอบของ AI จะนำมาพูดซ้ำ
  6. แสดงคะแนนรีวิวของแขก (widget จาก OTA หรือ review aggregator) บนหน้า Home และ Rooms แต่ อย่า mark up เป็น AggregateRating บนเว็บของโรงแรมเอง เพราะ Google ถือว่าเป็นการรีวิวตัวเอง (self-serving) และจะเพิกเฉย
  7. พิจารณาดำเนินการกับโดเมน clone (ร้องเรียนต่อ registrar หรือร้องเรียนด้านแบรนด์) หลังจากสัญญาณทางการข้างต้นพร้อมแล้ว — ต้องขอคำปรึกษาทางกฎหมาย

ไฟล์ llms.txt เป็นทางเลือกและมีความสำคัญต่ำ: ปัจจุบันยังไม่มี engine หลักรายใดพึ่งพาไฟล์นี้ และ /llms.txt ตอนนี้ redirect ไปที่หน้าแรก

06

Content (เนื้อหา)

เรื่องราวคือสินทรัพย์ — อาคารบริษัทคอมพิวเตอร์ยุค 1980, ด้านหน้าอาคารกระเบื้องสีขาว, ย่านสตรีทฟู้ด — แต่ copy ขายเรื่องนี้ด้วยประโยคสร้างอารมณ์ (mood lines) และหน้าที่สร้างรายได้นอกเหนือจากห้องพัก (meetings, dining, offers) คือหน้าที่เนื้อหาบางที่สุดและมีลิงก์เข้าน้อยที่สุด

สิ่งที่ใช้ได้ดี: Our Story (ประมาณ 450 คำ) อธิบายที่มาของชื่อและประวัติอาคารได้น่าเชื่อถือ · คู่มือย่าน (ตลาดราชวัตร, P. Look Chin Sriyan) คือเนื้อหาท้องถิ่นแบบที่ Google และ AI engine ให้คุณค่า · หน้าห้องพักมีข้อเท็จจริงที่ชัดเจน (ตร.ม., เตียง, จำนวนผู้เข้าพัก, ทีวี) · หน้า meeting ระบุความจุและขนาด
ด้านปัญหาวิธีแก้
หน้าแรกมีข้อความประมาณ 56 คำใน server HTML · ไม่มี H1 · H2 เขียนว่า "WELCOME TO" และ "YANH" · ไม่มีที่อยู่ จำนวนห้อง หรือสิ่งอำนวยความสะดวกหลักในส่วนบนของหน้า (above the fold) · ประโยคอย่าง "stay on top of your career game" แทบไม่ได้บอกอะไรH1 ตัวเดียว ("A neighbourhood hotel in Ratchawat, Bangkok"), ย่อหน้าบอกตำแหน่งแบรนด์ (positioning) 3 บรรทัด, แถบข้อเท็จจริง (78 rooms · pool · gym · café · restaurant · 4 meeting rooms · Dusit) และคะแนนรีวิวของแขก
Positioningสื่อเรียก YANH ว่า "workation hotel" แต่เว็บไซต์แค่บอกเป็นนัย ("spaces made for work") ไม่มีอะไรพิสูจน์: ไม่มีความเร็ว Wi-Fi, การจัดโต๊ะทำงาน, ราคาพักระยะยาว หรือหน้า workspaceตัดสินใจ: จะเอาจริงด้วยหน้า Work & Stay (หลักฐานยืนยัน, ข้อเสนอพักระยะยาว, Groundwork ในฐานะ workspace) หรือเลิกกล่าวอ้าง
Meetings4 หน้า หน้าละ 50–71 คำ · ไม่มีรูปแบบการจัดห้อง (layout), แพ็กเกจ, ราคาครึ่งวัน/เต็มวัน, รายละเอียดอาหาร (catering) หรือ AV · เป็นหน้า orphan (ดู Structure)ทำ Meetings hub หน้าเดียวที่มีตารางเปรียบเทียบ (ห้อง, ตร.ม., จำนวนที่นั่งตาม layout, AV, ราคาเริ่มต้น), แพ็กเกจ และฟอร์มสอบถามโดยเฉพาะ
DiningTANH ("The Morning Table of the Neighborhood") และ Groundwork (specialty coffee) ไม่มีเวลาเปิด-ปิด เมนู ราคา หรือข้อความว่า "เปิดให้บุคคลทั่วไปที่ไม่ได้เข้าพัก" · เป็นหน้า orphanทำ Dining hub พร้อมเวลาเปิด เมนูตัวอย่าง ระดับราคา และรูปภาพ · ลิงก์จาก Home, Facilities และทุกหน้าห้องพัก
Offerstitle ของหน้า EN เป็นภาษาไทย · ข้อเสนอไม่ถูกนำไปแสดงที่อื่นในเว็บเลยแก้ title · นำข้อเสนอหลักไปแสดงบน Home และในหน้าห้องพัก
Blog & guideบทความ blog 1 บทความ (2023) กับฟอร์มขอข้อมูลสำหรับสื่อที่ถูกจัดเป็นโพสต์ blog · บทความย่าน 2 บทความ (2024) ในทางกลับกัน Instagram โพสต์สม่ำเสมอ (long stay, early bird, wellness weekends, collaborations)ทำจังหวะรายเดือน: แปลงธีมจาก Instagram เป็นคู่มือบนเว็บ · ย้ายฟอร์มสำหรับสื่อไปที่ /press
ข้อผิดพลาดใน copy"sogo dough" (ควรเป็น sago — สาคู) บนหน้าแรก · H1 ของ Cookies Policy เขียนว่า "Privacy Policy" · H1 ของ Terms เขียนว่า "Terms & Service" · footer ฝั่ง server เขียนว่า "Copyright undefined" · alt text เป็น "Our Story Image 01", "WELCOME TO" · caption ของ Instagram ใช้ตัวหนาแบบ Unicode ซึ่ง screen reader และ search engine อ่านไม่ได้ตรวจทาน (proofread) ทั้งหมด · alt text ที่สื่อความหมาย · caption เป็นข้อความธรรมดา
การตั้งชื่อห้อง"Standard Quadruple" เป็นภาษาของ OTA แขกค้นหาว่า "family room" หรือ "room for 4" และมีคำว่า "YANH" นำหน้าชื่อห้องทุกห้องคงชื่อ rate plan ไว้ แต่ใช้หัวข้อหลักว่า "Family Room with Bunk Beds (sleeps 4)"
TH / ZHtag และ description ปนภาษา (ดู Metadata) · copy ภาษาอังกฤษถูกนำไปใช้ใน meta ภาษาไทยและจีนให้เจ้าของภาษาตรวจ title, description และ H1 ของ TH/ZH ทั้งหมด

หัวข้อที่ควรครองให้ได้ (Topics to own)

ไม่มีข้อมูลปริมาณการค้นหา (keyword volume) สำหรับการตรวจครั้งนี้ (ไม่มีสิทธิ์เข้า Search Console หรือเครื่องมือ keyword) ดังนั้นรายการนี้คือ intent ที่ต้องไปตรวจสอบต่อ ใน Search Console และ Google Keyword Planner ไม่ใช่เป้าหมายที่จัดอันดับความสำคัญแล้ว

Intentภาษาอังกฤษภาษาไทยหน้าที่ควรติดอันดับ
แบรนด์ (Brand)YANH Ratchawat, YANH hotel Bangkokโรงแรมย่าน ราชวัตรHome
ทำเล (Location)hotel in Dusit Bangkok; hotel near Ratchawat Market; near Wat Benchamabophitโรงแรมย่านดุสิต; ที่พักใกล้ตลาดราชวัตรHome, หน้า Location
ดีไซน์ (Design)design hotel Bangkok; boutique hotel old Bangkokโรงแรมดีไซน์ กรุงเทพOur Story
ทำงานและพักยาว (Work & long stay)workation hotel Bangkok; long-stay hotel Bangkokworkation กรุงเทพ; ที่พักรายเดือนหน้า Work & Stay
ห้องประชุม (Meetings)meeting room Dusit; small meeting room Bangkokห้องประชุม ราชวัตร; ห้องประชุม ดุสิตMeetings hub
อาหารและย่าน (Food & area)Ratchawat Market food; where to eat in Sriyanร้านอร่อย ราชวัตร; ของกินศรีย่านNeighbourhood guide
Staycationstaycation Bangkok with poolstaycation กรุงเทพOffers
ครอบครัว (Family)family room Bangkok for 4ห้องพัก 4 คน กรุงเทพStandard Quadruple

intent ภาษาไทยมีโอกาสเติบโตสูงสุด: สื่อไทยรายงานเรื่อง YANH อยู่แล้ว ครีเอเตอร์บน Lemon8 ก็โพสต์ถึงในฐานะที่ staycation และเว็บภาษาไทยคือเว็บที่ข้อผิดพลาดเรื่อง canonical กำลังซ่อนไว้

07

Structure และ UX

เว็บไซต์ถูกสร้างแบบโบรชัวร์ ไม่ใช่เส้นทางสู่การจอง: 6 หน้าที่ขาย dining และ meetings ไม่มีลิงก์ภายในจากที่ใดเลย ปุ่มจองห้องเปิด booking engine ด้วยวันที่ที่ผ่านไปแล้ว และผู้เข้าชมชาวไทยถูกผลักไปหน้าภาษาอังกฤษ

ปัญหาหลักฐานวิธีแก้
หน้าสร้างรายได้ที่เป็น orphanTANH, Groundwork และห้องประชุม 4 ห้อง (6 URL ฝั่ง EN + 12 URL ฝั่ง TH/ZH) ไม่ได้รับลิงก์จากเมนู, footer, หน้าแรก, Facilities หรือหน้าอื่นใด — เข้าถึงได้ผ่าน sitemap เท่านั้น บนหน้า Facilities คำว่า "TANH Restaurant", "GROUNDWORK Cafe" และ "Meeting Room & Event" เป็นข้อความธรรมดา ไม่ใช่ลิงก์ใส่ Dining hub และ Meetings hub ในเมนูหลัก · ลิงก์ทุก tile ในหน้า Facilities
เมนูหลักมีแค่ Our Story, Rooms, Special Offers, Our Neighborhoods, Contact ไม่มี Facilities, Dining หรือ Meetings และเมนู render ฝั่ง client จึงไม่มีอยู่ใน server HTMLทำเมนูตามแผนภาพด้านล่าง และ render ฝั่ง server
Booking deep linksลิงก์จองบนการ์ดห้องพัก hard-code วันเช็คอิน 29–31 กรกฎาคม 2026 (ผ่านไปแล้ว) และ locale=en แม้อยู่บนหน้า TH/ZH ส่วนปุ่ม "Book Now" บน header เปิด engine โดยไม่มีวันที่ส่งวันนี้/พรุ่งนี้ หรือวันที่ที่แขกเลือก พร้อม locale ของหน้าและสกุลเงิน THB · เพิ่ม date picker ใน header
Attributionbooking engine ทำงานบน book-directonline.com และโหลดทั้ง gtag.js และ gtm.jsยืนยัน GA4 cross-domain linking และการติดตาม purchase เพื่อให้รายได้จากการจองตรงถูกนับเป็นผลงานของเว็บไซต์และแคมเปญ
ภาษารั่วลิงก์ที่ไม่มี locale (ดู T5) ส่งผู้ใช้ TH/ZH ไปหน้าภาษาอังกฤษลิงก์ที่ผูกกับ locale (locale-aware)
หน้าที่วางผิดที่Media & Influencer Request อยู่ใต้ /blog/ย้ายไป /press และทำ 301
การตั้งชื่อ URL/food-and-drink/TANH, /meeting-room-and-event/TANH-2nd/dining/tanh, /meetings/tanh-2nd-floor (ตัวพิมพ์เล็ก) พร้อม 301
Contactมีฟอร์ม เบอร์โทร อีเมล แต่ไม่มีที่อยู่ แผนที่ หรือปุ่ม LINE ที่เด่นชัด (LINE เป็นแค่ไอคอนใน footer)ที่อยู่ภาษาอังกฤษและไทย, แผนที่, ปุ่ม LINE และโทรศัพท์เป็นปุ่มหลัก
น้ำหนักหน้าแรกฝังโพสต์ Instagram 26 โพสต์เป็นลิงก์ออกนอกเว็บ feed นี้มีส่วนทำให้หน้าหนัก 5.7 MB และ desktop layout shift 0.705แสดง 6 โพสต์ และโหลดเมื่อเลื่อนถึง
Footerserver HTML มีแค่ลิงก์ด้านกฎหมายและ "Copyright undefined"footer ที่ render ฝั่ง server มีที่อยู่ เบอร์โทร LINE และลิงก์หน้าสำคัญ
AccessibilityPSI: ปุ่มที่ไม่มี accessible name, ข้อความ contrast ต่ำ, alt text กว้างๆ ไม่สื่อความหมายใส่ label ให้ปุ่มไอคอน · เพิ่ม contrast · อธิบายรูปภาพ

โครงสร้างเว็บที่เสนอ · 8 ส่วน, hub ใหม่ 3 หน้า

Every revenue line one click from the homepage — ทุกช่องทางรายได้อยู่ห่างจากหน้าแรกเพียงคลิกเดียว

โครงสร้างที่เสนอสำหรับ yanhhotel.com เหมือนกันทั้ง EN, TH และ ZH

Home
hub page ใหม่หน้าที่มีอยู่แล้ว เก็บไว้และเขียนใหม่

แปดส่วนในเมนูเดียวที่ render ฝั่ง server ทำให้ห้องพัก, dining, meetings และ offers อยู่ห่างจาก Home เพียงคลิกเดียว และทำให้เนื้อหา FAQ และ location มีที่อยู่ถาวร

08

แผนปฏิบัติการ (Action plan)

งานแก้ P1 จำนวน 11 รายการ ใช้เวลาประมาณ 6 วันทำงานของนักพัฒนา, 2 วันของทีมคอนเทนต์ และ 1 วันของงานธุรการฝั่งการตลาด งานเหล่านี้กำจัดข้อผิดพลาดที่ซ่อนเว็บภาษาไทย ทำให้สำเนา staging รั่วออกไป และยกผลการค้นหาชื่อแบรนด์ให้ OTA ส่วน P2 คือการสร้างหน้าที่ขาย dining และ meetings และ P3 คือกลไกผลิตคอนเทนต์ต่อเนื่อง

#งานผู้รับผิดชอบEffort (ประมาณ)Priorityสถานะ
1ตั้ง self-canonical ให้ทุกหน้า TH และ ZH และตั้ง og:url ตาม locale (T1)นักพัฒนา0.5 วันP1แก้แล้ว · รอ deploy
2แก้บรรทัด Sitemap ใน robots.txt ให้ชี้ไปที่ www.yanhhotel.com (T2)นักพัฒนา10 นาทีP1แก้แล้ว · รอ deploy
3ตั้งรหัสผ่านป้องกัน www-uat, เพิ่ม noindex และลบ URL ของ UAT ที่ถูก index ออกผ่าน Search Console (T3)นักพัฒนา0.5 วันP1บางส่วนnoindex โค้ดแล้ว รอ deploy · Search Console removal (marketing) · IAP (infra)
4แก้ canonical 6 จุดที่ชี้ไปหน้า 404 (T4)นักพัฒนา1 ชั่วโมงP1แก้แล้ว · รอ deployหายพร้อม T1 (self-canonical)
5ทำให้ลิงก์ภายในทุกลิงก์ผูกกับ locale (T5)นักพัฒนา1 วันP1แก้แล้ว · รอ deploy
6Server-render เนื้อหาหน้าแรก, เมนูหลัก และ footer (ที่อยู่, เบอร์โทร, copyright)นักพัฒนา2–3 วันP1แก้แล้ว · รอ deploy
7ลิงก์จอง: ใช้วันที่จริง, locale ของหน้า และ THB · เพิ่ม date picker ใน headerนักพัฒนา0.5 วันP1บางส่วนลิงก์: วันที่/ภาษา/THB แก้แล้ว รอ deploy · date picker ใน header ทำทีหลัง
8title, description ใหม่ และ H1 เดียวต่อหน้าสำหรับทั้ง 27 หน้า EN · ชุด TH และ ZH โดยเจ้าของภาษาทีมคอนเทนต์2 วันP1บางส่วนโค้ดครบ (H1 + SEO แยกภาษา + suffix) รอ deploy · ข้อความ title/description ใหม่เป็นงาน content
9JSON-LD ของ Hotel, HotelRoom และ BreadcrumbList ใน layout และ template ห้องพักนักพัฒนา1 วันP1แก้แล้ว · รอ deploygeo, จำนวนห้อง, check-in/out รอโรงแรมยืนยัน
10ชี้ Google Business Profile, extranet ของ OTA, Facebook, Instagram และ LINE มาที่ yanhhotel.com · ปรับการสะกดที่อยู่ให้ตรงกันการตลาด / ฝ่ายรายได้ (Revenue)1 วันP1ยังไม่เริ่ม
11Verify Search Console สำหรับ www และ www-uat · submit sitemap · ตั้ง baseline อันดับคำค้นชื่อแบรนด์และการ index ของ TH/ZHการตลาด2 ชั่วโมงP1ยังไม่เริ่ม
12สร้าง Dining hub และ Meetings hub · เปลี่ยน slug เป็นตัวพิมพ์เล็กพร้อม 301 · เพิ่มในเมนู · ลิงก์ tile ใน Facilities (T7, T8)นักพัฒนา + ทีมคอนเทนต์1 สัปดาห์P2ยังไม่เริ่ม
13หน้า Location & Getting Here และ FAQ ภาษา EN/TH/ZH พร้อม FAQPage markupทีมคอนเทนต์1 สัปดาห์P2ยังไม่เริ่ม
14schema ของ Restaurant, CafeOrCoffeeShop และ MeetingRoomนักพัฒนา0.5 วันP2แก้แล้ว · รอ deploy
15Performance: cache header, น้ำหนักรูป, เลื่อนการโหลด Instagram feed, แก้ desktop CLS 0.705, ตัด request ที่บล็อกการ renderนักพัฒนา3–5 วันP2บางส่วน
16og:image เฉพาะหน้าบนทุก URLนักพัฒนา0.5 วันP2แก้แล้ว · รอ deploy
17ใช้วันที่ lastmod จริงใน sitemap (T6)นักพัฒนา0.5 วันP2แก้แล้ว · รอ deploy
18ใช้ Google tag ตัวเดียวผ่าน GTM · GA4 cross-domain ไปยัง booking engine · event purchase (T10)นักพัฒนา + การตลาด1 วันP2บางส่วนCSP ที่บล็อก GA4 แก้แล้ว · cross-domain รอ marketing
19ตรวจทาน (sago, H1), alt text ที่สื่อความหมาย, label ปุ่มที่ accessible, contrastทีมคอนเทนต์ + นักพัฒนา1 วันP2บางส่วนส่วน dev เสร็จ (label ปุ่ม, alt ทุกจุด, H1) · เหลือ contrast (ดีไซน์) และ "sago" (content)
20หน้า Press · ให้เครดิต CHAT Architects ใน Our Story · แสดงคะแนนรีวิวของแขกบน Home และ Roomsทีมคอนเทนต์2 วันP2ยังไม่เริ่ม
21หน้า Work & Stay พร้อมหลักฐานยืนยันและข้อเสนอพักระยะยาว — ทำเฉพาะเมื่อยืนยัน positioning แล้วGM + ทีมคอนเทนต์3 วันP3ยังไม่เริ่ม
22คู่มือย่านรายเดือน (EN/TH/ZH) โดยดึงจากธีมใน Instagramทีมคอนเทนต์ต่อเนื่องP3ยังไม่เริ่ม
23ย้ายฟอร์มสำหรับสื่อไป /press · คืน 404 สำหรับ path ระดับ root ที่ไม่รู้จัก (T9)นักพัฒนา2 ชั่วโมงP3แก้แล้ว · รอ deploy
24ร้องเรียนด้านแบรนด์หรือต่อ registrar กับโดเมน clone หลังจากสัญญาณทางการขึ้นระบบแล้วเจ้าของ + ที่ปรึกษากฎหมาย—P3ยังไม่เริ่ม
ข้อมูลที่ต้องได้จากโรงแรมก่อนจะปิดงาน P1/P2 ได้: สิทธิ์เข้า Search Console และ GA4 · สิทธิ์เข้า Google Business Profile · สิทธิ์ admin ของ booking engine · การยืนยันเวลา check-in/out, เวลาและราคาอาหารเช้า, เงื่อนไขที่จอดรถ, นโยบายสัตว์เลี้ยงและรถรับส่งสนามบิน · ราคาและแพ็กเกจห้องประชุม · รายการข้อเสนอที่เปิดขายอยู่ · ปีที่เปิดให้บริการ
09

แหล่งข้อมูล (Sources)

  • yanhhotel.com/en, robots.txt, sitemap.xml และ 81 URL ที่อยู่ใน sitemap — crawl เมื่อ 5 ตุลาคม 2026
  • www-uat.yanhhotel.com (staging host) — ตรวจเมื่อ 5 ตุลาคม 2026
  • รายงาน PageSpeed Insights หน้าแรก — 5 ตุลาคม 2026
  • รายการบน Trip.com — ที่อยู่, 78 ห้อง, คะแนน 9.2/10 จาก 297 รีวิว
  • art4d, "YANH RATCHAWAT: Revamping an old building" — CHAT Architects, SC Asset, ประวัติอาคาร
  • yanhratchawat.com-bangkok.com — เว็บจองที่ไม่เป็นทางการ และข้อความปฏิเสธความเป็นทางการ (disclaimer) ของเว็บนั้น
ต้นฉบับ PDF ฝังลิงก์ของ PageSpeed Insights, Trip.com, art4d และเว็บ clone ไว้ แต่ URL เต็มไม่ติดมาในข้อความที่ดึงออกจาก PDF ฉบับแปลนี้จึงใส่ลิงก์เฉพาะ URL ที่ระบุชัดในเนื้อหา
ภาคผนวก

คำอธิบายศัพท์ (ผู้แปลเพิ่มเติม)

ศัพท์ความหมาย
AEOAnswer Engine Optimization — การปรับเว็บให้ AI/answer engine (ChatGPT, Perplexity, Gemini, Google AI Mode) ดึงข้อมูลไปตอบและอ้างอิงได้ถูกต้อง
canonicalrel=canonical — tag ที่บอก search engine ว่า URL ไหนคือ "ต้นฉบับ" ของเนื้อหา หน้าที่ชี้ canonical ไปที่อื่นจะถูกมองว่าเป็นหน้าซ้ำและมักไม่ถูก index
self-canonicalหน้าที่ตั้ง canonical ชี้มาที่ URL ของตัวเอง
hreflangtag ที่บอกว่าแต่ละหน้ามีเวอร์ชันภาษาอื่นที่ URL ใด (en, th, zh, x-default)
OTAOnline Travel Agency — เว็บตัวกลางจองที่พัก เช่น Booking.com, Trip.com, Traveloka ซึ่งเก็บค่าคอมมิชชันจากโรงแรม
orphan pageหน้าที่ไม่มีลิงก์ภายในใดชี้เข้า เข้าถึงได้ทาง sitemap หรือ URL ตรงเท่านั้น
server- / client-renderedเนื้อหาที่มาพร้อม HTML จาก server เทียบกับเนื้อหาที่ JavaScript ดึงมาแสดงภายหลังในเบราว์เซอร์ (crawler ที่ไม่รัน JS จะไม่เห็น)
JSON-LD / schemaข้อมูลโครงสร้างตามมาตรฐาน schema.org ที่ฝังในหน้า เพื่อบอกเครื่องว่าหน้านี้คือโรงแรม ห้องพัก ร้านอาหาร ฯลฯ
NAPName, Address, Phone — ชื่อ ที่อยู่ เบอร์โทร ที่ควรเหมือนกันทุกแหล่ง
soft-404URL ที่ไม่มีอยู่จริงแต่ตอบกลับ 200 (เช่น redirect ไปหน้าแรก) แทนที่จะเป็น 404
LCP / FCP / TBT / CLSตัวชี้วัดความเร็ว: เวลาที่องค์ประกอบใหญ่สุดแสดง / เวลาที่เนื้อหาแรกแสดง / เวลาที่ main thread ถูกบล็อก / ปริมาณการกระโดดของ layout
og:image / og:urlOpen Graph tag ที่ใช้กำหนดรูปและ URL ตอนแชร์ลิงก์บน LINE, Facebook, WhatsApp
lastmodวันที่แก้ไขล่าสุดของแต่ละ URL ใน sitemap ใช้ช่วย Google จัดลำดับการ crawl ซ้ำ
link equity"คะแนน" ที่ส่งผ่านลิงก์ภายใน/ภายนอก ซึ่งลดลงเมื่อผ่าน redirect
cross-domain linkingการตั้ง GA4 ให้ติดตาม session ต่อเนื่องข้ามโดเมน (yanhhotel.com → book-directonline.com) เพื่อให้นับยอดจองตรงได้ถูกต้อง
Search Console / GBPGoogle Search Console (เครื่องมือดูการ index และคำค้น) / Google Business Profile (ข้อมูลธุรกิจบน Google Maps และ Search)