EstimatedSalary Schema Generator — Publish Occupation Pay Bands
Generate valid Occupation + MonetaryAmountDistribution JSON‑LD with currency, unit (YEAR/HOUR), and percentile values to clarify salary expectations.
Try the EstimatedSalary GeneratorWhy many salary pages underperform
- Salary info is presented in prose without structured percentiles.
- Currency and pay period are missing or inconsistent across pages.
- No location context (occupationLocation) makes values misleading.
- Manual JSON‑LD is inconsistent across occupation pages.
How SwiftSchema helps
The generator guides an Occupation with a MonetaryAmountDistribution for `estimatedSalary` including currency, pay period (duration), and percentiles (median encouraged).
It supports occupationLocation (Place/AdministrativeArea), keywords, and identifiers when needed, producing copy‑ready JSON‑LD for occupation pages.
How it works
- 01
Choose EstimatedSalary in the generator below.
- 02
Enter Occupation `name` and optional `description`.
- 03
Add `occupationLocation` to scope values to a region or country.
- 04
Provide `estimatedSalary` with currency, duration, and percentiles (median + others when available).
- 05
Copy JSON or Script, paste into the occupation page, and validate in the Schema Markup Validator.
Ready to build the markup?
Paste once per occupation page. Validate. Ship.
What is EstimatedSalary structured data?
EstimatedSalary pairs Occupation with a MonetaryAmountDistribution to express currency, unit (YEAR/HOUR/MONTH), and percentile values for salary estimates.
Essential elements
Occupation— includesname, optionaldescription,occupationLocation.estimatedSalary— aMonetaryAmountDistributionwithcurrency,duration, and percentiles (median,percentile10/25/75/90).occupationLocation— Place or AdministrativeArea (city, state, country) explaining where the salary applies.mainEntityOfPage— link to the canonical occupation page.identifier/sameAs— include job codes (SOC, ONET) or external references.- Last updated and source — Occupation has no date or provider properties. Show when the estimate was updated and where the data comes from in the page copy (and in the page's own WebPage markup if you use it).
description— explain methodology or scope.- Page language — Occupation has no language property; set
inLanguageon the page's WebPage markup if you publish in several languages.
Content prep checklist
- Gather median and percentile data for each occupation (source: surveys, job board data).
- Decide on the geographic scope (country, state, city) and note it on the page.
- Specify whether salaries include benefits, bonuses, or base pay only.
- Provide context on methodology (“Based on 5,000 job postings from 2024”).
- Include disclaimers about variability and data freshness.
- Link to job postings, employer profiles, or related occupations for additional context.
Implementation workflow
- Create or update the occupation page with the salary info, methodology, and location context.
- Generate Occupation JSON‑LD with
name,description,occupationLocation, andestimatedSalary. - Fill in MonetaryAmountDistribution with
currency,duration,median, and other percentiles. - Add metadata such as
identifier,sameAs, andmainEntityOfPage. - Embed the schema once per occupation page.
- Validate in the Schema Markup Validator; pay attention to warnings about a missing median or an invalid duration.
- Expect no Google display: Google retired the estimated salary feature in September 2025, so there is no Search Console report for it.
- Update cadence: refresh salary values and the page's last-updated date on a regular schedule (e.g., quarterly).
Location and currency considerations
- Use ISO currency codes (USD, EUR) and match the displayed currency.
- For multi-country pages, consider separate pages per region to avoid mixing currencies/rates.
- When listing multiple cities on one page, provide separate Occupation entries or clearly note differences in the content.
- Mention data sources when referencing aggregated platforms (e.g., “Based on SwiftSchema job postings”).
- If displaying different ranges by seniority (Junior/Mid/Senior), either create separate Occupation entries or make the ranges explicit in content; avoid mixing unrelated levels in one distribution.
Complementing JobPosting and Employer data
- Link to JobPosting schema for relevant listings; highlight salary ranges from real job postings when available.
- Pair with EmployerAggregateRating to provide employer reputation context.
- Use breadcrumbs and internal links so occupation pages feed traffic to related job listings or training courses.
Troubleshooting checklist
- Missing median: include
medianvalue; if unavailable, reconsider publishing. - Wrong pay period: use an ISO 8601
duration(P1Y, P1M, PT1H). - Ambiguous region: add
occupationLocationwith Place/AdministrativeArea. - Stale data: update the salary values and the page's last-updated date regularly (quarterly recommended).
- Insufficient data: if sample size is small, mention it in the description to avoid misleading readers.
- Scale confusion: ensure currency and units match what’s shown on-page; don’t mix base pay with total compensation unless stated.
Common Errors & Fixes
- Missing median: include at least the median; add other percentiles when possible.
- Wrong pay period: use an ISO 8601
duration(P1Y/P1M/PT1H). - Ambiguous region: add
occupationLocationto avoid misleading global values. - Missing currency: always set
currencyon the MonetaryAmountDistribution. - Hidden data: only include schema if the salary values are visible to users on the page.
On-page parity checklist
- Occupation name and description match on-page text.
- Salary figures and percentiles in schema match what’s displayed; currency and units are consistent.
- Region/location shown on-page matches
occupationLocation. - Methodology, source, and last-updated date are visible on the page.
- If multiple levels/regions are shown, schema reflects the same breakdown or separate entries.
Validation and QA
- Run the Schema Markup Validator after updates.
- Spot-check percentiles for numeric values and correct units/currency.
- Confirm
mainEntityOfPagepoints to the canonical occupation URL. - Review quarterly to refresh the values and the page's last-updated date; keep a changelog of data sources.
Methodology and sourcing notes
- Document sample size, time window, and filters (e.g., “Based on 8,200 postings from Jan–Dec 2024; excludes internships”).
- Clarify whether values are base salary, base + bonus, or total compensation.
- If you blend datasets (e.g., internal + third-party), explain the weighting in on-page copy.
- Provide links to data dictionaries or SOC/ESCO codes when relevant to disambiguate the occupation.
Handling multiple segments
- If publishing salaries by seniority, location, or industry, create distinct Occupation entries per segment or clearly label each distribution on-page.
- Avoid mixing currencies in one distribution; split into region-specific blocks and schema.
- When ranges are narrow or volatile, add a confidence note (“Range reflects limited sample size”) to avoid misleading readers.
Automation and governance
- Drive both the UI and JSON‑LD from the same data source to prevent drift.
- Add automated checks to confirm currency/unit consistency and numeric types before deploy.
- Track when sources change (new vendors, new survey methods) and refresh the page's last-updated date and on-page notes simultaneously.
Localization and accessibility
- Set
inLanguageon each localized page's WebPage markup and translate units/descriptions accordingly. - Provide alt text for charts or salary tables; consider plain-text summaries for screen readers.
- If pages are country-specific, note labor market context (taxes, benefits norms) in the content.
Required properties
Occupation.nameOccupation.estimatedSalary.currencyOccupation.estimatedSalary.durationOccupation.estimatedSalary.median
Recommended properties
Occupation.descriptionOccupation.occupationLocation.nameOccupation.mainEntityOfPageOccupation.estimatedSalary.percentile10Occupation.estimatedSalary.percentile25Occupation.estimatedSalary.percentile75Occupation.estimatedSalary.percentile90
{
"@context": "https://schema.org",
"@type": "Occupation",
"name": "Frontend Engineer",
"description": "Salary estimates for frontend software engineers.",
"occupationLocation": {
"@type": "AdministrativeArea",
"name": "United States"
},
"estimatedSalary": {
"@type": "MonetaryAmountDistribution",
"currency": "USD",
"duration": "P1Y",
"percentile10": 65000,
"percentile25": 85000,
"median": 110000,
"percentile75": 140000,
"percentile90": 170000
}
}{
"@context": "https://schema.org",
"@type": "Occupation",
"name": "Frontend Engineer",
"description": "Salary estimates for frontend software engineers.",
"occupationLocation": {
"@type": "AdministrativeArea",
"name": "United States"
},
"identifier": "soc:15-1256",
"mainEntityOfPage": "https://www.example.com/salaries/frontend-engineer",
"estimatedSalary": {
"@type": "MonetaryAmountDistribution",
"currency": "USD",
"duration": "P1Y",
"percentile10": 65000,
"percentile25": 85000,
"median": 110000,
"percentile75": 140000,
"percentile90": 170000
}
}FAQs
How do I structure salary estimates?ShowHide
Use an `Occupation` with `estimatedSalary` as a `MonetaryAmountDistribution` that specifies currency, the pay period as an ISO 8601 duration (P1Y for yearly, PT1H for hourly), and percentiles (percentile10/25, median, percentile75/90).
Is median required?ShowHide
Median is the most important percentile. It’s strongly recommended to include median and as many other percentile values as available.
How do I set the location for estimates?ShowHide
Use `occupationLocation` with a `Place` or `AdministrativeArea` and a `name` (for example, a city, state, or country).
What units can I use?ShowHide
Give the pay period in `duration` as an ISO 8601 duration: P1Y (year), P1M (month), or PT1H (hour). Make sure values are numeric and currency codes are valid (e.g., USD, EUR).