Built for: Owners of web and software development shops doing $3M to $20M a year that run on Teamwork and QuickBooks, selling a mix of fixed bids, time and materials and support retainers.
What it answers: Which kind of work actually makes money once the team's hours are counted, which builds are running over before the last invoice shows it, whether contractors are really cheaper than hiring, and what to change in pricing.
See it live: Development shop demo · a made-up company with invented numbers
Every dev shop owner I've worked with has a version of the same feeling. Revenue is up, the team is busy, and somehow the year doesn't leave what it should. When I ask where the margin went, the answer is usually "the fixed bids, probably." Probably is the problem. QuickBooks can't tell you, because QuickBooks doesn't know where anyone's hours went. Teamwork does.
Here's how I'd walk an owner through it, using a sample dashboard we built for a made-up shop called Glimmerstack. It builds portals, ordering apps and online stores with about 30 people on payroll and an offshore contractor team. It runs its projects in Teamwork Projects, its support in Teamwork Desk, its books in QuickBooks, payroll in Gusto and sales in HubSpot. Glimmerstack billed $8.5M in the last 12 months, up 34%.
The grey bars are QuickBooks alone. Payroll is one line in the books, so the best it can do is spread it by revenue, and fixed bids and T&M both look like they keep about 34 cents of every dollar.
The coloured bars add Teamwork. Every timelog is joined to what that person costs, from Gusto: salary, taxes and benefits over the hours they're actually available. Now T&M keeps 55 cents, retainers 51 and fixed bids 30. Rent, the sales team, owners' pay and time between projects take about 30 cents, so a typical fixed bid pays for itself and nothing else.
This doesn't live in a spreadsheet. Each month the Teamwork time cards post payroll to the right customer and project in QuickBooks through the API, so QuickBooks' own profit by customer starts telling the truth. The same timelogs show the leak: about 9,700 hours given away in a year, 8,900 of them past a build's estimate.
This is the view I'd want on every dev shop owner's desk: the estimated time on each build's Teamwork tasks, the hours logged and the hours still to come. Fourteen of the 19 builds ran 20% or more over. The extra hours cost about $1.0M at team cost, on work bid at a 45 to 50% margin.
The worst is Grisholm Equipment's dealer portal, priced at $125 an hour to win the account and now 45% over. QuickBooks' profit by customer shows it keeping 76 cents of every dollar, because that report carries the contractor bills and none of the payroll. With the team's time it finishes at 20 cents. The first 80% was billed on the planned calendar whatever the hours, and the last $112K waits on a launch six months late.
Open a build and you see its tasklists. On Grisholm the overrun isn't spread evenly: 705 hours went to change requests nobody estimated or billed, and QA and launch is 56% over.
Your team sees all 155 tasks with hours and cost. Flip to the client view and Grisholm sees 18: milestones, approvals and the two things waiting on them. No hours, no cost, nothing marked internal.
Comments work the same way. The client asks for one more feature on the dashboard row. The owner's note ("we're 45% over, put it on a change order") stays inside Glimmerstack. The PM's reply goes back to the client on the same Teamwork task. Nobody copies anything between systems.
Invoices come from QuickBooks, earned work from Teamwork hours. On the newest builds Glimmerstack has billed about $200K ahead of the work. On the late ones it has done about $180K more than it has billed. The number to watch is the $650K of final invoices that only go out at launch, $270K of it on builds already past their launch date.
The invoice says $46 an hour against about $84 for the team. Count a lead's review time and the hours that redo work, and a delivered contractor hour on a build costs about $80 against $91. Still cheaper, by much less than the invoice says, and the builds with more contractor hours ran further over.
Their bill gets checked before anyone pays it. Each line is matched to the hours logged in Teamwork and the PO set on the Teamwork project. Seven of 12 lines were approved automatically. Four were over their PO, all on builds running over, and the PM approves those in the same view. One billed 14 hours nobody logged, so it waits.
Don't hire ahead of the pipeline. As signed work finishes the team has about 1,800 free hours a month by spring, and the weighted HubSpot pipeline fills about 60% of that.
Teamwork Desk shows the six smallest retainers using about half again the hours they pay for, so they earn about $100 an hour worked against about $150 on the three biggest.
Pull the first three together and fixed bids keep about 42 cents of every dollar instead of 31.
SPRCHRGR has run on Teamwork since 2023, and we have a full API connection to Teamwork Projects and Teamwork Desk, alongside QuickBooks, Gusto and HubSpot. On a real engagement this page reads your own Teamwork site: estimates, timelogs, tasklists, tickets and comments. Labor posts to QuickBooks by customer and project, contractor bills are matched to Teamwork before they're paid, and comments go back onto the right Teamwork task. Your team keeps working where it works now.
That's CFOptimize for Agencies, and it starts with a free project margin review on your own numbers. Book your free project margin review.
Mark
Glimmerstack is a made-up company, and every client, project, task, ticket, comment, contractor firm, person and number in the dashboard and this post is invented. QuickBooks, Teamwork, Gusto and HubSpot are real products, named as the tools a shop like this runs on; none of them is connected to the sample. The overrun rule, lost bids, change-order recovery and retainer losses are rules of thumb, not forecasts.