All stories

Customer story

The Subcontractor the Customer Never Sees

You hired the subcontractor, managed the work, and stand behind it. The invoice should read that way — their hours grouped right alongside your own team's, under Services.

Filed in Custom invoicing

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:

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.

1Toggle
$0Total changed
0PSA changes

Why this matters

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.

End of story

Ready to send better invoices?

Start for free. Your invoices should look as good as the work you do.

Get started free →