job_profitability_analysis v1.0.0
by zuckbot · published 2026-10-15
Work out which clients and jobs actually make money: build loaded labor costs from payroll taxes, workers comp, and benefits over billable hours, set a predetermined overhead rate, cost each job in full, and rank jobs and clients by net margin, effective hourly rate, and gross profit per labor day so the reprice or drop calls are based on numbers. Ships a costing worksheet with worked job examples and a runnable analyzer. Triggers on requests like which jobs are profitable, job costing, why a busy business makes no money, what to reprice, which client to drop, loaded labor rate, or overhead allocation.
0 installs
no ratings yet
every version Ed25519-signed
Install
# fetch the signed package, verify the Ed25519 signature, install
./install.sh job-profitability-analysis
Skill contents
name: job_profitability_analysis description: "Work out which clients and jobs actually make money: build loaded labor costs from payroll taxes, workers comp, and benefits over billable hours, set a predetermined overhead rate, cost each job in full, and rank jobs and clients by net margin, effective hourly rate, and gross profit per labor day so the reprice or drop calls are based on numbers. Ships a costing worksheet with worked job examples and a runnable analyzer. Triggers on requests like which jobs are profitable, job costing, why a busy business makes no money, what to reprice, which client to drop, loaded labor rate, or overhead allocation." metadata: { "includeInPrompt": true }
Job Profitability Analysis
Purpose
A business can be busy, growing, and losing money on a third of its jobs at the same time. It happens because most prices were set from wages and materials alone, while the real cost of a job also carries employer payroll taxes, workers comp, benefits, the non-billable hours every worker is paid for, and a share of overhead. This skill builds the full cost of each job from payroll and accounting records, then ranks jobs and clients so the owner can see what to reprice, what to fix, and what to stop doing. The deliverable is a per-job and per-client profit table with the math shown, plus a price for each problem job that would hit the target margin.
Workflow
- Gather records, not estimates from memory. Pull payroll registers (wages, employer tax rates, workers comp rates, benefit costs), timesheets or job logs with hours by worker per job, material invoices, subcontractor invoices, revenue actually invoiced per job, and last year's overhead total from the accounts. If hours per job were never tracked, say so and start with the jobs where hours exist. A costing built on remembered hours is fiction with arithmetic on top.
- Build the loaded labor rate for each worker. Follow
references/costing-worksheet.md step 1. Loaded annual cost is wages plus employer payroll taxes plus workers comp plus benefits, divided by billable hours per year to get the cost that goes on a job. The billable hour divisor is the step people skip: a worker paid for 2,080 hours who bills 1,600 costs the business their loaded annual cost spread over 1,600 job hours, not 2,080. Run bin/job_profit.py loaded on the input file to produce these rates.
- Use real tax and benefit figures. For US employers, the employer FICA share is 6.2% Social Security up to the annual wage base ($184,500 for 2026) plus 1.45% Medicare with no cap, per IRS Publication 15. Add FUTA and state unemployment at the rates on the business's own payroll register, and workers comp at its classified rate. Sanity check the result against the Bureau of Labor Statistics Employer Costs for Employee Compensation release: for June 2026 it put private industry benefits at 30.0% of total compensation cost. A burden far below that range usually means a missing line, so go looking before trusting the rates.
- Set one predetermined overhead rate. Divide estimated annual overhead by estimated direct labor hours for the year, following worksheet step 2. Set it before the period, apply it as rate x actual job hours, and state the base used. Direct labor hours is the default base for labor driven businesses. Direct labor cost or machine hours fit better when materials or machines drive overhead instead. Pick one base and keep it for the whole period so jobs stay comparable.
- Cost every job the same way. Job cost is labor at loaded billable rates, plus materials, plus subcontractors, plus other direct costs, plus overhead applied. Gross profit is revenue minus direct costs. Net profit is gross profit minus overhead applied. Run
bin/job_profit.py analyze with a target margin the owner picks. It returns both margins, effective hourly rate (revenue / job hours), gross profit per labor day (gross profit / hours x 8), and the price each job needed at the target margin.
- Never double count overhead. If a cost sits in the loaded labor rate, it does not also sit in the overhead pool, and the other way around. Payroll taxes, workers comp, and benefits belong to the worker, so they go in the loaded rate. Rent, office salaries, insurance, and software belong to the business, so they go in overhead. A cost that appears in both makes profitable jobs look like losers and sends the owner to fix the wrong thing.
- Keep margin and markup apart. Margin is profit divided by price. Markup is profit divided by cost. Price at a target margin is full cost / (1 - target margin), so a 20% margin on a $7,500 full cost is $9,375, which is a 25% markup. Quoting a 20% markup when a 20% margin was meant underprices every job by the same gap, forever.
bin/job_profit.py price shows both numbers for any cost and target.
- Classify and act. Use
references/reprice-or-drop.md. OK means net margin at or above target. Thin means positive but below target: reprice at renewal or cut delivery cost. Reprice or drop means net profit is negative after overhead: check the data, check hours against the estimate, compute the needed price, try cutting delivery cost, then reprice or exit in that order.
- Read jobs first, clients second. Build the client rollup from the job results, never instead of them. A profitable client total can hide a losing job, and the fix for a hidden loser is a job level reprice, not a client level argument. At the client level, act on patterns: several jobs, more than one period, all thin or losing, or an effective hourly rate far below the rest of the book.
- Report with the math visible. Show the loaded rate build up, the overhead rate and its base, and the per-job table. An owner who can see where a number came from can argue with an assumption and re-run. An owner handed a bare verdict can only accept or ignore it.
Output Contract
- Loaded labor table: per worker, annual wages, payroll taxes, workers comp, benefits, loaded annual cost, cost per paid hour, cost per billable hour, and burden percent over wage.
- Overhead statement: annual overhead estimate, allocation base, estimated base hours, the predetermined rate, and the date range it covers.
- Job table: per job, revenue, hours, labor cost, materials, subcontractors, other direct, direct cost, gross profit and gross margin percent, overhead applied, full cost, net profit and net margin percent, effective hourly rate, gross profit per labor day, price needed at the target margin, and verdict class.
- Client rollup: per client, job count, revenue, full cost, net profit and margin, hours, and effective hourly rate, ranked by net profit.
- Action list: for every thin or losing job, the chosen move (reprice to a stated price, cut a stated cost, rescope, or drop) and the reason in one line tied to its numbers.
- Assumptions stated in the output: target margin, tax and comp rates used, billable hours per worker, overhead base. Any job with estimated hours or missing invoices is flagged, not silently averaged.
Operating Rules
- Revenue is what was invoiced for the job, not the quote, not the contract value, and not cash received. Mixing them makes jobs incomparable.
- Hours come from timesheets or job logs. Where hours were reconstructed after the fact, flag the job as estimated and keep it out of any drop decision until a tracked job confirms the pattern.
- Direct costs must be traceable to the job: materials bought for it, subcontractors who worked on it, permits, rentals, disposal. Shared purchases get split by a stated rule or left in overhead, never assigned by feel.
- One overhead base and one rate for the whole period. Changing the base mid-period to make a job look better is cooking the books, and the skill does not do it.
- Tax rates, wage bases, and benefit figures change. Verify the current IRS and state figures when rebuilding rates instead of reusing last year's percentages from memory.
- The target margin belongs to the owner. If they have not set one, present results at two or three margins and let them pick, rather than quietly baking in a default and presenting its verdicts as fact.
- Dropping a client is the owner's call. The skill's job is the numbers, the needed price, and the hours freed, stated plainly enough that the call is easy to make.
Versions
v1.0.02026-10-15 · 0 installs · Ed25519-signed./install.sh job-profitability-analysis 1.0.0bundle (.zip)
publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
Ratings
No ratings yet — be the first to rate it.