Construction

Extract payroll reports to structured JSON

A certified payroll report records, per worker per week, the hours worked each day, the work classification, the pay rate, gross wages, deductions, and net pay. The federal WH-347 is one layout among hundreds: states publish their own variants, payroll systems export their own, and contractors edit standard forms until the columns drift. Sensible converts certified payroll data into structured JSON for prevailing wage compliance and labor reporting.

prevailing wage compliance | certified payroll audit | labor reporting

Validated JSON

Schema-enforced output; every field matches your contract

Source coordinates

Every value links back to page + bounding box for audit

Per-document pricing

Predictable cost. No token-volatility surprises

Trusted by teams turning documents into production data

What makes payroll reports hard to extract

Certified payroll reports start from a handful of standard forms and end up looking like none of them. Contractors add columns and freetext, every state mandates its own variant, and the data crowds into tables tight enough that OCR merges adjacent values. Hybrid extraction reads the dense grid; deterministic rules keep each day's hours tied to the right worker and classification.

01

WH-347, State, and Vendor Variants

The federal WH-347 covers Davis-Bacon work, but California, New York, and dozens of other states require their own certified payroll forms, and payroll systems export their own again. Each layout moves the classification, rate, and deduction columns somewhere new. LLM parsing reads whatever arrives; SenseML rules map every variant to one consistent schema.

02

Dense Per-Day Hours and Deduction Tables

A single row holds a worker's name, last-four SSN, classification, hours for each day of the week, total hours, pay rate, gross amount, and a column of deductions before net pay. The cells crowd together tightly enough that OCR merges adjacent numbers. Sensible reads the table as structured rows, keeping each day's hours and each deduction tied to the right worker.

03

Scan Quality and Multi-Page Weeks

Many reports arrive scanned, faxed, or saved as edited PDFs where readable text turns illegible to OCR. A single week can run several pages, with workers continued across page breaks and the statement of compliance on its own sheet. Hybrid extraction combines positional rules with LLM parsing for degraded inputs, and flags low-confidence fields for review rather than guessing.

Managed services

Don't want to build it? We'll write your configs from your samples.

Solutions engineers handle plan, build, deploy, and adjust on your behalf. You see clean JSON in your API response. Same engine as self-serve, just with the configuration work outsourced.

What's included

01Plan.Engineers review your samples and pick the right method

02Build.SenseML configs written from your samples

03Deploy.Same engine as self-serve, ready for production

04Adjust.We update configs when formats shift or new edge cases appear

05Integrate.Help with custom integration into your downstream systems

Fields we extract

Every compliance pipeline maps payroll reports to its own schema, so we build the config around your exact fields rather than a fixed list. These are the fields compliance teams pull most often; we map whatever else your prevailing wage or labor-reporting workflow needs.

01

Contractor & project

Contractor or subcontractor name and address, project name and location, contract or project number, payroll number, week-ending date, and the statement of compliance

02

Employee & classification

Worker name, last-four SSN, work classification (laborer, electrician, operator, and more), exemptions or withholding allowances, and fringe-benefit indicators

03

Hours, wages & deductions

Day-by-day hours (S M T W T F S), total hours, overtime split, hourly rate, gross amount earned, FICA and federal/state withholding, other deductions, and net pay

config.json

SenseML

{ /* SenseML: certified payroll extraction */
"fields": [
{
"method": {
"id": "queryGroup",
"queries": [
{ "id": "contractor_name", "description": "contractor or subcontractor name, company name" },
{ "id": "project_name", "description": "project and location, project name, job name" },
{ "id": "week_ending", "description": "week ending, for week ending, payroll week end date" },
{ "id": "payroll_number", "description": "payroll no, payroll number, payroll #" }
// + per-employee hours, wages, and deductions, mapped to your schema
]
}
}
]
}

Supported payroll formats

Sensible processes certified payroll reports across forms, states, and payroll systems. New variants can be configured in hours, and the extraction logic is explicit in SenseML rather than buried in prompt tuning.

By form

Federal WH-347, state certified payroll forms (California DIR A-1-131, New York, and more), agency-specific prevailing wage reports, and contractor-edited variants of all of them

By source

Payroll system exports (ADP, Paychot, QuickBooks, LCPtracker), system-printed PDFs, typed forms, handwritten reports, and faxed or scanned copies

Common Questions

Answers about WH-347 and state form support, per-day hours and deduction extraction, and handling scanned or edited reports.

Can Sensible read scanned and multi-page payroll weeks?

Yes. Many reports arrive scanned, faxed, or saved as edited PDFs where text turns illegible to OCR, and a single week can run several pages with workers continued across breaks and the statement of compliance on its own sheet. Hybrid extraction combines positional rules with LLM parsing for degraded inputs and flags low-confidence fields for review.

How does Sensible handle the dense per-day hours and deduction tables?

A single row holds a worker's name, classification, hours for each day of the week, total hours, pay rate, gross amount, and a column of deductions, crowded tightly enough that OCR can merge adjacent numbers. Sensible reads the table as structured rows, keeping each day's hours and each deduction tied to the right worker and classification.

What fields does Sensible extract from a certified payroll report?

Contractor and project details, payroll number, week-ending date, per-worker classification, day-by-day hours, total and overtime hours, hourly rate, gross wages, deductions, and net pay are all extracted, along with the statement of compliance. Custom fields can be added in SenseML to match your prevailing-wage schema.

Which certified payroll forms does Sensible support?

Sensible processes the federal WH-347 for Davis-Bacon work, state certified payroll forms like the California DIR A-1-131 and New York variants, agency-specific prevailing wage reports, and contractor-edited versions of all of them. Payroll-system exports from ADP, Paychex, QuickBooks, and LCPtracker are covered, and new variants can be configured in SenseML.

Start free

Turn your next payroll report into JSON.

Free 14-day trial. No credit card required. Start extracting in minutes.