Two different companies are hiding inside your plumbing shop
You ran 140 service calls last month out of a shop off East Loop 820, and you also had three tract houses in Crowley at rough-in. Same trucks, same techs, same bank account. But those are two different businesses, and most plumbing business bookkeeping in Fort Worth treats them as one blended pile of revenue and material.
That's how a shop with good field production ends up not knowing which half is paying for the other.
Service work bills fast, collects fast, and dies from unbilled truck stock and callbacks. Builder work bills in phases, sits on retainage — the slice of your contract the builder holds back until the whole house closes out — and dies from change orders nobody wrote up. The books have to be built to tell those two stories apart.
What plumbing bookkeeping in Fort Worth has to track that generic bookkeeping doesn't
A restaurant bookkeeper records money in and money out. Yours has to carry four extra things or your job numbers are fiction:
Cost codes by phase. A cost code is a bucket you tag every dollar to so you can see what a specific piece of work cost. For plumbing that means rough-in, top-out, trim, gas, sewer/water service, and service-call work — not one line called "Job Materials."
Burdened labor. Your burdened rate is what an hour of a tech actually costs you after employer payroll taxes, workers' comp, truck, fuel, and phone — not the wage on his check.
Truck stock. Fittings, valves, and water heaters sitting on six trucks are inventory, not expense, until they go into a job. Shops that expense everything at the supply house look wildly profitable in a stocking month and broke the month after.
Subbed-out work. Backhoe operators, jetting crews, slab-leak locators, sometimes another plumber's helper. Every dollar of that is a 1099-NEC candidate.
Stream reconciles payroll, payables and receivables into the books so those four things line up with your bank — you still run payroll and buy the material; we make sure it lands in the right code.
Before the job: set up the codes and get one honest hourly number
Do this once and stop guessing. Build a chart of accounts that splits new-construction revenue from repair/service revenue, because Texas treats those differently for sales tax and whoever files that return needs them separated, not blended.
Then price your hour. Say you pay a journeyman $30 an hour. Add employer payroll taxes, comp, his half of a stocked truck, and his phone, and assume that lands at $40 an hour of real cost. Bid at $30 and you're eating $10 an hour, every hour, all year.
During the job: draws, retainage, and the material nobody billed
On builder work, bill each phase as you finish it and code the cost to the same phase. If rough-in bills but top-out material got coded to rough-in, your rough-in margin looks terrible and your top-out looks like a gift.
Watch overbilling — billing a job for more than the cost you've actually put into it. It feels like cash and it is cash, but it's cash you still owe work against. That's what a WIP schedule (work in progress: a job-by-job comparison of what you've billed against what you've spent) exists to show you before the builder's final draw disappears.
On service work, the leak is the ticket. A tech swaps a $600 water heater, adds an expansion tank, and closes the ticket without the tank on it. Nobody notices at the truck. You notice in March.
After the job: the callback, the sub, and what the house actually made
Here's a tract rough-in, top-out and trim package, priced at $10,000. Assume the numbers above.
- Material from the supply house: $3,200
- Labor: 64 hours at the burdened $40 an hour = $2,560
- Subbed backhoe work on the sewer tie-in: $1,240
Total job cost: $3,200 + $2,560 + $1,240 = $7,000. Gross profit is $10,000 − $7,000 = $3,000, or 30% of contract. That's the number most shops write down and stop.
Now the callback. Two months later the trim crew goes back for a leaking angle stop and a punch-list item: 6 hours at $40 = $240, plus $60 in parts, so $300. If that $300 gets coded to overhead — which is where it usually goes, because the job is "closed" — the house still reads 30%.
Code it back to the job and real profit is $3,000 − $300 = $2,700, or 27%. Do that across a 40-house subdivision and the three points you didn't see is the whole difference between a good year and a shrug.
The 1099 line most plumbing shops get wrong
That backhoe operator ran six tie-ins for you at $1,240 each. Individually, each one looks small. Add them up: 6 × $1,240 = $7,440 to one unincorporated sub.
For tax year 2026, the Form 1099-NEC reporting threshold for nonemployee compensation is $2,000. He's well past it. For tax year 2026, you furnish his statement and file with the IRS by January 31 — and you can't reconstruct his address and TIN in January if you never collected a W-9 the first day he showed up with the machine.
The rule that saves you: no W-9, no check. Every time.
Service-heavy or builder-heavy: which way to build your books
If your revenue is mostly service and repair, run tight monthly closes and focus on truck stock, ticket capture, and gross margin per tech. WIP barely matters when jobs open and close in a day.
If you're feeding builders, WIP and retainage matter more than anything else, because your money is sitting in phases and holdbacks, not in your account.
Most Fort Worth plumbing shops are both, and my verdict is simple: build the job-cost side properly even if builder work is only a quarter of revenue. Service margins you can feel in the bank. Construction margins lie to you for months. That's the specific mechanic behind bookkeeping and taxes for plumbing contractors.
If your books can't tell you what your last three houses actually made after callbacks, that's the thing to fix first. Submit a pricing request and tell us your revenue, crew count, and how much of your work is builder versus service.
Want the ongoing rundown on contractor tax and bookkeeping changes? Subscribe to the newsletter.