<?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: PeakSpire</title>
    <description>The latest articles on DEV Community by PeakSpire (@peakspire).</description>
    <link>https://dev.to/peakspire</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%2F4219715%2F04594cdb-88a4-4448-b9e7-d057a029fe92.png</url>
      <title>DEV Community: PeakSpire</title>
      <link>https://dev.to/peakspire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peakspire"/>
    <language>en</language>
    <item>
      <title>The map-pack math every local service business should run before hiring an SEO</title>
      <dc:creator>PeakSpire</dc:creator>
      <pubDate>Sun, 01 Nov 2026 03:20:19 +0000</pubDate>
      <link>https://dev.to/peakspire/the-map-pack-math-every-local-service-business-should-run-before-hiring-an-seo-3161</link>
      <guid>https://dev.to/peakspire/the-map-pack-math-every-local-service-business-should-run-before-hiring-an-seo-3161</guid>
      <description>&lt;p&gt;Every local SEO pitch I have ever sat through contains the same sentence, delivered the same way: "Imagine getting just five more calls a month." Then a pause, while you do the mental arithmetic on those five calls. The pitch works because the salesperson is counting on you doing that math quickly, in your head, in their favor.&lt;/p&gt;

&lt;p&gt;I run a web agency in Ottawa. Most of my clients are trades and home services businesses, and before I talk to any of them about local search, I make them do the arithmetic properly. Four numbers. It takes two minutes, and it changes the conversation from "what could SEO be worth" to "what does the math say, using your assumptions."&lt;/p&gt;

&lt;p&gt;I put the calculation on a free page, no email wall: &lt;a href="https://peakspire.ca/map-pack-value-calculator/" rel="noopener noreferrer"&gt;https://peakspire.ca/map-pack-value-calculator/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The math, in one line
&lt;/h2&gt;

&lt;p&gt;Monthly value equals calls from Google, times close rate, times average job value.&lt;/p&gt;

&lt;p&gt;That is the whole engine. The calculator ships with placeholder defaults: a $2,500 average job, 10 calls a month from search, a 40 percent close rate. Multiplied out, local search is worth $10,000 a month to that hypothetical business. Change any input and the number moves in a straight line: double the close rate, double the value. No click-through curve is hiding inside it.&lt;/p&gt;

&lt;p&gt;Then comes the second line, the one every pitch gestures at. A slider asks: if your visibility improved, how many more calls per month would that be? You set it. The tool adds exactly that many calls, at your close rate and your job value, and shows the gap. The default position is +5 calls, which turns that $10,000 into $15,000 a month, a difference of $5,000 monthly and $60,000 a year.&lt;/p&gt;

&lt;p&gt;Those are placeholder defaults, not a claim about any business. I picked round numbers precisely so nobody mistakes them for benchmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each input comes from
&lt;/h2&gt;

&lt;p&gt;The honesty of the output depends entirely on the honesty of the inputs, so here is where I tell clients to pull each number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Average job value:&lt;/strong&gt; your own invoices, not your best job. The typical ticket you actually sell. A service call and a full install are different businesses, so price the mix you really carry, and round down when torn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calls from Google:&lt;/strong&gt; your Google Business Profile performance report shows calls and messages by month. A "how did you hear about us" field on your intake form catches what the dashboard misses. Count only search-driven contacts, not referrals or repeat customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Close rate:&lt;/strong&gt; jobs booked divided by calls received, over a few months. Most owners I work with overestimate this on the first pass, then check and revise down. That revision is the exercise working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lift:&lt;/strong&gt; your assumption, not mine and not any agency's. A map pack entry, a second page one listing, a faster site: each can add calls. How many is realistic in your market, at your current position, is a judgment call, and the calculator deliberately refuses to make it for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why run it before the sales call
&lt;/h2&gt;

&lt;p&gt;Two reasons.&lt;/p&gt;

&lt;p&gt;First, it sets a ceiling. If your assumed uplift is worth $2,000 a month to you, a retainer priced at $2,500 a month is a bad trade until your assumptions change. That is a decision you want to make in a spreadsheet mood, not in a live demo.&lt;/p&gt;

&lt;p&gt;Second, it exposes imported assumptions. Plenty of agency calculators produce enormous numbers by quietly adding things: click-through rate curves from old studies, industry average close rates, call volume estimates from keyword tools. Mine assumes none of that, and says so under the result: no invented click-through curves, no industry averages. If an agency's calculator shows you a bigger number than your own inputs produce, ask where the extra assumptions came from. A good one will answer precisely. A bad one will change the subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing pitches side by side
&lt;/h2&gt;

&lt;p&gt;The newest feature is shareable permalinks. Every set of inputs is encoded into the URL itself, following the pattern &lt;code&gt;?job=&amp;amp;calls=&amp;amp;close=&amp;amp;lift=&lt;/code&gt;. Here is the tool with its defaults loaded:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://peakspire.ca/map-pack-value-calculator/?job=2500&amp;amp;calls=10&amp;amp;close=40&amp;amp;lift=5" rel="noopener noreferrer"&gt;https://peakspire.ca/map-pack-value-calculator/?job=2500&amp;amp;calls=10&amp;amp;close=40&amp;amp;lift=5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open that link and the calculator comes up pre-filled with exactly those four numbers. So when two agencies pitch you, hand each of them the same link and ask them to justify a different result from identical inputs. Or send your assumptions to your bookkeeper or business partner before you sign anything. The URL is the argument, and it stays put because the numbers live in the link itself, not in a database that can change later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this cannot tell you
&lt;/h2&gt;

&lt;p&gt;The calculator cannot promise you the extra calls. Close rates drift, markets shift, and a map pack ranking you do not hold yet is not collateral. Treat the output as a decision frame, not a forecast: it tells you what better visibility would be worth if your assumptions hold, which is the right question to carry into a sales call. Anyone who guarantees the uplift line is selling you something the math does not contain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it first
&lt;/h2&gt;

&lt;p&gt;If you own a local service business and SEO is on your list this quarter, run the four numbers before you take the meeting. It costs nothing and it puts the burden of proof where it belongs: on whoever wants your retainer to explain, in your numbers, how the gap gets closed.&lt;/p&gt;

&lt;p&gt;If you also want an honest read on where your site stands today, I published a census of Ottawa service business websites with every PageSpeed score attached: &lt;a href="https://peakspire.ca/ottawa-website-benchmarks/" rel="noopener noreferrer"&gt;https://peakspire.ca/ottawa-website-benchmarks/&lt;/a&gt;. And if you just want the arithmetic, it is here, free, no email required: &lt;a href="https://peakspire.ca/map-pack-value-calculator/" rel="noopener noreferrer"&gt;https://peakspire.ca/map-pack-value-calculator/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>marketing</category>
      <category>business</category>
      <category>google</category>
    </item>
    <item>
      <title>What 97 Ottawa small-business websites taught us about web-font performance</title>
      <dc:creator>PeakSpire</dc:creator>
      <pubDate>Sun, 01 Nov 2026 03:19:37 +0000</pubDate>
      <link>https://dev.to/peakspire/what-97-ottawa-small-business-websites-taught-us-about-web-font-performance-189g</link>
      <guid>https://dev.to/peakspire/what-97-ottawa-small-business-websites-taught-us-about-web-font-performance-189g</guid>
      <description>&lt;p&gt;I fix slow websites for a living. My agency is in Ottawa, and most of my clients are trades and home services: plumbers, electricians, HVAC, roofers, cleaners. Early in 2026 I got tired of guessing what slow means in this market, so I measured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dataset
&lt;/h2&gt;

&lt;p&gt;In March 2026 I ran Google PageSpeed mobile audits on 97 Ottawa-area service business websites. The set was sourced from public directories, so it represents businesses that list publicly rather than a formal census of the city. Every vertical I serve was in there: plumbing, electrical, HVAC, roofing, landscaping, painting, tree work, cleaning.&lt;/p&gt;

&lt;p&gt;The median mobile score was 66 out of 100. Five sites finished at a perfect 100, and ten of the 97 reached 90 or better. At the other end, two sites scored 13 and 0. The median Largest Contentful Paint across the census was 6.3 seconds. Every score is published here: &lt;a href="https://peakspire.ca/ottawa-website-benchmarks/" rel="noopener noreferrer"&gt;https://peakspire.ca/ottawa-website-benchmarks/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two slices matter for this post. The five plumber homepages in the set scored 43, 46, 53, 67 and 73, a median of 53. And in October 2026 I re-ran the exercise for Ottawa pest control companies: seven local sites, mobile scores from 20 to 83, median 65, with two of the seven below 50.&lt;/p&gt;

&lt;p&gt;A median of 66 is not a scandal, it is a description. Half of these sites load like it is 2015 on a phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the waterfalls kept showing
&lt;/h2&gt;

&lt;p&gt;One honest caveat first: the census tracks PageSpeed scores and opportunity flags, not font statistics specifically. I will not invent a percentage of sites with font sins. What I can tell you is what I see when I open the network waterfall on the slow half of this set, over and over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonts hiding at the end of the waterfall.&lt;/strong&gt; The browser has to fetch the HTML, fetch the stylesheet, parse the stylesheet, only then discover the WOFF2 URL, and fetch that too. That is two extra round trips on a phone network before real text renders. A preload link removes both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing font-display descriptors.&lt;/strong&gt; Plenty of hand-rolled @font-face rules set no font-display value at all. The default behavior holds text back while the font downloads. On a throttled mobile connection that is seconds of invisible headings staring back at a homeowner with a burst pipe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flash, handled badly.&lt;/strong&gt; When the fallback stack does not match the web font's metrics, text renders twice: fallback first, then a visible shift when the real font lands. It is ugly, and it moves layout after someone has already started reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote Google Fonts where local WOFF2 would do.&lt;/strong&gt; That is two more origins to resolve and negotiate TLS with, usually without a preconnect hint. There is also a 2022 German regional court ruling that embedding Google Fonts without consent can breach GDPR, which matters if you sell into Europe, or if you simply dislike shipping a visitor's IP address to a third party for a font you could self-host. WordPress themes that bundle their own CSS still point at fonts.googleapis.com more often than you would think.&lt;/p&gt;

&lt;p&gt;To be clear about scale: in the audit exports, 50 of the 97 sites were flagged for unused JavaScript and 48 carried redirect chains. Fonts are rarely the whole problem. But they are the part that paints your words, they are cheap to fix, and they are usually fixed wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix pattern
&lt;/h2&gt;

&lt;p&gt;When I fix a site, fonts get four steps, in order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Self-host the WOFF2 files you actually use.&lt;/strong&gt; Subset to the weights and styles the design really calls for. Most service business sites need two files, maybe three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preload exactly those files.&lt;/strong&gt; The preload URL must match the URL inside @font-face, with the crossorigin attribute set, or the browser downloads the font twice. And cap it: preload is a promise to spend bandwidth, and past a few files you are paying for nothing. I cap at four.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declare font-display: swap on every @font-face rule.&lt;/strong&gt; If a design truly cannot tolerate a swap flash, use optional and accept the fallback on cold loads. What you should not do is leave the descriptor out and let the browser decide to hide your text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure before and after.&lt;/strong&gt; Lab scores move from run to run. When I re-verified one pest control site in the October set, five runs scored 42, 44, 44, 44 and 52. Single-run numbers lie. Medians do not.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I shipped
&lt;/h2&gt;

&lt;p&gt;Doing this by hand on client after client got repetitive, so I packaged the pattern as a free WordPress plugin, Font Speed Fix. It is on GitHub: &lt;a href="https://github.com/sirajahmadzai/font-speed-fix" rel="noopener noreferrer"&gt;https://github.com/sirajahmadzai/font-speed-fix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does four things. It scans your enqueued stylesheets for WOFF2 files hosted on your own domain and preloads them, capped at four. It adds font-display: swap to inline @font-face rules that are missing a descriptor, and deliberately touches nothing that already declares optional, block, fallback or auto. It can dequeue fonts.googleapis.com requests once you have finished self-hosting. And it can drop the dashicons stylesheet for logged-out visitors, a render-blocking request most themes never use on the front end.&lt;/p&gt;

&lt;p&gt;Two deliberate limits say more about the plugin than the features do. It preloads only same-host fonts, because a cross-origin preload that does not match the stylesheet fetch wastes bandwidth instead of saving time. And it skips fonts declared inline in the HTML head, because I measured a 0.9 second LCP regression on one theme when preloading those: the browser already discovers inline declarations while parsing, so the preload was pure duplicate work. The plugin is tested on Twenty Twenty-Four, runs on PHP 7.4, changes only front-end output, and behaves alongside caching plugins like WP Rocket and LiteSpeed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest conclusion
&lt;/h2&gt;

&lt;p&gt;Web fonts are a real, recurring tax on Ottawa service sites, and the fix is boring, well understood, and about an hour of work. What the census actually taught me is that fonts sit inside a bigger problem. The median site in my market paints its main content in 6.3 seconds, half the set carries unused JavaScript, and roughly half lose time to redirect chains before anything renders at all. Fixing fonts on a site like that helps at the margins and feels like progress, but the sites scoring 13 and 0 need their page builders and plugin stacks dealt with first.&lt;/p&gt;

&lt;p&gt;So measure, fix fonts properly, then keep going down the waterfall. If you want the full dataset, every score is published at &lt;a href="https://peakspire.ca/ottawa-website-benchmarks/" rel="noopener noreferrer"&gt;https://peakspire.ca/ottawa-website-benchmarks/&lt;/a&gt;. If you want to see what slow mobile load times do to a local business's lead economics, I built a calculator for that: &lt;a href="https://peakspire.ca/map-pack-value-calculator/" rel="noopener noreferrer"&gt;https://peakspire.ca/map-pack-value-calculator/&lt;/a&gt;. And if you just want the font fix, the plugin is free: &lt;a href="https://github.com/sirajahmadzai/font-speed-fix" rel="noopener noreferrer"&gt;https://github.com/sirajahmadzai/font-speed-fix&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>fonts</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
