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 / Role
Type
Billable Rate ($/hr) — charged to client
Active
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).
Area
What it does
Trade Dropdown
Switches between trade types (HVAC, Roofing, Plumbing, etc.). Each trade has its own tasks, consumables, and markup table.
Equipment / Labor table
Enter quantities and hours for each task. The tool calculates total annual labor hours automatically.
Consumables / Supplies
Enter materials used per visit — quantity, frequency, and unit cost. Multiplied out to annual cost.
Filters / Parts
Recurring replacement items — filters, belts, drain inserts, fuses, etc. Enter size, location count, frequency, and cost.
Additional Materials
Any 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 Pricing
Auto-calculated 1, 3, and 5-year contract pricing with monthly and quarterly payment options.
🖨 Print / Save PDF
Generates 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.
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.
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 Section
What you can configure
🏢 Company & Branding
Company name, tagline, logo text, and footer that appear in the tool header and on printed worksheets.
👷 Tech Roster & Billable Rates
Add, 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 Discounts
Set the percentage discount applied to 3-year and 5-year contracts. These flow through to all pricing cards automatically.
🔧 Trades
Add, rename, recolor, or disable trades. Add entirely new trade types from scratch.
📋 Tasks & Labor Hours
Edit task names, unit labels, calc type (Per Unit vs Flat Rate), default hours per task, and default visits per year for each trade.
📈 Markup Tables
Edit 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 / Import
Save 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
▼
Trade
Key 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.