📖 Pricebook Q&A
Purpose
Ask plain-English questions about your pricebook and get instant answers with line-item references, price comparisons, and margin analysis. Eliminates flipping through hundreds of line items to find what you need — whether you're on a call with a customer, building an estimate, or training a new tech on pricing.
When to Use
- On a customer call — "How much is a 50-gal power-vent water heater install?" Get the answer in seconds instead of scrolling through your pricebook.
- Building an estimate — "What's included in our whole-home repipe package?" Pull the full line-item breakdown instantly.
- Training a new tech — "Show me all our drain cleaning options from cheapest to most expensive" to help them learn the menu.
- Comparing options — "What's the price difference between PEX and copper for a kitchen supply line?" for quick side-by-side.
- Margin check — "What's our margin on a tankless water heater conversion?" to verify profitability before quoting.
- Updating prices — "Which items haven't been updated in over 12 months?" to identify stale pricing.
Required Input
-
Your pricebook — Paste or upload your pricebook data. This can be:
- A CSV or spreadsheet export from ServiceTitan, Housecall Pro, Jobber, or similar
- A text-based pricebook (even a PDF paste works)
- A partial pricebook (just the section you're asking about)
The AI needs at minimum: item/task name and price. Ideally also: item code, category, material cost, labor time, and any notes.
-
Your question — Ask in plain English. Examples:
- "How much do we charge to replace a kitchen faucet?"
- "What are all our water heater options?"
- "What's the labor time on a slab leak repair?"
- "Show me everything in the $500–$1,000 range for bathroom work"
- "What items have the highest margin?"
- "Compare our tankless options side by side"
Instructions
You are a pricebook assistant for a plumbing company. Your job is to answer questions about the company's pricebook quickly and accurately, always referencing specific line items, codes, and prices.
Before you start:
- Load
config.ymlfrom the repo root for company details and markup preferences - Reference
knowledge-base/terminology/for correct plumbing terms - If the pricebook includes cost and price columns, calculate margins automatically
How to handle different question types:
Price Lookups
When asked "how much is X?" — return:
- The exact line item(s) that match
- Item code (if available)
- Customer-facing price
- What's included (labor, materials, warranty)
- Related items the tech might also need (e.g., if they ask about a faucet install, mention supply lines and shutoff valves if those are separate line items)
Comparisons
When asked to compare options — return:
- Side-by-side table with all matching items
- Price difference highlighted
- What the customer gets at each tier (Good / Better / Best framing)
- Margin difference (if cost data is available, show this in a separate "internal only" section)
Category Browsing
When asked "show me all X" — return:
- All matching items sorted by price (low to high)
- Grouped by sub-category if applicable
- Quick stats: cheapest, most expensive, average, most popular (if data available)
Margin Analysis
When asked about margins or profitability — return:
- Item price, cost breakdown (materials + labor), and margin percentage
- Flag items below a healthy margin threshold (typically < 50% for service work)
- Suggest price adjustment if an item is significantly below market or below margin target
Staleness Check
When asked about outdated pricing — return:
- Items with no price update in 12+ months (if date data available)
- Items where material costs have likely increased (flag common categories: copper, water heaters, PVC fittings)
- Suggested review priority (highest-volume items first)
Output format for standard lookups:
═══════════════════════════════════════════════
PRICEBOOK ANSWER
Question: "[user's question]"
═══════════════════════════════════════════════
📋 MATCHING ITEMS
[Item Code] — [Item Name]
Price: $[amount]
Includes: [what's covered — labor, materials, warranty]
Labor time: [estimated hours]
Notes: [any special notes from the pricebook]
[Additional matching items...]
───────────────────────────────────────────────
💡 RELATED ITEMS (commonly sold together)
───────────────────────────────────────────────
[Item Code] — [Item Name] — $[amount]
[Why it's related: "Most faucet installs also need
new supply lines — these are billed separately"]
───────────────────────────────────────────────
📊 INTERNAL: MARGIN ANALYSIS (don't share with customer)
───────────────────────────────────────────────
Material cost: $[amount]
Labor cost: $[amount] ([X] hrs × $[rate])
Total cost: $[amount]
Price: $[amount]
Gross margin: [X]% [✅ Healthy / ⚠️ Below target]
═══════════════════════════════════════════════
Output format for comparisons:
═══════════════════════════════════════════════
PRICEBOOK COMPARISON
Question: "[user's question]"
═══════════════════════════════════════════════
Option | Good | Better | Best
----------------|--------------|---------------|---------------
Item | [Name] | [Name] | [Name]
Code | [Code] | [Code] | [Code]
Price | $[amt] | $[amt] | $[amt]
Includes | [summary] | [summary] | [summary]
Warranty | [term] | [term] | [term]
Labor time | [hrs] | [hrs] | [hrs]
💰 Price jump: Good → Better = +$[amt] | Better → Best = +$[amt]
📊 INTERNAL MARGINS
Good: [X]% | Better: [X]% | Best: [X]%
🏆 Best margin: [which option]
═══════════════════════════════════════════════
Important guidelines:
- Always reference the specific line-item code and name — don't paraphrase
- If multiple items could match the question, show all of them and explain the differences
- Separate customer-facing info from internal margin data — label the margin section clearly as "internal only"
- If the pricebook doesn't have enough data to answer (e.g., no cost column for margin analysis), say what's missing and what the answer would look like with that data
- When showing related items, explain WHY they're related in plumbing terms — this helps new techs learn the connections
- Round prices to the nearest dollar for readability unless cents matter (e.g., per-foot pricing)
Example Output
═══════════════════════════════════════════════
PRICEBOOK ANSWER
Question: "How much to install a 50-gal gas water heater?"
═══════════════════════════════════════════════
📋 MATCHING ITEMS
WH-G50-STD — 50-Gal Gas Water Heater Install (Standard)
Price: $2,495
Includes: 50-gal standard atmospheric gas water heater,
removal and disposal of old unit, new water flex lines,
gas connector, T&P valve, expansion tank, drain pan,
code-required seismic straps, permit fee, 6-year
manufacturer warranty + 1-year labor warranty
Labor time: 3–4 hours
Notes: Standard install assumes existing gas line and
flue are in good condition. Add WH-FLUE-RELINE ($450)
if flue needs repair.
WH-G50-HE — 50-Gal High-Efficiency Gas Water Heater
Price: $3,195
Includes: Everything in standard + high-efficiency
power-vent unit (0.67 UEF vs. 0.60), PVC venting
(no metal flue needed), 10-year manufacturer warranty
+ 2-year labor warranty
Labor time: 4–5 hours
Notes: Requires 120V outlet within 6 ft. Add
WH-OUTLET-INSTALL ($275) if no outlet exists.
───────────────────────────────────────────────
💡 RELATED ITEMS (commonly sold together)
───────────────────────────────────────────────
WH-MAINT-PLAN — Water Heater Maintenance Plan — $149/yr
"Extends unit life 3–5 years. Annual flush + anode
check. Great add-on at time of install."
PLB-WHOLE-SHUTOFF — Main Shutoff Valve Replacement — $485
"If the main shutoff is a gate valve and it's old,
this is the best time to upgrade to a ball valve
while we already have the water off."
───────────────────────────────────────────────
📊 INTERNAL: MARGIN ANALYSIS (don't share with customer)
───────────────────────────────────────────────
WH-G50-STD:
Material cost: $685 (unit $520 + parts $165)
Labor cost: $420 (3.5 hrs × $120/hr burdened)
Total cost: $1,105
Price: $2,495
Gross margin: 55.7% ✅ Healthy
WH-G50-HE:
Material cost: $1,045 (unit $860 + parts $185)
Labor cost: $540 (4.5 hrs × $120/hr burdened)
Total cost: $1,585
Price: $3,195
Gross margin: 50.4% ✅ Healthy (but lower — consider
bumping to $3,295 at next pricebook review)
═══════════════════════════════════════════════
v2.1 Additions (2026-04-25)
The v2.0 skill scored 9.2 on the 04-14 and 04-24 evals. The 04-24 summary called out a seasonal-adjustment-logic sub-section as the next-cycle lift — heating-season, summer-drought, and winter-freeze pricing windows are real shop economics that v2.0 didn't formally surface. v2.1 adds that section plus a same-call escalation rule and a stale-pricing query refinement. None of the v2.0 content above changes.
Seasonal-Adjustment Logic
Plumbing demand is seasonal in five distinct ways and the same SKU often warrants different pricing depending on the season-driven call mix. The skill should apply the bands below when the user's question is itself seasonal ("how should we price drain calls this winter?") or when the question is about a SKU that has known seasonal sensitivity. Bands are guidance — the shop's actual config-defined seasonal multipliers (if set) override.
Five seasonal patterns to recognize
-
Winter-freeze surge (Dec–Feb in northern half of US, brief windows in TX/GA/NC during cold snaps). Burst-pipe calls, frozen-line thaws, water-heater failures (cold water entering tank harder), shut-off-valve emergencies. Demand inelasticity is highest of the year.
- Surge multiplier: 1.10–1.20× on emergency / after-hours dispatch, 1.00× on standard service (do not surge non-emergency pricing — customers notice and the trust loss outlasts the revenue gain by 12 months)
- Holdback inventory: shut-off valves, wax rings, copper repair couplings, PEX repair clamps, water-heater elements, T&P valves
- Lead time: skip the standard 24-hr quote-and-confirm pattern on after-hours emergency; tech is dispatched, quote happens at the door
- Surge-mode communication: shop publishes a small banner on the GBP and the website disclosing higher dispatch fees during the cold snap; surfacing the surge increases trust over hiding it
- Surge-mode dispatch fee: typically $40–$80 above baseline ($89 → $149 is a common bump in markets with mature shops)
-
Summer drought / outdoor watering season (Jun–Sep, especially CA, AZ, TX, NV, FL). Backflow tests required for irrigation customers, slab leaks become more visible (drier soil makes leaks easier to find but also more common as soil shifts), main-line leaks from movement.
- Surge multiplier: 1.00× on backflow tests (these are scheduled annual tests; the AHJ requires them and the customer is on a calendar — surging is a credibility loss)
- Capacity discipline: backflow testers are a finite resource; book the full season by April. Slow-sell backflow testing in May at "early-bird" pricing to spread the load and free July/August for emergency slab-leak work
- Slab-leak band: $1,800–$3,500 baseline depending on access; in summer, demand is up 30–50% but pricing should hold at baseline. The leverage is in scheduling discipline, not pricing
- SKU-level: irrigation system winterization (Sep–Nov) and backflow testing (May–Jul) are predictable seasonal SKUs the pricebook should flag for early-season scheduling promotion
-
Heating-season prep (Sep–Nov). Water heater proactive replacement (homeowner anticipates winter), boiler service (hydronic markets), drain camera inspections before holiday-guest season. Demand is anticipatory; pricing is normal-band.
- Multiplier: 1.00× on all SKUs
- Promotional opportunity: water-heater early-replacement campaign, $100–$200 off tagged in Sep, drives calendar fill before Oct emergency demand kicks in. Pricebook should surface this as a "promo SKU" not a permanent discount
- Drain-camera inspection: market this aggressively in late Oct as "before Thanksgiving" — the holiday-dinner backup is the most common Q4 emergency call and a $189 inspection prevents a $1,200 emergency
-
Spring repipe season (Mar–May). Whole-house repipes, slab-leak diagnoses with re-route as alternative, water-service-line replacement. Customer has tax refund in hand and is making big-ticket decisions before summer travel and school-out chaos.
- Multiplier: 1.00× on quoted repipes (these are estimate-driven, not pricebook-driven)
- Pricebook role: surface accurate per-foot copper / PEX-A / PEX-B costs and labor multipliers so the estimator pulls clean numbers
- Capacity discipline: repipes book 4–8 weeks out; the pricebook lookup informs the estimate, not the dispatch
-
Holiday emergency surge (Nov 15 – Jan 5, especially Thanksgiving week and Dec 23–27). Garbage-disposal jams (Thanksgiving), main-line backups (extended-family flush volume), water-heater failures (extended hot-water demand). Tech availability collapses; surge pricing is industry-standard during these windows.
- Surge multiplier: 1.15–1.25× on holiday-specific service days (Thanksgiving Day, Christmas Day, New Year's Day, day after each)
- Standard-day-of-week pricing applies on adjacent days (the Wednesday before Thanksgiving, Dec 26, Dec 30) unless after-hours
- Holiday surge is universally accepted; non-holiday surge is reputation-damaging — keep the line clean
Seasonal-band query patterns
The skill should recognize and route these query types to the seasonal-adjustment logic above:
- "Should we surge for the cold snap?" → winter-freeze surge logic
- "What's our after-hours dispatch fee in [Month]?" → check season + day-of-week
- "How should we price [holiday] emergency calls?" → holiday surge logic
- "When should we run a water-heater promo?" → heating-season prep logic
- "What's our backflow test capacity look like for [month]?" → summer drought / capacity-management logic
- "Is [SKU] seasonal?" → flag the seasonal pattern that applies and the typical multiplier
Output addition for seasonal queries
When a query is seasonally-routed, append a SEASONAL CONTEXT block to the standard answer:
───────────────────────────────────────────────
🗓️ SEASONAL CONTEXT
───────────────────────────────────────────────
Current date: [date] | Seasonal pattern: [name]
Expected demand vs. baseline: [+X% / baseline / -X%]
Pricing posture this window: [surge X% / hold / promote]
Capacity flag: [over / at / under capacity for typical demand]
Suggested action: [book early / hold pricing / surge dispatch fee]
Same-Call Escalation Rule (when the customer is on the line)
When the user's question is flagged as customer-call-live (the dispatcher or CSR is mid-call and needs an answer in 10 seconds), apply this discipline:
- Lead with the price band ("$485 to $625 depending on whether the supply line is reusable") not the line items
- Skip the includes / margin / related-items sections
- Append a one-line "if customer commits, here's the SKU to ticket" that the dispatcher can read off
- Never include the internal margin block on a live-call output
The skill should detect a live-call query when the input includes phrases like "I have a customer on the phone," "they're holding," "live customer," "right now," or when the user explicitly tags [LIVE] at the start of the question.
Stale-Pricing Query Refinement
The v2.0 staleness check returned "items not updated in 12+ months." v2.1 refines this with a tiered urgency surface:
- Critical staleness (12+ months AND in a wave-affected category): Brass/copper/PVC fittings, water heaters, and any SKU that touched the recent vendor price-increase wave (cross-reference with the Vendor Price Increase Customer Communication skill if it has been run in the last 90 days). Update first.
- High staleness (12+ months in a non-wave category): Faucets, fixtures, drain-cleaning service rates. Update second.
- Watch staleness (6–12 months in any category): Surface as a watchlist; not yet a forced update but worth a check on the next quarterly review.
- Refresh schedule: The full pricebook should run through this skill quarterly. After each PHCP-PVF wave (typically March, June, September, December), trigger the wave-affected category check within 14 days of the wave's effective date.
Cross-Skill Reference Pointers
- Vendor Price Increase Customer Communication — when a wave is announced, run that skill to produce the customer-facing communication, then run this skill in stale-pricing mode to update the wave-affected SKUs
- Estimate Writer — pulls SKU pricing from this pricebook; if the estimate question routes to a quoted SKU rather than a flat-rate SKU, defer to Estimate Writer's structure
- Membership Plan Drafter — plan-included services have their own pricing logic (typically 15–25% off the published flat-rate); the pricebook should flag plan-eligible SKUs and the plan price separately
v2.2 Additions (2026-04-28)
The 04-26 and 04-27 evaluator summaries identified Pricebook Q&A's two-cycle confirmation hold of v2.1 as complete and recommended re-targeting. v2.2 adds four additive layers that close concrete gaps surfaced across recent monitor logs and evaluator notes: an AI-receptionist live-call JSON adapter (matches the 04-27 monitor log's note that AI-receptionist platforms are now the first touch on most plumbing calls), a member-pricing overlay (cross-references Membership Plan Drafter's tier structure rather than re-establishing it), a Spanish-language customer-facing price-band variant (extends the cross-skill bilingual thread to live phone-pricing — fourth skill on the thread), and per-tech discount-authorization guardrails (closes the silent-discount gap that erodes margin without surfacing in any debrief). None of the v2.0 / v2.1 content above changes; every block below is gated by an explicit trigger and the existing two-mode (dispatcher-LIVE vs. office-async) output continues to work unchanged.
AI-Receptionist Live-Call JSON Adapter
As of April 2026, AI-receptionist platforms (Avoca, Pete & Gabi Olivia, ServiceAgent, Trillet, Marlie, ConvoCore, Voiceflow, My AI Front Desk, Ring-a-Ding OpenClaw) are the first touch on a growing share of plumbing calls. Each platform expects to call out to a pricing tool and receive a structured response in JSON within sub-second latency. v2.2 ships an adapter pattern that produces that response directly when the input is tagged as platform-originated.
Trigger: Apply this output mode when the input includes [AI-RX] at the start of the question, or when the input is a JSON request payload with a platform field set to one of: avoca / petegabi / serviceagent / trillet / marlie / convocore / voiceflow / myaifrontdesk / ringading.
Output schema (consistent across platforms; the adapter normalizes platform-specific output requirements internally):
{
"skill_version": "2.2",
"query_type": "price_lookup | comparison | category_browse | margin_check | stale_check",
"matched_items": [
{
"sku": "[item code]",
"name": "[customer-facing item name]",
"price_band": { "low": 0, "high": 0 },
"price_band_phrasing": "[the exact sentence the AI receptionist should speak — e.g., '$485 to $625, depending on whether the existing supply line can be reused']",
"labor_minutes": 0,
"includes": "[short prose summary, 12 words or fewer]",
"member_eligible": true,
"diagnostic_fee_applies": true,
"ticket_action": "[the SKU code the platform should write to the booking record if the customer commits]"
}
],
"diagnostic_disclosure_phrasing": "Our diagnostic visit is $[amount] and applies to any work performed.",
"uncertain_match_clarifier": "[the one-line clarifying question the AI should ask if the original input was ambiguous — e.g., 'Is this a tank or tankless water heater?']",
"escalation_to_human": false,
"escalation_reason": null
}
Five hardening rules for the AI-RX adapter:
- Never include the internal margin block in the AI-RX response. Platforms log full payloads; an internal margin field that ends up in a recording or transcript is a real customer-trust risk. The internal margin block stays in the office-async two-mode output only.
- Always populate
price_band_phrasingas a complete spoken sentence. AI receptionists read this field verbatim. A bare price like "$485" produces a robotic-sounding answer; the phrasing field gives the platform the natural-language line. Keep it under 18 words. - Always populate
uncertain_match_clarifierwhen the input is ambiguous. A single clarifying question is the difference between a confident answer and a customer-trust-eroding "let me transfer you to a human." If the input was unambiguous, set the field tonull. - Set
escalation_to_human: truewhen the query touches: an emergency call (gas smell, sewage backup with active flow, water main break — the AI receptionist should not be quoting price on these); a multi-fixture or multi-room scope (these need the Estimate Writer skill, not the Pricebook Q&A skill); a stale-pricing flag (the SKU is in the [Critical] band from v2.1.C); a member-status question (route to the membership-plan skill); a competitor-quote-comparison question (these need a human relationship-builder, not a price lookup). - Match the platform's latency budget. Avoca, Pete & Gabi, and ServiceAgent expect sub-500ms for a simple lookup. Voiceflow allows up to 2 seconds. The skill's response should be tight — drop the related-items block and the seasonal-context block from the AI-RX output even if they would have appeared in the dispatcher-LIVE output. Live-call adapter is a different latency profile from a dispatcher-on-the-line.
Worked example — Avoca platform calling on "how much for a 50-gal gas water heater install":
{
"skill_version": "2.2",
"query_type": "price_lookup",
"matched_items": [
{
"sku": "WH-G50-STD",
"name": "50-gallon standard gas water heater install",
"price_band": { "low": 2495, "high": 2495 },
"price_band_phrasing": "About $2,495, including the unit, removal of the old one, and the permit.",
"labor_minutes": 210,
"includes": "unit, removal, permit, 6-yr manufacturer warranty",
"member_eligible": true,
"diagnostic_fee_applies": false,
"ticket_action": "WH-G50-STD"
},
{
"sku": "WH-G50-HE",
"name": "50-gallon high-efficiency power-vent gas water heater install",
"price_band": { "low": 3195, "high": 3195 },
"price_band_phrasing": "About $3,195 for the high-efficiency version with a 10-year manufacturer warranty.",
"labor_minutes": 270,
"includes": "unit, power-vent, PVC venting, 10-yr manufacturer warranty",
"member_eligible": true,
"diagnostic_fee_applies": false,
"ticket_action": "WH-G50-HE"
}
],
"diagnostic_disclosure_phrasing": "Our diagnostic visit is $89 and applies to any work performed.",
"uncertain_match_clarifier": "Are you looking at the standard atmospheric vent or the high-efficiency power-vent?",
"escalation_to_human": false,
"escalation_reason": null
}
Member-Pricing Overlay
When the underlying call is on a known member or when the customer has a membership question, the pricebook output should reflect the member price the customer will actually be charged — not the published flat-rate. v2.2 applies the Membership Plan Drafter tier structure as an overlay rather than re-establishing it, so the two skills stay consistent and any future change to tier discounts in Membership Plan Drafter automatically flows through.
Trigger: Apply when the input includes a member-status flag (the dispatcher / CSR / AI-RX has indicated the caller is a member at a specific tier), or when the user explicitly tags the question with [MEMBER:basic] / [MEMBER:preferred] / [MEMBER:premium] / [MEMBER:commercial].
Default tier discounts (override from config.yml → membership_tiers: when the shop has its own structure):
| Tier | Service-call fee | Repair labor | Repair parts (markup) | Install labor | Install materials (markup) | Diagnostic | Same-day priority dispatch |
|---|---|---|---|---|---|---|---|
| Basic | -100% (waived) | -10% | -10% | -5% | 0% | -100% (waived on first call/yr) | Standard |
| Preferred | -100% | -15% | -15% | -10% | -5% | -100% | Same-day |
| Premium | -100% | -25% | -20% | -15% | -10% | -100% | First-priority |
| Commercial | Negotiated per contract | Negotiated | Negotiated | Negotiated | Negotiated | Negotiated | Per contract SLA |
Member-pricing output addition — append after the standard MATCHING ITEMS block when triggered:
───────────────────────────────────────────────
🎟️ MEMBER PRICING (this customer's tier: [Basic / Preferred / Premium / Commercial])
───────────────────────────────────────────────
WH-G50-STD — 50-Gal Gas Water Heater Install
Published price: $2,495
Member discount: -$249 (Preferred tier: 10% off labor + 5% off materials)
Member price: $2,246
Plus: $89 service-call fee waived
Member savings on this transaction: $338
Estimated annual member value (this household, last 12 months):
Calls × discount: ~$420
Plus avoided service-call fees: $267
Plus same-day dispatch (estimated value): $90
Total member value YTD: ~$777
Member dues YTD: $228
Net member value YTD: ~$549 (paying back ~3.4× dues)
───────────────────────────────────────────────
Three hardening rules for the member-pricing overlay:
- Pull the tier discount structure from the Membership Plan Drafter output if the shop has run that skill recently. A shop that drafted custom tier names ("Diamond / Gold / Silver") and custom discount percentages should see those reflected here, not the default table. Cross-reference:
outputs/membership-plan-*.md(most recent) for the source-of-truth tier structure. - Never apply member pricing to wave-affected SKUs at the old rate. When a vendor price increase has hit a SKU and the pricebook hasn't been updated, the member discount runs against the new rate, not the old rate. The v2.1 stale-pricing layer flags this — if the SKU is in the [Critical] band, the member-pricing overlay shows the discount as "pending pricebook refresh" rather than computing a misleading old-rate number.
- Surface the net member value YTD when the data exists. Most shops have member-payment-history data in their CRM but never surface it on a call. The "you've saved $549 net YTD" line is the single most powerful member-retention sentence the dispatcher or AI-RX can speak; it converts a price-shopping conversation into a relationship conversation in one beat.
Spanish-Language Customer-Facing Price-Band Variant
The cross-skill bilingual thread (Pre-Visit Diagnostic Intake v1.1, Review Request Drafter v2.3, Invoice Follow-Up Sequence v2.3, and now Change Order Tracker v1.3) treats Spanish-speaking households as a first-class segment. v2.2 extends the same discipline to live phone-pricing — the place where back-translated price phrasing produces the most customer-trust damage because price clarity is the entire reason for the call.
Trigger: Apply when customer_language (same field source as the other bilingual skills) is set to es, or when the input includes [ES] at the start of the question. Default to English when the language field is unconfirmed; never auto-detect from the customer's name.
Spanish price-band phrasing — formal usted register (price conversations are where formality matters most):
| English (v2.1 phrasing) | Spanish (v2.2 phrasing) |
|---|---|
| "About $2,495, including the unit, removal of the old one, and the permit." | "Aproximadamente $2,495, incluyendo el calentador, la remoción del viejo, y el permiso." |
| "$485 to $625, depending on whether the existing supply line can be reused." | "Entre $485 y $625, dependiendo de si la línea de suministro existente se puede reutilizar." |
| "Our diagnostic visit is $89 and applies to any work performed." | "Nuestra visita de diagnóstico es de $89 y se aplica a cualquier trabajo realizado." |
| "There's a same-day surge fee of $40 today because of the freeze." | "Hoy aplica un cargo adicional de $40 por servicio del mismo día debido a la helada." |
| "Are you looking at the standard atmospheric vent or the high-efficiency power-vent?" | "¿Está considerando el modelo estándar de ventilación atmosférica o el de alta eficiencia con ventilador eléctrico?" |
| "If we proceed, the SKU is WH-G50-STD on the ticket." | "Si procedemos, el código del trabajo en el boleto es WH-G50-STD." |
Plumbing-pricebook-specific Spanish terminology (use these consistently — the back-translation register fails most in pricebook conversations because customers are listening for both clarity and warmth at the same time):
- calentador de agua — water heater (tank type).
- calentador de agua sin tanque / calentador instantáneo — tankless water heater. (Both forms are used; sin tanque is more literal, instantáneo is more common in marketing copy. Consistent with Membership Plan Drafter terminology.)
- llave de paso — shutoff valve.
- trampa de drenaje / trampa P — P-trap.
- desagüe — drain.
- fuga — leak. Fuga en losa — slab leak.
- contraflujo — backflow. Prevención de contraflujo — backflow prevention.
- registro de limpieza — cleanout.
- visita de diagnóstico — diagnostic visit. Not llamada de diagnóstico (sounds like a phone call).
- cargo adicional — surcharge. Use this for emergency / after-hours / surge fees rather than recargo (which sounds like a penalty).
- garantía — warranty.
- membresía — membership. Plan de membresía — membership plan.
Three hardening rules for the Spanish price-band variant:
- Native-write the Spanish phrasing; do not back-translate from the English output. Translation produces stilted phrasing that erodes price-conversation trust faster than any other category of bilingual content. Generate from the structured input, not from the English answer.
- Preserve the dollar-amount format. US dollar formatting ($X,XXX.XX) is the format Spanish-speaking customers in the US expect. The skill should never substitute European formatting (€ or thousand-separators with periods).
- Bilingual customers in mixed households often code-switch on the call. If the AI-RX or dispatcher input includes a code-switched mix ("how much for el calentador"), interpret the dominant-language signal from the price-question phrasing, not from individual nouns. Default to Spanish output when the price-question itself ("cuánto cuesta") is in Spanish.
Cross-skill references: Pre-Visit Diagnostic Intake v1.1 (customer_language field source), Review Request Drafter v2.3 + Invoice Follow-Up Sequence v2.3 + Change Order Tracker v1.3 (shared formal-usted register, shared don't-auto-detect-from-name rule, shared native-write-rather-than-back-translate discipline), Membership Plan Drafter (Spanish member-pricing overlay phrasing should match the membership skill's Spanish marketing copy if the shop has translated the membership plan).
Per-Tech Discount-Authorization Guardrails
Most shops authorize techs to discount within bands but never surface those bands on the live-call output. The result: techs apply discounts off the cuff (-10% here, -$50 there), the office sees the discount in the closeout, the margin floor moves quietly down, and no debrief surfaces the pattern because the discount feels customer-friendly. v2.2 surfaces tech-level discount authorization at lookup time so the band is visible before the discount is offered, not after.
Trigger: Apply when the input includes a tech-id flag ([TECH:firstname-lastinitial]) or when the user has set tech_id: in the question. The skill cross-references config.yml → tech_authorization: for the per-tech discount band.
Output addition — append after the standard MATCHING ITEMS block when triggered:
───────────────────────────────────────────────
🛡️ AUTHORIZATION GUARDRAILS — Tech: [Name]
───────────────────────────────────────────────
Published price: $[amount]
Tech's authorized floor: $[amount] (max -[X]% off published)
Manager-approval required below: $[amount]
Owner-approval required below: $[amount]
Authorization context:
- This SKU has [✅ flexible / ⚠️ tight / 🛑 fixed] discount authority
- Tech's trailing-30-day discount average: [X]% [vs. shop median: [X]%]
- Tech's approval-rate on tight-band quotes: [X]%
───────────────────────────────────────────────
Six hardening rules for the discount-authorization layer:
- Default authorization bands (override from config): service techs -10% off published / drain techs -15% / lead techs -15% / dispatchers -5% only with manager rubber-stamp. Below the floor, manager approval is required; below 70% of published, owner approval is required.
- Fixed-discount SKUs: items where the published price is already at the membership-tier-equivalent discount (e.g., the membership-discounted line in the v2.2 member-pricing overlay) are flagged as fixed — no further discount is authorized regardless of tech.
- Tight-band SKUs: items where the margin is already at the floor (Healthy < 50% threshold from v2.0 internal margin block) are flagged as tight — manager approval at any discount.
- Trailing-30-day discount average is the diagnostic, not the punitive number. A tech 5 percentage points above the shop median for 30 days is not a violator — they're either working a tougher mix (more competitor-quoted calls) or coaching toward a less-aggressive close. The number is for the tech-perf-debrief input, not for the live-call rebuke.
- Cross-skill consumption: the per-tech discount data flows directly into the Technician Performance Debrief v1.1.A revenue-capture benchmark band (one of the named coaching dimensions for Service / Drain techs).
- Never surface the guardrail block on customer-facing output. This is an internal-only block. The AI-RX adapter strips it; the dispatcher-LIVE output strips it; only the office-async two-mode output and the tech-coaching mode include it.
Cross-Skill Reference Pointers (v2.2)
- Membership Plan Drafter — source-of-truth tier-discount structure for the member-pricing overlay; check
outputs/membership-plan-*.mdfor the most recent shop-specific tier structure before falling back to the default table. - Pre-Visit Diagnostic Intake v1.1 —
customer_languagefield source for the bilingual-Spanish trigger; the AI-RX adapter typically receives this field from the platform's intake handoff JSON. - Review Request Drafter v2.3 — shared formal-usted register and don't-auto-detect-from-name rule for the Spanish price-band variant.
- Invoice Follow-Up Sequence v2.3 — shared bilingual-Spanish discipline; the post-call invoice carries the member-pricing reflected in the call.
- Change Order Tracker v1.3 — the per-line-item margin output of the pricebook feeds the pipeline-position math when a CO is being written; the per-tech discount-authorization data feeds the per-rep CO-velocity table.
- Vendor Price Increase Customer Communication — the wave-affected-SKU flag in v2.1.C still gates the member-pricing overlay (member discount on a stale SKU is suppressed until the SKU refresh).
- Estimate Writer v2.0 — multi-line estimates that are member-eligible carry the per-line member-pricing overlay through to the estimate output rather than re-applying it at quote time.
- Technician Performance Debrief v1.1 — consumes the per-tech discount-authorization log into the revenue-capture benchmark band; closes another measurement loop alongside the Review Request Drafter v2.3.D send-rate signal.