Schema & Structured Data

OfferCatalog Schema

Schema danh mục các đề nghị (Offer), dùng khi trang liệt kê nhiều sản phẩm/dịch vụ với giá khác nhau.

3 lượt xem Cập nhật: 27/05/2026

OfferCatalog Schema là gì?

OfferCatalog Schema là một loại markup cấu trúc (structured data) thuộc chuẩn Schema.org, dùng để mô tả danh mục gồm nhiều đề nghị mua bán — như sản phẩm, dịch vụ hoặc gói hỗ trợ — được hiển thị cùng lúc trên một trang web. Đây không phải là schema cho từng mặt hàng riêng lẻ (dùng Offer hoặc Product), mà là lớp bao ngoài giúp Google và các công cụ tìm kiếm hiểu rằng trang đó đang liệt kê nhiều lựa chọn có giá khác nhau, thường kèm theo điều kiện áp dụng, thời hạn, hoặc tùy chọn nâng cao.

Ví dụ điển hình: trang so sánh các gói đăng ký phần mềm (Miễn phí / Cơ bản / Pro), trang danh sách các khóa học với mức học phí khác nhau, hoặc trang giới thiệu các gói bảo hiểm sức khỏe theo mức độ chi trả.

Tại sao quan trọng trong SEO?

OfferCatalog Schema giúp công cụ tìm kiếm phân biệt rõ ràng giữa một trang thông tin chung và một trang có tính thương mại cao. Khi triển khai đúng, nó hỗ trợ:

  • Tăng khả năng xuất hiện trong các kết quả tìm kiếm giàu tính năng (rich results), đặc biệt ở nhóm so sánh sản phẩm hoặc danh mục dịch vụ — dù hiện tại Google chưa hiển thị rich snippet riêng cho OfferCatalog, nhưng schema này góp phần làm rõ ngữ cảnh trang, từ đó cải thiện khả năng lập chỉ mục và xếp hạng liên quan;
  • Hỗ trợ thuật toán hiểu đúng cấu trúc nội dung: tránh nhầm lẫn trang danh mục với trang chủ hoặc trang blog;
  • Cải thiện độ tin cậy tín hiệu cấu trúc dữ liệu tổng thể — đặc biệt khi kết hợp với Product, Service hoặc PriceSpecification bên trong;
  • Là yêu cầu bắt buộc hoặc khuyến khích đối với một số nền tảng tích hợp (ví dụ: Google Merchant Center khi gửi danh mục sản phẩm dạng tập hợp có điều kiện).

Cách hoạt động

OfferCatalog hoạt động như một container chứa nhiều đối tượng Offer. Mỗi Offer bên trong có thể liên kết tới một Product, Service, hoặc thậm chí một Event. Schema này không tự động tạo rich result, nhưng giúp Google xác định:

  • Đây là trang liệt kê — không phải trang chi tiết;
  • Các đề nghị có mối quan hệ phân cấp hoặc so sánh (qua thuộc tính itemListElement);
  • Giá cả, điều kiện, và thời hạn được khai báo nhất quán theo chuẩn.

Google đọc schema qua JSON-LD nhúng trong thẻ <script> hoặc Microdata trong HTML — không ảnh hưởng đến giao diện người dùng.

Hướng dẫn thực hiện

Dưới đây là các bước triển khai OfferCatalog Schema chuẩn xác:

  1. Xác định phạm vi áp dụng: Chỉ dùng khi trang thực sự liệt kê ít nhất 2 đề nghị mua bán độc lập, có giá hoặc điều kiện khác nhau. Không dùng cho trang sản phẩm đơn lẻ hoặc trang danh mục không có thông tin giá rõ ràng.
  2. Chuẩn bị dữ liệu đầu vào: Với mỗi đề nghị, cần có:
    • Tên rõ ràng (name)
    • Mô tả ngắn (description)
    • Giá hoặc khoảng giá (price, priceCurrency, priceSpecification)
    • Liên kết tới trang chi tiết (url)
    • (Tùy chọn) Thời hạn hiệu lực (validFrom, validThrough)
  3. Viết markup JSON-LD: Dùng cấu trúc @type: "OfferCatalog", kết hợp itemListElement kiểu mảng chứa các Offer.
  4. Kiểm tra bằng công cụ chính thức: Sử dụng URL Inspection Tool hoặc Rich Results Test (lưu ý: OfferCatalog không xuất hiện dưới dạng rich result riêng, nhưng phải không báo lỗi và hiển thị đầy đủ thuộc tính).
  5. Giám sát định kỳ: Kiểm tra lại sau mỗi lần cập nhật giá hoặc thay đổi cấu trúc trang — vì schema dễ bị lỗi do thiếu thuộc tính bắt buộc khi thêm/xóa đề nghị.

Lỗi thường gặp

Lỗi Nguyên nhân Cách khắc phục
Thiếu itemListElement Không khai báo mảng các đề nghị bên trong OfferCatalog Thêm mảng itemListElement chứa ít nhất 2 đối tượng @type: "Offer"
Giá không có đơn vị tiền tệ Thiếu thuộc tính priceCurrency hoặc dùng sai định dạng (ví dụ: "VND" thay vì "VND" — đúng là "VND") Khai báo rõ priceCurrency theo mã ISO 4217 (ví dụ: "VND", "USD")
Offer không có price hoặc priceSpecification Một hoặc nhiều đề nghị thiếu thông tin giá — gây lỗi validation Mỗi Offer trong itemListElement phải có ít nhất một trong hai: price (chuỗi) hoặc priceSpecification (đối tượng)
Sử dụng sai loại schema cha Dùng OfferCatalog cho trang không phải danh mục (ví dụ: trang chủ, bài blog) Chỉ triển khai trên trang có tiêu đề rõ ràng như "Các gói dịch vụ", "So sánh giá", "Danh sách sản phẩm"

Ví dụ thực tế

Dưới đây là đoạn JSON-LD minh họa OfferCatalog cho trang so sánh 3 gói hosting:

{ "@context": "https://schema.org", "@type": "OfferCatalog", "name": "Các gói hosting WordPress", "description": "So sánh tính năng và giá các gói hosting phù hợp với website WordPress", "itemListElement": [ { "@type": "Offer", "name": "Gói Miễn phí", "price": "0", "priceCurrency": "VND", "description": "Dành cho cá nhân, tối đa 1 website, hỗ trợ cơ bản", "url": "https://example.com/hosting/mien-phi" }, { "@type": "Offer", "name": "Gói Tiêu chuẩn", "price": "199000", "priceCurrency": "VND", "description": "Hỗ trợ kỹ thuật 24/7, SSL miễn phí, sao lưu hàng tuần", "url": "https://example.com/hosting/tieu-chuan" } ] }

Lưu ý: Giá nên ở dạng chuỗi số (không có dấu phẩy, không có đơn vị), ví dụ "199000" — không phải "199.000 ₫".

Câu hỏi thường gặp

OfferCatalog Schema có tạo rich snippet không?

Hiện tại (tháng 6/2024), Google không hiển thị rich result riêng cho OfferCatalog. Tuy nhiên, schema này vẫn giúp cải thiện việc hiểu ngữ cảnh trang và hỗ trợ các tính năng khác như khám phá sản phẩm qua Google Shopping hoặc Google Lens — tùy trường hợp.

Có bắt buộc phải dùng OfferCatalog khi có nhiều Offer không?

Không bắt buộc. Nhưng nếu trang có tính chất so sánh hoặc danh mục rõ ràng, việc dùng OfferCatalog giúp tăng tính nhất quán cấu trúc dữ liệu và giảm rủi ro bị hiểu sai bởi bot. Nếu không dùng, Google vẫn lập chỉ mục — nhưng khả năng phân loại chính xác thấp hơn.

Có thể lồng OfferCatalog trong Product hay Service không?

Có thể — nhưng chỉ khi trang đó là trang chi tiết của một sản phẩm/dịch vụ có nhiều phiên bản (ví dụ: điện thoại có 3 màu và 3 dung lượng). Trong trường hợp này, OfferCatalog nên nằm trong thuộc tính offers của Product. Tuy nhiên, cách phổ biến và an toàn hơn là dùng OfferCatalog ở cấp trang danh mục — không lồng sâu.