This is an example. Example Roofing Co is not a real business.It is the document a real customer gets, written out for a company we invented, so we can show it without publishing somebody's problems. The findings are the ones we see most often.

BBA Network · Online presence audit

Example Roofing Co

We measure the live site rather than glance at it. This is what that comes back looking like.

8.4 sBefore anything appears on a phone
0Estimate requests the form has delivered
6 moGoogle has said you are closed
16Findings, 4 of them critical

The short version

Read this and nothing else.

The site is not badly designed. Somebody took real care with the photographs and the writing, the work page is genuinely persuasive, and none of what follows requires replacing it.

What it has is four faults that are costing money today, and they compound. Google has been telling people you are permanently closed since March, so most searches end before your site is involved. The ones that get through wait 8.4 seconds on a phone for a page carrying 31 megabytes of photographs. Whoever survives that finds a phone number saved as a picture, which does nothing when tapped. And anyone patient enough to fill the estimate form in gets a thank-you message from a form that has not delivered anything since at least June.

Fix those four in the order they are listed and the rest of this document becomes worth doing. Fix the rest first and you are improving a page almost nobody reaches. Our recommendation is a repair pass, not a rebuild, and the measurement work in the high-impact section before anything else — because without it, nobody can prove any of this worked.

On a real audit, everything below is measured against the live site by our own tools and by Google's, from a clean machine, and where we could not check something it is listed at the bottom rather than guessed at. This one is written to the same standard against a site that does not exist, so the evidence lines show you the shape of the proof rather than proving anything.

Critical

Costing you customers right now, or making the business look less trustworthy than it is. Fix these first.

01
Critical

Your phone number is a picture, so nobody can tap it

The problem

The number in your header is part of a graphic — the same image file on all seven pages. There is no text version of it anywhere on the site, and no tel: link. On a phone, tapping it does nothing at all.

Why it matters

Nine out of ten people who look you up are on a phone, and a roofing enquiry is usually made standing outside looking at the problem. Somebody in that position does not write your number down. They tap it, and if nothing happens they go back to the search results, which is a page full of your competitors. It also means the number is invisible to Google, to screen readers, and to anyone who copies and pastes.

What we recommend

Put the number in as text with a tel: link, in the header of every page, and keep the graphic behind it if you like the look. Then use the same number everywhere else — the Google listing, Facebook, the estimate form's confirmation — so there is exactly one number to change if it ever does.

How we’d do it

One line of HTML per page, plus a rule so it stays legible on a small screen. An hour, including checking it dials correctly on both an iPhone and an Android.

What we measured 4
  • Every page carries <img src="/img/header-phone.png" alt=""> and no text phone number. Collected 2026-09-06.
  • grep for tel: across all seven pages returns nothing.
  • The alt attribute is empty, so the number is not even readable to a screen reader or a search engine.
  • The Google listing does carry a tappable number, which is why the calls you get come through Maps rather than the site.
02
Critical

The estimate form has been posting into nothing since at least June

The problem

The form on /free-estimate submits to sendmail.php, and that file returns a 500 error. The page still shows "Thanks, we'll be in touch" afterwards, because the message is written by the browser before the server has answered. So the customer believes they have contacted you, and nothing arrives.

Why it matters

This is the most expensive thing on this page and it is not close. Every one of these is somebody who chose you, typed their details in, and then heard nothing — so they either rang a competitor or told people you never got back to them. It is worse than having no form at all, because a missing form sends them to the phone.

What we recommend

Fix the delivery, then prove it: send every submission into a database you own as well as to your inbox, so a broken mail server can never again mean a lost enquiry. Add a real confirmation page that only appears once the server has actually accepted it.

How we’d do it

The form itself is fine; it is the handler that is dead. Rebuilding it to write to a database and email you takes half a day. We would send a test enquiry from outside your network and show you it arriving before calling it done.

What we measured 4
  • POST to https://example-roofing.test/sendmail.php returned 500 Internal Server Error, three attempts, 2026-09-06.
  • The success message is set by inline JavaScript on submit and does not check the response.
  • The page's own HTML comment reads <!-- TODO: new host, check mail -->, dated in the file's last-modified header as 11 June 2026.
  • How long it has actually been broken is not something we can see from outside. June is the earliest we can prove.
03
Critical

Google has said you are permanently closed since March

The problem

Your Google Business Profile carries the "Permanently closed" flag. Search your own company name and that label sits above everything else, greyed out, before anyone reaches your website at all.

Why it matters

Most people looking for a roofer never visit a website — they search, they read the Maps card, and they tap call. A closed label ends that journey before your site is involved, and it takes your listing out of the map results for "roofer near me" entirely. Your 63 reviews are doing nothing while it is set.

What we recommend

Claim the profile and reopen it. Then check the hours, the service area, the phone number and the website link at the same time, because a listing that has been wrong for six months is usually wrong in more than one way.

How we’d do it

It is a form, and the review takes a few days rather than minutes. We would do it with you rather than for you — Google wants the owner — and we would re-run this audit afterwards to prove the listing came back.

What we measured 4
  • The Business Profile card shows Permanently closed as of 2026-09-06.
  • The reviews on the profile continue to 2026-08, so the business is plainly trading — the flag is wrong, not late.
  • Who set it, and when exactly, is not visible from outside the account. March is what the profile's own edit history shows to the public.
  • The same listing carries a phone number that matches the site's graphic, so the number itself is right.
04
Critical

The home page takes 8.4 seconds to appear on a phone

The problem

On a mid-range Android on a normal mobile connection, the page is blank for 8.4 seconds before anything readable appears. The cause is twenty-two photographs loaded at full camera resolution — 31 MB of images on the first screen, resized by the browser to thumbnails.

Why it matters

Roughly half of visitors abandon a page that takes more than four seconds, and the ones who leave are disproportionately the ones on a phone in a driveway — which is your buying customer. It is also a ranking signal, so the slow page is both losing the people who arrive and reducing how many arrive.

What we recommend

Resize the photographs to the size they are actually displayed at, save them in a modern format, and load the ones below the fold only when someone scrolls to them. Nothing about the design has to change.

How we’d do it

This is a processing job, not a redesign — a script over the image folder and one attribute on each tag. A day, and it is the single biggest measurable improvement available on the site.

What we measured 4
  • Measured 2026-09-06 on a throttled connection (Slow 4G, 4x CPU slowdown): first contentful paint 8.4s, largest contentful paint 11.2s.
  • Twenty-two images on the home page total 31.4 MB transferred. The largest single file is roof-after-3.jpg at 4.1 MB, displayed at 380 pixels wide.
  • The same page measured 1.9s on a desktop connection, which is why this has probably never been noticed from the office.
  • No loading="lazy" attribute appears anywhere on the site.

High impact

Nothing is on fire. These are the biggest wins available.

05
High impact

Sixty-three reviews, and not one of them on your website

The problem

The site has no reviews, no ratings, no customer names and no photographs of finished jobs with a comment attached. Your Google profile has 63 reviews averaging 4.8, and a visitor to the website would never learn that.

Why it matters

Choosing a roofer is a trust decision made by a stranger about a large sum of money. Reviews are the strongest thing you have and they are sitting on a page most visitors never open. Putting them on the site does not cost anything — you already earned them.

What we recommend

Pull the reviews onto the site and keep them current, then add a one-tap way to ask for new ones after each job so the number keeps moving instead of stalling.

How we’d do it

A reviews section on the home page and one under each service. The asking part is a product we have already built — see the product-fit document — and it is what keeps this from being a one-off.

What we measured 3
  • The Google profile shows 63 reviews, 4.8 average, most recent 2026-08-24. Read 2026-09-06.
  • No occurrence of the words review, rating, testimonial or a star glyph anywhere in the site's HTML.
  • Six of the eight competitors we looked at in the same towns show reviews on their home page.
06
High impact

Every page on the site is called the same thing

The problem

All seven pages carry the identical browser title — the company name and nothing else. The storm damage page, the gutters page and the contact page are all titled the same as the home page.

Why it matters

The title is the blue line somebody clicks in Google, and it is the strongest signal about what a page is for. Seven identical titles means Google has almost nothing to distinguish them, so it shows one page for everything and the specific pages never surface for the specific searches — which are the searches with intent behind them.

What we recommend

Give every page a title that says what it is and where you work, in the words a customer types. "Roof replacement in Fairfax County" rather than the company name repeated.

How we’d do it

Seven lines. An hour including writing them properly, and it is the cheapest visibility work available on this site.

What we measured 3
  • All seven pages return <title>Example Roofing Co</title>, byte for byte identical. Collected 2026-09-06.
  • Search Console is not connected to this site, so what those pages currently rank for cannot be checked from outside.
  • The pages themselves have distinct, useful content — this is a labelling problem, not a content problem.
07
High impact

Nothing on the site says where you work

The problem

There is no address, no list of towns, and no service area on any page. The only geographic clue is a photograph caption that mentions Burke.

Why it matters

Somebody in Annandale deciding whether you cover them cannot find out without ringing, and most will not ring. Search engines have the same problem: with no location signal they will not put you in the local results for the towns around you, which is where roofing work is found.

What we recommend

Put the service area on every page in the footer, and give the main towns a page each that genuinely differs — the kind of roofs there, jobs you have done, how far you travel.

How we’d do it

The footer is one change. The town pages are a small piece of writing per town and worth doing properly or not at all; done as a template with the name swapped, search engines treat it as spam and it does more harm than nothing.

What we measured 3
  • No postal address, LocalBusiness markup or town list appears in the HTML of any page. Collected 2026-09-06.
  • The Google listing does carry a service area, so this information exists — it is just not on the site.
  • The word Burke appears once, in an image caption on /our-work.
08
High impact

Forty photographs with no description on them

The problem

Forty of the forty-four images on the site have an empty or missing alt attribute, including every before-and-after on the work page. Four have descriptions, and all four say "image".

Why it matters

Your work photographs are the best sales material you have, and to a search engine they are currently blank rectangles. They also cannot be read by anyone using a screen reader, which is both a lost customer and, for a business selling to the public, a legal exposure worth avoiding cheaply.

What we recommend

Write a real description on each one — what the job was, what was done, roughly where. It doubles as the caption a visitor would want anyway.

How we’d do it

Forty short sentences. Half a day, and it can be done alongside the resizing job in the finding above since both touch the same files.

What we measured 3
  • 44 <img> tags across the site; 40 have alt="" or no alt attribute. Four use alt="image". Collected 2026-09-06.
  • This includes all eighteen before-and-after photographs on /our-work.
  • Alt text is also what shows if an image fails to load, which on this site happens often given the file sizes.
09
High impact

Nothing on the site measures anything

The problem

There is no analytics of any kind installed — no Google Analytics, no tag manager, nothing. There is also no Search Console property for the domain.

Why it matters

It means nobody can answer the questions that decide where money goes: which pages bring in estimate requests, what people searched for to arrive, how many people abandoned the eight-second home page. Every decision about the site is currently a guess, including the decision about whether any fix worked.

What we recommend

Install measurement, and record the events that matter to this business rather than page views — a tap on the phone number, an estimate form started, an estimate form sent. Then connect Search Console so the search terms become visible.

How we’d do it

About half a day. Search Console is free and needs one DNS record. The numbers only become useful after a fortnight of collection, which is why this is worth doing before the rest rather than after.

What we measured 3
  • No analytics script of any kind found in the HTML of any page. Collected 2026-09-06.
  • No google-site-verification meta tag, so no Search Console property is attached to this domain.
  • Whether analytics existed on a previous version of the site is not something we can see from outside.

Medium

Worth doing. None of them changes a month on its own.

10
Medium

The insecure version of your site still answers

The problem

The certificate is valid and https works. But the plain http address answers too, with the same pages, instead of redirecting. Both versions are reachable and neither points at the other.

Why it matters

A browser will warn some visitors that the page is not secure, on the page where they are about to type their name, address and phone number. Search engines also treat the two addresses as two different sites and split the credit between them.

What we recommend

Redirect every http request to https permanently, and tell the browser to remember it.

How we’d do it

A few lines of server configuration and one header. An hour including checking every page still resolves.

What we measured 3
  • http://example-roofing.test/ returned 200 OK with full page content rather than a redirect. Collected 2026-09-06.
  • The certificate itself is valid to 2027-01 and correctly configured.
  • No Strict-Transport-Security header is sent.
11
Medium

Your server tells anyone who asks exactly what it is running

The problem

The site sends headers naming the web server software and its exact version number, and the same information appears again in the error pages.

Why it matters

It is not a hole on its own. It is a shortcut for anyone scanning for sites running a version with a known problem — they do not have to probe, the site volunteers it. Small business sites get scanned constantly and automatically, and the ones that answer questions get looked at more closely.

What we recommend

Stop sending the version. Then add the handful of standard security headers this site is missing while the file is open.

How we’d do it

One configuration change and four headers. An hour. We run the same check on our own sites, and would re-run it on yours afterwards to show the difference.

What we measured 4
  • Response header Server: names the software and a full version number on every request. Collected 2026-09-06.
  • The default error page repeats it at the bottom.
  • Content-Security-Policy, X-Content-Type-Options and Referrer-Policy are all absent.
  • No attempt was made to test whether that version is actually vulnerable — that would be an attack on your site, not an audit of it.
13
Medium

Search engines are finding your pages by accident

The problem

There is no sitemap and no robots file. Search engines are discovering pages only by following links from the home page, and two pages are not linked from anywhere.

Why it matters

The two unlinked pages — storm damage and gutters — are effectively invisible, and storm damage is the page most likely to be searched for the week after bad weather. Everything else is being found slowly and re-checked less often than it could be.

What we recommend

Publish a sitemap listing every page, add a robots file that points at it, and submit it once Search Console is connected.

How we’d do it

Generated rather than written by hand, so it stays right when a page is added. An hour, and it pairs with the measurement work above.

What we measured 3
  • /sitemap.xml and /robots.txt both return 404. Collected 2026-09-06.
  • /storm-damage and /gutters are reachable directly but are not linked from any other page on the site.
  • Whether search engines have indexed them anyway cannot be confirmed without Search Console.

Nice to have

Real, small, and safe to leave until later.

15
Nice to have

The site has no icon, so it is a blank square in a list of tabs

The problem

There is no favicon. Browsers show a generic placeholder in the tab, in bookmarks and in the phone's history list.

Why it matters

Small, and free. Somebody comparing three roofers has three tabs open, and yours is the unlabelled one.

What we recommend

Add an icon in the sizes browsers and phones actually ask for.

How we’d do it

Half an hour if a logo file exists in a usable size.

What we measured 1
  • /favicon.ico returns 404 and no <link rel="icon"> appears in any page. Collected 2026-09-06.
16
Nice to have

There is no way to arrange anything outside office hours

The problem

The only routes to you are the phone number (which is a picture) and the estimate form (which is broken). Neither offers a time, and there is nothing that works while the office is shut.

Why it matters

It is last on this list because the two things above it have to be fixed before it means anything — a booking page behind a broken form helps nobody. Once they are working, this is the gap worth closing next, and the site's own traffic pattern is the argument for it.

What we recommend

Let somebody pick a slot for a free estimate themselves, and hold the diary in one place so two people cannot take the same morning.

How we’d do it

Something we have already built and would make yours. It is in the product-fit document rather than costed here, because it is new work rather than a repair.

What we measured 2
  • No booking, scheduling or calendar functionality of any kind appears on the site. Collected 2026-09-06.
  • Without analytics installed, the after-hours traffic pattern that would justify this cannot be measured yet. That is the finding above, and it comes first.

What this audit does not cover

The edges of the work, stated rather than glossed over.