Back to the blog

December 27, 2025 · 11 min read

Recording Subcontractor Payments Cleanly: What Your Books Need to Show

By 909 Bookkeeping

How to record subcontractor payments in QuickBooks Online. Track each subcontractor on its own line, tie every payment to the job, hold retainage apart from the paid amount, and keep the monthly income true. Plain English from 909 Bookkeeping.

Trade illustration for this bookkeeping guideA flat illustration of a contract with a check and a held retainage box, showing subcontractor payments and retainage tracked per job for a trade that hires subs.LEDGER%

What subcontractor books need to track

A trade that hires subcontractors is not one number. It is the jobs you ran, the subs you hired, the amounts you billed them, the retainage you held, and the payments you sent. Each part needs its own line so your monthly income stays true.

When you track all of it by job and by sub, you can see which jobs cost more in subcontracted work and which subs come in on budget. When you do not, you get one big pile of checks sent and no way to tell whether the framing sub or the drywall sub ate the budget on the new build.

Many trades hire subcontractors. General contractors, drywall crews, framers, electricians, plumbers. You bid the job, you hire a sub for part of the work, the sub bills you, you hold a retainage, and you pay the rest. The retainage is the held amount that keeps the sub coming back to finish. When the books hold the payment apart from the retainage and both on the job line, the business makes sense. You can read more about how we keep these lines tied on our bookkeeping page.

Here is what a clean sub payment looks like.

LineWhat it means
Subcontractor billedWhat the sub billed you for the job
Retainage heldThe amount you held back until the job is done
Amount paidWhat you sent the sub this month
Retainage dueWhat you still owe the sub when the job passes
Total sub costThe full cost of the sub on the job

When the payment and the retainage sit on their own lines, your sub cost per job is real. When they sit together, a big check looks like the whole cost and the amount you still owe hides.

How subcontractor payments show up in your books

A subcontractor payment is a cost of the job, not a cost of the month. The sub bills you for the work. You pay the bill. The cost needs to tie to the project.

The clean way is to book the full billed amount to a subcontractor cost line tagged to the job class. The full invoice goes in as a cost. The part you pay goes out of the bank. The part you hold goes to a retainage liability account. Your profit and loss shows the full cost of the sub on the job. Your balance sheet shows what you still owe. The two tell different stories and both are true.

The messy way is to book only the check you sent as a cost and ignore the retainage. Now your job cost looks lower than it is. You can not tell what you still owe the sub. When the job ends and the retainage comes due, it shows as a sudden cost in a month when no work was done. You can read more about how we track job costs in our cost codes and projects guide. The same idea works for a subcontractor payment.

Here is how to keep the payment clean.

  • **Book the full billed amount to a subcontractor cost line: ** not just the check.
  • - **Book the retainage to a retainage liability account: ** so it shows what you owe.
  • - **Tag each payment to the job class: ** so the cost sorts by project.
  • - **Match the check to the bank: ** the day it clears.
  • - **Watch the retainage balance: ** it should drop to zero when the job is done.

When the full billed amount sits on the job, your cost is real. When only the check sits there, the retainage hides and the true cost is a guess.

How retainage shows up apart from the paid amount

Retainage is the amount you hold back from a sub until the job passes inspection or finishes. It is a real amount you owe, even though you have not sent the check yet.

The clean way is to book the retainage to a retainage liability account when the sub bills you. The full invoice goes to the subcontractor cost line. The retainage piece also goes to the liability account. The part you pay goes out of the bank. Your balance sheet shows the retainage you owe. Your profit and loss shows the full cost. When the job finishes, you pay the retainage and the liability drops to zero.

The messy way is to ignore the retainage and book only the check. Now your balance sheet does not show what you owe. When the retainage comes due, the payment looks like a cost with no job to tie it to. You can read more about how we handle retainage in our progress billing and retainage guide. The same idea works for a subcontractor retainage.

Here is how to keep retainage clean.

  • **Book the retainage to a liability account: ** so it shows what you owe.
  • - **Book the full invoice to the subcontractor cost line: ** so the job cost is true.
  • - **Pay the retainage when the job passes: ** and drop the liability to zero.
  • - **Tag the retainage to the job class: ** so it sorts by project.
  • - **Watch the retainage balance per sub: ** so no held amount gets lost.

When the retainage sits in a liability account, your books show what you owe. When it hides inside the check, the true cost of the sub is wrong.

How to tie each payment to the job

A trade with three jobs and two subs on each needs a way to sort the sub costs by project. Classes in QuickBooks Online do this.

The clean way is to turn on class tracking and set up one class for each job. Every subcontractor bill, every retainage entry, and every check carries the class for the job it belongs to. When you run the profit and loss by class, each job shows its own sub cost total. You can see which job cost more in framing and which one cost more in drywall.

The messy way is to book every sub payment to the same account with no class. Now you can not sort by job. You can not tell if the new build or the remodel ran over on subcontracted work. You can read more about how we keep projects apart in our fence and deck builder guide. The same idea works for sub payments.

Here is how to tie payments to the job.

  • **Turn on class tracking in QuickBooks Online: ** and set one class per job.
  • - **Tag each sub bill to the job class: ** so the cost sorts by project.
  • - **Tag the retainage to the job class: ** so the liability sorts by project.
  • - **Tag the check to the job class: ** so the cash out sorts by project.
  • - **Run the profit and loss by class each month: ** so each job shows its own sub cost.

When each line carries a class, the business reads like a row of jobs. When it does not, the business reads like one big blur.

How to match each payment to the bank

Every subcontractor check has to match the bank. The sub bills you. You send the check. The books need to tie the cash out to the real number.

The clean way is to match each check to the bank the day it clears. The amount in the books agrees with the amount that left the bank. When a check clears late, it lands in the right week, not the week you wrote it. When a check is void, it does not stay on the books. The bank and the books always agree.

The messy way is to book the check and never match it. Now the books show a payment that may or may not have cleared. A voided check sits as a cost. A late check sits in the wrong month. You can read more about how we match payments to the bank in our courier and delivery guide.

Here is how to keep the match clean.

  • **Match each check to the bank: ** the day it clears.
  • - **Watch for voided checks: ** a check that did not clear should not stay as a cost.
  • - **Watch for late checks: ** a check that cleared late goes in the right week.
  • - **Reconcile the bank each month: ** so the cash total agrees with the bank.
  • - **Check the retainage liability against the open jobs: ** so no held amount gets lost.

When each check matches the bank, your cash is true. When they float untied, the cost drifts and the real profit hides.

How the month end close works

At month end, every job needs its sub costs added up. The billed amount, the retainage held, the checks sent, and the retainage still due all pull together into one project total. When the jobs roll up by class, you see each project side by side.

We start with the bank. We match each check to the cleared payment. We book the full sub invoice to the subcontractor cost line tagged to the job. We book the retainage to the liability account tagged to the job. We check the retainage balance against the open contracts. When a job finishes, we pay the retainage and drop the liability to zero. Then we add up the month by job class. We send you the profit and loss by class, a balance sheet, and a cash summary. Each job sits inside the report in its own column.

Here is a simple month end check.

  • **Match each check to the bank: ** every payment cleared.
  • - **Book the full sub invoice to the job class: ** not just the check.
  • - **Book the retainage to the liability account: ** tagged to the job.
  • - **Check the retainage balance against open jobs: ** so no amount gets lost.
  • - **Pay retainage when a job finishes: ** and drop the liability to zero.
  • - **Run the profit and loss by class: ** so each job shows its own sub cost.

When the close runs every month, the job story stays clear. When it skips a month, the retainage stacks up and the next month is harder to close.

A situation we clean up

The sub payments that hid the retainage

A general contractor runs three jobs and hires a framing sub and a drywall sub on each. Every check sent to a sub lands in one general subcontractor expense line. The retainage is never tracked. At month end, the owner can not tell what the framing cost on the new build is, what the drywall cost on the remodel is, or what retainage is still owed to each sub. The balance sheet does not show the held amounts at all.

Here is how we handle it. We turn on class tracking in QuickBooks Online and set up one class for each job. We set up a retainage liability account. We go back through the open months and book the full sub invoice to the subcontractor cost line tagged to the job. We book the retainage to the liability account tagged to the job. We match each check to the bank. When we are done, the owner can run the profit and loss by class and see each job in its own column, and the balance sheet shows the retainage still owed to each sub. We set up a rule so the next sub bill carries the right class from the start.

Mistakes we fix

  • Only the check booked as a cost with no retainage tracked
  • No retainage liability account set up at all
  • Every sub payment in one general subcontractor line with no job tag
  • No class tracking turned on so no way to sort by job
  • A retainage payment with no job to tie it to when it comes due
  • A voided check still sitting as a cost after it did not clear
  • No profit and loss by class run at month end
  • The balance sheet not showing what is still owed to subs
  • A sub billed amount never matched to the check that went out
  • Retainage from a finished job still sitting on the books

Common questions

How do I record a subcontractor payment? Book the full billed amount to a subcontractor cost line tagged to the job class. Book the retainage to a retainage liability account. Match the check to the bank the day it clears. Your profit and loss shows the full cost and your balance sheet shows what you owe.

How do I track retainage? Book the retainage to a liability account when the sub bills you. The full invoice goes to the cost line and the retainage piece goes to the liability. Pay the retainage when the job passes and drop the liability to zero. The balance sheet always shows what you still owe.

How do I tie a sub payment to the job? Turn on class tracking in QuickBooks Online and set up one class per job. Tag every sub bill, retainage entry, and check to the job class. Run the profit and loss by class so each job shows its own sub cost.

How do I match a sub check to the bank? Match each check to the bank the day it clears. Watch for voided checks that do not clear and late checks that clear in the wrong week. Reconcile the bank each month so the cash total agrees with the bank.

Ready for books that close on time?

Free 20-minute call. We reply with a fixed quote within one business day.

Book a callCall