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.
Why many salary pages underperform
Pain points we solve
- Salary info is presented in prose without structured percentiles.
- Currency and unitText are missing or inconsistent across pages.
- No location context (occupationLocation) makes values misleading.
- Manual JSON‑LD is inconsistent across occupation pages.
How SwiftSchema helps
Solution
The generator guides an Occupation with a MonetaryAmountDistribution for `estimatedSalary` including currency, unitText (YEAR/HOUR/MONTH), 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
How it works
- Choose EstimatedSalary in the generator below.
- Enter Occupation `name` and optional `description`.
- Add `occupationLocation` to scope values to a region or country.
- Provide `estimatedSalary` with currency, unitText, and percentiles (median + others when available).
- Copy JSON or Script, paste into the occupation page, and validate in the Rich Results Test.
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,unitText, 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.
- datePublished/dateModified— optional; note when the salary estimate was last updated.
- provider— optional; mention the data source (job board, internal survey).
- description— explain methodology or scope.
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,unitText,median, and other percentiles.
- Add metadata such as identifier,sameAs,provider, andmainEntityOfPage.
- Embed the schema once per occupation page.
- Validate using Rich Results Test; pay attention to warnings about missing median or invalid unitText.
- Monitor Search Console for job/occupation enhancements if available.
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”).
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 units: ensure unitTextis uppercase (YEAR, HOUR, MONTH).
- Ambiguous region: add occupationLocationwith Place/AdministrativeArea.
- Stale data: update dateModifiedand salary values regularly (quarterly recommended).
- Insufficient data: if sample size is small, mention it in the description to avoid misleading readers.
Common Errors & Fixes
- Missing median: include at least the median; add other percentiles when possible.
- Wrong units: use unitTextin uppercase (YEAR/HOUR/MONTH).
- Ambiguous region: add occupationLocationto avoid misleading global values.
Required properties
Occupation.nameOccupation.estimatedSalary.currencyOccupation.estimatedSalary.unitTextOccupation.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",
"unitText": "YEAR",
"percentile10": 65000,
"percentile25": 85000,
"median": 110000,
"percentile75": 140000,
"percentile90": 170000
}
}