The customer
A ConnectWise-based MSP that subcontracts part of its delivery. Some specialized work — the kind you don’t keep a full-time person on staff for — gets handed to a trusted subcontractor, managed by the MSP, and billed to the client as part of one seamless service.
The client never contracted with the subcontractor. They bought a service from the MSP. As far as the relationship, the warranty, and the invoice are concerned, the MSP delivered the work.
The tension: outsourced work that doesn’t look outsourced
The whole point of subcontracting is that it’s invisible. The client hires one provider, gets one bill, holds one throat to choke. White-labeling the subcontractor isn’t a sleight of hand — it’s the commercial truth: the MSP scoped the work, stood behind it, and owns the outcome.
But the ConnectWise invoice kept giving it away.
The subcontractor’s labor landed in the Products section of the invoice, sitting apart from the MSP’s own team’s hours. Same kind of work — labor — printed in two different places, under two different headings. A client reading the invoice could see exactly which work the MSP did and which work it didn’t.
The client bought a service from one provider. The invoice should read like one provider delivered it.
Why the labor lands under Products
This is the part every ConnectWise admin recognizes.
Your own technicians work tickets in ConnectWise Manage, so their hours become time entries — and time entries flow into the Services section of the invoice, grouped by work role, the way labor should appear.
A subcontractor doesn’t work tickets in your CW Manage. They don’t have logins, they don’t touch your boards, and their hours never become time entries. So when it’s time to bill, that labor gets keyed in the only place left for it: as a product line on the invoice.
The result is structurally wrong even though the math is right. Labor is sitting in Products. The Services subtotal understates the work actually delivered. And the subcontracted line refuses to group with the in-house labor of the same role, because as far as ConnectWise is concerned, it isn’t labor at all — it’s a catalog item that happens to be named after a job.
What we built
A tenant extension that reclassifies those product lines back into labor at render time.
Better Invoice reclassifies the subcontracted line as labor before the invoice renders. From that point on it behaves like any other hour your team logged:
- It moves out of Products and into Services.
- It groups and merges by work role, right alongside your own team’s labor of the same role.
- The Services subtotal grows by exactly what left Products. The grand total, the tax, and the balance due never move.
Nothing changes in ConnectWise. The line is still keyed as a product on your side, still feeds your cost accounting and your margin math the way it always did. The reclassification lives entirely in how the invoice renders.
The result
The subcontractor disappears into the invoice. A client reading it sees one Services section, grouped by work role, with no seam between the work the MSP’s own team did and the work it subcontracted. It all reads as one provider’s delivery — because it is.
Why this matters
- The white label holds. Outsourced work that prints under Products announces itself. Moving it into Services, grouped with in-house labor, keeps the delivery looking like what it is to the client: one service from one provider.
- The products/services split tells the truth. Labor belongs in Services. Once the subcontracted hours land there, the Services subtotal finally reflects all the labor the client paid for, and Products is just products again.
- Margin math is untouched. The line stays a product inside ConnectWise. Cost, margin, and reporting work exactly as before. Only the customer-facing render changes.
- Not a penny moves. This is a reclassification, not a re-price. The number at the bottom of the invoice is identical — the breakdown above it is just honest.
Why it’s possible
The mechanism is deliberately simple: name the product line exactly like one of your ConnectWise work roles, and the extension recognizes it as labor and reclassifies it. No new fields, no mapping table to maintain, no change to how billing keys the line.
That’s because this isn’t a bespoke template tweak — it’s a tenant extension, a narrow behavior that runs on raw invoice data before rendering, scoped to one customer. The same mechanism that collapses a productized service into one clean line reclassifies subcontracted labor here. We meet your data model where it lives, instead of asking you to restructure ConnectWise around the invoice.