Skip to content

Certified payroll · Prevailing wage · California public works

The hours are yours. The arithmetic isn’t.

Certified payroll is the same handful of facts every week: who worked, which classification, how many hours. Everything after that — the rate, the fringes, the gross, the payroll number — follows from the wage determination that governed the bid. Ordan starts there, so the only thing left to type is the timecard.

Built from a first-hand, step-by-step account of the job as it runs today at a Bay Area heavy-civil general contractor, by someone who spent a thousand hours doing it.

Fifty workers, four weeks, two hundred passes.

Certified payroll is entered one worker, for one week, at a time. Week-ending date, project, employee, classification, then an entry form filled in by hand from a timecard — gross pay, wages paid in lieu of fringes, vacation and holiday, health and welfare, pension, training. A fifty-person crew across four weeks is two hundred separate trips through that form. Then certification. Then the same information filed again on the DIR site, under the subcontractor’s own account.

None of that is anyone’s fault — it is simply how the work has always been shaped, and every coordinator doing it has built real skill around it. Ordan keeps the shape and removes the retyping.

One week, one subcontractor, today

The click-path, in order

  1. Enter the week-ending date.
  2. Choose the project.
  3. Choose the employee — and if they don’t exist yet, stop and create them across roughly twenty fields assembled from several spreadsheets.
  4. Confirm the classifications.
  5. Fill the entry form by hand from a timecard pulled out of CMiC.
  6. Do the arithmetic manually, then enter the check information.
  7. If a figure does not reconcile, go back and correct it.
  8. Repeat for the next worker.

The same week, in Ordan

One grid

Entry is scoped to one subcontractor, one job, one week — which is both the unit the work is already organised in and the unit a certified payroll is actually filed in, since a payroll is made by an employer for its own employees.

Every worker on that crew is a row. Every day of the week is a column. The rates are already resolved when you arrive, the gross and the itemised fringes are computed from the hours as they are typed, and overtime and double-time rows stay collapsed for the workers who don’t have any.

The spreadsheet you keep outside the system.

Every compliance coordinator has one. A sheet of every subcontractor on every job, gone down row by row to decide who to chase — because the filing system will tell you what is in it and never what is missing from it. Two columns do all the work: the last day a sub had people on the job, and the last date their certified payroll covers.

The gap between those two dates is work that has been done and not yet filed. It is subtraction, done by eye, a hundred rows at a time. Ordan does it.

Sample subcontractors · worst first
SubcontractorLast workedFiled throughStanding
Bara Sodhi Trucking2026-07-07neverNothing filed at all
Deep Road Lines2026-07-242026-06-1440 days unfiled
Bal Express2026-07-212026-07-0516 days unfiled
Charlie Trucking2026-07-222026-07-193 days unfiled
ACZ Transportation2026-07-252026-07-26Up to date

Ordered by how far behind each sub is — computed from those two dates, by the same code the product runs on. Note the top row: a crew on the job and no certified payroll on file at all. On a sheet those two columns sit side by side and look like every other row, and that one is the one that becomes a finding.

What it deliberately does not do is rank by urgency. Some awarding bodies want payroll sooner than others and that is set per job — a real thing, and not one Ordan will pretend to know before you tell it. So it sorts by exposure, and says so on the screen.

Rates are not typed. They resolve.

A wage determination applies to a project as of its bid advertisement date — 8 CCR 16204 — not today’s date, and not the date the payroll happens to be entered. Ordan resolves from the craft, the classification, the county and that one date, and prints the determination number it used, so the answer can be checked against DIR rather than trusted.

Crew ratesProject AC-2026-14Sub Sierra GradingCounty AlamedaBid advertised 15 April 2026
Sierra Grading’s crew on Fremont Blvd Overlay, priced against the determination in effect on the bid advertisement date.
WorkerCraft / classificationDeterminationBaseFringeTotal hourly
Marcus WebbOperating EngineerGroup 4NC-23-63-1-2026-1$62.57$34.69$97.26
Elena CruzLaborerGroup 2NC-23-102-1-2026-1$39.00$31.16$70.16
Jaylen OrtizOperating EngineerApprentice, 1st periodNo rate determined. The rate library carries "Operating Engineer" in Alameda County, but no classification matching "Apprentice, 1st period" — only Group 4. Confirm the classification, or load the missing determination before filing.

The crew and the job above are sample records. The money is not. Every rate, determination number and refusal on this page was computed by the product’s own engine as the page rendered, against determinations transcribed by hand from DIR’s published PDFs — so if one were re-verified tomorrow and its figure moved, this table would move with it, including the line that refuses.

Two live contracts, one county, two rates. Both correct.

Because the governing determination is fixed by the bid advertisement date, two jobs running side by side in the same county can legitimately owe different money for the same craft. Below is Operating Engineer, Group 4, Alameda County — the same query, run twice, changing only the date the contract went out to bid.

Advertised 3 February 2025

NC-23-63-1-2024-2

$93.26per hour, straight time
  • Base hourly$59.76
  • Fringe$33.50
  • Effective from2024-09-01

Advertised 15 April 2026

NC-23-63-1-2026-1

$97.26per hour, straight time
  • Base hourly$62.57
  • Fringe$34.69
  • Effective from2026-03-04

$4.00 an hour apart, on the same craft in the same county, because the two contracts were advertised in different determination periods. That is why Ordan locks to the bid advertisement date rather than to today, and why superseded determinations stay in the library instead of being deleted — a 2024 payroll is supposed to be priced off a 2024 determination.

Where the answer is not settled, it asks.

Every rule carries its authority in its output rather than in a comment, so the work can be checked instead of trusted. And where a question is genuinely open — two determinations that both apply, a payroll week that runs past the one that governs, a fringe that rises with time on the job — the engine states the question and names the candidates instead of picking one and moving on. A wrong answer here, repeated weekly, is what an audit finds later as back wages.

The three panels below are the engine’s own wording, produced while this page rendered. They are not paraphrased for marketing.

Two determinations cover the same craft on the same bid date

More than one determination covers "Teamster" / "Group 2" in Santa Clara County on 2026-01-15: NC-23-261-1-2025-1, NC-23-261-1-2025-1A. Which one applies depends on facts this query doesn't carry (e.g. shift schedule) — confirm which determination governs before filing.

NC-23-261-1-2025-1NC-23-261-1-2025-1A
A payroll week that falls past the governing determination’s printed window

Determination NC-23-63-1-2026-1 governs this contract by its bid advertisement date (2026-04-15) but ran only through 2026-06-28, and this payroll week (2026-07-20 – 2026-07-26) is entirely after that. DIR prints on the determination itself: "The rate to be paid for work performed after this date has been determined. If work will extend past this date, the new rate must be paid." That successor rate is not published in the determination document — DIR directs contractors to its Research Unit at (415) 703-4774 for it. Obtain it and add it to the rate library before filing; paying NC-23-63-1-2026-1's rate for this week would underpay.

NC-23-63-1-2026-1
A dump-truck driver’s fringe, with no length of service on record

Determination C-DT-830-261-7-2021-1 sets part of its fringe by length of service with the employer, and this query carried none: health_welfare starts at $0.00 and rises to $1.16 after 90 days of service; vacation_holiday starts at $0.43 and rises to $0.78 after 90 days of service, $1.21 after 5 years of service, $1.65 after 10 years of service. Paying the printed day-one figures for a worker past the first step underpays; assuming a higher step asserts a length of service nobody has confirmed. Supply the worker's length of service with this employer before filing.

C-DT-830-261-7-2021-1

One worker. Two rule sets. Two craft names.

A federally funded state job needs a classification from both systems on the same record, and the federal craft name is not the state one — the same person doing the same work is a Truck Driver to Davis-Bacon and a Teamster to DIR.

Ordan resolves the two independently and never merges them into a single rate. Where one side answers and the other does not, it says so, rather than letting the answered side stand in for both.

ClassificationsWorker Kevin DoyleProject 04-0K2404
JurisdictionCraft / classificationTotal hourly
CalTrans–FederalCA20260018-6Truck DriverGroup 2$77.84
CaliforniaTeamsterGroup 2Two determinations could govern. Ordan asks which, rather than choosing.NC-23-261-1-2025-1NC-23-261-1-2025-1A

The sample job above is modelled as Caltrans-let and federally funded, which is what puts both rows on one record. Craft names differ across the two systems; only the divergence actually observed on a live payroll record is asserted here — no other craft’s federal name is claimed, because none has been verified.

Built for a domain with legal consequences.

Certified payroll is signed under penalty of perjury, and it handles SSNs and wage data on the way there. Three constraints shape the architecture rather than getting retrofitted onto it.

Credentials

Ordan holds no portal logins. Ever.

No password, PIN or token is a field anywhere in the schema, and a test walks every table on every run to keep it that way. The spreadsheets a compliance team keeps today do hold subcontractor portal logins — the importer recognises those columns and reports them as refused rather than quietly skipping them, so nobody finds out later that a credential came along for the ride. A system built to connect everything is exactly the system that must never become one trove of everyone’s logins.

Provenance

Recorded, not assumed.

Generated documents carry the template version and the revision of the agency blank they were rendered against, so “was this produced from a stale form?” is a question with an answer. Immutable filings are modelled as append-only amendment chains rather than as edits.

Omissions

Nothing is hidden silently.

Blank rows are skipped and counted. A deadline horizon never suppresses an overdue item, at any setting. An unrecognisable import throws, rather than reporting a clean run of nothing. In a system that interlinks everything, a silent omission propagates.

Check it against a week you have already filed.

Ordan opens on what needs you now and what is coming up, ordered by deadline rather than by a menu — loaded with projects, subcontractors, determinations, documents and deadlines in the shape the work actually takes. So the fastest way to judge it is to put a week you already know through it and see whether it agrees with you.

Or tell us about your jobs and we’ll answer.

A question about how it handles a classification you file, a request for access, or a look at it against one of your own weeks. Whatever you send arrives as an email and a person reads it.

This sends an email to us and nothing else — no account is created and you are not added to any list.