What Virginia Actually Publishes (and What It Won't Tell You)
I've spent more time than I care to admit digging through Virginia's state employee compensation data. The official portal is the Virginia Department of Human Resource Management's VSHRS database, and honestly, it's decent for what it is but has some real quirks that trip people up if you don't expect them. The raw data lives at https://www.dhrm.virginia.gov/vshrs/. From there you get a downloadable CSV file, usually updated once a year with the previous year's full roster. A single spreadsheet can run 80,000 to 110,000 rows depending on the fiscal year snapshot. It's straightforward if you know how to query it, and it becomes a nightmare if you don't.
Salaries For Virginia State Employees Transparency Trends And Total Compensation In The Commonwealth
The column headers alone are worth mapping out before you start. The standard fields you'll encounter are: Agency Code, Position Title, EEO Classification, FTE, Base Salary, and then a cluster of columns for step, grade, and hire date. What the dataset does not include is benefits. The base salary is literally just the base salary. If someone told you they make $62,000 and that's their full compensation story, they're being technically accurate but materially misleading. Here's the part most guides leave out. The employer contribution to VRS (Virginia Retirement System) runs at roughly 14.12% for general employees and about 12.8% for teachers under VSTRS. That's mandatory and significant. Add in the state's share of health insurance — which varies wildly depending on whether you chose PPO or HDHP, and whether you have dependents enrolled — and you're looking at another 8,000 to 15,000 in annual benefits per person. Dental, vision, and life insurance are smaller but still real. A $55,000 base salary for a GS-5 level administrative assistant in Richmond effectively becomes somewhere between $68,000 and $72,000 in total package value, depending on family coverage choices. I ran into a genuinely annoying edge case last year that nobody seems to have documented clearly. The VSHRS CSV uses a numeric code for the agency, and those codes shifted slightly between FY 2021 and FY 2023 when some departments got reorganized. DMV and DOS had some merge and split activity that the data export doesn't flag. If you're doing longitudinal analysis across those years and your join is breaking on Agency ID, check the reorg history first instead of assuming your query is wrong. I spent a half day debugging what turned out to be a department name change masquerading as a data integrity problem.
The other thing that trips people up is overtime pay reporting. Some agencies include it in the base salary column. Some put it in a separate supplementary earnings field. DCR and transportation agencies tend to lump it in, while education-adjacent positions report it separately. If you're comparing base pay across agencies without checking the column definitions in the data dictionary, your averages will be skewed. I learned this the hard way when my first aggregate of "total earnings by agency" made the Department of Rail and Public Transport look absurdly high until I realized half their column was summer overtime for tunnel inspectors who only work six months of the year. For people who actually want to do analysis rather than just browse, here's the practical approach that saves time. Don't use the web interface for bulk operations. Download the full CSV and work with it locally. The site limits you to a certain number of records per query anyway, and trying to paginate through hundreds of thousands of rows in a browser is miserable. I typically throw it into a SQLite database with a simple schema — Agency, Title, Classification, BaseSalary, Step, Grade, HireDate — and then run queries directly. A typical "show me all senior engineers at DCR making over $90,000" query takes about 0.3 seconds against the SQLite copy versus however long the web UI takes, which is basically always. If you want trend data rather than a single snapshot, you need to download multiple years. The archive is at the same VSHRS page, usually listed as prior years' reports near the bottom. Match records by Employee ID if you can — that's the only reliable way to track one person's progression across fiscal years. Matching on name and SSN-fragment is possible but messy, and the SSN column is partially masked anyway so you're working with limited data. I've seen people lose 40% of their longitudinal matches when they tried name-based joins because state employee names in Virginia include a lot of hyphenated combinations and non-obvious spellings.
Get the Full Details

A counter-intuitive thing about this data: the most transparent roles aren't always the highest paid when you account for the full picture. A GS-7 data analyst in the Department of Health might show a base of $58,000, but the actual position carries a hazardous duty differential and shift premium that bumps the effective hourly rate significantly above what the headline number suggests. Meanwhile, a GS-12 policy advisor at $78,000 base might have zero differentials and work a standard schedule. The base salary is misleading if you treat it as the whole story, which is basically what every news article does. There's also the classification system itself to understand. Virginia uses a combined General State Authority (GSA) and Teacher Classification system. GSA covers most executive, administrative, and technical positions. VSTRS covers teaching positions. The two systems have different salary structures, different step progressions, and different eligibility for certain types of advancement. If you're comparing a GSA position to a VSTRS position directly, you're comparing two different games. I've seen people do this in public comment threads and then act surprised when the math didn't align. One more practical note about limitations. The VSHRS data is published annually and it's always at least six months old by the time you see it. The FY 2024 report came out in mid-2025, meaning the salaries reflect the prior fiscal year. If you're looking for current pay information for negotiation purposes, you're working with stale data. The state does publish pay range tables separately on the DHRM website — those are current but they're ranges, not actual salaries, so you don't know where any individual person actually sits within that band. The raw data and the range tables complement each other but neither tells the full story alone.
Also worth noting: contract employees, TEMP positions, and certain emergency hires don't always appear in the standard VSHRS export. They show up in a separate supplementary file or not at all, depending on the agency's reporting practices. If you're trying to get a complete picture of who's working for the Commonwealth and what they make, you need to account for the gap between permanent and temporary staffing, which in some departments is nearly a 1:1 ratio. For someone just starting out, I'd recommend this sequence: download the latest CSV, load it into SQLite or even a well-formatted Excel sheet, filter to your agency of interest, and then sort by classification and step to understand the structure. The patterns become obvious quickly — the minimum, midpoint, and maximum for each grade are visible in the sorted output. Once you see how the steps distribute, you can spot anomalies: people sitting at the absolute minimum with five years of service, or someone at the top step in a grade that shouldn't have that many people. Those outliers are usually explained by legacy hiring, special authority appointments, or interagency transfers, but they deserve a second look if you're doing serious analysis. The data exists. It's free. It's just not organized in a way that makes casual browsing particularly rewarding, and the gaps and quirks aren't documented anywhere in one place. Once you understand the structure, though, it's enough to answer most questions about what Virginia state employees actually make and how the compensation system works in practice.