<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LeadReef Dev</title>
    <description>The latest articles on DEV Community by LeadReef Dev (@leadreef_ai).</description>
    <link>https://dev.to/leadreef_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4221175%2F71498492-c4de-4f2e-ae40-df6bbf03c611.png</url>
      <title>DEV Community: LeadReef Dev</title>
      <link>https://dev.to/leadreef_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leadreef_ai"/>
    <language>en</language>
    <item>
      <title>Build a mobile-first homepage for a local business in one afternoon</title>
      <dc:creator>LeadReef Dev</dc:creator>
      <pubDate>Tue, 03 Nov 2026 13:29:31 +0000</pubDate>
      <link>https://dev.to/leadreef_ai/build-a-mobile-first-homepage-for-a-local-business-in-one-afternoon-mlh</link>
      <guid>https://dev.to/leadreef_ai/build-a-mobile-first-homepage-for-a-local-business-in-one-afternoon-mlh</guid>
      <description>&lt;p&gt;Most local business homepages we look at were designed on a 27-inch monitor and then squeezed onto a phone. The hero slider shrinks to a strip, the phone number sits in a footer nobody scrolls to, and the "Book now" button is a 30-pixel link in a hamburger menu.&lt;/p&gt;

&lt;p&gt;That is backwards for this kind of site. People find a plumber, a dentist or a nail salon on their phone, usually with a specific job in mind: call, book, or check whether the place is any good. Google also treats the phone version as the real one. Its documentation says plainly that it "uses the mobile version of a site's content, crawled with the smartphone agent, for indexing and ranking."&lt;/p&gt;

&lt;p&gt;So here is the template we keep coming back to when we sketch a homepage for a local service business. It is plain HTML and CSS, no framework, and you can get a solid first version done in an afternoon. The examples use a fictional plumbing company so the code has something concrete to hold onto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl965ojgbcybdxncu50nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl965ojgbcybdxncu50nx.png" alt="Diagram of a mobile homepage for a fictional plumbing company, with each block labeled: header with call button, hero with one promise, booking button, trust strip, reviews, services, sticky call bar" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The afternoon, roughly
&lt;/h2&gt;

&lt;p&gt;You won't hit these times exactly, but this is the order that keeps you from polishing a footer while the hero is still empty.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Block&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;What "done" looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Content gathering&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;td&gt;Phone, hours, service area, 3 to 5 services, real reviews with permission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header + hero&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;td&gt;Name, one-line promise, call and book buttons visible without scrolling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust + reviews&lt;/td&gt;
&lt;td&gt;40 min&lt;/td&gt;
&lt;td&gt;Licence/insurance line, 2 or 3 real reviews, link to the full review profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services + area&lt;/td&gt;
&lt;td&gt;40 min&lt;/td&gt;
&lt;td&gt;Short cards, each with a price hint or "from" price if the owner agrees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Footer + sticky bar&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Address, hours, map link, tap-to-call bar on small screens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance pass&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Hero image sized, fonts trimmed, Lighthouse run on mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first row is the one people skip. If you start coding before you have the real phone number, the real hours and at least two reviews you are allowed to quote, you end up with lorem ipsum in production. Ask the owner for those first, by text if that is how they like to talk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Above the fold: four things, nothing else
&lt;/h2&gt;

&lt;p&gt;On a typical phone screen you have room for about four things before the visitor has to scroll. For a local service business we use them like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The business name and a call button&lt;/strong&gt; in the header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One sentence&lt;/strong&gt; that says what they do and where. "Emergency plumbing in North Austin, same-day visits" beats "Quality You Can Trust."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A primary action&lt;/strong&gt;: book online, request a quote, or call. Pick the one the owner actually answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A trust signal&lt;/strong&gt; you can verify: years in business, licence number, or a review count that links to the source.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What we leave out: sliders, autoplay video, a newsletter popup, and a mission statement. None of them help someone with a leaking water heater.&lt;/p&gt;

&lt;p&gt;Here is the skeleton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Harbor Lane Plumbing | Same-day plumbing in North Austin&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Licensed plumbers in North Austin. Same-day visits, upfront pricing. Call 512-555-0142."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/css/site.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"top"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"brand"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Harbor Lane Plumbing&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-call"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"tel:+15125550142"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Call&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Same-day plumbing in North Austin&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Leaks, water heaters, drains. Licensed, insured, upfront prices.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/book"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Book a visit&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-ghost"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"tel:+15125550142"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;512-555-0142&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"trust"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Licence #M-00000 (example) · Open Mon to Sat, 7am to 7pm&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- reviews, services, area, footer --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Harbor Lane Plumbing is a fictional example. The number uses the 555-01xx range reserved for fiction.)&lt;/p&gt;

&lt;p&gt;Two details matter more than they look. The viewport meta tag is what stops a phone from rendering the page at desktop width and zooming out. And the &lt;code&gt;tel:&lt;/code&gt; link should use the full international format, so it dials correctly no matter how the visible text is formatted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tap targets that thumbs can hit
&lt;/h2&gt;

&lt;p&gt;Buttons on these sites are often styled links with 14px text and no padding. web.dev's guidance on tap targets suggests a minimum of "around 48 device independent pixels", spaced about 8 pixels apart. WCAG 2.2 sets a lower floor of 24 by 24 CSS pixels at Level AA. We aim for 48 and treat 24 as the line you never cross.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#0f5c8c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--ink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#14212b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apple-system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;"Segoe UI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Roboto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--ink&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline-flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;48px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.btn-ghost&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="l"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.actions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;flex-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.actions&lt;/span&gt; &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;160px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system font stack is deliberate. Body text in the phone's own font loads instantly and looks native. If the owner insists on a brand font, use it for headings only and load one weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sticky call bar
&lt;/h2&gt;

&lt;p&gt;For trades and emergency services, a bar pinned to the bottom of the screen with "Call" and "Book" gets used. Show it only on narrow screens, and add bottom padding to the page so it never covers the footer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.callbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;640px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.callbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe-area-inset-bottom&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;-2px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="nf"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;env(safe-area-inset-bottom)&lt;/code&gt; part keeps the buttons above the home indicator on iPhones. For it to return a value, add &lt;code&gt;viewport-fit=cover&lt;/code&gt; to the viewport meta tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  The booking button: link to what they already use
&lt;/h2&gt;

&lt;p&gt;Don't build a booking system. Most local businesses already have something: a scheduling tool, a form that emails the front desk, or a phone. Ask which one actually gets answered, and link the button to that.&lt;/p&gt;

&lt;p&gt;If you embed a third-party booking widget, put it on its own &lt;code&gt;/book&lt;/code&gt; page rather than the homepage. Those widgets often pull in a lot of JavaScript, and you want the homepage to stay fast.&lt;/p&gt;

&lt;p&gt;A plain fallback form is fine too. Keep it short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/quote"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"quote"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Name &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Phone &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"tel"&lt;/span&gt; &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"tel"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;What's going on?
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"issue"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Request a callback&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;type="tel"&lt;/code&gt; brings up the number pad. &lt;code&gt;autocomplete&lt;/code&gt; lets the phone fill in name and number in one tap. Three fields is plenty. Every extra field is one more reason to give up and call a competitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviews: real, attributed, linked
&lt;/h2&gt;

&lt;p&gt;The reviews block is where homepages get sloppy. A grid of five-star quotes from "John D." with no source reads as invented, even when it isn't.&lt;/p&gt;

&lt;p&gt;What we do instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quote 2 or 3 real reviews, with the owner's okay, and show the reviewer's first name and the platform.&lt;/li&gt;
&lt;li&gt;Link to the full review profile so visitors can check.&lt;/li&gt;
&lt;li&gt;Show the date or at least the year. A glowing review from 2016 is a warning sign, not a selling point.&lt;/li&gt;
&lt;li&gt;Skip the star widget scripts. Plain HTML is enough.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"reviews"&lt;/span&gt; &lt;span class="na"&gt;aria-labelledby=&lt;/span&gt;&lt;span class="s"&gt;"reviews-h"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"reviews-h"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;What customers say&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"review"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;blockquote&amp;gt;&lt;/span&gt;Came out the same afternoon and fixed the leak under our sink. Clear price before starting.&lt;span class="nt"&gt;&amp;lt;/blockquote&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;Maria, March 2026 (example review)&lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"more"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Read all reviews&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A side note if you are thinking about adding review markup for search: Google's guidelines say that when a business controls the reviews about itself on its own site, pages using LocalBusiness or Organization structured data are not eligible for star review snippets. Put the reviews on the page for humans and leave the star markup out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feiuc376r3qk4br6pnko6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feiuc376r3qk4br6pnko6.png" alt="Comparison table: common desktop-first habits versus the mobile-first choice for a local business homepage" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance basics that take ten minutes
&lt;/h2&gt;

&lt;p&gt;You don't need a build pipeline for this. Four things cover most of the gain on a page this simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Size the hero image properly.&lt;/strong&gt; Export it at the size it is shown, serve WebP or AVIF with a JPEG fallback, and give it &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; so the browser reserves the space. The hero image is often the Largest Contentful Paint element, and Google's "good" threshold for LCP is 2.5 seconds at the 75th percentile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero-800.avif 800w, /img/hero-1400.avif 1400w"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero-800.webp 800w, /img/hero-1400.webp 1400w"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/hero-800.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Plumber fixing a pipe under a kitchen sink"&lt;/span&gt;
       &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"800"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"533"&lt;/span&gt; &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Don't lazy-load the hero.&lt;/strong&gt; web.dev's advice is direct: "Don't lazy-load images that are likely to be in-viewport when the page loads, especially LCP images." Use &lt;code&gt;loading="lazy"&lt;/code&gt; for gallery photos further down, and &lt;code&gt;fetchpriority="high"&lt;/code&gt; on the hero, which is supported in current Chrome, Edge, Firefox and Safari.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load almost no JavaScript.&lt;/strong&gt; This page does not need any. If you add a cookie banner or analytics, load them with &lt;code&gt;defer&lt;/code&gt; and check what they cost in the Network tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test on a real phone.&lt;/strong&gt; Lighthouse in DevTools is a good start. Then open the page on a mid-range phone over cellular and try to call the business from it. You'd be surprised how often the number turns out not to be tappable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The handoff checklist
&lt;/h2&gt;

&lt;p&gt;Before sending the link to the owner, we go through this list on an actual phone, not a resized desktop window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftx8jm632jrpia32v7gge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftx8jm632jrpia32v7gge.png" alt="Checklist of 12 checks to run on a phone before handing off a local business homepage" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you send it, keep the message about what the owner cares about, not the tech. Something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's the new homepage on your phone: [link]. The call button works from anywhere on the page, and "Book a visit" goes straight to your scheduling page. Can you try both and tell me if anything looks off?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last question matters. Owners often spot a wrong price or an old service area that you'd never catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the businesses that need this
&lt;/h2&gt;

&lt;p&gt;The template is the easy part. The harder part is finding owners whose current homepage fails these checks, and the manual way works: search a trade plus a town on Google Maps, open each site on your phone, and note which ones have no tap-to-call, no visible booking option or a page that doesn't fit the screen.&lt;/p&gt;

&lt;p&gt;If you'd rather not open forty tabs, &lt;a href="https://leadreef.ai/find" rel="noopener noreferrer"&gt;LeadReef&lt;/a&gt; finds local businesses whose sites are outdated, broken on mobile or missing, shows what's wrong with each one, and helps you draft a first mockup and outreach message. You choose who to contact and send everything yourself. The first 10 leads are free. Full disclosure: we build LeadReef. Everything above works fine without it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: Google Search Central, &lt;a href="https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing" rel="noopener noreferrer"&gt;Mobile-first indexing best practices&lt;/a&gt;; web.dev, &lt;a href="https://web.dev/articles/accessible-tap-targets" rel="noopener noreferrer"&gt;Accessible tap targets&lt;/a&gt;; W3C, &lt;a href="https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html" rel="noopener noreferrer"&gt;Understanding SC 2.5.8 Target Size (Minimum)&lt;/a&gt;; web.dev, &lt;a href="https://web.dev/articles/defining-core-web-vitals-thresholds" rel="noopener noreferrer"&gt;Defining the Core Web Vitals metrics thresholds&lt;/a&gt;; web.dev, &lt;a href="https://web.dev/articles/browser-level-image-lazy-loading" rel="noopener noreferrer"&gt;Browser-level image lazy loading&lt;/a&gt;; web.dev, &lt;a href="https://web.dev/articles/fetch-priority" rel="noopener noreferrer"&gt;Optimize resource loading with the Fetch Priority API&lt;/a&gt;; Google Search Central, &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/review-snippet" rel="noopener noreferrer"&gt;Review snippet guidelines&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>css</category>
      <category>freelance</category>
    </item>
    <item>
      <title>How to find local businesses with bad websites (a field guide for freelance web designers)</title>
      <dc:creator>LeadReef Dev</dc:creator>
      <pubDate>Mon, 02 Nov 2026 12:55:18 +0000</pubDate>
      <link>https://dev.to/leadreef_ai/how-to-find-local-businesses-with-bad-websites-a-field-guide-for-freelance-web-designers-1gcc</link>
      <guid>https://dev.to/leadreef_ai/how-to-find-local-businesses-with-bad-websites-a-field-guide-for-freelance-web-designers-1gcc</guid>
      <description>&lt;p&gt;If you build websites for small businesses, you already know the hardest part of the job isn't the design. It's finding the next client.&lt;/p&gt;

&lt;p&gt;Most of us start the same way. Open Google Maps, type "dentist" and the name of a city, click through every listing, open each website, and keep a spreadsheet of the ones that look rough. It works. It's also slow, and after the fortieth tab you stop being able to tell a bad site from an okay one.&lt;/p&gt;

&lt;p&gt;We've spent the last year working on exactly this problem, and we've looked at a lot of local business websites along the way. This post is everything we learned about finding the businesses that actually need a new site, figuring out which ones are worth your time, and reaching out without sounding like spam. You can do all of it by hand with a browser and a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "bad website" businesses are the best prospects
&lt;/h2&gt;

&lt;p&gt;There are two kinds of local businesses you can pitch: ones with no website at all, and ones with a website that's hurting them.&lt;/p&gt;

&lt;p&gt;Both can work, but the second group is usually easier to sell to. They've already paid for a website once. They already believe a website matters. You don't need to convince them of the idea, only that theirs is costing them customers.&lt;/p&gt;

&lt;p&gt;A business with no site at all is a different conversation. Some of them are doing fine on word of mouth and a Facebook page and genuinely don't want one. Others are a great fit, but you'll spend the first call explaining why they need a website before you can talk about yours.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;No website&lt;/th&gt;
&lt;th&gt;Bad website&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Believes a website matters&lt;/td&gt;
&lt;td&gt;Not always&lt;/td&gt;
&lt;td&gt;Yes, they paid for one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you have to prove&lt;/td&gt;
&lt;td&gt;Why they need one at all&lt;/td&gt;
&lt;td&gt;Why theirs is losing them money&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easy to show the problem&lt;/td&gt;
&lt;td&gt;Hard, nothing to point at&lt;/td&gt;
&lt;td&gt;Easy, open it on a phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical objection&lt;/td&gt;
&lt;td&gt;"We get work from referrals"&lt;/td&gt;
&lt;td&gt;"We already have a site"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best opening&lt;/td&gt;
&lt;td&gt;A quick mockup of what they'd get&lt;/td&gt;
&lt;td&gt;A side by side of their site and a better version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So most of this guide is about the second group.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually counts as a "bad" website
&lt;/h2&gt;

&lt;p&gt;"Bad" is vague, and vague doesn't help you in a cold message. If you tell a plumber his site is ugly, he'll shrug. If you tell him it doesn't load properly on a phone and most of his customers are searching on one, he'll go check.&lt;/p&gt;

&lt;p&gt;Here's what we look for. These are the problems a business owner can verify in ten seconds, which is why they make good conversation starters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft4ibrv8yoyr6w2584sl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft4ibrv8yoyr6w2584sl4.png" alt="The 10-second website audit checklist" width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It breaks on a phone.&lt;/strong&gt; This is the big one. Open the site on your phone, not in a resized desktop browser. Do you have to pinch and zoom to read anything? Is the menu a row of tiny links? Do buttons overlap? Local searches happen on phones far more than desktops, so a site that's unusable there is losing calls every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It looks like it was built a long time ago.&lt;/strong&gt; Clip art, tiny fonts, a background texture, a visitor counter, an animated "under construction" banner. You know it when you see it. This one is subjective, so on its own it's a weaker pitch than "it doesn't work on mobile."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's no way to act.&lt;/strong&gt; No click-to-call phone number, no booking button, no form, or a contact page that only lists an email. For a service business, the whole point of the site is to turn a visitor into a call. If that path is missing, it's an easy problem to point at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It shows signs of being abandoned.&lt;/strong&gt; A copyright year from many years ago, a "latest news" section with one post from 2016, no HTTPS warning in the browser, broken images, links to a Facebook page that no longer exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search engines can't make sense of it.&lt;/strong&gt; Every page has the same title, or the title is just "Home". The business name and city don't appear anywhere in the text. These don't look dramatic, but they're part of why the site sits on page three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The domain isn't really a website.&lt;/strong&gt; A parked page, an expired hosting notice, a builder's "site not published" placeholder, or a domain that just doesn't load. These businesses think they have a website. They don't.&lt;/p&gt;

&lt;p&gt;When you write down a lead, write down the specific problem, not just "bad site". You'll need it later for the message, and it's the difference between a pitch that sounds personal and one that sounds copy-pasted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to find them
&lt;/h2&gt;

&lt;p&gt;Google Maps is where everyone starts, which is a good reason not to stop there. Here are the places we've found useful, roughly from most to least obvious.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where to look&lt;/th&gt;
&lt;th&gt;What you find there&lt;/th&gt;
&lt;th&gt;Why it's good&lt;/th&gt;
&lt;th&gt;Watch out for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps&lt;/td&gt;
&lt;td&gt;Almost every local business, with a website link&lt;/td&gt;
&lt;td&gt;Huge volume, reviews tell you how busy they are&lt;/td&gt;
&lt;td&gt;Everyone else is looking here too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google search, pages 2 to 4&lt;/td&gt;
&lt;td&gt;Businesses that are online but not ranking&lt;/td&gt;
&lt;td&gt;Page 1 is mostly directories and businesses that already invested&lt;/td&gt;
&lt;td&gt;Slower to work through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Businesses running ads&lt;/td&gt;
&lt;td&gt;Owners currently paying for leads&lt;/td&gt;
&lt;td&gt;They already spend on marketing, so a bad landing page hurts them directly&lt;/td&gt;
&lt;td&gt;Some send ads to Facebook, not a site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yelp and industry directories&lt;/td&gt;
&lt;td&gt;Trade-specific lists (contractors, salons, clinics)&lt;/td&gt;
&lt;td&gt;Good for niching down by trade&lt;/td&gt;
&lt;td&gt;Many listings are stale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instagram and Facebook-only businesses&lt;/td&gt;
&lt;td&gt;Active businesses with no real site&lt;/td&gt;
&lt;td&gt;Often busy and growing&lt;/td&gt;
&lt;td&gt;Some are happy without a site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New business registrations&lt;/td&gt;
&lt;td&gt;Companies that just started&lt;/td&gt;
&lt;td&gt;Need everything, including a website&lt;/td&gt;
&lt;td&gt;Small budgets, slow decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Skip page one
&lt;/h3&gt;

&lt;p&gt;This one surprised us. When you search for "roofer" plus a city on Google, the first page is mostly directories, review sites and a handful of businesses that already have decent websites and probably an agency. They are the worst prospects on the page.&lt;/p&gt;

&lt;p&gt;The businesses you want are further down, on pages two, three and four. They're real, they're operating, and they're invisible online. That's a problem you can fix for them, and it's a much easier story to tell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgvne0no902wljdebp714.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgvne0no902wljdebp714.png" alt="Where the best prospects sit in search results" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Look at who's running ads
&lt;/h3&gt;

&lt;p&gt;The most underrated signal we've found is simple: is the business currently paying for advertising?&lt;/p&gt;

&lt;p&gt;A business that runs ads already believes in marketing and already spends money on it every month. If those ads send people to a slow, broken or outdated page, every click they pay for is partly wasted. That's a concrete, money-shaped problem, and owners understand it immediately.&lt;/p&gt;

&lt;p&gt;You can check this by hand. Facebook's Ad Library is public and searchable by business name, and Google shows "Sponsored" labels on local service businesses in many trades. If you see a contractor whose ads are everywhere but whose site looks like it hasn't been touched in a decade, put them at the top of your list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use reviews as a busyness meter
&lt;/h3&gt;

&lt;p&gt;Reviews don't tell you whether a site is bad, but they tell you whether the business can afford you. A dentist with 400 reviews and a terrible website is a better lead than one with 6 reviews and the same website. The first one is busy and losing money to the bad site. The second one might just be struggling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deciding who to contact first
&lt;/h2&gt;

&lt;p&gt;Once you've collected a list, you'll have more leads than time. You need some way to decide who gets a message today and who waits.&lt;/p&gt;

&lt;p&gt;You don't need anything fancy. We'd suggest grading each lead on three things and only reaching out to the ones that score well on all three.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8no00z9vvoy7uobwfs0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8no00z9vvoy7uobwfs0.png" alt="A simple way to prioritise leads" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How bad is the site?&lt;/strong&gt; A site that's broken on a phone or doesn't load at all is a stronger lead than one that just looks a bit dated. Be honest here. "I don't love the colours" isn't a problem the owner will pay to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can they afford it?&lt;/strong&gt; Review count, number of locations, whether they run ads, and the type of business all give you a rough idea. A law firm or a roofing company spends more on marketing than a single-chair barbershop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you reach a decision maker?&lt;/strong&gt; A direct phone number or an owner's name is worth a lot. A generic contact form that goes nowhere is worth much less.&lt;/p&gt;

&lt;p&gt;A lead that's high on all three is worth a personalised message today. Medium leads can go into a lighter outreach batch. Low leads are probably not worth your evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reaching out without sounding like spam
&lt;/h2&gt;

&lt;p&gt;This is where most people lose the deal. They do all the research, then send a message that could have been sent to anyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show, don't tell
&lt;/h3&gt;

&lt;p&gt;The single most effective thing you can do is show the owner what their site could look like. It doesn't have to be a finished website. A quick mockup of the homepage with their business name, their real photos and a couple of their actual reviews is enough.&lt;/p&gt;

&lt;p&gt;Business owners are busy and they don't think in terms of design. Telling them "your site could be more modern" is abstract. Showing them their own business on a clean, fast page makes it real in about two seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dajlptlbecafgnbjfsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dajlptlbecafgnbjfsr.png" alt="Showing a mockup beats describing the problem" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don't need to spend hours on it. A homepage hero, a services section and a contact block is plenty. If they reply, then you build the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the message short and specific
&lt;/h3&gt;

&lt;p&gt;Here's the shape of a message that tends to work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi Maria, I was looking for a dentist near Oak Park and found your practice. Your reviews are great, but when I opened your site on my phone the menu and booking link were hard to use. I put together a quick idea of how the homepage could look on mobile, using your photos and reviews: [link]. Happy to walk you through it if it's useful. Either way, good luck with the new location.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It mentions something real about them, names one specific problem they can check themselves, shows the mockup, and doesn't push. Compare that with "We are a leading web design agency offering affordable solutions for your business." Nobody replies to that.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Do&lt;/th&gt;
&lt;th&gt;Don't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name one problem they can verify on their own phone&lt;/td&gt;
&lt;td&gt;List ten problems in one message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mention something real (their reviews, their area, their services)&lt;/td&gt;
&lt;td&gt;Use "Dear Sir/Madam" or no name at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link to a mockup of their own business&lt;/td&gt;
&lt;td&gt;Attach a PDF price list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep it under 100 words&lt;/td&gt;
&lt;td&gt;Explain your whole process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask a low-pressure question&lt;/td&gt;
&lt;td&gt;Ask for a call in the first message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow up once or twice, politely&lt;/td&gt;
&lt;td&gt;Send the same message five times&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Pick the right channel
&lt;/h3&gt;

&lt;p&gt;Email is the default, and it's fine. But a lot of local business owners live on their phones, and a short text or a message through their Google Business profile can get read faster than an email to an info@ address nobody checks.&lt;/p&gt;

&lt;p&gt;Whatever you use, send it yourself and keep the volume sensible. Blasting hundreds of identical emails from a fresh domain is the quickest way to land in spam folders and burn the domain, and it doesn't work anyway. Twenty thoughtful messages beat two hundred generic ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Follow up, once or twice
&lt;/h3&gt;

&lt;p&gt;Most replies come after a follow up, not the first message. People see it, mean to answer, and forget. A short note a few days later ("Just bumping this in case it got buried, the mockup link is still live") is completely normal. After two follow ups with no answer, move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing this every week without burning out
&lt;/h2&gt;

&lt;p&gt;The research part is what wears people down. A realistic weekly routine looks something like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What you do&lt;/th&gt;
&lt;th&gt;Rough time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pick a niche and area&lt;/td&gt;
&lt;td&gt;One trade, one city or region&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collect leads&lt;/td&gt;
&lt;td&gt;Maps, search pages 2 to 4, ad libraries&lt;/td&gt;
&lt;td&gt;1 to 2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check each site on a phone&lt;/td&gt;
&lt;td&gt;Note the one main problem&lt;/td&gt;
&lt;td&gt;1 to 2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prioritise&lt;/td&gt;
&lt;td&gt;High, medium, low&lt;/td&gt;
&lt;td&gt;20 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make mockups for the top leads&lt;/td&gt;
&lt;td&gt;5 to 10 quick homepages&lt;/td&gt;
&lt;td&gt;2 to 4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send messages&lt;/td&gt;
&lt;td&gt;Short, personal, one problem each&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow up&lt;/td&gt;
&lt;td&gt;From last week's batch&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Picking one niche at a time helps more than it seems. After a few dentists you know what a dentist's site needs, your mockups get faster, and you start to sound like someone who understands their business. That's also how you end up with a portfolio that sells the next client for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way vs. using a tool
&lt;/h2&gt;

&lt;p&gt;Everything above works with a browser, a spreadsheet and a design tool. Plenty of designers do it that way and do well.&lt;/p&gt;

&lt;p&gt;The part that doesn't scale is the checking: opening hundreds of sites, testing each on a phone, noting what's wrong, and then building a mockup for the good ones. That's the part we got tired of, so we built LeadReef to do it. It searches for local businesses, flags the ones with outdated, broken or missing sites, and helps with the mockup and the first message. You still decide who to contact and you send everything yourself. If you want to try it, there's a free plan at &lt;a href="https://leadreef.ai" rel="noopener noreferrer"&gt;leadreef.ai&lt;/a&gt;. Full disclosure, it's our product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbfqna3r6cgu4cki6ktl7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbfqna3r6cgu4cki6ktl7.png" alt="LeadReef search screen" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But honestly, even if you never use a tool, the process is the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Look where other designers don't, like search pages two to four and businesses running ads.&lt;/li&gt;
&lt;li&gt;Write down one specific problem per lead.&lt;/li&gt;
&lt;li&gt;Prioritise by how bad the site is, whether they can pay, and whether you can reach the owner.&lt;/li&gt;
&lt;li&gt;Show them a mockup of their own business.&lt;/li&gt;
&lt;li&gt;Keep the message short and follow up once or twice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you've got your own tricks for finding clients, I'd really like to hear them in the comments. Especially the weird ones that shouldn't work but do.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>freelance</category>
      <category>marketing</category>
      <category>design</category>
    </item>
  </channel>
</rss>
