baseSalary
baseSalary · Recommended
Appears in
What is it?
The compensation for the job, expressed as a structured monetary amount. This field uses a nested MonetaryAmount object with a QuantitativeValue inside it, allowing you to specify the currency, amount (or range), and pay period. Google displays salary information prominently in job search results when this field is present.
Why this matters for AEO
Salary is the second most common filter after location in job searches. When someone asks "What do software engineers make at Shopify?" or "Find marketing jobs paying over $80k in Chicago," AI engines extract baseSalary values to answer directly. Listings with structured salary data get prioritized in compensation related queries. Without baseSalary, an AI engine cannot include the job in salary filtered results even if the pay range appears in the description text.
What the specs say
Schema.org:Number, MonetaryAmount, or PriceSpecification. The base salary of the job or of an employee in an EmployeeRole. schema.org/baseSalary
Google: Recommended. "The actual base salary for the job, as provided by the employer (not an estimate)." Google Search Central
How to find your value
- Job requisition — The approved salary band from HR or finance
- Compensation team — The pay grade and range for this role level
- Offer letter template — The base pay figure (exclude bonuses and equity)
- Industry benchmarks — Glassdoor, Levels.fyi, or Payscale for competitive ranges
Report the actual employer provided salary, not an estimate from third party data. Google's guidelines specify this must be the real compensation, not an aggregated market figure.
Format and code
Type: MonetaryAmount with nested QuantitativeValue
Single value (hourly):
{
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 40.00,
"unitText": "HOUR"
}
}
}
Single value (annual):
{
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 120000,
"unitText": "YEAR"
}
}
}
Salary range:
{
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 90000,
"maxValue": 130000,
"unitText": "YEAR"
}
}
}
Valid unitText values:
HOUR— Hourly rateDAY— Daily rateWEEK— Weekly salaryMONTH— Monthly salaryYEAR— Annual salary
Invalid patterns:
"baseSalary": 120000
A plain number is valid per schema.org but will not produce rich results in Google. Google expects the full MonetaryAmount structure.
"baseSalary": "$120,000/year"
A formatted string fails validation entirely. Use the structured MonetaryAmount object.
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": "120000"
}
Missing the nested QuantitativeValue and unitText. Google needs the pay period to display salary correctly.
Webflow implementation
Static pages
Add the full salary structure in Page Settings > Custom Code:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Designer",
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 95000,
"maxValue": 125000,
"unitText": "YEAR"
}
}
}
</script>
CMS template pages
Create CMS number fields for salary min, salary max, and a dropdown or text field for currency and pay period:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "{{wf {"path":"salary-currency","type":"PlainText"} }}",
"value": {
"@type": "QuantitativeValue",
"minValue": {{wf {"path":"salary-min","type":"PlainText"} }},
"maxValue": {{wf {"path":"salary-max","type":"PlainText"} }},
"unitText": "{{wf {"path":"salary-period","type":"PlainText"} }}"
}
}
}
</script>
Use Webflow number fields for min/max values so they output without quotes in the JSON. Use an option field for salary period with values: HOUR, MONTH, YEAR.
In Schema HQ
The baseSalary field assembles the nested MonetaryAmount > QuantitativeValue structure from your CMS salary fields. It handles currency formatting, validates the unitText value, and builds the correct JSON-LD nesting that is difficult to maintain in manual Webflow embeds.
Real examples
Google documentation (Google Search Central):
{
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 40.00,
"unitText": "HOUR"
}
}
}
Tustin Recruiting (tustinrecruiting.com):
{
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 120000,
"unitText": "YEAR"
}
}
}
Related fields
- employmentType: determines whether salary is hourly, salaried, or contract rate
- title: the role this salary applies to
- hiringOrganization: the employer offering this compensation
- jobLocation: location affects salary expectations and cost of living adjustments
- workHours: hours context for hourly rates
FAQ
Should baseSalary include bonuses and stock options?
No. baseSalary represents base compensation only. Bonuses, equity, commissions, and other variable pay components are not part of this field. Google's documentation specifies "the actual base salary" to distinguish it from total compensation.
How do you handle salary ranges?
Use minValue and maxValue inside the QuantitativeValue object instead of a single value. Google displays the range in job search results (e.g., "$90,000 - $130,000 a year"). Ranges are preferred over single values since most positions have a compensation band.
Is the currency code required?
Yes, when using MonetaryAmount. Use ISO 4217 currency codes: "USD" for US dollars, "EUR" for euros, "GBP" for British pounds. Without the currency code, Google cannot display the salary correctly in localized results.