You already built the pages. Nobody told Google what they’re for.
HS Ultra is not starting from zero. There are 113 landing pages live, a real service line, verified Google reviews, and a named leadership team. The effort is already spent. The problem is what happened after the pages went up: across 105 city pages, seven different services in the same city share one identical title tag, not one carries a meta description, not one carries structured data, and the body copy runs 99.5 percent identical from city to city. This is a read on what is live today, what it costs you, and the order I would fix it in.
The pages are built. The metadata is not.
HS Ultra does not have a volume problem. There are 113 landing pages live and 34 blog posts aimed at real commercial buyers. What is missing sits one layer down: the title tags, the descriptions, the structured data, and any body copy that distinguishes one city from the next. Below are the three findings that cost the most, and the full severity table under them.
105 city pages are 99.5 percent identical.
I pulled the Milwaukee, Madison, and Green Bay food-manufacturing pages and compared them
word for word. All three run 2,462 words. The only difference between them is the city name,
swapped eleven times. Every one is set to index, follow with a self-referencing
canonical, so each page tells Google it is the original.
Seven services share one title tag.
Food manufacturing, lab, medical, school, wellness, processing plant, and hospitality
disinfection in Milwaukee all carry the title Milwaukee, WI - HS ULTRA.
No service. No keyword. Across 105 pages there are only 15 unique titles, and zero
meta descriptions. The H1s are correct. The title tags throw that away.
The proof you have is for the wrong buyer.
Your reviews are real and third-party verified. They are also entirely residential: pet odor, musty apartments, mold in a furnace. A food-plant sanitation manager finds nothing. Your one industrial case study sits behind an email form.
| Priority | Finding | Why it matters |
|---|---|---|
| Critical | 105 city pages run 99.5% identical body copy, all set to index, follow | Meets Google’s own description of “substantially similar pages” targeted at cities |
| Critical | 7 services per city share one title tag; 105 pages have no meta description | 15 unique titles doing the work of 105 pages. Nothing can rank on service intent |
| Critical | “Eliminates 99% of airborne pathogens in a single pass” runs with no substantiation shown | A quantified efficacy claim on a health-adjacent device is the kind regulators read closely |
| High | Zero structured data on all 105 city pages; homepage typed as Article, not LocalBusiness | No address, phone, service area, or review stars available to local search |
| High | Every testimonial is residential odor work. No commercial or industrial proof anywhere public | Your highest-value buyer has nothing to evaluate you on |
| High | The only industrial case study is gated behind a form | Buyers in evaluation mode leave rather than trade an email for proof you exist |
| High | Homepage sells to plant managers and homeowners in the same breath | Both audiences read copy written for someone else |
| High | Four different service areas stated across the site | “Northwest Wisconsin,” southeast metros, Billings MT, and “nationwide” cannot all be the footprint |
| Medium | “Years Experience” counter renders on the homepage with no number in it | An empty stat block reads as a broken site |
| Medium | “Who Benifits From Our Disinfection?” — homepage section heading | A typo in a heading, on a site selling compliance-grade precision |
| Medium | /contact-us-commercial/ has no H1 and is titled “Contact Us Commercial” | Your commercial intake page reads like an internal draft |
| Medium | 31 CSS files, 39 JS files, 197–224 KB of raw HTML per page | Slow pages on mobile, where most local search happens |
| Medium | Truncated URL slugs: /hospitality-disinfec/, /processing-plant-dis/ | Visibly cut-off URLs in search results and when shared |
| Low | robots.txt does not declare a sitemap, and /sitemap.xml returns empty | The real index at /sitemap_index.xml is left for crawlers to guess at |
105 pages. Eleven words of difference.
This is the largest single issue on the site and the one the report I was handed missed entirely. It recommended building city landing pages. They already exist — and their sameness is the problem.
Three cities, 2,462 words each, eleven words different.
I fetched food-manufacturing/milwaukee-wi, madison-wi, and green-bay-wi and diffed the visible text. Milwaukee and Madison: 2,462 words each, 99.5 percent identical. Milwaukee and Green Bay: 99.4 percent. Madison and Green Bay: 99.5 percent. The complete list of differences between the Milwaukee page and the Madison page is the word “Milwaukee” replaced with “Madison” eleven times.
Multiply that by the pattern. Seven service types across fifteen cities is 105 pages. Carpet cleaning adds eight more towns. That is 113 pages generated from roughly eight underlying templates.
Google names this pattern specifically.
Google’s spam policies define doorway abuse to include “having multiple domain names or pages targeted at specific regions or cities” and “creating substantially similar pages” (Google Search spam policies). Your pages are city-targeted and substantially similar. That is the definition, in their words.
I want to be fair about this: these are not classic doorways. They do not funnel to one page, and each has a correct, service-specific H1. HS Ultra was clearly trying to build something real. But at 99.5 percent overlap the pages carry the risk profile without earning the benefit. The most likely outcome is not a manual penalty. It is that Google picks one page per cluster, ignores the rest, and 100 pages of work returns nothing.
Every page claims to be the original.
Each city page carries <meta name="robots" content="follow, index"> and a canonical
pointing at itself. So there is no consolidation signal anywhere in the set. You are not telling Google
“these are variants of one service page.” You are submitting 105 separate documents and asserting
each is distinct. The crawler can measure that they are not.
Cross-service overlap is a problem too. The Milwaukee food-manufacturing page and the Milwaukee lab-disinfection page are 68 percent identical. So the duplication runs both directions: across cities for one service, and across services for one city.
The fix is differentiation or consolidation. Not deletion.
Do not bulk-delete these. The URL structure and the H1 logic are both sound, and that is the expensive part to get right. Two viable paths, and you can run them in parallel.
Consolidate the long tail. Pick the six to eight city-service combinations that actually match where you can service work profitably. Keep those. Point the rest at the parent service page with a 301 redirect. Fewer, stronger pages beat 105 weak ones every time.
Differentiate what you keep. Each surviving page needs 300 or more words that could only have been written about that city: the specific plants and facility types there, a local job you have done, drive time from your base, the relevant state or county inspection context. A named local reference is worth more than the other 2,400 words combined.
The template knows what each page is. The metadata does not.
Every city page has a correct, specific, service-plus-city H1. Then the title tag replaces it with the city name, the meta description comes back empty, and there is no structured data at all. This section holds the cheapest fixes in the whole audit.
Seven pages, one title tag, fifteen titles doing the work of 105.
I pulled the title tag for all seven Milwaukee service pages. Every one returned
Milwaukee, WI - HS ULTRA. Food manufacturing, lab, medical, school, wellness center,
processing plant, hospitality. Identical. Across the full 15-city by 7-service grid there are
15 unique title tags covering 105 pages.
Here is what makes this worth fixing first: the page content is right. The H1 on the Milwaukee page reads “Food Manufacturing Plant Disinfection & Sanitation in Milwaukee, WI.” That is a good H1. The template already knows what the page is about. The title tag discards it and substitutes the city name.
The title tag is one of the strongest relevance signals you control and it is what a searcher reads in the result (Google, title links). This is almost certainly a single Yoast title template set to output the post title, where the post title is just “Milwaukee, WI.” One setting. 105 pages. Probably the highest-return hour of work on the site.
Zero meta descriptions on every city page.
I checked all seven Milwaukee service pages plus samples across other cities. Not one returns a
meta description. Google then writes its own snippet from whatever body text it finds —
which, given the duplication above, is the same paragraph for every city.
You lose the one piece of ad copy you get for free in the search result. For a commercial service where the buyer is scanning for “do they handle FSMA audits, do they serve my county,” the snippet is where that question gets answered or does not.
No structured data on any local page. Homepage typed as an article.
The homepage carries one JSON-LD block, and its types are Person, Organization,
WebSite, WebPage, and Article. There is no LocalBusiness.
No telephone. No postal address. No areaServed. No aggregateRating. A homepage for a
field-service business is not an article
(Google, LocalBusiness markup).
The city pages carry no JSON-LD at all. Zero blocks. So 105 pages built specifically to win local search provide search engines with no machine-readable location, service, or contact data.
The one that stings: you have real, third-party-verified Google reviews on the site and no
aggregateRating markup. Review stars in search results are among the largest click-through
gains available, you have already earned the reviews, and the markup is not there to claim them.
Crawlers are left to guess where the sitemap is.
robots.txt contains only
User-agent: * and Allow: /. No Sitemap: directive.
Meanwhile /sitemap.xml returns an empty response, and the real index lives at
/sitemap_index.xml. Two lines of config.
Two buyers, one page, four service areas.
The commercial buyer and the residential buyer want different things, are worth different amounts, and are currently sold to in the same paragraph. Underneath that, the site gives four different answers to where HS Ultra actually works.
The homepage sells to a plant manager and a homeowner in the same paragraph.
The homepage H1 reads “Chemical-Free Disinfection for Commercial Facilities and Homes Across the Upper Midwest and Nationwide.” Below it, one paragraph covers food processing plants, cleanrooms, labs, schools, gyms, restaurants, healthcare, and “safeguarding your family at home.”
These buyers share nothing. A sanitation manager at a poultry plant is thinking about FSMA documentation, audit trails, validation protocols, and production downtime. A homeowner is thinking about a smell in the basement. Written together, each one reads copy addressed to someone else and concludes you are a generalist.
The economics are not symmetrical either. One food-processing contract is worth many hundreds of residential jobs and renews. The homepage should be a commercial page. Residential deserves a clear, well-built path of its own — just not the front door.
Four different answers to “where do you work?”
The homepage says HS Ultra serves “homes throughout Northwest Wisconsin and Eastern Minnesota.” The “Where We Serve” list underneath it names Milwaukee, Madison, Kenosha, Racine, Waukesha, West Allis, and Wauwatosa — southeast Wisconsin, three hours the other direction. The carpet-cleaning pages target Hayward, Spooner, Rice Lake, Chetek, Bloomer, Colfax, Cameron, and Ladysmith, which genuinely are northwest Wisconsin. And a testimonial on your testimonials page describes work by “Jeff Hancock with HS Ultra in Billings, MT.” The word “nationwide” is also used throughout.
Reading the site closely, there is a real structure hiding in this: residential and carpet work is northwest Wisconsin where you are physically based, commercial and industrial travels further, and there is some presence in Montana. That is a legitimate model. Say it plainly. Right now a buyer in Milwaukee cannot tell whether you are local, three hours away, or a franchise.
“Chemical-free” is the differentiator. It is stated, not proven.
Chemical-free disinfection is a genuinely strong position. It maps to real buyer pain: chemical handling requirements, worker exposure, residue on food-contact surfaces, resistance concerns, disposal cost. Those are budget-line problems for a plant manager.
The site asserts the benefit and stops. There is no before-and-after chemical spend comparison, no worker-safety or exposure framing, no note on what it means for food-contact surface validation, no side-by-side against the chlorine or quat program a plant is running today. The strongest thing you have is used as an adjective instead of an argument.
You have proof. It is for the wrong buyer, or behind a form.
I need to correct the report I was given here, because it concluded proof was absent. It is not. Verified reviews, a documented case study, and a named leadership team all exist. The problem is what they are about and where they sit.
The reviews are real. They are also all about smells in houses.
Credit where it is due, and the attached report I was given got this wrong: you do have proof. The testimonials page carries Google reviews verified through Trustindex, which is third-party attribution and worth more than typed-out quotes. Several are excellent — the real-estate professional describing dog urine odor fully removed from a rental is a genuinely persuasive piece of writing.
Every one of them is residential odor and air quality. Pet urine in a rental. A stale-smelling new apartment. Mold haze in a furnace. A house that smelled amazing afterward. Not one commercial or industrial client. Not one plant, lab, school, or clinic.
So the buyer you most want — the one on a page titled “Food Manufacturing Plant Disinfection” — scrolls to your social proof and finds eight people happy about how their houses smell. That does not build confidence for a facility decision. It actively reframes you as a home-services company.
Your only industrial case study is behind a form.
The daycare study page says “Proven Results, Backed by Data” and then asks for name and email to access the PDF. The evidence itself is not on the page.
Gating works when a prospect already believes you can do the job and wants depth. It fails when the document is the first proof that you can do the job at all. Right now the form stands between a commercial buyer and the only commercial evidence on the entire site.
Put the findings on the page as readable HTML: the facility, the problem, the protocol, the measurements before and after, the outcome. Keep a downloadable version behind the form for people who want the full write-up. You lose nothing and you stop turning away buyers who were not ready to trade contact details for a first look.
You have a named leadership team. It is marked up as three H1s.
The About page names Jason Pawelsky, Director of Business Development, and Angel Earnshaw, Head of Marketing and Operations. Real names on a real page is a trust asset, and it is not surfaced anywhere else on the site.
Two problems. Structurally, that page carries three H1 tags — the page title plus each team member’s name — which is invalid heading hierarchy. Substantively, there is no technical credential anywhere: no certifications, no industry association memberships, no training, no named operations or technical lead. For UV-C and ozone work in regulated facilities, technical credentials are the trust signal that matters most, and the “70 years of combined industry expertise” line is doing all the work by itself.
An empty stat block and a typo, both on the homepage.
The homepage renders a counter labeled “Years Experience” with no number in it. The element is there, the value is not. Twelve words later the copy claims “more than 70 years of combined industry expertise.” Put 70 in the counter or remove the counter.
In the same page, the section above “Industries We Serve” reads “Who Benifits From Our Disinfection?” It is a small thing that does specific damage here, because you are asking buyers to trust you with validated, documented, compliance-grade protocols. Precision is the product.
“Contact Us” is not an offer.
A commercial contact page already exists but is unfinished and unlinked. The homepage sends every visitor, at every stage, to the same generic form — and asks them to explain their own problem before you have shown you understand it.
The commercial intake page exists. It is unfinished and unlinked.
Another correction to the report I was handed: a commercial contact path already exists at /contact-us-commercial/. It was built. It is just not finished and not promoted.
Its title tag is “Contact Us Commercial - HS ULTRA,” which is an internal file name, not a headline. It has no H1 at all — the heading structure starts at H2. And nothing on the homepage points a commercial visitor toward it. The primary homepage call to action is “Contact Us,” which routes everyone to the same general form.
“Contact Us” asks the buyer to do the work of framing the job.
A plant manager with a listeria problem does not want to contact you. They want to know whether you have handled listeria in a facility like theirs, what the protocol involves, how long the line is down, and what documentation they get for their audit file. “Contact Us” answers none of that and puts the burden of explaining the situation on them.
Replace it with a specific offer that names the next step: Request a Facility Assessment. Then qualify in the form — company, facility type, city, square footage, the pathogen or odor concern, current sanitation program, and timeline. That form does two jobs. It makes the buyer feel understood, and it routes a real lead to a human with enough context to prepare.
Forms that fail without JavaScript, and no phone number in the markup.
Multiple pages render “Please enable JavaScript in your browser to complete this form” twice in the visible content. That string appearing in the page text means it is shipping to real visitors under some conditions, and every one of those is a lost lead with no fallback.
There is also no telephone number in the homepage structured data and none surfaced in the markup I
pulled. For urgent commercial sanitation work — a contamination event, a failed swab, an
inspection next week — the phone is the conversion path. It should be in the header, in the
footer, and in LocalBusiness schema on every page.
The numbers on this site need conditions attached.
This is the section I would act on first, ahead of any SEO work. Not because the claims are necessarily wrong, but because they are quantified, absolute, health-adjacent, and published with nothing visible behind them. Tightened correctly, they get more persuasive, not less.
“Eliminates 99% of airborne pathogens in a single pass.”
This is the sentence I would deal with before anything else on this list. It appears on /in-home-purification-system/ as “Our in-duct UV system eliminates 99% of airborne pathogens in a single pass,” and again as “With 99% pathogen kill efficiency, your home becomes a defense zone against airborne viruses and bacteria.” It repeats on /services/.
In-duct UV-C efficacy is a function of irradiance, airflow rate, and dwell time. At residential HVAC air velocities, contact time is a fraction of a second. Single-pass inactivation at that exposure varies enormously by organism, and 99 percent across “airborne pathogens” as a category is a very strong claim to make without conditions attached.
I am not telling you the claim is false. I am telling you it is unqualified, quantified, health-adjacent, and published without any visible basis — no organism named, no test standard, no lab, no airflow assumption, no third-party report. That combination is what draws scrutiny, and “defense zone against airborne viruses” pushes it further toward a health claim than a performance claim.
What I would do: get the manufacturer’s test data for the specific lamp and housing you install, then restate the claim with its conditions — the organism tested, the standard used, the airflow rate it holds at. A narrower claim you can document is worth more commercially than a broad one you cannot, because the buyer who cares about the number is the buyer who will ask for the report.
“Prevents pathogen mutation” and “zero resistance.”
The daycare study page states “Zero Residue. Zero Resistance. Our pathogen control leaves no toxic residue and prevents pathogen mutation.”
The residue half is defensible and is a real advantage of ozone and UV-C over chemical programs. The mutation half is a much bigger claim. There is a reasonable argument that oxidative and UV mechanisms present a lower resistance-selection pressure than sub-lethal chemical exposure, and that argument is worth making. “Prevents pathogen mutation” is not that argument. It states something absolute about microbial genetics that you cannot support.
Rewrite it as the mechanism claim it actually is: oxidative and UV inactivation does not select for resistance the way repeated sub-lethal chemical exposure can. Same benefit to the buyer. Defensible.
“Eliminate,” “eradicate,” and “hospital-grade.”
Across the homepage and service pages the verbs are absolute: systems that “eliminate pathogens, mold, bacteria, and odors,” treatment that “eradicates bacteria, viruses, mold, and allergens,” solutions that “effectively eliminate” the same list. The residential page also describes bringing “hospital-grade disinfection” into the home.
Disinfection is measured in log reduction against named organisms under defined conditions. It is not elimination, and the industry language for that distinction exists precisely because the difference is legally and technically meaningful. “Hospital-grade” is also a term with specific regulatory weight in some contexts and should not be used loosely.
Switch to reduction language with conditions: what organism, what log reduction, under what protocol. It sounds more competent, not less. A sanitation manager reading “eradicates all pathogens” discounts the whole page. The same manager reading a documented log-reduction figure against listeria on stainless steel takes a meeting.
Ozone safety is never addressed.
Ozone is the core of the residential offering and the site never discusses its safety profile. Ozone at disinfecting concentrations is a respiratory irritant, spaces must be unoccupied during treatment and ventilated before reentry, and there is public health guidance on ozone generators sold as air cleaners that a cautious homeowner may well find while researching you.
Not addressing it is the weaker play. A clear section — how the treatment works, why the space is vacated, how long before reentry, how you verify levels, what training the technician has — turns your biggest objection into a demonstration of competence. Silence leaves the homeowner to resolve the question on someone else’s website.
Heavy pages, broken headings, clipped URLs.
None of this is fatal and some of it is already handled well — the image layer in particular. The rest is housekeeping that compounds: page weight on mobile, heading structure crawlers rely on, and slugs that got cut off and shipped.
31 stylesheets and 39 scripts on the homepage.
The homepage loads 31 separate CSS files and 39 separate JS files, and ships 197 KB of raw HTML before a single image. The commercial services page is 224 KB. City pages run about 170 KB. For reference, a well-built page of this kind is typically 30 to 60 KB of HTML.
This is Elementor plus ElementsKit doing what those page builders do. Some of it is unavoidable without a rebuild, but a good deal is recoverable: consolidate and minify, drop widget CSS on pages that do not use the widget, and audit the plugin list for anything loading site-wide to serve one page.
The good news is that the image layer is already handled well. I counted 43 WebP references and 89 lazy-loading attributes. Someone did that work deliberately. The weight problem is code, not media.
Heading hierarchy is broken in three different ways.
The homepage runs H1, then 17 H2s, then jumps to H4, H5, and H6 with no H3 anywhere. The About page has three H1s. The commercial contact page has no H1 at all and starts at H2. Screen readers and crawlers both use heading structure to understand a page, and right now it does not describe the content on any of these three.
URL slugs that are visibly cut off.
/hospitality-disinfec/ and /processing-plant-dis/ are truncated mid-word.
They appear in 30 live URLs, in search results, and in every link anyone shares. A character limit
somewhere clipped them and nobody checked.
Fix them at the same time you consolidate the city pages, so you only handle redirects once. Do it as 301s and keep them in place permanently.
Blog volume is real. It is disconnected from the money pages.
There are 34 posts live, and several are aimed at exactly the right buyer — biofilm in food manufacturing, salmonella in food processing, FSMA compliance, the cost of pathogen outbreaks. That is genuine subject-matter content on high-intent commercial topics.
It is doing very little work because it does not connect to anything. These posts should link directly into the matching service page and the facility assessment form, and the service pages should link back out to them as supporting evidence. Right now the library sits parallel to the sales path instead of feeding it.
In the order I would actually do it.
Sequenced by return per hour, not by severity. Phase 01 is a single working day and recovers the most ground. Phase 03 is where commercial conversion actually changes.
Stop the waste.
Week 1- Fix the Yoast title template on the city post types so titles output service plus city. One setting, 105 pages.
- Pull the “99% of airborne pathogens in a single pass” claim until you have the lamp test data in hand to restate it with conditions.
- Rewrite “prevents pathogen mutation” as the resistance-selection argument.
- Fix “Benifits” on the homepage.
- Put 70 in the “Years Experience” counter or delete the block.
- Add the
Sitemap:line to robots.txt pointing at/sitemap_index.xml. - Give
/contact-us-commercial/an H1 and a real title tag.
Fix the foundation.
Weeks 2–6- Decide the city-page strategy: keep and differentiate the six to eight combinations you can actually service, 301 the rest to parent service pages.
- Write 300-plus words of genuinely local content for every page you keep. Named facilities, a local job, drive time, county inspection context.
- Add
LocalBusinessandServiceschema sitewide with address, phone, andareaServed. Retype the homepage offArticle. - Add
aggregateRatingmarkup to claim the reviews you have already earned. - Write meta descriptions for every page you keep.
- Ungate the daycare study. Full findings on the page, PDF behind the form.
- Replace “Contact Us” with “Request a Facility Assessment” and build the qualifying form.
- Rebuild the homepage for a commercial buyer. Give residential its own clear entry point.
- State one service-area model plainly and make every page agree with it.
Build the proof engine.
Months 2–4- Get three commercial testimonials on record. Named person, named facility type, specific outcome. This is the single highest-value asset missing from the site.
- Document two industrial case studies to the standard of the daycare study: facility, problem, protocol, measurements, result.
- Publish technical credentials. Certifications, training, association memberships, a named technical lead.
- Build the chemical-free business case as a real page: chemical spend, worker exposure, residue and validation, resistance, disposal, downtime.
- Add the ozone safety and protocol page. Turn the objection into a competence signal.
- Wire the 34 blog posts into their matching service pages and the assessment form, both directions.
- Consolidate CSS and JS, and audit the plugin list for sitewide loads serving single pages.
- Fix the truncated slugs with 301s while the redirect work is already open.