Mục lục bài viết
Google for Jobs xuất hiện cho hơn 60% truy vấn tìm việc tại Việt Nam. Box này hiển thị ngay dưới thanh tìm kiếm với logo công ty, tên vị trí, mức lương, và địa chỉ — chiếm toàn bộ màn hình phần đầu kết quả. Doanh nghiệp không có JobPosting schema đơn giản là không xuất hiện ở đây, dù trang tuyển dụng đã được index.
So sánh có và không có JobPosting schema
| Không có schema | Có JobPosting schema đầy đủ |
|---|---|
| Chỉ xuất hiện trong organic (nếu được index) | Xuất hiện trong Google for Jobs carousel |
| Không có logo, lương, địa chỉ trên SERP | Hiển thị logo + lương + địa điểm + nút Apply |
| AI không hiểu đây là tin tuyển dụng | AI tóm tắt yêu cầu và quyền lợi khi hỏi |
| Cạnh tranh ngang với mọi trang web | Lọc vào nhóm nhà tuyển dụng có schema |
| Không thể track qua Employer Center | Theo dõi được qua Google Search Console |
JSON-LD JobPosting đầy đủ
{
"@context": "https://schema.org",
"@type": "JobPosting",
"@id": "https://example.vn/vi/tuyen-dung/senior-digital-marketing-manager-hcm",
"title": "Senior Digital Marketing Manager",
"description": "Chúng tôi tìm kiếm Senior Digital Marketing Manager để dẫn dắt đội ngũ 5 người, quản lý ngân sách marketing 500 triệu/tháng và xây dựng chiến lược omnichannel cho thương hiệu FMCG hàng đầu tại Việt Nam.\n\nCông việc hàng ngày:\n- Lập kế hoạch và triển khai chiến dịch Google Ads, Meta Ads, TikTok Ads\n- Phân tích dữ liệu GA4, Meta Business Suite và báo cáo ROI hàng tuần\n- Quản lý và mentoring team marketing 5 người\n- Phối hợp với product team và creative team cho các campaign lớn\n- Tối ưu landing page và conversion funnel\n\nYêu cầu:\n- 4+ năm kinh nghiệm performance marketing\n- Thành thạo Google Ads, Meta Ads, TikTok for Business\n- Kinh nghiệm quản lý budget từ 200 triệu/tháng trở lên\n- Google Ads Certification là lợi thế\n\nQuyền lợi:\n- Lương cạnh tranh 30-45 triệu/tháng\n- Thưởng KPI hàng quý\n- Bảo hiểm sức khỏe cao cấp cho nhân viên và gia đình\n- Laptop MacBook được cung cấp\n- Work from home 2 ngày/tuần",
"datePosted": "2026-08-11",
"validThrough": "2026-09-11T23:59:59+07:00",
"employmentType": ["FULL_TIME"],
"hiringOrganization": {
"@type": "Organization",
"@id": "https://example.vn",
"name": "Công ty TNHH ABC Vietnam",
"url": "https://example.vn",
"logo": "https://example.vn/images/logo.png",
"sameAs": [
"https://www.linkedin.com/company/abc-vietnam",
"https://www.facebook.com/abcvietnam"
]
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "15 Lê Thánh Tôn, Bến Nghé",
"addressLocality": "Quận 1",
"addressRegion": "Hồ Chí Minh",
"addressCountry": "VN",
"postalCode": "700000"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "VND",
"value": {
"@type": "QuantitativeValue",
"minValue": 30000000,
"maxValue": 45000000,
"unitText": "MONTH"
}
},
"experienceRequirements": {
"@type": "OccupationalExperienceRequirements",
"monthsOfExperience": 48
},
"educationalRequirements": {
"@type": "EducationalOccupationalCredential",
"credentialCategory": "bachelor degree"
},
"skills": "Google Ads, Meta Ads, TikTok Ads, Google Analytics 4, Performance Marketing, Budget Management",
"industry": "Marketing và Quảng cáo",
"occupationalCategory": "11-2021.00",
"applicationContact": {
"@type": "ContactPoint",
"email": "careers@example.vn",
"contactType": "HR"
},
"directApply": true
}
Remote job
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Full-Stack Developer (Remote)",
"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": {
"@type": "Country",
"name": "Vietnam"
},
"datePosted": "2026-08-11",
"validThrough": "2026-09-11",
"hiringOrganization": {
"@type": "Organization",
"name": "TechStartup VN",
"url": "https://techstartup.vn"
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 2000,
"maxValue": 3500,
"unitText": "MONTH"
}
},
"description": "..."
}
Next.js implementation với nhiều vị trí
// app/[lang]/tuyen-dung/[slug]/page.tsx
import type { WithContext, JobPosting } from "schema-dts";
export default async function JobPage({ params }) {
const job = await getJob(params.slug);
const jsonLd: WithContext<JobPosting> = {
"@context": "https://schema.org",
"@type": "JobPosting",
title: job.title,
description: job.fullDescription,
datePosted: job.postedAt.toISOString().split("T")[0],
validThrough: job.expiresAt.toISOString(),
employmentType: job.type === "full-time" ? "FULL_TIME" : "PART_TIME",
hiringOrganization: {
"@type": "Organization",
name: "Công ty ABC",
url: "https://example.vn",
logo: "https://example.vn/logo.png",
},
jobLocation: {
"@type": "Place",
address: {
"@type": "PostalAddress",
streetAddress: job.address,
addressLocality: job.district,
addressRegion: job.city,
addressCountry: "VN",
},
},
...(job.salaryMin && {
baseSalary: {
"@type": "MonetaryAmount",
currency: "VND",
value: {
"@type": "QuantitativeValue",
minValue: job.salaryMin,
maxValue: job.salaryMax,
unitText: "MONTH",
},
},
}),
...(job.isRemote && { jobLocationType: "TELECOMMUTE" }),
directApply: true,
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
{/* Job page content */}
</>
);
}
Lỗi JobPosting phổ biến
| Lỗi | Hậu quả | Cách fix |
|---|---|---|
| description quá ngắn | Google for Jobs từ chối | Tối thiểu 200 từ với yêu cầu và quyền lợi cụ thể |
| Không có datePosted | Bị xếp thấp hơn | Luôn đặt ngày đăng thực tế |
| Tin hết hạn không xóa schema | Báo lỗi Search Console | Đặt validThrough, xóa schema sau hạn |
| Lương khai báo sai (VND thay vì triệu VND) | Hiển thị sai trên Google for Jobs | Dùng số nguyên VND đầy đủ: 25000000 không phải 25 |
| jobLocation thiếu addressCountry | Schema không hợp lệ | Luôn có addressCountry: "VN" |
| directApply: true nhưng không có apply URL | Người dùng không apply được | Thêm applicationContact hoặc apply URL |
JobPosting schema là một trong số ít schema có ROI đo được trực tiếp — số ứng viên, chất lượng CV, và chi phí tuyển dụng so với job board như TopCV hay VietnamWorks. Doanh nghiệp đăng tin trực tiếp trên website với schema đầy đủ có thể giảm 40-60% phụ thuộc vào job boards.
Câu hỏi thường gặp
Google for Jobs là gì và JobPosting schema giúp ích như thế nào?
Google for Jobs là tính năng xuất hiện khi người dùng tìm kiếm việc làm (ví dụ: 'tuyển dụng marketing hà nội', 'việc làm kỹ sư phần mềm hồ chí minh'). Google hiển thị một box đặc biệt ở đầu SERP với danh sách vị trí, logo công ty, mức lương, địa điểm, và nút apply. JobPosting schema là yêu cầu bắt buộc để xuất hiện trong box này — không có schema, tin tuyển dụng không được lọc vào Google for Jobs dù trang có index. Schema cũng giúp AI tóm tắt yêu cầu công việc khi ứng viên hỏi AI về cơ hội nghề nghiệp.
Những trường nào bắt buộc trong JobPosting schema?
Google yêu cầu tối thiểu: (1) title — tên vị trí, (2) description — mô tả đủ chi tiết về công việc và yêu cầu (không phải tagline), (3) hiringOrganization — tên và url công ty, (4) jobLocation — địa chỉ đầy đủ (hoặc applicantLocationRequirements nếu remote), (5) datePosted — ngày đăng. Nên thêm: baseSalary (lương cụ thể giúp tăng CTR đáng kể), validThrough (hạn ứng tuyển), employmentType, experienceRequirements, educationRequirements. Tin không có datePosted sẽ bị coi là outdated và bị Google for Jobs hạ ưu tiên.
Làm sao khai báo lương trong JobPosting schema?
Dùng baseSalary với MonetaryAmount: value (số hoặc range), currency (VND hoặc USD), unitText (MONTH, YEAR, HOUR). Ví dụ lương cứng: value: 25000000, currency: VND, unitText: MONTH. Ví dụ lương range: dùng QuantitativeValue với minValue: 20000000, maxValue: 35000000, unitText: MONTH. Google hiển thị mức lương nổi bật trong Google for Jobs — tin có lương cụ thể có CTR cao hơn 30-40% so với tin 'lương thỏa thuận'. Nếu lương thực sự thỏa thuận: bỏ qua baseSalary thay vì ghi 0 hay 'thỏa thuận'.
Remote job và hybrid job khai báo như thế nào?
Remote hoàn toàn: thêm jobLocationType: TELECOMMUTE và applicantLocationRequirements với @type Country, name: Vietnam (hoặc để trống nếu toàn cầu). Hybrid: khai báo jobLocation bình thường (văn phòng) và thêm jobLocationType: TELECOMMUTE — Google sẽ hiển thị là hybrid. On-site: chỉ cần jobLocation, không cần jobLocationType. Quan trọng: nếu khai báo remote nhưng thực tế on-site sẽ bị Google for Jobs từ chối sau khi kiểm tra.
Sau khi điền hết vị trí, có cần xóa JobPosting schema không?
Có — và đây là lỗi phổ biến nhất. Khi vị trí đã tuyển đủ: (1) Thêm validThrough với ngày hết hạn ở quá khứ, HOẶC (2) Trả về HTTP 404 cho trang đó, HOẶC (3) Xóa script JSON-LD khỏi trang. Tin tuyển dụng đã hết hạn nhưng vẫn còn schema sẽ bị Google for Jobs báo lỗi và có thể ảnh hưởng đến uy tín của toàn bộ domain. Với hệ thống ATS: set validThrough tự động bằng ngày đóng tin.
AEO Saigon
Agency Answer Engine Optimization tại TP. Hồ Chí Minh — giúp website doanh nghiệp được AI trích dẫn. Về AEO Saigon →
Muốn website của bạn được AI trích dẫn như vậy?
Audit miễn phí