Resources
46Install
npx skillscat add boilermaker-innovator/itabs-quotes Install via the SkillsCat registry.
Trade Quote Estimator Skill
name: trade-quote-estimator
description: Generate interactive quote estimator widgets for trade and service businesses. Use this skill when someone wants to build a quote calculator, price estimator, cost guide, or interactive pricing tool for any trade — fencing, plumbing, painting, landscaping, electrical, roofing, concreting, or any service business. Also triggers on requests like 'build a quote widget', 'create a pricing tool for my client', 'interactive estimator', 'embed a quote calculator', or 'replace the contact form with a quote tool'. Works for any trade, any region, any pricing model.
What This Skill Does
Generate config-driven interactive quote estimator widgets for trade and service businesses. One config file produces a complete widget with step-by-step guided quoting, educational content, live pricing, and lead capture — ready to embed on any website via a floating button.
What Makes This Different
This is not a dumb calculator. The widget educates the customer while they quote. Each step includes contextual hints — comparisons between options, regional tips, regulatory info, and practical advice. By the time a customer submits, they understand what they're getting and can describe exactly what they want.
Pricing is a sales tool, not a quote. The tradie sets their own price ranges as a marketing hook — just like putting "From $95/m" on their website. It keeps customers engaged, sets expectations, and filters unrealistic budgets. But the quote summary that gets sent to the tradie is always a clean spec sheet — no dollar figures. The actual quote comes from the tradie after a site visit.
How It Works
The widget is a single self-contained HTML file powered by a WIDGET_CONFIG JavaScript object. Change the config, change the trade. The rendering engine never changes.
WIDGET_CONFIG (your trade's config)
│
▼
engine.js + engine.css
│
▼
Interactive quote widgetWorkflow
When someone asks you to build a quote estimator:
- Ask about the trade — What trade/service? What region? What are the main options a customer chooses between?
- Design the steps — Map out 3-6 decision steps the customer walks through (see Step Design below)
- Write the educational content — This is the differentiator. Write helpful hints for each step (see Educational Content below)
- Set up pricing — Base prices, multipliers, extras (see Pricing Engine below)
- Configure branding — Business name, colours, fonts
- Generate the complete HTML file — Single file with config + engine, ready to deploy
- Add the floating button embed code — So it can be added to any existing website
Step Design
Each step is an accordion section the customer opens in sequence. Good estimators have 3-6 steps. More than 6 feels like a chore.
Step types available:
| Type | Use for | Example |
|---|---|---|
select |
Choose one option from a card grid | Fence type: Colorbond / Timber / Aluminium |
multi_select |
Choose multiple options | Extras: Gate / Removal / Plinth / Lattice |
slider_group |
Numeric ranges with mapped values | Height: 0.9m / 1.2m / 1.8m / 2.1m |
toggle_group |
On/off switches for add-ons | Includes: Old fence removal? Asbestos? |
Each step has:
id— Unique identifier used by the pricing enginetitle— Customer-facing question ("What type of fence?")type— One of the types aboveoptions— Array of choices with id, label, optional description, icon, price hinthints— Educational content shown via the i-button (see below)
Design principles:
- Start with the biggest decision (material/type)
- Move to specifics (size, quantity, style)
- End with extras and add-ons
- Each step title should be a plain-English question
- Options should have short labels (1-3 words) with descriptions for detail
Educational Content (The Differentiator)
Every step has an i-button that opens a hint panel. This is what separates a good estimator from a contact form. The customer learns while they decide.
Hint types:
| Type | When to use | Example |
|---|---|---|
comparison_table |
Comparing options side by side | Colorbond vs Timber vs Aluminium — durability, maintenance, cost |
tips |
Practical advice cards with icons | "Most Perth homes use Colorbond for low maintenance" |
key_point |
Single important fact | "Pool fencing must comply with AS1926.1" |
mixed |
Combination of paragraphs, tips, key points | General guidance with highlighted specifics |
Writing good educational content:
- Explain differences between options in plain language
- Mention region-specific factors (climate, soil, regulations)
- Tell the customer WHY this information matters
- Help them measure or estimate if they're unsure ("Walk along your fence line heel-to-toe — each step is roughly 0.75m")
- Reference local regulations where relevant
- Keep it conversational, not technical
Research the trade and region. Use web search to find current pricing guides, local regulations, common materials, and regional considerations. Sources like HiPages cost guides, trade association websites, and council planning pages are useful. Prices should be GST inclusive for Australian consumer-facing widgets.
Pricing Engine (Tradie's Price Guide)
Pricing defaults to ON. The prices shown in the widget are the tradie's own numbers — set by them (via the web designer) as a marketing tool to attract and engage customers. This is no different to a tradie putting "Fencing from $95/m" on their website. The widget just makes that sales pitch interactive.
Why tradies show prices: It keeps customers on the page. A visitor who sees ballpark pricing engages with the tool instead of bouncing to the next Google result. The prices set expectations, filter out unrealistic budgets, and guide the customer through their options. It's a sales funnel, not a quote.
The one hard rule: The quote summary that gets sent to the tradie NEVER includes pricing. The summary is always the clean spec — selections, measurements, extras, and notes only. On-screen pricing is a marketing tool. The actual quote comes from the tradie after a site visit.
When building the config, ask the web designer (or their tradie client) what price ranges they want to show. These are their numbers — not researched averages. If they don't have pricing, fall back to regional averages as a starting point they can adjust.
Price hints on option cards help customers understand relative cost between options (e.g. "From $95/m" vs "From $180/m"). These are set per option in the config.
Pricing calculation order (when enabled)
base price → preAdjustments → multipliers → quantity → postAdjustments → extras → minimum → roundingComponents:
- basePrices — Set by the primary step (e.g., fence type). Each option has a
lowandhighprice. - preAdjustments — Flat amounts added before multipliers (e.g., style upgrade +$200)
- multipliers — Factors from sliders (
value_map: height 1.8m = 1.0x, 2.1m = 1.15x) or selects (select_map) - quantity — Optional. Per-metre (fencing), per-unit (gates), per-room (painting), or omitted
- postAdjustments — Flat amounts added after multipliers
- extras — Fixed costs (gate: $350-$600), per-unit costs (removal: $15-$30/m), or percentage uplifts (sloping block: +10-20%)
- minimumPrice — Floor price (e.g., $500 minimum for any fence job)
- roundTo — Round to nearest value (0 = whole dollars)
Pricing display modes:
range— Shows "$2,400 – $3,800"from— Shows "From $2,400"
Always label pricing as a "price guide" — not a quote or estimate. Include a disclaimer: "Prices are a guide only. Your actual quote is confirmed after a site visit."
Config Structure
Generate the complete WIDGET_CONFIG object following this structure:
const WIDGET_CONFIG = {
business: {
name: "", // Business name
tagline: "", // Short descriptor
phone: "", // Optional
email: "", // Optional
website: "", // Optional
location: "", // Region shown in header/footer
},
branding: {
mode: "dark", // "dark" or "light"
primaryColor: "", // Brand accent colour (hex)
secondaryColor: "", // Gradient pair
backgroundColor: "",
cardBackground: "",
textColor: "",
mutedText: "",
fontFamily: "'Plus Jakarta Sans', sans-serif",
monoFont: "'JetBrains Mono', monospace",
borderRadius: "14px",
googleFontsUrl: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500&display=swap",
},
header: {
icon: "", // Emoji or image URL
headline: "", // Customer-facing question ("How much will my fence cost?")
subtitle: "", // Brief description of what they'll get
badge: "", // Context badge ("Free estimator · Perth metro · Updated 2026")
},
steps: [
// Array of step objects — see Step Design above
],
estimate: {
title: "Your ballpark price",
preview: "Based on your selections",
note: "Supply & install • incl. GST • Prices based on 2026 averages",
hints: [
// Accuracy disclaimer and pro tips for the summary screen
]
},
pricing: {
showPricing: true, // ON by default — tradie's own price guide
priceLabel: "Price guide", // Label shown above pricing (not "quote" or "estimate")
unit: "metre", // or "unit", "room", "sqm"
unitLabel: "per metre",
basePriceStep: "", // id of the step that sets the base price
basePrices: {}, // keyed by option id: { low: X, high: Y } — tradie sets these
quantitySource: "", // id of the step/slider that provides quantity
multipliers: [], // array of multiplier rules
extras: [], // array of extra cost rules
showBreakdown: true,
displayMode: "range", // or "from"
roundTo: 0,
minimumPrice: 0,
disclaimer: "Prices are a guide only. Your actual quote is confirmed after a site visit."
},
leadCapture: {
enabled: true,
title: "Ready to quote?",
subtitle: "Send your selections to a local tradie for an accurate quote",
fields: ["name", "email", "phone", "address", "message"],
// Integration options: Web3Forms, email, webhook, or "copy summary" button
// IMPORTANT: The copied/sent summary NEVER includes pricing — just the clean spec
// On-screen pricing is a sales tool. The tradie quotes after a site visit.
}
};Example Config — Perth Fencing
This is a trimmed working example showing the pattern. Use this as your reference when building configs for other trades.
const WIDGET_CONFIG = {
business: {
name: "Perth Fencing Price Guide",
tagline: "Colorbond, Timber & Aluminium Fencing",
phone: "",
email: "",
website: "",
location: "Perth, WA",
},
branding: {
mode: "dark",
primaryColor: "#f59e0b",
secondaryColor: "#d97706",
backgroundColor: "#0c1117",
cardBackground: "#151c25",
hoverBackground: "#1a2332",
textColor: "#e8ecf1",
mutedText: "#8896a7",
successColor: "#22c55e",
fontFamily: "'Plus Jakarta Sans', sans-serif",
monoFont: "'JetBrains Mono', monospace",
borderRadius: "14px",
googleFontsUrl: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500&display=swap",
},
header: {
icon: "🏗️",
headline: "How much will my fence cost?",
subtitle: "Answer a few questions and get a ballpark price in 60 seconds. No login. No spam. Just numbers.",
badge: "Free estimator · Perth metro · Updated 2026",
},
steps: [
{
id: "fence_type",
title: "What type of fence?",
type: "select",
columns: 2,
options: [
{
id: "colorbond",
label: "Colorbond",
icon: "🛡️",
description: "Steel panels. Low maintenance, long lasting.",
priceHint: "From $95/m",
tags: ["Most Popular"]
},
{
id: "timber",
label: "Timber",
icon: "🪵",
description: "Classic look. Needs staining every 2-3 years.",
priceHint: "From $120/m"
},
{
id: "aluminium",
label: "Aluminium Slat",
icon: "✨",
description: "Modern look. Won't rust or rot.",
priceHint: "From $180/m"
},
{
id: "pool",
label: "Pool Fencing",
icon: "🏊",
description: "Glass, aluminium or steel. Must meet AS1926.1.",
priceHint: "From $200/m",
tags: ["Compliance Required"]
}
],
hints: {
type: "comparison_table",
title: "Which fence type is right for you?",
headers: ["Feature", "Colorbond", "Timber", "Aluminium"],
rows: [
["Durability", "⭐⭐⭐⭐⭐", "⭐⭐⭐", "⭐⭐⭐⭐⭐"],
["Maintenance", "Almost none", "Stain every 2-3 yrs", "Almost none"],
["Privacy", "Full privacy", "Full privacy", "Partial (slats)"],
["Wind resistance", "Excellent", "Good", "Excellent (gaps)"],
["Cost", "$$", "$$$", "$$$$"],
["Lifespan", "20-30 years", "15-20 years", "25+ years"]
],
footer: "Most Perth homes go with Colorbond for the low maintenance and full privacy. Timber suits heritage areas or if you want a natural look."
}
},
{
id: "height_m",
title: "How high?",
type: "slider_group",
sliders: [
{
id: "height_m",
label: "Fence height",
min: 0,
max: 3,
step: 1,
defaultValue: 2,
valueMap: [0.9, 1.2, 1.8, 2.1],
displayFormat: "{value}m",
labels: ["0.9m", "1.2m", "1.8m", "2.1m"]
}
],
hints: {
type: "mixed",
items: [
{
type: "tip",
icon: "📏",
title: "Standard height",
text: "1.8m is the most common fence height in Perth. It provides full privacy and meets most council requirements without needing a permit."
},
{
type: "key_point",
label: "⚠️ Over 2.1m?",
text: "Fences over 2.1m in most Perth councils need a building permit. Check with your local council before committing to extra height."
},
{
type: "tip",
icon: "💡",
title: "Dividing Fences Act",
text: "In WA, neighbours typically split the cost of a standard dividing fence (1.8m Colorbond). If you want something taller or fancier, you pay the difference."
}
]
}
},
{
id: "length_m",
title: "How many metres?",
type: "slider_group",
sliders: [
{
id: "length_m",
label: "Total fence length",
min: 5,
max: 80,
step: 1,
defaultValue: 20,
unit: "m",
displayFormat: "{value}m"
}
],
hints: {
type: "mixed",
items: [
{
type: "tip",
icon: "📐",
title: "How to measure",
text: "Walk along your fence line and count your steps. Each adult step is roughly 0.75m. So 30 steps ≈ 22 metres. Or use Google Maps — right-click your property and use 'Measure distance'."
}
]
}
},
{
id: "extras",
title: "Any extras?",
type: "toggle_group",
toggles: [
{ id: "gate", label: "Pedestrian gate", icon: "🚪", description: "Standard single gate" },
{ id: "drivegate", label: "Driveway gate", icon: "🚗", description: "Double or sliding gate" },
{ id: "removal", label: "Old fence removal", icon: "🗑️", description: "Remove and dispose of existing fence" },
{ id: "slope", label: "Sloping block", icon: "⛰️", description: "Stepped or raked panels for uneven ground" }
],
hints: {
type: "mixed",
items: [
{
type: "key_point",
label: "🪨 Hitting rock or limestone?",
text: "Common in Perth — especially north of the river. If posts can't be dug by hand, core drilling is needed at ~$10–$20 per post hole. Your fencer will check on site."
},
{
type: "tip",
icon: "💡",
title: "Pro tip",
text: "When you contact a fencer, mention if you have a sloping block, trees near the fence line, or shared boundaries. It helps them quote faster and more accurately."
}
]
}
}
],
estimate: {
title: "Your ballpark price",
preview: "Based on your selections",
note: "Supply & install • incl. GST • Perth metro • Prices based on 2026 averages",
hints: [
{
type: "key_point",
label: "How accurate is this?",
text: "This is a rough guide based on average Perth pricing in 2026. Your actual quote depends on soil type, access, specific materials, and the installer. Always get at least 2-3 quotes from local fencers."
},
{
type: "tip",
icon: "💡",
title: "Pro tip",
text: "When you send this to a fencer, they'll love you. Instead of saying 'how much for a fence?' you'll have all your specs ready — fence type, height, length, and extras. It saves everyone time and gets you a faster, more accurate quote."
}
]
},
pricing: {
unit: "metre",
unitLabel: "per metre",
basePriceStep: "fence_type",
basePrices: {
colorbond: { low: 95, high: 130 },
aluminium: { low: 180, high: 300 },
timber: { low: 120, high: 200 },
pool: { low: 200, high: 600 },
},
quantitySource: "length_m",
multipliers: [
{
source: "height_m",
type: "value_map",
values: { 0.9: 0.65, 1.2: 0.8, 1.8: 1.0, 2.1: 1.15 }
}
],
extras: [
{ id: "gate", type: "fixed", low: 350, high: 600, breakdownLabel: "Pedestrian gate" },
{ id: "drivegate", type: "fixed", low: 800, high: 1500, breakdownLabel: "Driveway gate" },
{ id: "removal", type: "per_unit", lowPerUnit: 15, highPerUnit: 30, breakdownLabel: "Old fence removal" },
{ id: "slope", type: "percentage", lowPercent: 10, highPercent: 20, breakdownLabel: "Sloping block" },
],
showBreakdown: true,
displayMode: "from",
roundTo: 0,
minimumPrice: 500,
},
leadCapture: {
enabled: true,
title: "Ready to quote?",
subtitle: "Send this summary to a local fencer for an accurate quote",
fields: ["name", "email", "phone", "address", "message"],
}
};Key patterns to follow:
- Every
selectoption hasid,label,icon,description, and optionallypriceHintandtags - Hints object sits at the step level, not inside individual options
comparison_tablehints needheaders,rowsarray, and optionalfootermixedhints have anitemsarray containingtipandkey_pointobjects- Pricing
extrasreference toggle ids and specify their cost type - Slider
valueMapmaps slider positions to actual values used in pricing
Output Format
Generate a single self-contained HTML file containing:
- All CSS inline (themed via CSS variables from the branding config)
- The
WIDGET_CONFIGobject - The rendering engine JavaScript
- Mobile-first responsive design
- Dark mode by default (configurable)
- Accordion UI with i-button hint panels
- Live pricing that updates as the customer makes selections
- Price guide display with breakdown (labelled as "price guide", not "quote" or "estimate")
- Lead capture form or "copy summary" button — the summary that gets sent to the tradie is ALWAYS the clean spec only (selections, measurements, extras, notes) with NO pricing. On-screen pricing is a sales tool. The tradie's quote comes after a site visit.
Plus a separate embed snippet — a small script tag and floating button that opens the estimator as an overlay on any existing website:
<!-- Add to any website — floating quote button -->
<script>
(function() {
var btn = document.createElement('div');
btn.innerHTML = '💬 Get a Quick Quote';
btn.style.cssText = 'position:fixed;bottom:20px;right:20px;background:#f59e0b;color:#000;padding:12px 20px;border-radius:50px;cursor:pointer;font-family:sans-serif;font-weight:600;box-shadow:0 4px 12px rgba(0,0,0,0.3);z-index:9999;';
btn.onclick = function() {
window.open('URL_TO_WIDGET.html', '_blank', 'width=420,height=700');
};
document.body.appendChild(btn);
})();
</script>The button colour, text, and position should match the branding config.
Validation Checklist
Before delivering the widget:
- Does every step render correctly with all options visible?
- Is the flow logical? (Biggest decision first, extras last)
- Does the educational content help the customer understand their options without needing to call the tradie?
- Does the quote summary contain everything a tradie needs to provide an accurate quote?
- Does the quote summary exclude all pricing? (On-screen pricing is a sales tool only — never in the output sent to the tradie)
- Is the educational content accurate and region-specific?
- Does it work on mobile? (Most customers use phones)
- Could a tradie quote from the summary alone?
Example Trades
This skill works for any trade. Some examples to get started:
- Fencing — Colorbond, timber, aluminium, pool, security. Per-metre pricing with height multipliers.
- Painting — Interior, exterior. Per-room or per-sqm. Condition-based multipliers.
- Landscaping — Lawn, paving, retaining walls, reticulation. Mixed pricing models.
- Plumbing — Hot water, bathroom reno, drainage. Fixed + hourly pricing.
- Electrical — Switchboard upgrade, lighting, power points. Per-point pricing with complexity multipliers.
- Roofing — Tile, metal, gutters. Per-sqm with pitch multipliers.
- Concreting — Driveways, paths, slabs. Per-sqm with thickness/finish multipliers.
For each trade, research local pricing, common options, and regional considerations before building the config.
Source Repository
Engine, configs, and working examples: github.com/boilermaker-innovator/itabs-quotes
Built with iTabs · Interactive tools that convert