Site scan

boyceheating.com

An automated scan of the homepage, the sitemap and a handful of key pages. Everything below came from actual fetches of this site - nothing here is estimated, and what a scan cannot see is named rather than guessed at.

Overall

38/100

Poor · fetched https://www.boyceheating.com/

Why the score is capped

  • Score capped: indexable junk pages are in the sitemap.
  • Score capped: the business schema is missing its name, street address or phone.
  • 2 hard fails cap the overall at 38 (40, minus 2 for each fail after the first).
  • Local capped at 35: no LocalBusiness schema with complete NAP.
Time to first byte
687 ms
HTML transferred
28 KB
What the scan found

Technical

46/100 · Weak
  • FAIL: 1 junk URL in the XML sitemap: coming-soon stub (/blog/new-website-and-blog-coming-soon). Fetched and confirmed indexable (no noindex): /blog/new-website-and-blog-coming-soon.
  • 8 render-blocking stylesheets in <head> - nothing paints until they load.
  • 27 blocking scripts in <head> with no async or defer.
  • 32 of 32 images have no width/height, so the page shifts as they load.
  • A Canadian business declared as US English (lang="en-US", og:locale -); en-CA fits.

How this was measured - The homepage response, robots.txt, the XML sitemap (index plus up to five child sitemaps), and a sample of up to four junk URLs fetched to read their robots meta and X-Robots-Tag. Junk is judged by URL pattern (default posts, -old copies, author and tag archives, uncategorized archives, cart/checkout/account, thank-you pages, coming-soon and email-signature stubs, lorem ipsum and testimonial post types). A sitemap the scan could not fetch is inconclusive, not a pass. Page weight: One HTML response (plus a HEAD probe when the GET loses Content-Encoding). Transfer size is the compressed weight when Content-Encoding is visible (or a gzip estimate when that size is unknown). The uncompressed finding only fires when Content-Encoding is visible and is not gzip/br/zstd — platforms that strip encoding after decompress are treated as inconclusive, not as a fail. Uncompressed markup is reported alongside and only flagged when extreme. Scripts, images and CSS linked from the page are not downloaded.

On-page

87/100 · Solid
  • Title tag is 13 characters ("Boyce Heating"). 15-65 reads best in results.
  • No meta description, so Google writes its own snippet.
  • More than one H1 on homepage (4), /furnace-service (2), /maintenance-plans (2), /new-furnace-installation (2) and 3 more.

How this was measured - The homepage plus up to six key pages linked from its navigation (contact, about, services, locations, pricing or membership, then city or service pages). Each is checked for exactly one H1 that is more than the brand name, a title that still names a city or a service once the brand is removed, and word count. Image alt text is read on the homepage. Pages that could not be fetched are left out rather than counted as passing.

Local

35/100 · Poor
  • FAIL: LocalBusiness is missing telephone (the phone is visible on the page but not in schema).
  • Schema is missing geo and sameAs.
  • No Google Maps link or embed, a common local trust and relevance signal.

Capped at 35: no LocalBusiness schema with complete NAP.

How this was measured - Cities are read from visible text on the fetched pages (addresses, '<City> location', 'locations in ...', service-area statements) and from schema addressLocality and areaServed. A dedicated city page means a URL in the sitemap or navigation whose path names the city (product, blog and archive URLs do not count). Schema is every JSON-LD block on the homepage; NAP means name, telephone, and either a matching PostalAddress street (when a street is visible on the pages) or areaServed / locality on a LocalBusiness-type node when no street is shown (service-area-only). Storefronts with a visible street still need that street in schema. This scan cannot see a Google Business Profile.

Mobilesecondary

75/100 · Workable
  • 32 images and no srcset - phones download desktop-sized files.

Conversionsecondary

80/100 · Solid
  • No online booking or scheduling link, so every lead waits on a callback.
  • Enquiry path found via link (/contact-us), not a form on this page.

How this was measured - One HTML response. A <form> on that page scores highest for the enquiry path; same-site contact, booking, quote or referral links, and recognised booking providers, count as a pass but the linked page itself is not fetched. Tel and mailto links are read from hrefs only.

Privacy & consentsecondary

56/100 · Weak
  • a generic cookie banner is present, but the tracking scripts are not marked as blocked in the markup - a banner that appears after the trackers have already loaded does not record consent, it announces it.
  • No link to a privacy policy anywhere on the page.
  • Trackers or cookies are in use but there is no cookie policy linked, so a visitor cannot find out what is set or how to refuse it.
  • No terms of use or terms of service linked.

How this was measured - Checked by fetching the page once, server-side, without running JavaScript: which tracking scripts are in the markup, whether a consent tool is present and actually gating them, which cookies the server set on that first response, and which policy pages are linked. Cookies set later by JavaScript are not visible to this scan. These are observations about a single response, not legal advice.

What is already fine

Table stakes. They are reported here and carry almost no weight, so they cannot lift the score past a cap.

  • XML sitemap found (/sitemap.xml, 96 URLs read).
  • robots.txt present.
  • Served over HTTPS.
  • HSTS header set.
  • HTML is compressed (gzip).
  • Canonical tag present.
  • Homepage is indexable.
  • JSON-LD present (WebSite, Organization, LocalBusiness).
  • <html lang="en-US">.
  • Server responded in 687 ms (first byte).
Every check
Show every check (54) with weights and evidence
CheckResultWeightWhat was found
Index hygiene (junk URLs)technical · hard failFail241 junk URL in the XML sitemap: coming-soon stub (/blog/new-website-and-blog-coming-soon). Fetched and confirmed indexable (no noindex): /blog/new-website-and-blog-coming-soon.
  • https://www.boyceheating.com/blog/new-website-and-blog-coming-soon [coming-soon stub; in sitemap]
  • https://www.boyceheating.com/blog/new-website-and-blog-coming-soon [indexable]
XML sitemaptechnical · floorPass2XML sitemap found (/sitemap.xml, 96 URLs read).
  • https://www.boyceheating.com/sitemap.xml
robots.txttechnical · floorPass1robots.txt present.
HTTPStechnical · floorPass2Served over HTTPS.
HSTStechnical · floorPass1HSTS header set.
Compressiontechnical · floorPass2HTML is compressed (gzip).
Canonical tagtechnical · floorPass2Canonical tag present.
Homepage indexabletechnical · floorPass2Homepage is indexable.
Server response timetechnical · issuePass3Server responded in 687 ms (first byte).
HTML transfer sizetechnical · issuePass4HTML is 28 KB transferred, 178 KB uncompressed. Under 100 KB transferred is healthy.
Uncompressed markuptechnical · issuePass2Uncompressed HTML is 178 KB. Over 1 MB of markup is extreme even when the transfer compresses well.
Scripts and stylesheetstechnical · issuePass5The homepage loads 32 scripts and 8 stylesheets (178 KB HTML). Over 40 files is page-builder weight.
Render-blocking CSStechnical · issueFail38 render-blocking stylesheets in <head> - nothing paints until they load.
Blocking scriptstechnical · issueFail327 blocking scripts in <head> with no async or defer.
Image dimensionstechnical · issueFail232 of 32 images have no width/height, so the page shifts as they load.
Single viewport tagtechnical · minorPass11 viewport meta tags on the homepage; there should be one.
Language / localetechnical · minorFail1A Canadian business declared as US English (lang="en-US", og:locale -); en-CA fits.
Comments feedtechnical · minorPass1No comments feed advertised.
One real H1 per key pageonpage · hard failPass22Every page checked (7) has a real H1.
  • https://www.boyceheating.com/ [H1: "" | "Boyce Heating & Air Conditioning" | "Our Suppliers" | "Testimonials"]
  • https://www.boyceheating.com/furnace-service [H1: "" | "Furnace Service, Maintenance & Repair"]
  • https://www.boyceheating.com/maintenance-plans [H1: "" | "HOME MAINTENANCE PLANS"]
  • https://www.boyceheating.com/new-furnace-installation [H1: "" | "New Furnace Installation"]
  • https://www.boyceheating.com/air-conditioning-service [H1: "" | "Service, Maintenance, Repair"]
  • https://www.boyceheating.com/duct-cleaning [H1: "" | "DUCT CLEANING SERVICES"]
  • https://www.boyceheating.com/electronic-air-cleaners [H1: "" | "Electronic Air Cleaners"]
No duplicate H1sonpage · minorFail2More than one H1 on homepage (4), /furnace-service (2), /maintenance-plans (2), /new-furnace-installation (2) and 3 more.
Titles name a city or serviceonpage · hard failPass16Key page titles name a city or a service.
  • https://www.boyceheating.com/furnace-service [title: "Furnace Repair Calgary | Furnace Service Calgary - Boyce Heating"; ok]
  • https://www.boyceheating.com/maintenance-plans [title: "Home Maintenance Plans - Boyce Heating"; ok]
  • https://www.boyceheating.com/new-furnace-installation [title: "High-Efficiency Furnaces Calgary | New Furnace Calgary | Furnace Replacement - Boyce Heating"; ok]
  • https://www.boyceheating.com/air-conditioning-service [title: "Cooling Systems Calgary | Air Conditioning Repair & Maintenance Calgary - Boyce Heating"; ok]
  • https://www.boyceheating.com/duct-cleaning [title: "Duct Cleaning | Duct Cleaning Calgary - Boyce Heating"; ok]
  • https://www.boyceheating.com/electronic-air-cleaners [title: "Electronic Air Cleaner Calgary | HEPA Filters Calgary - Boyce Heating"; ok]
Image alt textonpage · issuePass102 of 32 images on the homepage have empty or missing alt text.
Homepage title lengthonpage · issueFail3Title tag is 13 characters ("Boyce Heating"). 15-65 reads best in results.
Meta descriptiononpage · issueFail3No meta description, so Google writes its own snippet.
Content depth on key pagesonpage · issuePass4Key pages carry real copy (1079, 331, 1194, 357, 339, 478, 319 words).
  • https://www.boyceheating.com/ [1079 words]
  • https://www.boyceheating.com/furnace-service [331 words]
  • https://www.boyceheating.com/maintenance-plans [1194 words]
  • https://www.boyceheating.com/new-furnace-installation [357 words]
  • https://www.boyceheating.com/air-conditioning-service [339 words]
  • https://www.boyceheating.com/duct-cleaning [478 words]
  • https://www.boyceheating.com/electronic-air-cleaners [319 words]
Structured data presentonpage · floorPass2JSON-LD present (WebSite, Organization, LocalBusiness).
lang attributeonpage · floorPass1<html lang="en-US">.
Dedicated city / location pageslocal · hard failPass22City pages cover the service area (no page yet for Airdrie).
  • Airdrie -> no dedicated URL
  • Calgary -> https://www.boyceheating.com/furnace-service
Street address for every locationlocal · issuePass8Street address shown for Airdrie.
  • Airdrie: street address found
LocalBusiness-type schemalocal · hard failPass14Business schema found: LocalBusiness.
  • WebSite
  • Organization
  • LocalBusiness
NAP inside schemalocal · hard failFail12LocalBusiness is missing telephone (the phone is visible on the page but not in schema).
  • visible phones: 4032305248, 4039125100
  • visible street: yes
  • schema node: name="Boyce Heating 2006 Ltd." tel="" street="147 Woodside Crescent Northwest Airdrie Canada" locality="" areaServed=""
Hours, geo and sameAs in schemalocal · issueFail4Schema is missing geo and sameAs.
Phone and address visible on the sitelocal · issuePass5Phone and street address are visible on the page.
Tap-to-call linklocal · issuePass3Tap-to-call tel: link present.
Opening hours on the pagelocal · issuePass3Opening hours appear on the pages checked.
Map link or embedlocal · minorFail2No Google Maps link or embed, a common local trust and relevance signal.
Viewport tagmobile · issuePass1Viewport tag: passed.
Pinch-zoom allowedmobile · issuePass1Pinch-zoom allowed: passed.
Responsive imagesmobile · issueFail132 images and no srcset - phones download desktop-sized files.
No Not Secure warningmobile · issuePass1No Not Secure warning: passed.
Clickable phonecvr · issuePass1Clickable phone: passed.
Enquiry pathcvr · issuePass1Enquiry path found via link (/contact-us), not a form on this page.
Online bookingcvr · issueFail1No online booking or scheduling link, so every lead waits on a callback.
Any way to make contactcvr · issuePass1Any way to make contact: passed.
Share previewcvr · issuePass1Share preview: passed.
Privacy check 1privacy · issuePass1Privacy check 1: passed.
Privacy check 2privacy · issueFail1a generic cookie banner is present, but the tracking scripts are not marked as blocked in the markup - a banner that appears after the trackers have already loaded does not record consent, it announces it.
Privacy check 3privacy · issuePass1Privacy check 3: passed.
Privacy check 4privacy · issueFail1No link to a privacy policy anywhere on the page.
Privacy check 5privacy · issueFail1Trackers or cookies are in use but there is no cookie policy linked, so a visitor cannot find out what is set or how to refuse it.
Privacy check 6privacy · issueFail1No terms of use or terms of service linked.
Privacy check 7privacy · issuePass1Privacy check 7: passed.
Privacy check 8privacy · issuePass1Privacy check 8: passed.
Privacy check 9privacy · issuePass1Privacy check 9: passed.
What this scan cannot see

About twenty requests: the homepage, robots.txt, the sitemap, up to six key pages and a few sample URLs. It does not measure what real visitors experience on their own phones, it cannot check tap targets or anything that depends on rendering, and it knows nothing about a Google Business Profile, review velocity, citations or search positions. Those often decide whether a local business gets calls, and none of them are in the numbers above.

Compare

Side-by-side with another host — same checker, hard-fail deltas only, no ranking language. Curated live comparisons

If you want the rest

The half a scan cannot reach.

A thirty-minute call covers what this page could not: the profile, the pack, what the site actually ranks for, and where enquiries are being lost between the page and the phone. No deck and no pitch - if there is nothing worth fixing we say so.

Bring your site. Leave with a plan.

A free 30-minute call with the founder. We review your site and your local market, then tell you straight what will bring in more work.

  • A read of your current site and your local market
  • A straight answer: a new site, SEO, or nothing yet
  • The audit doc before the call, not after
JJ Wardorx, founder of WARDORXYou talk to JJ WardorxFounder, WARDORX · CalgaryMeet the team

Book a call · 30 min

Live availability

Times shown in your local zone.

Free 30-minute call

Book your free site review

You talk to the founder. We look at your current site and your market, then tell you straight what would bring in more work. No obligation.

Read our Google reviews

Choose your field

What kind of business do you run?

Pick yours to see how we build the site and the search work for it.