Can Gusto do certified payroll?
Partly. Gusto pays employees at different rates for different jobs, which is what prevailing wage work needs. What it doesn't do is look up wage determinations or produce the WH-347 itself. The usual approach is to keep Gusto for payroll and fill the WH-347 from its exports, by hand or with a tool like this one.
Set up Gusto so the export is usable
- One job per classification. In the employee's jobs and compensation, add a job for each classification they work, each with its own hourly rate, such as "Carpenter" and "Laborer Group 1". Hours recorded against each job become separate WH-347 lines with the same entry number.
- Weekly pay schedule. Certified payrolls are weekly. If your Gusto pay period is biweekly, you'll split the hours by workweek in the export (the generator keeps only dates inside the week you pick and lists anything outside it).
- Overtime as its own hours. Keep regular, overtime and double-time hours in separate columns. The WH-347 has a straight-time row and an overtime row for every line.
Which Gusto reports to export
- Pay: Payroll Journal. In Gusto go to Reports and download the Payroll Journal for the pay date that covers the week. Gusto describes it as detailed payroll information for each pay period and employee: gross earnings, taxes, deductions and net pay.
- Hours by day. The payroll journal has hours per pay period, not per day. Export daily hours from Gusto's time tracking if you use it, or from your timekeeping app (Workyard, ClockShark, Busybusy and similar all export CSV). Filter to the public works project.
- Combine. Use the hours export as the base: one row per worker per day. Add the pay columns from the journal to one row per worker. You don't need to repeat them on every row.
Columns the generator recognises
| WH-347 needs | Typical Gusto-style column | Required? |
|---|---|---|
| Worker name (1B–1D) | first_name, last_name | Yes |
| Identifying number (1E) | ssn or employee_id; only the last 4 digits are printed | Recommended |
| Labor classification (3) | job_title (your job name per classification) | Yes |
| Apprentice level (2) | apprentice_level (blank = journeyworker) | If any apprentices |
| Day and hours (4, 5) | work_date, regular_hours, overtime_hours, double_overtime_hours | Yes |
| Hourly rate (6A) | 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_earnings | Recommended |
| Deductions (8) | federal_income_tax, social_security_medicare, state_income_tax, sdi, union_dues | Recommended |
| Net pay (9) | net_pay, check_number | Recommended |
Your headers can be different. Match them once in step 2 and they're remembered for files with the same columns.
Fringe benefits with Gusto
If you pay part of the prevailing wage as benefits, the WH-347 needs the hourly credit for each plan. Gusto records benefit contributions per payroll, not per hour, so work out the hourly credit for each plan and add it as a column (for example pension 9.80). DOL generally requires credits for contributions to be annualized: the yearly contribution for the worker divided by the total hours they work in the year on all jobs, so you can't take the whole credit only in prevailing wage weeks. Any shortfall between the fringe rate and your plan credits is paid as cash and shows in column 6C.
A worked example
Ana works 40 hours as a carpenter in the week ending November 7: eight hours a day Monday to Friday, plus two hours of overtime on Thursday. Her Gusto job "Carpenter" pays $52.10 an hour, and you contribute $11.20 health, $9.80 pension and $4.10 vacation per hour to plans. Her WH-347 line shows 8 hours on each weekday in the ST row, 2 on Thursday in the OT row, 40 and 2 in column 5, $52.10 and $78.15 in column 6A, and $1,054.20 in column 6B (42 hours × $25.10). Page 2 lists the three plans and her $25.10 total hourly credit. The first worker in our Gusto sample file is set up like this, plus a four-hour Saturday overtime shift and two small extra fringe items.
Common mistakes
- Biweekly totals on a weekly form. Split hours into the actual workweek; the generator lists dates outside the week.
- One job for everything. If all hours go to one job, the form can't show the work in each classification. DOL says that without accurate records the worker must be paid the highest rate for all hours.
- Benefits taken only on public jobs. Credits for plan contributions generally have to be annualized across all hours worked.
- Full SSNs. Never printed: column 1E shows the last four digits only.
Questions
Can Gusto do certified payroll?
Gusto handles the payroll itself, including different rates per job, but it doesn't offer a built-in WH-347 report. Export and use a separate tool to fill the form.
Does this connect to my Gusto account?
No. It reads only the file you choose, in your browser. Nothing is uploaded to us or to Gusto.
Does Gusto make the California DIR XML?
Not that we know of. For California public works you can check an XML file with our free eCPR V2 checker, and our paid plan builds the XML from the same file you use for the WH-347.