Pay stub to CSV, one row per stub, with the math checked
Drop in PDFs or phone photos of pay stubs and get a CSV with a fixed set of columns, in pay-date order, ready for a spreadsheet or your system's import. Every row carries its own check results.
Pay stub intake
Free: 1 file per day, up to 10 pages, no account
No file handy? Open a built-in sample (fictional people and employers).
Files are processed in memory and deleted after conversion. How uploads are handled.
Sample result: three weekly stubs, one period missing, one stub off by $12.40
Brightwater Home Care (fictional), March to April 2025. The 03/17 to 03/23 stub is not in the file. Upload your own file above and this area is replaced with its stubs.
- Math checks pass
Stub 1 · Weekly
Paid Mar 14, 2025
Period Mar 3 – Mar 9, 2025
- Gross
- $918.00
- Taxes
- $164.59
- Deductions
- $91.14
- Net
- $662.27
YTD gross $9,648.00 · YTD net $6,960.33
- Gross - taxes - deductions = net. 918.00 - 164.59 taxes - 91.14 deductions = 662.27, matching net pay.
- Earnings lines add up to gross. 3 earnings line(s) add to 918.00.
4 more consistency checks passed.
Lines read from this stub
Earnings read
Line Hours Rate Current YTD Regular 40 22.50 900.00 9,000.00 Overtime 0 33.75 0.00 405.00 Shift Differential 12 1.50 18.00 243.00 Taxes read
Line Current YTD Federal Withholding 74.42 763.82 Social Security Tax 52.97 593.73 Medicare Tax 12.39 138.87 State Income Tax 24.81 287.01 Deductions read
Line Current YTD 401(k) Employee pre-tax 27.54 289.44 Health Insurance pre-tax 54.00 522.00 Dental Insurance pre-tax 9.60 92.80 YTD chain ties
9,648.00 + 1,053.00 = 10,701.00
2 to reviewStub 2 · Weekly
Paid Mar 21, 2025
Period Mar 10 – Mar 16, 2025
- Gross
- $1,053.00
- Taxes
- $190.62
- Deductions
- $107.59
- Net
- $767.19
YTD gross $10,701.00 · YTD net $7,727.52
- Gross - taxes - deductions = net. 1,053.00 - 190.62 taxes - 107.59 deductions = 754.79, but net pay prints 767.19 (higher by 12.40).
- Earnings lines add up to gross. 3 earnings line(s) add to 1,053.00.
- Deduction lines add up to the printed total. Deduction lines add to 107.59 but the stub's total deductions prints 95.19 (differs by 12.40).
3 more consistency checks passed.
Lines read from this stub
Earnings read
Line Hours Rate Current YTD Regular 40 22.50 900.00 9,900.00 Overtime 4 33.75 135.00 540.00 Shift Differential 12 1.50 18.00 261.00 Taxes read
Line Current YTD Federal Withholding 86.20 850.02 Social Security Tax 61.34 655.07 Medicare Tax 14.35 153.22 State Income Tax 28.73 315.74 Deductions read
Line Current YTD 401(k) Employee pre-tax 31.59 321.03 Health Insurance pre-tax 54.00 576.00 Dental Insurance pre-tax 9.60 102.40 Parking pre-tax 12.40 12.40 1 pay period missing (Mar 17 – Mar 23, 2025)
1 pay period between stub 2 and stub 3 is not in the file, so the chain cannot be tied. Printed YTD implies 985.50 was paid in that period.
1 to reviewStub 3 · Weekly
Paid Apr 4, 2025
Period Mar 24 – Mar 30, 2025
- Gross
- $921.00
- Taxes
- $165.16
- Deductions
- $91.23
- Net
- $664.61
YTD gross $12,607.50 · YTD net $9,090.81
- Gross - taxes - deductions = net. 921.00 - 165.16 taxes - 91.23 deductions = 664.61, matching net pay.
- Earnings lines add up to gross. 3 earnings line(s) add to 921.00.
4 more consistency checks passed.
Lines read from this stub
Earnings read
Line Hours Rate Current YTD Regular 40 22.50 900.00 11,700.00 Overtime 0 33.75 0.00 607.50 Shift Differential 14 1.50 21.00 300.00 Taxes read
Line Current YTD Federal Withholding 74.68 1,013.39 Social Security Tax 53.16 769.33 Medicare Tax 12.43 179.94 State Income Tax 24.89 370.20 Deductions read
Line Current YTD 401(k) Employee pre-tax 27.63 378.23 Health Insurance pre-tax 54.00 684.00 Dental Insurance pre-tax 9.60 121.60
What does a pay stub to CSV conversion produce?
A pay stub to CSV conversion turns each stub into one row of plain values: dates, earnings by type, taxes, deductions, net pay and year-to-date totals. The point is to stop retyping the same eight to twenty numbers per stub.
Here each row also has the result of the net-pay math and the YTD chain check, so the sheet shows which rows to trust and which to compare with the original.
From pay stub to CSV in four steps
-
Upload the file
Choose a PDF or photos, or paste an image. Free: 1 file per day, up to 10 pages, no account.
-
Stubs are found and read
The file is split into one stub per row. Dates, earnings, taxes, deductions, net and YTD figures are read into their columns.
-
The checks fill their columns
Net-pay math, the earnings sum and the YTD chain are tested and written next to each row, with a flags column in plain words.
-
Download or copy
Download the CSV, the chain report or the JSON, or copy the CSV straight into a spreadsheet.
The 45 columns, with a real example
Example values are the first stub of built-in sample A (a fictional employee), taken from the file this site produces for it.
| Column | What it holds | Example |
|---|---|---|
| Who and when | ||
stub_no | Position in pay-date order across the whole result. 1 is the earliest stub. | 1 |
employer | Employer name as printed on the stub. | Cedar Ridge Supply Co. |
employee | Employee name as printed on the stub. | Morgan T. Ellery |
ssn_masked | XXX-XX- followed by the last four digits. The full number is never written out. | XXX-XX-4821 |
period_start | First day of the pay period, YYYY-MM-DD. When a stub prints only the end date, the start is derived from the pay frequency and flagged on screen. | 2025-05-04 |
period_end | Last day of the pay period, YYYY-MM-DD. | 2025-05-17 |
pay_date | Date the pay was issued (the check or pay date), YYYY-MM-DD. Stubs are ordered by this. | 2025-05-23 |
frequency | weekly, biweekly, semimonthly, monthly or other. Blank when it could not be worked out. | biweekly |
| Hours and rate | ||
regular_hours | Hours on the regular earnings line. Blank for salaried stubs. | 80 |
regular_rate | Hourly rate on the regular earnings line, kept only when hours times rate matches the amount. | 26 |
overtime_hours | Hours on overtime earnings lines. | 4.5 |
| Earnings | ||
regular_pay | Regular earnings for the period. | 2080.00 |
overtime_pay | Overtime earnings for the period. | 175.50 |
bonus_pay | Bonus earnings for the period. | (blank) |
commission_pay | Commission earnings for the period. | (blank) |
pto_pay | Paid time off: PTO, vacation, sick, holiday, bereavement and jury duty pay. | (blank) |
other_earnings | Every other earnings line, such as tips or allowances. Reimbursements added after net are not part of it. | (blank) |
gross_pay | Gross pay as printed. If the stub does not print it, the sum of the earnings lines (labelled 'summed' on screen). | 2255.50 |
| Taxes | ||
federal_tax | Federal income tax withheld. | 214.84 |
state_tax | State income tax withheld. | 56.27 |
local_tax | City, county or other local income tax withheld. | 51.15 |
social_security_tax | Social Security (OASDI) tax withheld. | 133.85 |
medicare_tax | Medicare tax withheld. | 31.30 |
other_tax | Other statutory withholdings, such as state disability, family-leave or unemployment contributions. | (blank) |
total_taxes | Sum of the tax lines. If the stub shows only a total, that printed total. | 487.41 |
| Deductions | ||
pretax_deductions | Pre-tax deductions: the printed total if there is one, otherwise the lines marked pre-tax. | 209.38 |
posttax_deductions | Post-tax deductions, on the same basis. | (blank) |
retirement_401k | Retirement plan contributions (401(k), 403(b), 457, IRA-style lines). | 112.78 |
health_deductions | Medical and vision premiums, HSA/FSA and similar benefit lines. | 85.00 |
dental_deductions | Dental premiums. | 11.60 |
garnishments | Garnishments, child support and levies. | (blank) |
other_deductions | Deduction lines that fit none of the groups above. | (blank) |
total_deductions | Sum of the deduction lines. If the stub shows only a total, that printed total. | 209.38 |
| Net pay and year to date | ||
net_pay | Net pay as printed. | 1558.71 |
ytd_gross | Year-to-date gross as printed (or summed from the YTD column of the earnings lines). | 21671.00 |
ytd_taxes | Year-to-date taxes. | 4822.90 |
ytd_deductions | Year-to-date deductions. | 2014.78 |
ytd_net | Year-to-date net pay. | 14833.32 |
| Checks | ||
net_math_check | PASS, FAIL or NA: does gross minus taxes minus deductions equal net pay within $0.02? | PASS |
net_math_diff | Printed net minus the computed net, in dollars. Positive means the stub prints more than the lines support. | 0.00 |
earnings_sum_check | PASS, FAIL or NA: do the earnings lines add up to gross pay? | PASS |
ytd_chain_status | FIRST, TIES, BREAK, GAP, RESET_OK, RESET_BREAK or UNCHECKED: how this stub's YTD gross relates to the previous stub's. | FIRST |
ytd_chain_expected | The YTD gross the chain predicts: previous YTD plus this stub's gross. | (blank) |
ytd_chain_diff | Printed YTD gross minus the predicted value, in dollars. | (blank) |
flags | Plain-language reasons the stub needs a second look. Empty when every check passes. | (blank) |
Reading the checks. A PASS means the printed numbers agree with each other. It says nothing about whether the stub is genuine or whether the employer's payroll is correct.
Pay stub to CSV: by hand, generic converter, VerifyStub
What each approach hands you, and what is left for you to do.
| What you need | Typing into a sheet | Generic PDF-to-CSV tool | VerifyStub |
|---|---|---|---|
| Column layout | Your own template, rebuilt for each file | Whatever columns the stub printed, so each payroll provider gives a different sheet | 45 fixed columns in the same order every time |
| Several stubs in one PDF | One at a time | Usually one table per page, left for you to stack | Split into one row per stub and put in pay-date order |
| Current and YTD columns | You keep them apart | Often merged or shifted into the wrong column | Read separately; YTD figures have their own columns |
| Negatives and parentheses | Typed as you read them | Parentheses and trailing minus signs stay as text | Parsed to numbers; withholdings written as positive amounts |
| Dates | Mixed formats | Left as printed (03/14/25, Mar 14, 2025) | YYYY-MM-DD in every date column |
| Arithmetic checks | Only if you add formulas | None | net_math_check, earnings_sum_check and the YTD chain columns on every row |
| SSN column | Whatever you copy | Whatever is printed | XXX-XX- plus the last four digits |
Pay stub to CSV: common questions
Which columns does the CSV have?
45 columns, always in the same order: who and when, hours and rate, earnings, taxes, deductions, net and year-to-date figures, and the check results. The table on this page lists each one with an example from the built-in sample.
Does the CSV include the check results?
Yes. Each row carries net_math_check, net_math_diff, earnings_sum_check, ytd_chain_status, ytd_chain_expected, ytd_chain_diff and a flags column in plain language, so the checks travel with the data into your spreadsheet.
How are negative numbers and parentheses handled?
Figures printed as (123.45) or 123.45- are read as negative numbers. Withholdings that a stub prints as negatives are written as positive amounts in the tax and deduction columns, so a tax column always reads as the amount taken out.
Why is a cell blank?
A blank means the stub did not print that figure or it could not be read with confidence. A blank is never filled with zero or a guess. If it matters for your calculation, open 'Lines read from this stub' and compare with the original.
Does Excel open the file correctly?
The download is UTF-8 with a byte-order mark, comma separated, with money as plain numbers (two decimals, no currency symbol or thousands separator) and dates as YYYY-MM-DD. If Excel shows dates as text, use Data, From Text/CSV and set the column type.
Can I import the CSV into my loan or screening system?
It is a standard CSV, so any system that imports delimited files can take it after you map the columns. There are no direct integrations with loan origination or screening systems.
What is in the chain-report CSV?
One row per link between neighbouring stubs: the two stub numbers and pay dates, the status (TIES, BREAK, GAP, RESET_OK, RESET_BREAK or UNCHECKED), the expected and printed YTD gross, the difference, and for gaps the missing period and the gross it would have to hold.
Does a text cell ever run as a formula?
No. Text cells that begin with =, +, - or @ are prefixed with an apostrophe so a spreadsheet shows them as text instead of running them.
What if a stub cannot be read?
You get a warning that names the stub and what was missing, and the row keeps blanks where figures were not found. If no pay stub figures are found in a file at all, the page says so instead of returning an empty or invented sheet.
Is the full Social Security number kept?
No. The CSV shows XXX-XX- and the last four digits only.
Turn the next stack of stubs into a CSV
Free: 1 file per day, up to 10 pages, no account. Nothing to install.
Upload pay stubs