# Massachusetts Plumbing, HVAC & Electrical Service Areas > Check your town or ZIP code Town, village or 5-digit ZIP Clear Use the field above to check if we serve your location. Massachusetts Plumbing, HVAC & Electrical Service Areas Full list of the towns an... ## Check your town or ZIP code Town, village or 5-digit ZIP Use the field above to check if we serve your location. ## Massachusetts Plumbing, HVAC & Electrical Service Areas [Full list of the towns and ZIP codes we serve](https://rodenhiser.com/rodenhiser-service-area-md.html?view=servicearea&layout=md)Rodenhiser Home Services has been fixing and installing home systems from our base in Holliston since 1928. Our plumbers, heating and air conditioning technicians, and electricians serve communities across MetroWest and the Route 495/128 corridor, Greater Worcester and the Blackstone Valley, the Nashoba Valley, Newton, Wellesley and Waltham, the South Shore and Plymouth County, and the Attleboro and Taunton area. - [Schedule service](#module-262) - [CALL 1-800-462-9710](tel:+18004629710) ## Services available across our service area - ### Plumbing Leaks, clogged drains, no hot water, or a water heater near the end of its life. We repair and install tank and tankless water heaters, clear and repair drains, fix pipes and fixtures, and test and treat household water. [Plumbing services](https://rodenhiser.com/plumber-framingham.html)· [Water testing](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html) [Read more](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html) - ### Heating and A/C repair and maintenance When an existing furnace, boiler, heat pump or air conditioner stops working or can’t keep up, we diagnose and repair it. We work on equipment from many manufacturers, and annual maintenance keeps systems running and catches problems early. [Heating repair and service](https://rodenhiser.com/furnace-framingham/furnace-repair-framingham.html)· [Maintenance plans](https://rodenhiser.com/maintenance-plans.html) [Read more](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html) - ### Heating and A/C installation and replacement Replacing an aging system or adding cooling? We plan and install furnaces, boilers, central air, heat pumps and ductless mini-splits. Estimates are free for qualifying new heating and cooling installations. [Heating installation](https://rodenhiser.com/furnace-framingham/furnace-newton.html) · [Heat pumps](https://rodenhiser.com/furnace-framingham/heat-pumps-framingham.html) · [Ductless systems](https://rodenhiser.com/furnace-framingham/ductless-heating-ma.html) [Read more](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html) - ### Electrical repairs and upgrades Panel replacements and upgrades, rewiring, lighting, surge protection, EV charger installation and whole-home standby generators, along with everyday electrical repairs. [Electrical services](https://rodenhiser.com/framingham-electricians.html) · [EV chargers](https://rodenhiser.com/framingham-electricians/electric-vehicle-charging-installations-framingham.html) [Read more](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html) We also handle [remodeling](https://rodenhiser.com/plumber-framingham/bathroom-remodeling-framingham.html) and [carpentry](https://rodenhiser.com/remodels/carpenters-framingham.html) projects. When you schedule, we confirm the work you need and the first available appointment for your address. ## Towns, villages and ZIP codes we serve Service area table — 194 rows '; } zips(location) { var html = location.zip.map((zip) => { var tag = zip.tag ? ' ' + ServiceArea.escape(zip.tag) + '' : ''; return '' + ServiceArea.escape(zip.code) + '' + tag; }).join(', '); if (location.shared) { html += '' + ServiceArea.escape(location.shared) + ''; } return html; } /\*\* Distinct first letters of the towns, in alphabetical order. \*/ letters() { var seen = {}; return this.locations.reduce((letters, location) => { if (location.letter && !seen\[location.letter\]) { seen\[location.letter\] = true; letters.push(location.letter); } return letters; }, \[\]).sort(); } /\* --------------------------------------------------------------------- \* Filtering \* ------------------------------------------------------------------ \*/ onLetterClick(event) { var link = event.target.closest('a'); if (!link \|\| !this.letterList.contains(link)) { return; } event.preventDefault(); var item = link.parentElement; if (item.classList.contains('uk-disabled')) { return; } // Clicking the active letter again clears the letter filter. this.setLetter(this.activeLetter === item.dataset.letter ? null : item.dataset.letter); } /\*\* @param {String\|null} letter \*/ setLetter(letter) { this.activeLetter = letter \|\| null; this.letterItems.forEach((item, key) => { item.classList.toggle('uk-active', key === this.activeLetter); }); if (this.scroller) { this.scroller.scrollTop = 0; } this.apply(); } /\*\* @param {String} value raw lookup field value \*/ setQuery(value) { this.query = String(value == null ? '' : value); // Typing always drops a previously selected letter. if (this.activeLetter) { this.activeLetter = null; this.letterItems.forEach((item) => item.classList.remove('uk-active')); } this.updateClear(); this.apply(); } clear() { this.searchInputs.forEach((input) => { input.value = ''; }); this.query = ''; this.setLetter(null); this.updateClear(); } /\*\* Applies letter + query, then repaints letters, empty row, info block. \*/ apply() { var tokens = ServiceArea.tokens(this.query); var letter = this.activeLetter; var matches = \[\]; this.locations.forEach((location) => { var show = (!letter \|\| location.letter === letter) && ServiceArea.matches(location, tokens); if (show) { matches.push(location); } this.rowByIndex.get(location.index).hidden = !show; }); this.visible = matches.length; this.matches = matches; this.updateLetters(tokens); this.updateEmptyRow(); this.updateInfo(); this.root.dispatchEvent(new CustomEvent('service-area:filter', { bubbles: true, detail: { query: this.query, letter: this.activeLetter, visible: this.visible, total: this.locations.length } })); } /\*\* A letter stays clickable only while it still has matches for the query. \*/ updateLetters(tokens) { var available = {}; this.locations.forEach((location) => { if (!available\[location.letter\] && ServiceArea.matches(location, tokens)) { available\[location.letter\] = true; } }); this.letterItems.forEach((item, letter) => { item.classList.toggle('uk-disabled', !available\[letter\]); }); } updateEmptyRow() { if (!this.emptyRow) { return; } var query = this.query.trim(); var text = this.visible ? '' : (query ? 'No locations match “' + query + '”.' : this.options.emptyText); this.emptyRow.cells\[0\].textContent = text; this.emptyRow.hidden = this.visible !== 0; } /\*\* Info block under the lookup field. \*/ updateInfo() { if (!this.infos.length) { return; } var query = this.query.trim(); var text = TEXT.idle; var muted = true; if (query) { if (this.visible === 0) { text = TEXT.none.replace('{query}', query); } else if (this.visible === 1) { text = TEXT.found.replace('{location}', ServiceArea.title(this.matches\[0\])); muted = false; } else { text = TEXT.many.replace('{count}', this.visible); } } this.infos.forEach((info) => { info.textContent = text; info.classList.toggle('uk-text-muted', muted); }); } /\* --------------------------------------------------------------------- \* Lookup field \* ------------------------------------------------------------------ \*/ /\*\* \* Wires every .service-area-search block: input, clear button and info \* block. Missing clear button / info block are created in place. \*/ bindSearch() { document.querySelectorAll(SELECTOR.search).forEach((container) => { var input = container.tagName === 'INPUT' ? container : container.querySelector('input'); if (!input) { return; } this.searchInputs.push(input); this.associateLabel(container, input); var clear = this.ensureClear(container, input); if (clear) { this.clearButtons.push(clear); } this.infos.push(this.ensureInfo(container, input)); input.addEventListener('input', () => { this.setQuery(input.value); }); input.addEventListener('search', () => { this.setQuery(input.value); }); if (clear) { clear.addEventListener('click', () => { this.clear(); input.focus(); }); } if (input.value) { this.setQuery(input.value); } }); this.updateClear(); this.updateInfo(); } /\*\* Points a at the input when its target does not exist. \*/ associateLabel(container, input) { if (input.id) { return; } var label = container.querySelector('label\[for\]'); var target = label ? document.getElementById(label.getAttribute('for')) : null; if (label && !target) { input.id = label.getAttribute('for'); } } /\*\* \[input\]\[clear\] row — wraps the input once, then hides/shows the button. \*/ ensureClear(container, input) { var clear = container.querySelector(SELECTOR.clear); if (!clear) { var field = input.parentElement; if (!field \|\| !field.classList.contains('service-area-field')) { field = document.createElement('div'); field.className = 'uk-flex uk-flex-middle service-area-field'; input.parentNode.insertBefore(field, input); field.appendChild(input); } input.classList.add('uk-width-expand'); clear = document.createElement('button'); clear.type = 'button'; clear.className = 'uk-button uk-button-text uk-text-small uk-margin-small-left service-area-clear'; clear.textContent = 'Clear'; clear.setAttribute('aria-label', 'Clear the town or ZIP code'); field.appendChild(clear); } return clear; } ensureInfo(container, input) { var info = container.querySelector(SELECTOR.info); if (!info) { info = document.createElement('p'); info.className = 'uk-text-small uk-text-muted uk-margin-small-top uk-margin-remove-bottom service-area-info'; info.setAttribute('role', 'status'); info.setAttribute('aria-live', 'polite'); container.appendChild(info); } if (!info.id && !document.getElementById('area-lookup-info')) { info.id = 'area-lookup-info'; input.setAttribute('aria-describedby', info.id); } return info; } updateClear() { var hasValue = this.searchInputs.some((input) => input.value !== ''); this.clearButtons.forEach((button) => { button.hidden = !hasValue; }); } /\* --------------------------------------------------------------------- \* Public lookups \* ------------------------------------------------------------------ \*/ /\*\* @param {Number} index original JSON index \*/ getLocation(index) { return this.byIndex.get(Number(index)) \|\| null; } /\*\* @param {Number} index original JSON index \*/ getRow(index) { return this.rowByIndex.get(Number(index)) \|\| null; } /\*\* All locations matching a raw query string, in display order. \*/ find(query) { var tokens = ServiceArea.tokens(query); return this.locations.filter((location) => ServiceArea.matches(location, tokens)); } /\* --------------------------------------------------------------------- \* Static helpers \* ------------------------------------------------------------------ \*/ /\*\* Reads {"serviceArea":\[...\]} — #service-area-data first, then any JSON script. \*/ static readData() { var scripts = \[\]; document.querySelectorAll(SELECTOR.data + ',' + SELECTOR.json).forEach((script) => { scripts.push(script); }); for (var i = 0; i { var town = String(row.cells\[0\].textContent \|\| '').trim(); var same = !!row.cells\[1\].querySelector('.uk-text-muted'); var locality = same ? town : String(row.cells\[1\].textContent \|\| '').trim(); var cell = row.cells\[2\]; var zip = Array.prototype.map.call(cell.querySelectorAll('.uk-text-nowrap'), (code) => { var next = code.nextElementSibling; return { code: String(code.textContent \|\| '').trim(), tag: next && next.classList.contains('uk-label') ? String(next.textContent \|\| '').trim() : '' }; }).filter((entry) => entry.code); var note = cell.querySelector('.uk-display-block'); return { index: Number(row.dataset.index), town: town, locality: locality, same: same, zip: zip, shared: note ? String(note.textContent \|\| '').trim() : '', letter: town.charAt(0).toUpperCase(), fields: \[town, locality\].concat(zip.map((entry) => entry.code)).map(ServiceArea.fold) }; }); } /\*\* Accepts zip entries as "02351" or {code, tag}. \*/ static normalize(item, index) { var town = String(item && item.town \|\| '').trim(); var locality = String(item && item.locality \|\| '').trim(); var zip = (item && Array.isArray(item.zip) ? item.zip : \[\]).map((entry) => { if (entry && typeof entry === 'object') { var zip = { code: String(entry.code \|\| '').trim() }; if (entry.tag) { zip.tag = String(entry.tag).trim(); } return zip; } return { code: String(entry).trim() }; }).filter((entry) => entry.code); return { index: index, town: town, locality: locality, same: !locality \|\| locality === town, zip: zip, shared: item && item.shared ? String(item.shared) : '', letter: town.charAt(0).toUpperCase(), fields: \[town, locality\].concat(zip.map((entry) => entry.code)).map(ServiceArea.fold) }; } /\*\* Town, or the village when it differs — used in the "is in our service area" line. \*/ static title(location) { return location.locality && location.locality !== location.town ? location.locality : location.town; } static tokens(query) { return ServiceArea.fold(query).split(' ').filter(Boolean); } /\*\* Every token must match at least one field (town, village, ZIP). \*/ static matches(location, tokens) { return tokens.every((token) => location.fields.some((field) => field.indexOf(token) !== -1)); } /\*\* Lowercase, no diacritics, single spaces. \*/ static fold(value) { return String(value == null ? '' : value) .toLowerCase() .normalize('NFD') .replace(/\[\\u0300-\\u036f\]/g, '') .replace(/\\s+/g, ' ') .trim(); } static escape(value) { return String(value).replace(/\[&"'\]/g, (character) => ({ '&': '&', '': '>', '"': '"', "'": ''' }\[character\])); } /\*\* Renders every #service-area-list on the page. \*/ static boot() { document.querySelectorAll(SELECTOR.root).forEach((root) => { if (root.dataset.serviceAreaReady) { return; } root.dataset.serviceAreaReady = '1'; var instance = new ServiceArea(root); ServiceArea.instances.push(instance); if (!ServiceArea.instance) { ServiceArea.instance = instance; } }); } } ServiceArea.instances = \[\]; ServiceArea.instance = null; window.ServiceArea = ServiceArea; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', ServiceArea.boot); } else { ServiceArea.boot(); } }(window, document)); ## What happens when you contact us - ### 1. Tell us where and what 1 Give us the property address and describe the problem or project. - ### 2. We book the right visit 2 Repairs and maintenance go to a service technician. A new heating or cooling system starts with an estimate, free for qualifying installations. If a service or diagnostic charge applies to your visit, we’ll tell you when you book. - ### 3. You see the price before work starts 3 Your technician explains what they found and gives you the price for the recommended work. You decide whether to go ahead. - ### 4. We do the work and walk you through it 4 When the job is done, we show you what was completed and answer your questions. ## Helpful guides from Rodenhiser - [Annual maintenance plans](https://rodenhiser.com/our-commercials/maintenance-plans.html): what each plan covers for heating, cooling, plumbing and electrical systems. - [Water testing](https://rodenhiser.com/plumber-framingham/water-testing-services-framingham-ma.html): what an in-home water test checks and when lab testing makes sense. - [Heat pumps](https://rodenhiser.com/furnace-framingham/heat-pumps-framingham.html): how heat pumps heat and cool a Massachusetts home. - [Ductless heating and cooling](https://rodenhiser.com/air-conditioning-framingham/ductless-air-conditioning-massachusetts.html): an option for older homes and rooms without ductwork. - [Test your air conditioning before you need it](https://rodenhiser.com/air-conditioning-framingham/test-your-air-conditioning-system-before-you-need-it.html): a quick check to run before summer. - [About Rodenhiser](https://rodenhiser.com/rodenhiser-massachusetts/rodenhiser-plumbing-heating.html): our history and how we work. --- ## Tell us the address and what you need Share the property address and a quick description of the problem or project, and we’ll match you with the right technician and the next available appointment. Nice People. Great Service. ## Service area questions - ### How do I check whether Rodenhiser serves my town or ZIP code? Find your town, village or ZIP code in the list on this page. If it’s listed, you’re in our service area. When you book, we confirm the appointment and the work for your specific address. - ### Does Rodenhiser serve homeowners outside Holliston? Yes. Holliston is our home base, but our technicians work in communities across MetroWest, Greater Worcester and the Blackstone Valley, the Nashoba Valley, Newton, Wellesley and Waltham, the South Shore and Plymouth County, and the Attleboro and Taunton area. Every town and ZIP code is listed above. - ### Which services can I request in the listed areas? You can request plumbing, heating, air conditioning and electrical service anywhere on the list, including repairs, maintenance and new installations. Some specialty work depends on the job and the schedule, so we confirm what you need when you call or book. You can also [see our full list of services](https://rodenhiser.com/our-services.html). - ### Can I schedule a repair, a maintenance visit or a replacement estimate? Yes. Tell us whether something needs repair, your system is due for maintenance, or you’re thinking about replacing equipment. Repairs and maintenance are handled by a service technician. New heating and cooling installations start with an estimate, which is free for qualifying systems. - ### How are urgent problems handled? Call us at 1-800-462-9710 and describe what’s happening, such as no heat, an active leak, or a loss of power to part of the house. We’ll tell you the earliest appointment available for your address and what to do in the meantime. If you smell gas, leave the house and call your gas utility or 911 first. - ### Why is my mailing address different from my town name? Many Massachusetts ZIP codes use a village or postal name, like Whitinsville in Northbridge or Newton Centre in Newton. A few ZIP codes cross town lines. That’s why the list shows the town, the postal name and the ZIP code. We always schedule service at the physical address of the property. - ### What should I do if my ZIP code isn’t listed? Call us at 1-800-462-9710. We’ll tell you whether we can help at that address and with the work you need. - ### Where can I learn more about the work Rodenhiser does? Our service pages explain [plumbing](https://rodenhiser.com/plumber-framingham.html), [heating](https://rodenhiser.com/furnace-framingham.html) and [electrical](https://rodenhiser.com/framingham-electricians.html) work in more detail, and our [maintenance plans](https://rodenhiser.com/maintenance-plans.html) page explains what annual maintenance covers. You can also [read what customers say](https://rodenhiser.com/rodenhiser-heating.html). ## Navigation - [Rodenhiser Home Services](https://rodenhiser.com/) - [Rodenhiser Plumbing Services](https://rodenhiser.com/plumber-framingham.html) - [Rodenhiser Heating Services](https://rodenhiser.com/furnace-framingham.html) - [Rodenhiser Cooling Services](https://rodenhiser.com/air-conditioning-framingham.html) - [Rodenhiser Electrical Services](https://rodenhiser.com/framingham-electricians.html) - [Rodenhiser Home Services: Book Online](https://rodenhiser.com/call-rodenhiser/book-online.html) - [Rodenhiser Remodeling Services](https://rodenhiser.com/remodels/bathroom-remodeling-framingham.html) - [Rodenhiser Home Services: Reviews](https://rodenhiser.com/rodenhiser-heating.html) ## Company information - Rodenhiser Home Services - [https://rodenhiser.com](https://rodenhiser.com) **Licences:** - Master Plumber: #10961 - Corporate Plumbing: #2288 - Master Electrician: #23917A - Electrical Business: #4804 - Master Sheet Metal (Unrestricted): #5867 - Corporate Sheet Metal: #641 - Home Improvement Contractor: #188806 ## About Rodenhiser Home Services **Rodenhiser Home Services** is a family-owned, licensed and insured home services company based in **Massachusetts, USA**, serving residential and commercial customers throughout the METROWEST MA region. Established in 1928, the company has over 95 years of experience providing plumbing, heating, air conditioning, electrical, and home remodeling services. Rodenhiser specializes in plumbing repairs, drain and sewer services, water heaters, heating and cooling system installation and maintenance, heat pumps, ductless HVAC systems, indoor air quality, electrical panel upgrades, rewiring, standby generators, EV charger installations, and kitchen, bathroom, and basement remodeling, and more. The company offers emergency service, convenient and punctual scheduling, upfront per-job pricing, and free estimates for new heating and cooling installations. All work is backed by written warranties and a satisfaction guarantee. Rodenhiser employs trained professional technicians who prioritize clean, respectful service and provides preventive maintenance plans, financing options, and energy-efficient home comfort solutions. Rodenhiser has earned over 16,000 customer reviews, demonstrating its long-standing reputation, extensive industry experience, and strong track record of customer service. **Nice People…Great Service** ## Page information - [Canonical URL: https://rodenhiser.com/plumbers-framingham-ma.html](https://rodenhiser.com/plumbers-framingham-ma.html) ## Our plumbers, heating and air conditioning technicians, and electricians serve communities across MetroWest and the Route 495/128 corridor, Greater Worcester and the Blackstone Valley, the Nashoba Valley, Newton, Wellesley and Waltham, the South Shore and Plymouth County, and the Attleboro and Taunton area, including: - Abington - Acton - Arlington - Ashland - Attleboro - Auburn - Avon - Ayer - Bellingham - Belmont - Berkley - Berlin - Blackstone - Bolton - Boston - Boxborough - Boylston - Braintree - Bridgewater - Brockton - Brookline - Canton - Carlisle - Carver - Charlton - Clinton - Cohasset - Concord - Dedham - Dighton - Douglas - Dover - Dudley - Duxbury - East Bridgewater - Easton - Foxborough - Framingham - Franklin - Grafton - Groton - Halifax - Hanover - Hanson - Harvard - Hingham - Holbrook - Holden - Holliston - Hopedale - Hopkinton - Hudson - Hull - Kingston - Lakeville - Lancaster - Leicester - Leominster - Lexington - Lincoln - Littleton - Lunenburg - Mansfield - Marlborough - Marshfield - Maynard - Medfield - Medway - Mendon - Middleborough - Milford - Millbury - Millis - Millville - Milton - Natick - Needham - Newton - Norfolk - North Attleborough - Northborough - Northbridge - Norton - Norwell - Norwood - Oxford - Paxton - Pembroke - Pepperell - Plainville - Plymouth - Plympton - Quincy - Randolph - Raynham - Rehoboth - Rockland - Rutland - Scituate - Seekonk - Sharon - Sherborn - Shirley - Shrewsbury - Southborough - Southbridge - Spencer - Sterling - Stoughton - Stow - Sturbridge - Sudbury - Sutton - Taunton - Townsend - Upton - Uxbridge - Walpole - Waltham - Watertown - Wayland - Webster - Wellesley - West Boylston - West Bridgewater - Westborough - Westford - Weston - Westwood - Weymouth - Whitman - Worcester - Wrentham