Skip to main content
Best Practices

Quoting labor and projects

Assemble project quotes from standard labor products, catalog rates, and reusable widgets — so hours are priced the same way every time and reach your PSA.

Written By Mike Forte

Last updated About 1 hour ago

Project quotes fail when hours are invented on the deal. A laptop kit goes out without install time, two engineers quote the same migration at different rates, or the labor never reaches the Professional Services Automation (PSA) system because it was typed as a note instead of a catalog line.

The building blocks are the same ones in Quoting best practices for new quoters:

  • A listed catalog of Labor products — your standard roles and project fees, not one-off names
  • Rates and markups set once — hourly or fixed fee, on the product or its category
  • Bundles, add-ons, and project widgets so the hours travel with the hardware and the job type

When those are in place, a project quote is: pick the project template, drop in the widget for that job, set quantities (hours), send. The quote editor is designed for that loop.

If you start from a blank page, every deal encodes a new hour count and a new rate. The next hire cannot reuse last month's estimate, and the PSA never sees the work.

Do this in order

Do the setup before quoters and project managers send live proposals. Each step depends on the one before it.

  1. Standardize Labor products — if two roles share a name, or hours live only in someone's spreadsheet, someone will skip a line or pick the wrong rate.
  2. Decide fixed fee vs hourly in the catalog — a clean labor list with no rates still lets a line go out as a guess.
  3. Attach hours to the work — bundles, add-ons, and project widgets so labor cannot be left off a hardware or migration quote.
  4. Then quote — pick the template, set hours, leave the rate alone unless a manager already put the exception in a pricing book.

1. Standardize Labor products before anyone quotes hours

Labor is a product type, not a text box. On Product Detail the type Labor is time-based billing for project work or hourly services. It is separate from One-time hardware and Recurring services. Only Labor lines accept decimal quantities (for example 2.5 hours). Hardware and service lines are whole numbers.

A Labor product that is unlisted cannot be added to a quote. A Labor product with no category is also blocked — category is what Salesbuildr uses to apply markup, tax, and which product table the line lands in. New tenants already have a Labour category; keep your roles under it (or a tree you own) so quoters can filter instead of hunting.

Open Products and treat labor as a portfolio of roles and project fees.

Where the catalog comes from

How you add Labor products depends on your PSA:

PSAHow Labor gets into SalesbuildrWhat quoters should not do
AutotaskImport roles. On Autotask Configuration → Data Import, map each role to a Salesbuildr category, then import. Create Labor is disabled — Autotask owns roles.Do not invent a Labor product in the quote editor. If a role is missing, map and import it.
HaloPSAItems import from Halo product groups. On Settings → Integrations → HaloPSA → Products → Product Group Types, map the group to Labor so hours can be decimal.Do not expect to switch one item from Service to Labor on the product page. Remap the group, or move the item in Halo, then synchronize.
ConnectWiseCatalog rows import with the type mapping you set on product groups. One-time Labor is sent to ConnectWise as unit Hour.Rebuild packages in Salesbuildr. ConnectWise bundle definitions do not expand into child labor on import.
No PSA / otherOn Products, use Create Labor. Give it a name, category, cost, sell price, and turn Listed and Can be sold on.Do not create the same role twice under slightly different names.

After an Autotask role is deactivated, Salesbuildr does not automatically unlist that Labor product. Unlist it yourself so it drops out of the picker.

Price and markup on Labor that is already linked to Autotask, ConnectWise, or HaloPSA are locked in Salesbuildr (change the rate in the PSA, then let sync refresh). Autotask labor cost can still be edited here; Halo and ConnectWise labor cost is locked too.

What an approved Labor product looks like

Before a role or project fee is fair game:

  • Type Labor, Listed on, Can be sold on
  • A category (so markup and the quote's product table resolve)
  • A consistent name and quote description — "Senior Engineer" everywhere, not "Sr Eng" on one deal
  • Cost and sell price from your rules (next section), not a leftover acquired rate unless you locked it on purpose

Use Labels if you want a temporary "review" tag. Labels help you filter; they do not hide the product. Listed is the control that hides it.

What quoters should not do in the picker

The quote editor can Create new product, Create bundle, and (Autotask, when the feature is on) Import labour bundle. Those exist for product editors and exceptional deals. They are not the path for a standard project.

If the role is not in the listed catalog, stop and ask the person who owns the portfolio. Creating labor on the fly is how the next duplicate rate — and the next missed hour — gets in.

Quote-only labor bundles (created only on that quote, never saved as a catalog product) also fail later: you cannot save them as a reusable widget. Build the bundle in the catalog. See Products & Catalog if a labor widget save errors.

2. Price labor in one place — hourly or fixed fee

Salesbuildr does not have a separate "time and materials" switch. You express the commercial model with sell price and quantity:

How you sell the workWhat to put on the Labor productWhat the quoter changes on the quote
Hourly / time and materialsSell price = the hourly rate. Quantity on the quote = estimated hours (decimals allowed). Line total is rate × hours.Hours only. Leave the rate.
Fixed feeSell price = the project fee. Quantity stays 1. Use a dedicated product ("Microsoft 365 migration — fixed") so nobody multiplies a fee by hours.Leave quantity at 1 unless you are selling multiple of the same package.

Do not mix both models on the same catalog product. If you sell a role both hourly and as a project fee, create two Labor products. Otherwise someone will set quantity to 40 on a $12,000 fee.

Pricing belongs in Settings → Financial → Pricing Rules and on categories, not typed onto each quote line. A sell price is copied onto the line when the product is added. Changing the tenant strategy later does not rewrite lines that are already on a draft or a sent quote.

Hardware, professional services, and cloud licenses rarely share one percentage. Put a Labor / professional-services markup on the category. Do not type a sell price on every role "just in case" — an explicit sell price turns the strategy off for that item until you clear it. Use an explicit price to lock a round project fee or a PSA rate you do not want recalculated.

Labor usually has no distributor recommended retail price. That is expected — Product RRP on the line can show n/a. Markup-from-cost is the usual path; see Pricing strategy.

When one customer has a negotiated rate, put it in a pricing book or discount group. The quoter creates the quote for that company; the exception is already on the line.

Approval Rules catch what still slips through — including markup below a percentage. A new quoter can still edit a line's sell price on a draft, but a quote that drops under the floor should not reach the customer without a manager.

Labor lines do not carry a billing term (monthly / annual). Recurring retainers belong on Service products, not Labor.

3. Attach hours to the work — bundles, add-ons, and project widgets

Hours get missed when they are optional memory. Attach them to the catalog item or the job type so adding the work adds the labor.

Bundles: labor with hardware

A bundle is the package: workstations plus install hours, a firewall plus configuration time. Build it in the catalog:

  • Child lines keep their own type. Hardware stays a product; hours stay Labor.
  • Each child has a quantity per bundle. Quote quantity multiplies: 10 kits × 1.5 install hours = 15 hours on the PSA line.
  • The bundle parent does not sync to the PSA. Only enabled children do. The customer can still see the package name on the proposal.

Build those bundles in the catalog, not as a one-off group on a single quote.

Add-ons: labor that appears when hardware is added

On the hardware or service product (or its category), attach the install or professional-services Labor as an add-on:

  • Required add-ons are included automatically when the parent is added.
  • Suggested add-ons appear as a one-click recommendation.

That is how a new quoter adds a laptop and still quotes racking time. Category-level add-ons apply to every product in the family so you do not maintain the same labor child on fifty SKUs.

Project widgets and templates

A template is the third building block: layout plus the product tables you always need for that kind of job.

Do not start from an empty quote and rebuild the sections. On New Quote, pick a project template. The pattern that scales is one project template and widgets for each job type. Full detail is in Quote Templates.

Deal typeWhat lives in the templateWhat the quoter adds or changes
Transactional hardwareShort quote — products onlyQuantities. Install labor should already be an add-on or bundle child.
Project workProject proposal — intro, a product table, termsThe Items widget for that job (migration, network refresh, deployment). Hours on each Labor line.
Mixed hardware + projectHardware table + project widgetSeat or device counts, then hours.

Create the job widgets at Quotes → Widget templates (or Save a copy as widget template from an Items widget that uses catalog Labor products). Typical widgets: Microsoft 365 migration, firewall cutover, workstation rollout. Each widget already lists the Labor products and default hours; the quoter adjusts hours, not names.

When the same Labor product repeats with different task names, copy the line in the widget editor instead of searching the catalog again.

Lock widgets that must never come off — terms, mandatory labor scope, attachments — so an account manager cannot delete the hours block on a live quote.

You can set a default quote template on the company so the project template is already selected for that customer.

Review widgets when rates change. A widget is only as current as the Labor products sitting in it.

What a quoter or project manager does on each deal

Once the building blocks are in place, the job on a live deal is narrow:

  1. Start from an opportunity or press Q.
  2. Pick the project template (or accept the company's default). Do not create a blank quote.
  3. Add the widget for that job type if the template does not already include it. Or add listed Labor products and bundles from the picker — search by name. Use add-ons the catalog already attached.
  4. Set quantities. On Labor, quantity is hours (2, 2.5, 40). On a fixed-fee Labor product, leave quantity at 1. Leave cost and sell price alone unless a manager has already put the exception in a pricing book.
  5. Glance at markup / margin. If a line looks thin, stop — do not type a lower hourly rate to "make it work."
  6. Add line notes if the delivery team needs context. Notes sync to the PSA with the line.
  7. Preview presentation view and send.

If Spreadsheet View is on for your workspace, use it to adjust many hour cells at once — same quote, same products. See Spreadsheet View.

That is assembling from approved blocks. Building from scratch is everything this article tells you not to do: a blank layout, a Labor product created in the editor, hours typed into a content widget, a second "Senior Engineer" that survived an acquisition, a quote-only labor bundle that cannot be saved as a widget.

How labor reaches your PSA

Quoted labor is only useful if delivery can see it. Salesbuildr pushes catalog Labor lines, not hours buried in a paragraph.

When you send (and when the quote is approved):

  • Each enabled Labor line syncs as its own PSA line — Autotask quote item type Labor (the Autotask role), Halo quotation line, or ConnectWise opportunity product (unit Hour on one-time labor).
  • Quantity and sell price on the PSA line are the values stored on the quote, not a live re-read of the catalog. Check hours before send.
  • Bundle parents are skipped. Only child Labor (and hardware) lines appear in the PSA. If a child fails to sync, fix that child — it must already be linked to the PSA (and have a category if it was never imported). Listed only controls whether it appears in the picker.
  • Lines the customer can still toggle off (unselected options, optional add-ons) must still be PSA-syncable, or Send is blocked.
  • Zero-quantity placeholders are dropped on ConnectWise; Halo still carries them. Remove leftover 0 hour rows before send unless you mean to keep them visible.

After approval — fulfillment:

  • Autotask / ConnectWise: Create ticket. The picker lists Labor (and hardware) as separate rows — not the bundle parent. Service children are not selectable there; they stay on the Autotask quote or ConnectWise opportunity for contract workflows. You can split Labor across more than one ticket.
  • HaloPSA: Create Sales Order. Product, service, and Labor lines are all selectable.
  • Labor does not enter procurement. It is time, not a distributor order.
  • Salesbuildr does not create PSA project phases or tasks from a bundle. The hours land as ticket charges, opportunity products, or sales-order lines. Plan the project in the PSA from those lines.

If a quote total reaches the PSA but a Labor line does not, open the quote's sync card and the PSA quote or opportunity. The usual cause is a Labor product that was never imported or mapped — especially Autotask roles that were never mapped to a category.

See also