Salary methodology
How we collect eye care salary data — and why Reported and Advertised live in separate buckets.
B-Seen publishes two structurally separate compensation datasets. They answer different questions, so blending them would produce a number that means nothing. This page explains exactly what we collect, how we validate it, and the rules each dataset is held to.
Reviewed by Kian Patel, OD · Last updated 2026-05-10
Reported pay
Reported pay is collected through a single anonymous submission form at /salaries/submit. The form branches by role category — clinical (salaried), clinical (hourly), sales, and operations — so each professional only sees the fields relevant to their compensation structure.
For salaried clinical roles (OD, OMD): base salary, production bonus or percentage, sign-on bonus, ownership equity, subspecialty (for OMDs).
For hourly clinical roles (optician, ophthalmic tech, optometric tech, frame stylist, scribe, front desk): hourly rate or annualized base, certification (COA, COT, COMT, ABO), bonus or commission structure.
For sales roles (frame, equipment, pharma, contact lens, lens / lab, distributor, plus territory and key account managers): base salary, OTE, actual prior-year earnings, commission structure, quota attainment percentage, car allowance, company car, and equity. Sales compensation is the most volatile slice on the platform — actual earnings often diverge sharply from OTE — so we capture both.
For operations roles (practice manager, office manager, billing specialist, optical lab tech): base salary or hourly rate, multi-location stipend, bonus.
Every submission requires at least one pay field (base, hourly, or sales actual earnings). Submissions are validated against a per-role plausibility band — entries below or above the band are excluded from aggregates but retained for audit. Sales submissions additionally pass a quota-attainment sanity check.
Advertised pay
Advertised data is parsed from B-Seen native job postings (the jobs board) and from aggregated public listings via the Adzuna API. Postings without an explicit salary range are excluded from advertised aggregates entirely — we do not impute.
Where a posting provides a range (e.g. $120k–$150k), both bounds are recorded and the slice's advertised median is computed from the mid-points. Hourly listings are converted to annualized equivalents using a 2080-hour year only for cross-cut comparisons; the per-page displays preserve the original units (hourly stays hourly).
Why we never blend the two
Reported tends to come in lower than Advertised, often by 10–25% depending on the slice. Three structural reasons:
- Aspirational ranges. Advertised ranges are written by employers with hiring leverage in mind. The top of the range is what they'd pay a perfect candidate; the realized hire is rarely there.
- Career-arc skew. Reported submissions come from working professionals at every stage. Advertised pay is anchored to the role's market band, independent of seniority distribution.
- Sales actuals vs OTE. For sales roles especially, the gap between OTE (Advertised) and actual earnings (Reported) is the entire game. Quota attainment under 100% is the median, not the exception.
Averaging the two flattens those signals into a number that misleads both candidates and employers. The site shows them as two adjacent values — Reported median and Advertised median — and lets you read the gap.
Limitations
- Reported is voluntary, so it underrepresents pay levels at which professionals are content not to report. Both tails may be mildly skewed.
- Slice granularity (role × state × setting) means small states and rare roles take longer to cross the 5-report threshold. We don't synthesize medians from neighboring slices.
- Advertised data depends on third-party aggregators for external listings — gaps in Adzuna's coverage propagate.
- We are U.S.-focused. International roles surface in jobs search but are not included in salary aggregates.
Frequently asked questions
How is B-Seen's eye care salary data collected?
Two independent first-party datasets. Reported pay comes from anonymous voluntary submissions by working professionals — each entry includes role, state, practice setting (or company plus territory for sales roles), years of experience, base pay, hourly rate, bonus, commission structure, and ownership stake. Advertised pay is parsed from public job postings, both B-Seen native listings and aggregated Adzuna data.
Why does B-Seen separate Reported pay from Advertised pay?
Because they answer different questions. Advertised ranges are intentionally aspirational and skew toward the upper bound an employer is willing to pay. Reported earnings are what professionals actually take home, which captures the effect of base salary, commission structure, quota attainment, and tenure. Blending the two produces a number that means nothing — it's the average of an employer's wishful thinking and a worker's lived experience.
What's the threshold for showing a salary median?
B-Seen requires at least 5 verified reports for a given role × state × setting (or role × company × territory for sales) before a median is shown. Below that threshold, the slice page either shows the count without the median or is excluded from the sitemap entirely to prevent thin-content pages.
How often is the salary data updated?
Reported submissions update the dataset in real time as professionals submit them. Advertised data refreshes when job postings are crawled (multiple times per day for active listings). Aggregated medians on the public salary pages refresh on a 30-minute cache cycle.
Are submissions anonymous?
Yes. Reported salary submissions are not linked to a public profile. The submission form asks for role, location, employer category, years of experience, and pay structure — never for identifying details. Aggregated medians are only displayed when there are enough submissions in a slice to prevent re-identification.
How does B-Seen handle outliers and bad submissions?
Submissions are validated against a per-role plausibility band before they're included in any aggregate. Entries below or above the band are excluded from medians but retained for audit. Sales-role submissions also get a quota-attainment sanity check (actual earnings ÷ OTE).
Who reviews the methodology?
The methodology and aggregation logic are reviewed by Kian Patel, OD — an optometrist who built B-Seen specifically because the existing salary-data sources (employer surveys, blended national medians) didn't reflect the actual variance eye care professionals see across settings, regions, and career arcs.
How does B-Seen's data compare to BLS Occupational Employment Statistics?
The U.S. Bureau of Labor Statistics OES is the standard external benchmark for optometrist and ophthalmic-tech wages, but it lags by 12-18 months and aggregates across all settings — including hospital-employed and corporate-chain roles that often differ structurally from independent practice. B-Seen's Reported dataset complements OES by capturing setting-level granularity (private vs corporate vs hospital vs academic) and timely sales-role compensation that OES doesn't break out at all.
