CMA Pricing Tool
HVAC Maintenance
Commercial Maintenance Agreement · Pricing Tool
Trade
Input
Default
Calculated
Total Labor Hours
0.0
Labor Cost
$0
Materials Cost
$0
Base Price (1 Yr)
$0
💼 Contract Pricing Base: $0
1-Year
$0
Annual Price
Monthly$0
Quarterly$0
Total Contract$0
Save 3%
3-Year
$0
Annual Price
Monthly$0
Quarterly$0
Total Contract$0
Save 5%
5-Year
$0
Annual Price
Monthly$0
Quarterly$0
Total Contract$0
3-Year: 3% discount · 5-Year: 5% discount
Admin Panel
Company & Branding
Set your company name and details displayed in the tool header.
Company Info
Tech Roster & Billable Rates
Set the billable hourly rate for each technician — this is what you charge the client per labor hour, not what you pay the tech. These rates are used to calculate the labor portion of every contract price.
Technicians
Name / RoleTypeBillable Rate ($/hr) — charged to clientActive
Default Visits Per Year
Contract Discounts
Set the discount percentage applied to 3-year and 5-year contracts. These flow through to all pricing cards in the tool.
Multi-Year Discounts
Example: 3% means a $10,000 base price becomes $9,700/yr on a 3-year contract.
Trade Configuration
Add, reorder, or disable trades. Each trade gets its own emoji, name, and accent color in the pricing tool.
Active Trades
Icon
Trade Name
Accent Color
Visible
Tasks & Default Labor Hours
Edit task names, unit types, default hours per unit per visit, and default visits per year for each trade.
Markup / Multiplier Tables
Each trade has its own materials markup table. The tool looks up the multiplier based on total consumables cost and applies it to price materials.
Save / Export / Import
All settings are saved in your browser automatically when you click Save. Export a JSON backup or import settings from another device.
Browser Storage

Settings are stored in your browser's local storage and persist across sessions on this device.

Export Settings

Download a JSON file with all your configuration. Use this to back up settings or move them to another device.

Import Settings

Import a previously exported settings.json file. This will overwrite all current settings.

You have unsaved changes in Admin. They're applied to the tool live but won't persist until saved.
CMA Pricing Tool — How To Use
This tool calculates Commercial Maintenance Agreement pricing across multiple trades. Follow the steps below to produce an accurate internal pricing worksheet for any job.
🗺
Tool Overview
How the tool is structured and what each part does

The tool has three tabs at the top: Pricing Tool (where you work), Admin (where you configure rates and settings), and How To Use (this page).

AreaWhat it does
Trade DropdownSwitches between trade types (HVAC, Roofing, Plumbing, etc.). Each trade has its own tasks, consumables, and markup table.
Equipment / Labor tableEnter quantities and hours for each task. The tool calculates total annual labor hours automatically.
Consumables / SuppliesEnter materials used per visit — quantity, frequency, and unit cost. Multiplied out to annual cost.
Filters / PartsRecurring replacement items — filters, belts, drain inserts, fuses, etc. Enter size, location count, frequency, and cost.
Additional MaterialsAny other materials or services not covered above.
Tech Roster (sidebar)Set how many of each technician are on site per visit. Each tech's billable rate × total hours = their labor contribution.
Contract PricingAuto-calculated 1, 3, and 5-year contract pricing with monthly and quarterly payment options.
🖨 Print / Save PDFGenerates a detailed internal pricing worksheet you can print or save as PDF.
📋
Step-by-Step: Pricing a Job
Walk through from blank form to final contract price
1
Select the Trade
Use the Trade dropdown in the header to select the trade for this job. The entire form — tasks, consumables, parts, and markup table — reloads for that trade automatically.
2
Fill In Customer Info (sidebar)
Enter the customer name, address, contact, and date in the right sidebar. This information appears on the printed pricing worksheet.
3
Set Tech Roster (sidebar)
Under Tech Roster — Billable Rates, set how many of each technician will be on site per visit. Defaults to 1 for all active techs. Set to 0 to exclude a tech from this job. All active techs with a qty above 0 contribute to the labor cost calculation.

Important: Billable rates are set in Admin, not here. These are the rates you charge the client per hour — not your internal payroll cost.
4
Enter Equipment / Labor
For each piece of equipment or task on the job, enter three values:

QTY — How many of that item (units, panels, rooms, etc.). For flat rate tasks (roofing squares, sq ft, acres), QTY is for scope reference only and does not multiply hours.
Hrs/Visit — How many hours does this task take per visit? For flat rate tasks this is total job time. For per-unit tasks this is hours per individual unit.
Visits/Yr — How many times per year is this task performed?

Grey values are suggested defaults — edit them to match your actual field experience.
Flat Rate vs Per Unit explained: A flat rate badge means the hours you enter are the total job time regardless of how large the job is. Example: inspecting a 230-square TPO roof takes 6 hours — enter 6 in Hrs/Visit regardless of how many squares. A per-unit task (like HVAC units) multiplies hours by QTY — 5 RTUs × 1.5 hrs = 7.5 hrs per visit.
5
Enter Consumables / Supplies
Enter any materials consumed on each visit. For each item provide:

# Units — How many units used per service call.
Freq/Yr — How many times per year this consumable is used.
Cost Each ($) — Your cost per unit.

Annual cost = Units × Freq/Yr × Cost Each. This is your raw cost — the markup multiplier is applied automatically when calculating the contract price.
6
Enter Filters, Belts, and Parts
Use the Filters / Parts section for any recurring replacement items. Enter a description and size (e.g., 20x20x1 MERV-8 filter), number of locations, frequency per year, quantity per location, and unit cost.

Annual cost = # Locations × Freq/Yr × QTY Each × Cost Each.
7
Review the Multiplier
The Materials Multiplier in the sidebar auto-selects based on your total consumables cost. Higher material costs get a lower multiplier. The highlighted row shows which tier is active. The multiplier is applied to your total raw materials cost to produce the marked-up materials price included in the contract.
8
Review Contract Pricing
The Contract Pricing section at the bottom shows the full 1, 3, and 5-year contract options with annual, monthly, and quarterly payment breakdowns. Multi-year discounts are set in Admin.

Base Price = Labor Cost + (Total Materials × Multiplier)
9
Print or Save PDF
Click 🖨 Print / Save PDF in the header to open the internal pricing worksheet. This is for internal use only — not a customer-facing document. In the print dialog, select Save as PDF as the destination (Chrome/Edge). The sheet shows full labor, materials, multiplier, and all three contract pricing tiers.
🧮
Understanding the Calculations
How every number is calculated — know the math
CalculationFormulaExample
Labor Hrs — Per Unit QTY × Hrs/Visit × Visits/Yr 5 RTUs × 1.5 hrs × 2 visits = 15 hrs
Labor Hrs — Flat Rate Hrs/Visit × Visits/Yr
QTY is scope reference only
6 hrs × 4 visits = 24 hrs (regardless of roof size)
Labor Cost Σ (Tech Rate × Total Hrs × Qty on Site) ($60 × 24 × 1) + ($40 × 24 × 1) = $2,400
Consumable Annual Cost # Units × Freq/Yr × Cost Each 2 gal × 12/yr × $15 = $360
Filter / Part Annual Cost # Locations × Freq/Yr × QTY Each × Cost Each 5 locations × 4/yr × 2 ea × $8 = $320
Total Materials (raw) Consumables + Filters/Parts + Additional $360 + $320 + $0 = $680
Materials Multiplier Looked up from trade's markup table based on total materials cost $680 total → 2.75× (HVAC table)
Base Contract Price Labor Cost + (Total Materials × Multiplier) $2,400 + ($680 × 2.75) = $4,270
3-Year Annual Price Base Price × (1 − discount%) $4,270 × 0.97 = $4,142/yr
Monthly Payment Annual Price ÷ 12 $4,270 ÷ 12 = $356/mo
3-Year Total Contract Value 3-Year Annual × 3 $4,142 × 3 = $12,426
Important: The tool calculates what you should charge based on the inputs you provide. The accuracy of the output depends entirely on the accuracy of your inputs — especially labor hours per task. Adjust default hours to reflect your team's actual field experience before relying on these numbers for contract pricing.
Admin Panel Reference
What each admin section controls
Admin SectionWhat you can configure
🏢 Company & BrandingCompany name, tagline, logo text, and footer that appear in the tool header and on printed worksheets.
👷 Tech Roster & Billable RatesAdd, remove, and configure technicians. Set the billable rate — what you charge the client per hour, not your payroll cost. Mark techs inactive to hide them from the sidebar without deleting them.
💰 Contract DiscountsSet the percentage discount applied to 3-year and 5-year contracts. These flow through to all pricing cards automatically.
🔧 TradesAdd, rename, recolor, or disable trades. Add entirely new trade types from scratch.
📋 Tasks & Labor HoursEdit task names, unit labels, calc type (Per Unit vs Flat Rate), default hours per task, and default visits per year for each trade.
📈 Markup TablesEdit the materials multiplier table per trade. Each row sets a "From $" threshold and the multiplier applied at that tier. Rows must be in ascending order by dollar amount.
💾 Save / Export / ImportSave settings to your browser, export a JSON backup, or import settings on a new device. Always save after making admin changes.
Always click Save after making admin changes. Settings are applied to the tool live as you edit, but they won't persist across browser sessions until you save. The orange save bar at the bottom of the screen appears whenever you have unsaved changes.
🏗
Trade-Specific Notes
Key things to know for each trade vertical
TradeKey Notes
❄️ HVAC QTY = number of individual units. Hours multiply per unit (per_unit mode). Standard visits: 2/yr. Extra Access Time and Extra Travel Time are flat-rate (total hours, not per unit).
🏗 Roofing Area-based tasks (TPO, EPDM, mod-bit, metal panels, gutters) use flat rate — enter total job hours regardless of square count. QTY is scope reference only. Count-based tasks (skylights, drains, flashings) are per-unit. Standard visits: 2/yr (spring + fall).
🔧 Plumbing QTY = number of devices or fixtures. Grease trap service often runs monthly — default is 12 visits/yr. Backflow testing is typically annual (1 visit/yr).
⚡ Electrical QTY varies by task — panels per panel, fixtures per fixture, circuits per circuit. Generator PM typically 2×/yr; most inspections 1×/yr.
🔥 Fire Protection Sprinkler heads are counted individually. Suppression systems (kitchen hood) are counted as a whole system. Most fire inspections are annual (1×/yr); kitchen hood is typically 2×/yr.
🧹 Janitorial Floor, carpet, and pressure wash tasks are flat rate (total sq ft, total hours). Window cleaning and room-based tasks are per-unit. Mowing defaults to 36 visits/yr (weekly during season).
🐛 Pest Control Interior/exterior perimeter treatments are flat rate. Device-based tasks (bait stations, ILTs, glue boards) are per-unit. Most services default to monthly (12/yr).
🌿 Landscaping Acreage tasks (mowing, fertilization) are flat rate. Shrubs, trees, and irrigation heads are per-unit. Mowing defaults to 36 visits/yr. Mulch QTY is in cubic yards (1 yd³ ≈ 100 sq ft at 3" depth).
🌊 Water Treatment All tasks are per tower, system, or test point. Chemical treatment typically monthly (12/yr); deep cleaning quarterly (4/yr). Legionella testing typically quarterly.
🔋 Generator Monthly run tests (12/yr) are standard. Load bank testing and oil changes are typically 1–2×/yr. Count each generator set separately.
🏊 Pool Chemical balancing is weekly (52/yr). Equipment PM is monthly to quarterly. Count each pool and spa separately. Seasonal opening/closing default to 1×/yr each.
💡
Tips & Best Practices
Get the most accurate pricing every time
📏 Labor Hours
The default hours are industry starting points. Adjust them to reflect your team's actual speed. A crew that can do an RTU in 45 min should use 0.75, not the default 1.5. Run a few real jobs and compare your actual hours to what the tool estimated.
🏢 Multiple Buildings
For a campus or multi-building account, enter the total unit count across all buildings. The tool prices the whole agreement — not per building. Note travel time between buildings in the Extra Travel Time row.
👷 Tech Staffing
Set "on site" qty to match who will actually be on this specific job — not your company roster. A small account might only need 1 tech; a large one might need 2 leads and an apprentice. The qty input in the sidebar is per-job, not global.
💰 Multiplier Tables
The markup multiplier covers your overhead, profit margin, and materials handling. If you consistently win or lose jobs on price, consider adjusting the multiplier table in Admin. Flat-margin businesses may want a tighter table; higher-overhead operations may need more.
🔄 Multi-Year Discounts
3% and 5% are conservative defaults. Adjust in Admin based on your market. Longer contracts reduce your sales cost and churn risk — offering 5–10% for a 3-year deal is common in HVAC and roofing maintenance.
💾 Save Your Settings
After configuring Admin (rates, trades, multipliers), always click Save. Export a JSON backup using the Save/Export/Import panel. If you clear your browser data, you'll lose settings — the exported file lets you restore everything in seconds.
© 2026 The Blue Collar Wave · All Rights Reserved · Commercial Maintenance Agreement Pricing Tool