AEO Saigon
Hướng dẫn

JobPosting Schema: Tin Tuyển Dụng Xuất Hiện Trong Google for Jobs và AI Search

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ó schemaCó 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 SERPHiển thị logo + lương + địa điểm + nút Apply
AI không hiểu đây là tin tuyển dụngAI 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 webLọc vào nhóm nhà tuyển dụng có schema
Không thể track qua Employer CenterTheo 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ỗiHậu quảCách fix
description quá ngắnGoogle for Jobs từ chốiTối thiểu 200 từ với yêu cầu và quyền lợi cụ thể
Không có datePostedBị xếp thấp hơnLuôn đặt ngày đăng thực tế
Tin hết hạn không xóa schemaBá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 JobsDùng số nguyên VND đầy đủ: 25000000 không phải 25
jobLocation thiếu addressCountrySchema không hợp lệLuôn có addressCountry: "VN"
directApply: true nhưng không có apply URLNgười dùng không apply đượcThê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í