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 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
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
- 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, unitText, and percentiles (median + others when available).
- 05
Copy JSON or Script, paste into the occupation page, and validate in the Rich Results Test.
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,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.inLanguage— add locale if you publish region-specific pages in multiple 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,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.
- Update cadence: refresh salary values and
dateModifiedon 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 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.
- 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 units: use
unitTextin uppercase (YEAR/HOUR/MONTH). - 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 on-page align with
provider/dateModified. - If multiple levels/regions are shown, schema reflects the same breakdown or separate entries.
Validation and QA
- Run Rich Results Test/Schema Validator after updates.
- Spot-check percentiles for numeric values and correct units/currency.
- Confirm
mainEntityOfPagepoints to the canonical occupation URL. - Review quarterly to refresh
dateModifiedand values; 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
dateModified+ on-page notes simultaneously.
Localization and accessibility
- Use
inLanguageon Occupation entries for localized pages 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.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
}
}FAQs
How do I structure salary estimates?ShowHide
Use an `Occupation` with `estimatedSalary` as a `MonetaryAmountDistribution` that specifies currency, unitText (e.g., YEAR or HOUR), and percentiles (10/25/50/75/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
Use `unitText` values like YEAR, HOUR, or MONTH (uppercase). Make sure values are numeric and currency codes are valid (e.g., USD, EUR).