How to Pull Real Pay Data Out of North Carolina's Government Salary Systems

I spent about six weeks last year building a compensation benchmarking dataset for a municipal consulting project in Wake County, and the process was less straightforward than most people expect. The data exists, but it is fragmented across multiple portals, exported in formats that require cleaning, and rarely matches the numbers you see in budget documents without some reconciliation. What follows is a practical walkthrough based on actually doing this work, not a summary of whatever press release the state published about transparency. The primary entry point for North Carolina state employee pay data is the NC Department of Administration's payroll transparency portal, which publishes quarterly salary reports. Government salary aggregation sites like GovSalaries typically scrape or license this data and repackage it with search and filter functionality. The standalone portal gives you raw export files in CSV or Excel format. Aggregator sites give you a prettier interface but often charge for historical data, and the accuracy depends entirely on how frequently they refresh their crawls. Here is what the actual workflow looks like when you go directly to the source rather than a third-party site.

Step one: Navigate to the NC DAO compensation data page and locate the current quarterly salary report. These are usually published within 30 days of quarter close. Download the zip file containing the employee-level dataset. It will include fields for position title, department, base salary, step or grade, hire date, and sometimes prior year salary. The files run between 40 and 80 megabytes each depending on the quarter. Step two: Open the data in something that can handle large datasets without choking. Excel will lag or crash if you import the full file. I use a Python script with pandas, or alternatively, a light query in SQLite by importing the CSV directly. The goal at this stage is to deduplicate records by combining multiple rows for the same employee across different appointments or positions in the same quarter. Step three: Map salary ranges to job families. North Carolina uses a structured pay plan with grades and steps, so position titles alone are not enough to compare roles accurately. You need to join the salary data against the state's classification and pay plan tables, which are also published separately on the DAO site. Without that join, your analysis will treat a GS-5 administrative clerk and a GS-14 systems analyst as roughly comparable because they share a department and nothing else.

Step four: Clean the data. You will encounter missing values in the step field, duplicate employee IDs where someone held two concurrent positions, and department names that changed between quarters due to reorganization. I maintain a lookup table for department code changes going back to 2019. The state published about fourteen reorganizations in that window, and every one of them left orphaned records in the quarterly files that look like ghost departments if you do not flag them. The aggregator sites handle some of this cleanup for you, but they rarely publish their methodology, so you have no way to verify whether their deduplication logic is correct. That is the real reason I stopped relying on them for anything beyond a quick sanity check. I ran into a specific edge case that took me three days to resolve. A client asked me to compare salaries for nursing positions across county health departments in the Piedmont region. The county health department salary data lives on a completely separate portal from the state system. The state portal covers UNC system and executive branch employees. The counties use their own payroll systems and publish data on a different schedule, if they publish at all. I ended up pulling data from the NC Association of County Health Directors annual survey for the county health side and merging it with the state data by cross-referencing employee names and employer codes. It worked, but the merge rate was about 62 percent because county records use different naming conventions and many employees appear under slightly different spellings. I used a fuzzy match algorithm with a confidence threshold of 0.85 to handle the mismatches.

Get the Full Details

Salary: Government Employee in North Carolina (Jul 26)
Salary: Government Employee in North Carolina (Jul 26)

One counter-intuitive thing about North Carolina salary data that nobody mentions is that base salary rarely tells the whole story. The state publishes additional compensation separately, and it can shift a take-home figure by ten to fifteen percent. Longevity pay, shift differentials, education incentives, and certain department-specific stipends appear in different tables or are buried in supplementary spreadsheets. If you are building a compensation model and only pull base salary, your benchmarks will consistently understate total cash compensation for roles that carry those add-ons. I learned this the hard way when my initial regression model had a residual pattern that correlated perfectly with nursing and IT positions—both categories with heavy differential pay that the base salary column does not capture. Another thing that trips people up is the assumption that salary data is static within a quarter. It is not. Employees get step increases, promotions, and salary adjustments throughout the quarter. The published report is a snapshot as of the quarter end date, which means anyone who was promoted mid-quarter appears at their new salary even though they were making less for part of the period. This matters if you are calculating average compensation by tenure band. I adjust for this by cross-referencing with the state's personnel action reports, which are published weekly and contain promotion and step increase dates. It adds about two hours of work per quarter, but it is the difference between a dataset that is roughly right and one that is defensible. There are real limitations to this kind of analysis. The state data does not include retiree salaries, only active employees. Contract positions and temporary appointments are often excluded or reported at aggregate levels rather than individual records. Some agencies publish delayed data, and the DAO has acknowledged in the past that certain departments submit their files late. You should always check the publication date on the download page and note which quarters have gaps. The data is also not granular enough for fine-grained geographic comparisons within a county. Wake County salary data will show you the state campus and the Raleigh office as separate entries, but it will not differentiate between two office buildings three miles apart if they share the same employer code.

If your goal is simply to look up a specific employee's salary, a government salaries aggregator site will be faster and more convenient than the raw portal. If your goal is to build a reliable dataset for analysis, benchmarking, or policy work, the direct source plus the cleanup steps I described above will save you from embedded errors that are nearly impossible to detect without understanding how the data was compiled. There is no single button that produces a clean, analysis-ready North Carolina government salary dataset. The work is in the joining, the deduplication, and the acknowledgment that what the state publishes is a starting point, not a finished product.