QuickBooks' own report or an export?
Intuit's article on certified payroll in QuickBooks Online is tagged for the Payroll Premium and Elite plans. To use it you set up each public works job as a project, enter time against the project on weekly timesheets, put everyone on a weekly pay schedule and create a separate hourly pay type for every classification and for overtime. Intuit's example name is "WD #CA20000 Carpenter-Industrial ST". Fringe benefits appear on page 2 only if you set up retirement and health items.
That works if your company already runs payroll that way. Many contractors don't: they're on Core, they track time in another app, or each worker's classification changes day to day. In those cases an export plus a generator is quicker than rebuilding your QuickBooks setup.
| QuickBooks certified payroll | Export + this generator | |
|---|---|---|
| QuickBooks plan | Payroll Premium or Elite (per Intuit's article tags) | Any plan, or no QuickBooks at all |
| Setup | Projects, weekly timesheets, pay type per classification | None; match columns once |
| Two classifications in one week | Separate pay types | Classification column per row |
| California DIR XML | Not mentioned in Intuit's article | V2 checker now; XML builder in our paid plan |
| Where data is processed | Intuit's servers | Your browser only |
Which QuickBooks Online reports to export
The WH-347 needs two kinds of information: hours by day for each worker and classification, and pay for the week (gross, taxes, deductions, net). QuickBooks keeps them in different reports.
- Hours. Go to Reports → Standard reports and open a time activity report by employee (detail, not summary). Set the date range to your payroll week, Sunday to Saturday or whatever your workweek is. Use Customize to show the date, employee, customer or project, service item and duration, and filter to the public works project. Export to Excel.
- Pay. In the Employees or payroll section of Standard reports, run a payroll details report for the pay date that covers that week. It lists gross pay, each tax, each deduction, net pay and check number per employee. Export to Excel.
- Combine. In the hours sheet, add the pay columns. Each worker needs their pay figures on one of their rows only. The generator takes the first value it finds per worker, so you don't have to repeat them.
QuickBooks report names and menus change from time to time. What matters is the shape of the file: one row per worker per day with hours, plus pay totals somewhere for each worker.
Columns the generator recognises
Header names don't have to match exactly; these are the QuickBooks-style names we pick up automatically. Anything else you match once and it's remembered for next week.
| WH-347 needs | Typical QuickBooks column | Required? |
|---|---|---|
| Worker name (1B–1D) | Employee ("Last, First") | Yes |
| Identifying number (1E) | SSN or Employee ID; only the last 4 digits are printed | Recommended |
| Labor classification (3) | Work Classification, Service, or your pay type name | Yes |
| Apprentice level (2) | Apprentice Level (blank = journeyworker) | If any apprentices |
| Day and hours (4, 5) | Date, Regular Hours / Duration, Overtime Hours | Yes |
| Hourly rate (6A) | Hourly Rate, Pay Rate | Yes |
| Fringe credit per hour (6B, page 2) | Health & Welfare, Pension, Vacation/Holiday, Training | If claiming fringe credit |
| Gross for all work (7B) | Gross Pay | Recommended |
| Deductions (8) | Federal Income Tax, Social Security & Medicare, state tax, SDI, Union Dues, Other Deductions | Recommended |
| Net pay (9) | Net Pay | Recommended |
If you use one pay type per classification
If you followed Intuit's setup, each worker's hours are split by pay types like "WD #CA20000 Carpenter ST" and "WD #CA20000 Carpenter OT". Put the classification name (without ST/OT) in a classification column, and put straight-time and overtime hours in separate columns on the same row. That way a carpenter who also worked as a laborer that week becomes two WH-347 lines with the same entry number, which is what DOL asks for.
Fringe benefits from QuickBooks
The WH-347 shows fringe benefits two ways. Column 6B is the credit for contributions to bona fide plans (health, pension and so on): hours × the hourly credit, with each plan named on page 2. Column 6C is cash paid in lieu of fringes. QuickBooks stores company-paid benefits as deductions and contributions, not as an hourly rate, so add columns with the hourly credit per plan (for example Health & Welfare 11.20, Pension 9.80). Then list each plan, its type, plan number and whether it is funded in step 4 of the generator.
Common mistakes with QuickBooks exports
- Summary instead of detail. Summary reports total the week and lose the daily hours that column 4 needs.
- Wrong date range. A pay period that doesn't match the workweek puts hours in the wrong week. The generator flags any date outside the week ending you enter.
- All projects in one export. Column 7A is gross for this project only; column 7B is gross for all work. Filter hours to the project, but keep pay totals for all work.
- Prorated deductions. DOL's instructions say not to prorate deductions to the project. Use the full week's deductions.
- Full SSNs. They must not appear on the form. If your export has them, the generator prints only the last four digits.
Questions
Does QuickBooks Online make a WH-347?
Intuit offers a certified payroll report in QuickBooks Online Payroll. Its help article is tagged for Premium and Elite and depends on projects, weekly timesheets and a pay type per classification. On other plans, or without that setup, export your data and use a generator like this one.
Does it work with QuickBooks Desktop?
Yes, as long as you can export hours by day and pay to Excel or CSV. The generator doesn't connect to QuickBooks; it only reads the file you give it.
Is my QuickBooks data uploaded?
No. The file is read and the PDF built in your browser. Nothing goes to our servers or to Intuit.
Can I reuse the setup next week?
Yes. Your column matches are remembered for files with the same columns, and saving the project keeps the project details, plans and programs. The payroll number goes up by one when you load it.