An HVAC answering service picks up what arrives after the office closes — no heat, no cooling, a unit down, a smell nobody can place — and decides which of it is worth waking a tech for. On a heating call that decision carries a second half most vendor pages skip: whether the call belongs to a technician at all, or to 911.
This page is the map, not a pitch. Twelve calls an HVAC shop gets after dark and what the code in this repository does with each one today — including the 3 it has no rule for. The safety gate above the triage table is trade-independent and already names the furnace, the boiler, the vent and the flue. The table underneath it is a plumbing table. Both of those are said here rather than papered over.
On Call Bell has not answered a phone call yet. The safety gate, the triage rules, the call flow and the evidence trail are written and tested offline; the telephony is the next piece of work. Nothing on this page describes how fast or how reliably a live line answers, because no live line exists to measure. There is nothing to sign up for and no demo number. Everything below is either a decided price or a number you can count in the code.
No heat is a comfort complaint and a combustion complaint wearing the same two words. Nothing in the words tells them apart; what tells them apart is whatever else is true in that house at that moment, and the caller almost never leads with it.
So the deciding happens in two stages, in a fixed order, and the first one is not negotiable. A word list runs on every utterance before any model or any rule sees the call. If it fires, the call ends in a referral to 911 and no job is captured. Only a call that clears it reaches the triage table that says tonight, first thing or scheduled.
That word list was written for a plumbing line, and it needed no translation for heating work, because the hazards it hunts are combustion hazards. 173 of its 283 shipped patterns are gas, carbon monoxide or smoke and fire. Its carbon-monoxide context list — the words that must sit near a symptom before the symptom counts as anything — names heating equipment outright: furnace, boiler, heater, vent, flue, exhaust and heating are all in it.
The 6 symptom groups beside that list are headache, dizziness, nausea, drowsiness, confusion and feeling generally ill — the CDC's own description of carbon monoxide poisoning as “flu-like”, turned into a matcher, and close to the list the CPSC publishes. A furnace call is the call that list exists for.
Which is also why the gate stops those calls instead of escalating them faster. The CPSC's instruction to anyone who suspects carbon monoxide poisoning is to “get outside to fresh air immediately, and then call 911”. A technician ninety minutes out is not an answer to that sentence, and a line that books one has done the wrong thing efficiently.
Left column: what the caller says, lowercase and unpunctuated, the way speech
recognition hands it over. Middle: what the shipped safety gate does with it —
every row was run through
packages/stop-gate/src/cli-try.ts before it was written down, and the
pattern ids are the ones that command printed. Right: the triage row the call lands on
afterwards.
3 of the 12 have no rule at all. That is the honest state of an HVAC rule set here, and it is printed rather than described.
| What the caller says | The safety gate | Then the table |
|---|---|---|
| i smell gas down here | Stops the call. T1, A-T1C-01. | Never reached. Nothing is booked and nobody is sent. |
| my carbon monoxide alarm went off | Stops the call. T1, B-T1C-02. | Never reached. |
| everyone in the house feels sick and dizzy since we turned the furnace on | Stops the call. T1, B-T1O-06 — two symptoms beside a heating word, not one. | Never reached. |
| the smoke detector keeps going off when the heat runs | Asks P-ALARM first. T2, B-T2-01. | Only on a clean no. |
| the furnace is making a noise and i feel dizzy | Asks P-ALARM first. T2, B-T2-04 — a symptom beside a heating word. | Only on a clean no. |
| theres a burning smell when the furnace runs | Asks P-FIRE first. T2, C-T2-01. | Only on a clean no. |
| the pilot wont stay lit | Asks P-GAS first. T2, A-T2-11. | R15, first thing — the one row no call can reach any other way. |
| no heat and its below freezing (hydronic, cold snap on) | Passes. | R08, tonight. |
| no heat and its below freezing (forced air, or cold snap off) | Passes. | No rule matches. Same sentence, different answer, decided by a switch. |
| the ac quit and the house is at 92 | Passes. | No rule matches. Nothing in the table is about cooling. |
| the rooftop unit is down at the restaurant | Passes. | No rule matches. The commercial row wants a backup or no water, not a unit that stopped. |
| a pipe froze in the crawlspace | Passes. | R13, first thing. R05, tonight, the moment it has burst. |
The two no-heat rows are the same six words. What separates them is a pair of switches an owner sets: whether the shop is flagged as servicing hydronic heat, and whether cold-snap mode is on. Turn either off and the sentence that woke somebody last night matches nothing tonight.
“No rule matches” is not the same as “nothing happens”, and it is worse than it sounds. When no row fires, the rules return the lowest tier and the only thing that can raise it is the model — which is allowed to raise a tier and never to lower one, so the floor is a scheduled callback. The modifiers do not help either: vulnerable occupants, cold snap and multi-unit each raise a matched rule by one tier, and none of them applies when no rule matched. A no-cooling call in a heatwave, in a house with an elderly customer in it, rests on a language model's judgement with nothing underneath it. That is not a thing to find out at 2am, and it is why this page does not claim the product answers HVAC calls.
Three of the four probe questions in the shipped script file are the ones a heating call runs into. They are fixed strings; no model writes them, and there is no setting that edits or removes them:
“Quick safety check before we go on — do you smell gas right now?”
“Quick safety check — is a carbon monoxide alarm or a smoke alarm going off right now?”
“Quick safety check — is there any smoke, fire or sparking right now?”
Three answers are possible and only one of them lets the call go on. A clean no clears the screen. Hold on, let me check buys eight more seconds. Anything else — including an answer that names a hazard of its own — ends the call at 911.
Silence is not a no. The question is repeated once and then the call is stopped anyway, because of who is silent at that moment: the people already being overcome by it, the people who put the phone down and ran, and the people who dropped it. Reading that pause as “no hazard” would invert the one asymmetry the whole design rests on.
Where the hazard is gas the script does not stop at 911 either. It says: “Please hang up and call nine-one-one, or your gas company's emergency line, right now.”
A word list can be beaten by words, and on heating calls it is. Two of the sentences it still answers with silence are furnace calls: “my father cannot get the pilot lit and the room smells” (T316) and “the basement is flooding and the furnace is in there with the electric” (U142). Both were run against the shipped gate. Both pass, and would be booked like any other job.
So the 911 referral does not depend on the word list at all. It is said by two sentences that never look at the transcript — once on every call, and a second time on every call that captured a job. The greeting comes first, before the caller has said anything, and no owner can switch any part of it off: “If you smell gas, or a carbon monoxide alarm is going off, hang up and call nine-one-one first.”
And again at the end of every call that captured a job, in the context of the caller's own problem rather than in a disclosure block: “One last thing — if you smell gas, or an alarm goes off, or anything about this starts to feel like an emergency, don't wait for us. Hang up and call nine-one-one.”
Neither sentence can be evaded by phrasing, because neither is listening for phrasing. That is the honest answer to a hazard vocabulary on an HVAC line: not a longer list, a channel the list cannot fail on. All 43 sentences that still beat the list are published, in full, on their own page.
The shipped table has 18 rows. 1 of them is about heat — R08, No heat during a cold snap (hydronic only) — and 0 are about cooling. Hydronic means boilers and radiators: the wet side, which is what a plumbing shop services. It fires only when the owner has flagged the shop as doing that work and has cold-snap mode switched on.
The facts the line extracts from a call tell the same story. There is a tag for no heat, one for a gas appliance and one for a pilot that is out. There is none for cooling, none for refrigerant, none for airflow, and none for a heat pump. A rule cannot be written against a fact nobody extracts.
An HVAC set would need rows this table does not have: no cooling, graded by who is in the house; no heat that does not care whether the heat is wet or dry; a commercial row that fires on a unit down rather than on water; a frozen coil; a red-tagged furnace. None of them is written. The version that gets written will be the plumbing table's sibling, argued row by row and published the same way — which is the only reason it is worth saying now that it does not exist.
Independent plumbing companies running one to three trucks, in the US, and nowhere else — the name this is being built under has been screened and not cleared, and what the screening did turn up is why it is one market and not two. An HVAC shop is not the customer today, and there is nothing here to buy: no signup, no demo number, no HVAC rule set.
What is usable now is the design. The gate above the table is trade-independent, and the three questions it asks are the ones any line taking heating calls should be asking before it books anything. The four outcomes any after-hours call can have are written out for any trade, and the five questions on that page work on whichever vendor you are actually talking to.
If you run an HVAC shop and want the rows written, the useful thing to send is not an enquiry. It is the calls your line really gets after dark, in the words your callers use, and which of them you would want to be woken for. That is the input the table is missing.
Above the triage table, no: the safety gate is the same for every trade, and 173 of its 283 shipped patterns are gas, carbon monoxide or smoke and fire. Below it, yes. The shipped table has 18 rows, 1 of which is about heat and 0 about cooling, so an HVAC shop running it would be running a plumbing rule set.
A caller who says the alarm went off is stopped outright: no booking, no transfer, no clarifying question, and a script that names 911. A caller whose wording is less certain, such as a detector beeping in the hallway, gets one fixed question — "Quick safety check — is a carbon monoxide alarm or a smoke alarm going off right now?" — and only three answers to it are possible. A clean no clears the screen; a "hold on, let me check" buys eight more seconds; anything else ends the call at 911. Silence is not a no either: the question is repeated once, and then the call is stopped anyway.
No. 0 of the 18 shipped rows are about cooling, refrigerant or a heat pump, and no fact is extracted from the call that such a row could be written against. When no row matches, the rules return the lowest tier and only the model can raise it — so a no-cooling call has no rule underneath it at all. That is a gap, and printing it is more useful than a page that implies otherwise.
No. On Call Bell has not answered a phone call yet: there is no demo number, nothing to sign up for, and no HVAC rule set. What exists is the safety gate, the plumbing triage table, the call flow and 511 tests that run offline. Write to hello@oncallbell.com if you want to be told when either of those changes.
If you run a shop and something on this page is wrong — a rule that would wake you for nothing, a phrase the word list should catch and does not — write to hello@oncallbell.com. A person reads it. That is more useful to us than a signup, and there is no signup yet anyway.
Last checked against the code on 2026-09-06