<?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: Jack Warner</title>
    <description>The latest articles on DEV Community by Jack Warner (@webdevwales).</description>
    <link>https://dev.to/webdevwales</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%2F3849467%2F9953fdd2-5731-4354-903f-6ca057c9f5b0.jpg</url>
      <title>DEV Community: Jack Warner</title>
      <link>https://dev.to/webdevwales</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webdevwales"/>
    <language>en</language>
    <item>
      <title>The First 48 Hours After a Site Goes Live</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:25:30 +0000</pubDate>
      <link>https://dev.to/webdevwales/the-first-48-hours-after-a-site-goes-live-46c4</link>
      <guid>https://dev.to/webdevwales/the-first-48-hours-after-a-site-goes-live-46c4</guid>
      <description>&lt;p&gt;Launch day gets all the attention. The client sees the new site, everyone is pleased, the invoice goes out. Then the developer moves on to the next project, and the two days that decide whether the launch actually worked pass without anyone watching.&lt;/p&gt;

&lt;p&gt;Most of the problems I get called about on a site someone else built are not design disagreements. They are things that broke silently in the first couple of days after going live and were never noticed, because the checks that would have caught them are not part of most people's launch routine.&lt;/p&gt;

&lt;p&gt;Here is the routine I use, in the order the failures tend to appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hour zero: confirm the thing you are looking at is the thing visitors get
&lt;/h2&gt;

&lt;p&gt;The single most common launch-day mistake is checking the site in the browser you have been building in. You have cached assets, a logged-in session, possibly a hosts file entry pointing at the old server. What you are looking at is not what a stranger sees.&lt;/p&gt;

&lt;p&gt;Open the live URL in a private window on a device that has never seen the site. This takes ten seconds and catches an embarrassing proportion of everything below.&lt;/p&gt;

&lt;p&gt;While you are there, check that only one version of the site is reachable. The naked domain and the www version should not both serve content: one should redirect to the other, in a single hop, and every internal link should point at the winner. Split them and you have divided your own search signals between two addresses that each look like a partial copy of the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hour one: make sure you have not blocked the search engines
&lt;/h2&gt;

&lt;p&gt;Staging sites are usually blocked from indexing, and the block frequently ships to production because it is set in an environment variable, a CMS toggle, or a robots file that nobody thought to change.&lt;/p&gt;

&lt;p&gt;Check three things. The robots file should not disallow everything. No page should carry a noindex directive that is not meant to. And the canonical tags should point at the live domain rather than the staging one, which is the version of this mistake that survives longest because it looks fine to a human and quietly tells search engines the real page lives somewhere else.&lt;/p&gt;

&lt;p&gt;Then submit the sitemap and request indexing on the homepage. This is also the moment to confirm the sitemap lists live URLs rather than staging ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hour two: test the money paths on the real site
&lt;/h2&gt;

&lt;p&gt;Not on staging, where the payment provider is in test mode and the mail service is intercepted. On production, as a member of the public would.&lt;/p&gt;

&lt;p&gt;Send a message through the contact form and confirm it arrives somewhere a human reads, then reply to it and confirm the reply reaches the sender. Complete a booking or a purchase and check that both parties get their confirmations. Ring the phone number as written on the page rather than the one you have in your contacts.&lt;/p&gt;

&lt;p&gt;Email is where launches quietly fail. A new domain sending its first messages, often through a new provider, is exactly the profile spam filters distrust. Confirm the authentication records are in place and then confirm delivery empirically, because the records being correct and the message arriving are two different claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hours three to six: the redirects, if this is a rebuild
&lt;/h2&gt;

&lt;p&gt;If the site replaced an existing one, every URL that had value needs to land somewhere sensible. Not all of them on the homepage: that is technically a redirect and practically a dead end, and search engines increasingly treat a homepage catch-all as a soft error.&lt;/p&gt;

&lt;p&gt;Export the old URL list from analytics or the search console, map each meaningful one to its closest equivalent, and test them in bulk rather than by hand. What you are looking for is a single hop to a page that answers the same question, with no chains and no loops.&lt;/p&gt;

&lt;p&gt;Missing redirects are the most expensive launch error there is, because the damage compounds daily and the recovery takes months. It is also the one nobody notices immediately, since the new site looks perfect to anyone who visits the homepage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day two: watch for what only appears under real traffic
&lt;/h2&gt;

&lt;p&gt;Some faults need strangers to surface them. Check the error logs for anything appearing repeatedly. Check the search console for crawl errors, which start arriving within a day or so and are the fastest external signal that something is structurally wrong.&lt;/p&gt;

&lt;p&gt;Look at the site on a real phone on mobile data rather than on a simulated viewport on office wifi. Field performance and lab performance are different measurements, and the gap between them is where the real experience lives.&lt;/p&gt;

&lt;p&gt;Finally, put the recurring checks in place while you still remember what matters: uptime monitoring, certificate expiry alerting, and a scheduled test that submits the real contact form and verifies the message arrived. That last one is unglamorous and has caught more silent failures for us than everything else combined, which is part of the standard &lt;a href="https://www.webdevwales.com/services/website-maintenance" rel="noopener noreferrer"&gt;maintenance routine&lt;/a&gt; on every site we look after.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;The live URL renders correctly in a clean private window on an unfamiliar device&lt;/li&gt;
&lt;li&gt;Only one of www and non-www serves content, the other redirects in one hop&lt;/li&gt;
&lt;li&gt;No stray noindex, no blanket robots disallow, canonicals point at production&lt;/li&gt;
&lt;li&gt;Sitemap submitted and listing live URLs&lt;/li&gt;
&lt;li&gt;Contact form delivers to a monitored inbox, and replies reach the sender&lt;/li&gt;
&lt;li&gt;Transactional email is authenticated and confirmed arriving, not merely configured&lt;/li&gt;
&lt;li&gt;Old URLs redirect individually to their closest equivalent, no homepage catch-all&lt;/li&gt;
&lt;li&gt;Error logs and crawl errors reviewed on day two, under real traffic&lt;/li&gt;
&lt;li&gt;Uptime, certificate and form monitoring scheduled before you move on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is difficult and all of it is boring, which is precisely why it gets skipped. A launch is not the moment the site becomes visible. It is the moment it starts being load-bearing, and the two days afterwards are when you find out whether it holds.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of WebDev Wales, a web development studio in Glynneath, South Wales, building sites for small and medium businesses with Next.js.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>seo</category>
    </item>
    <item>
      <title>Why Local Search Works Differently in a Valleys Town</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:24:46 +0000</pubDate>
      <link>https://dev.to/webdevwales/why-local-search-works-differently-in-a-valleys-town-4een</link>
      <guid>https://dev.to/webdevwales/why-local-search-works-differently-in-a-valleys-town-4een</guid>
      <description>&lt;p&gt;Most local SEO advice is written for cities. It assumes a few things that quietly stop being true once you are working in a town of eight thousand people with a mountain on either side: that there is meaningful search volume for your service plus your town, that your competitors are also optimising, and that the map results are the main prize.&lt;/p&gt;

&lt;p&gt;I build websites in the South Wales valleys, and the pattern here is genuinely different from Cardiff or Swansea. If you run a business in a smaller town and your website is not bringing in work, the reason may be that you are following advice written for a different kind of place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody is searching for your town plus your trade
&lt;/h2&gt;

&lt;p&gt;In a city, "plumber Cardiff" is a real query with real volume, and ranking for it is worth fighting for. In a valleys town, the equivalent query might be searched a handful of times a month. You can rank first for it and notice no difference to your phone.&lt;/p&gt;

&lt;p&gt;This leads people to a wrong conclusion, which is that local search does not work for them. What is actually happening is that the searches exist, but they are distributed differently. Instead of one query with volume, there are many queries with almost none: your town, the next town, the one over the hill, the general area, the nearest big place, and the county. Each is tiny. Together they add up to most of your enquiries.&lt;/p&gt;

&lt;p&gt;The practical consequence is that a single page optimised for one town is the wrong shape for the problem. You need coverage across a realistic travel radius, and the honest definition of that radius is wherever you will actually drive to do a job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your customers search for the bigger place
&lt;/h2&gt;

&lt;p&gt;People routinely search using the nearest town with a name others would recognise, even when they do not live there. Someone in a village outside Neath searches "Neath" because that is the reference point. Someone in Glynneath may well search Neath too, or Swansea, depending on which direction they think of as town.&lt;/p&gt;

&lt;p&gt;This means the geography that matters is not administrative, it is habitual. Where do your customers think they live, in the sense of which name they would type? That is often a different answer to their postal address, and it is the one worth building around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proximity is doing more work than you think
&lt;/h2&gt;

&lt;p&gt;Google weighs the searcher's location heavily in local results, and in a rural or valleys context that cuts both ways. It helps you enormously for people physically nearby. It works against you for anyone searching from the next valley, because there is a hill and twenty minutes of road between you, and the algorithm knows it.&lt;/p&gt;

&lt;p&gt;The upshot is that you are not really competing with everyone in your county. You are competing with whoever is closest to each individual searcher, which is a much smaller and more winnable fight than the one you probably think you are in. It also means the businesses beating you in a nearby town may not be beatable there, and effort spent trying is better spent consolidating where you are genuinely the closest good option.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually moves the needle
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A properly filled out Google Business Profile.&lt;/strong&gt; In smaller towns this outperforms the website for direct enquiries, and the gap is not close. Complete every field, keep the hours accurate including bank holidays, and post occasionally. Most local competitors will have claimed the profile and then abandoned it, which is an opening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reviews that mention places.&lt;/strong&gt; A review saying "came out to us in Resolven" is a stronger local signal than five reviews saying "great service". You cannot script this, but you can ask customers where they were when you ask for the review, and some will mention it naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistent contact details everywhere.&lt;/strong&gt; Your name, address and phone number should be identical across your site, your profile and every directory you appear in. This sounds like pedantry and is not. Contradictory addresses across sources make you look less certain to the systems trying to work out where you are, and inconsistencies persist for years once they spread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pages for the places you serve, written by someone who knows them.&lt;/strong&gt; A page per town works, but only if the page says something true and specific. A page listing local landmarks with your service name pasted in reads exactly like what it is. A page explaining that you cover this valley, that you can usually be there the same day, and that you did three jobs on that street last year, is worth having.&lt;/p&gt;

&lt;p&gt;That last point is why we write these individually rather than generating them. Our &lt;a href="https://www.webdevwales.com/locations/neath" rel="noopener noreferrer"&gt;Neath page&lt;/a&gt; is different from our &lt;a href="https://www.webdevwales.com/locations/aberdare" rel="noopener noreferrer"&gt;Aberdare one&lt;/a&gt; because the two places are different, and a page that could describe anywhere describes nowhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to ignore
&lt;/h2&gt;

&lt;p&gt;Chasing national head terms. "Web design" as a bare phrase is dominated by definitions, directories and companies with budgets that do not resemble yours. Ranking on page one for it would deliver traffic with no intention of hiring anyone within fifty miles.&lt;/p&gt;

&lt;p&gt;Publishing constantly for its own sake. Small-town businesses do not out-publish national competitors and do not need to. Six pages that are actually correct and specific will out-earn sixty that are filler.&lt;/p&gt;

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

&lt;p&gt;Local search in a valleys town is not a smaller version of local search in a city. The volume arrives spread across many tiny queries rather than concentrated in a few obvious ones, proximity decides more of the outcome than optimisation does, and the profile often matters more than the website. Work with that shape rather than against it and the results arrive from a much smaller amount of effort than the city-oriented advice would have you spend.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of WebDev Wales, a web development studio based in Glynneath, South Wales, working with small businesses across Neath Port Talbot and the surrounding valleys.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>business</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What a Website Maintenance Month Actually Looks Like</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:23:37 +0000</pubDate>
      <link>https://dev.to/webdevwales/what-a-website-maintenance-month-actually-looks-like-2g0l</link>
      <guid>https://dev.to/webdevwales/what-a-website-maintenance-month-actually-looks-like-2g0l</guid>
      <description>&lt;p&gt;Most small business owners paying a monthly maintenance fee could not tell you what they get for it. That is not their fault. The invoice says "website maintenance", the amount leaves the account, and the website carries on looking the same as it did last month. When nothing visibly changes, it is reasonable to wonder whether anything happened at all.&lt;/p&gt;

&lt;p&gt;I run a small web development studio in South Wales and maintenance is a big part of what we do. So here is the unglamorous version: what the work actually consists of, why most of it is invisible by design, and how to tell whether the person you are paying is doing any of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The invisible work is the point
&lt;/h2&gt;

&lt;p&gt;A maintenance month that goes well produces no news. Nobody rings to say the site is down, no customer emails to say the contact form bounced, no search ranking quietly evaporates. The absence of events is the deliverable.&lt;/p&gt;

&lt;p&gt;That creates an awkward dynamic. The better the work, the less there is to show for it. Which is exactly why a maintenance arrangement should come with a record of what was done, even when what was done was small.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the work actually is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dependency and platform updates.&lt;/strong&gt; Every site is built on layers of other people's code, and those layers get security patches. Applying them is routine right up until it is not: an update occasionally changes behaviour somewhere unrelated, which is why they get applied and then checked rather than applied and forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backups you have actually tested.&lt;/strong&gt; A backup nobody has ever restored is a belief, not a backup. The only way to know it works is to restore it somewhere safe and look at the result. Untested backups fail at the exact moment you need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uptime and certificate monitoring.&lt;/strong&gt; SSL certificates expire, usually renewing automatically, occasionally not. A lapsed certificate replaces your homepage with a browser security warning, and the first person to notice is normally a customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Form delivery checks.&lt;/strong&gt; I have written at length elsewhere about contact forms that accept a message, thank the visitor, and quietly discard the enquiry. A monthly end-to-end test costs about a minute and catches the failure that costs the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search visibility monitoring.&lt;/strong&gt; Not rank chasing, just watching for the sudden drops that indicate something broke: pages falling out of the index, a stray noindex tag, a crawl error appearing across a section of the site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content and detail corrections.&lt;/strong&gt; Prices that moved, staff who left, opening hours that changed at Christmas and never changed back. Small, constant, and the thing customers actually notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure I see most often
&lt;/h2&gt;

&lt;p&gt;The most common problem in sites I take over is not a hack or a crash. It is drift. Nobody did anything wrong; nobody did anything at all. Plugins sit three years behind, the copyright notice says 2021, a phone number points at a disconnected line, and the enquiry form posts to an address nobody has opened since the person who set it up moved on.&lt;/p&gt;

&lt;p&gt;Drift is slow enough that no single month feels negligent, and it compounds. By the time it becomes visible it is a rebuild rather than a repair, which is a far more expensive conversation than the one that would have prevented it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to tell if you are getting the service
&lt;/h2&gt;

&lt;p&gt;Three questions, none of which should be difficult to answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What did you do last month?"&lt;/strong&gt; A specific answer beats a reassuring one. "Applied the framework patch, restored the backup to a staging copy and checked it, confirmed the contact form delivered" is a real answer. "Everything is running fine" is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"When did you last restore a backup?"&lt;/strong&gt; If the answer is that backups exist, that is a different question to the one asked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How would you know if the contact form stopped working?"&lt;/strong&gt; If the answer depends on somebody complaining, then the answer is that they would not know.&lt;/p&gt;

&lt;p&gt;None of this requires you to understand the technical detail. It requires the person doing the work to be able to describe it in plain terms, which is a fair expectation of anyone taking a monthly fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is reasonable to pay
&lt;/h2&gt;

&lt;p&gt;I am not going to pretend there is a universal number, because it depends on what the site does. A brochure site with five pages and a contact form is genuinely low effort to keep healthy. A site taking bookings or payments is not, because the failure modes are worse and more of them matter.&lt;/p&gt;

&lt;p&gt;The thing worth insisting on is that the arrangement is written down: what is covered, what counts as a change request rather than maintenance, and how quickly something broken gets looked at. Most disputes I hear about are not about price. They are about two people holding different assumptions about what the fee included.&lt;/p&gt;

&lt;p&gt;If you want the detail of how this is priced and scoped in practice, we have written it up properly on our &lt;a href="https://www.webdevwales.com/services/website-maintenance" rel="noopener noreferrer"&gt;website maintenance&lt;/a&gt; service page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Maintenance is insurance you can inspect. The work is real, most of it leaves no visible trace, and the only way to know it is happening is to ask for specifics and get them. A website that has been quietly ignored for two years rarely announces the fact. It just slowly stops earning its keep, and then one day the form has been broken for nine months and business was never actually quiet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of WebDev Wales, a web development studio based in Glynneath, South Wales, building and maintaining websites for small and medium businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>business</category>
      <category>seo</category>
    </item>
    <item>
      <title>Implementing LocalBusiness Schema for Welsh Trade Sites: Real Examples That Survived a Year of Real Traffic</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Sat, 06 Jun 2026 16:46:47 +0000</pubDate>
      <link>https://dev.to/webdevwales/implementing-localbusiness-schema-for-welsh-trade-sites-real-examples-that-survived-a-year-of-real-2dn1</link>
      <guid>https://dev.to/webdevwales/implementing-localbusiness-schema-for-welsh-trade-sites-real-examples-that-survived-a-year-of-real-2dn1</guid>
      <description>&lt;p&gt;Most Welsh trade sites I audit are invisible to Google Business Profile rich results despite ranking on page one for branded searches. The fix is almost always the same: there is no LocalBusiness schema, or it was generated by an SEO plugin three years ago and has gone stale.&lt;/p&gt;

&lt;p&gt;This is the schema setup I now use across every client site at WebDev Wales. We host 42 small business client sites on Vercel, mostly local trade and service businesses across Neath, Bridgend, Swansea, Cardiff and the valleys. The patterns below have been running in production for over a year on the Next.js builds I migrate clients to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why schema markup specifically matters for trades
&lt;/h2&gt;

&lt;p&gt;A plumber in Pontypridd does not compete with national chains on raw SEO. They compete with three other plumbers in Pontypridd. The decider is not who has the most pages, it is who Google trusts enough to show the rich result for "plumber in Pontypridd": the box with the rating, the phone number, the opening hours, the photo.&lt;/p&gt;

&lt;p&gt;That rich result is driven by structured data, primarily LocalBusiness schema, aligned with the Google Business Profile listing. Get this right and Google starts surfacing your client where local-intent searches happen. Get it wrong (or skip it) and even a Lighthouse 95 site sits below the rich-result block.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimum viable LocalBusiness JSON-LD
&lt;/h2&gt;

&lt;p&gt;This is the smallest schema block I will ship on a Welsh trade site. I drop it into a Next.js layout via the App Router's metadata API or a Script component with type application/ld+json.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Plumber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Plumbing Services"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://exampleplumbing.co.uk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telephone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+44-1639-595000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://exampleplumbing.co.uk/og-image.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priceRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"£60-£300"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PostalAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streetAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12 Example Street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressLocality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pontypridd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressRegion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rhondda Cynon Taf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CF37 1AA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressCountry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GB"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GeoCoordinates"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.5996&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-3.3431&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"areaServed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pontypridd"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Treforest"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Llantwit Fardre"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openingHoursSpecification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpeningHoursSpecification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dayOfWeek"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Monday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"Tuesday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"Wednesday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"Thursday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"Friday"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"opens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"08:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"closes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"17:00"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bits that earn the rich result are: matched name with the Google Business Profile, telephone in international format, address that matches the GBP address to the comma, opening hours that match the GBP hours, and a specific @type from schema.org's LocalBusiness subtypes (Plumber, Electrician, RoofingContractor, etc.) rather than a generic LocalBusiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I put it in the Next.js App Router
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Script&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LOCAL_BUSINESS_SCHEMA&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/schema&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en-GB"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Script&lt;/span&gt;
          &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"local-business-schema"&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;
          &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"beforeInteractive"&lt;/span&gt;
          &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LOCAL_BUSINESS_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;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;I keep the schema object in lib/schema.ts so I can compose it per-client without rewriting the layout. The Script component with beforeInteractive ensures Google sees the JSON-LD on first crawl, which matters more than it should because some Welsh client sites get crawled fortnightly at most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Google Business Profile alignment audit
&lt;/h2&gt;

&lt;p&gt;The schema only earns the rich result if it matches what Google already has on file. Before shipping, I run a quick alignment check against the GBP listing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick visual diff&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://client-site.co.uk | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 100 &lt;span class="s1"&gt;'application/ld\+json'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/site-schema.json
&lt;span class="c"&gt;# Compare against what GBP shows for: name, address, phone, hours&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three fields commonly drift between schema and GBP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phone number formatting.&lt;/strong&gt; GBP usually stores 07700 900123 with spaces. Schema needs +44-7700-900123. Both must resolve to the same number but the format mismatch is fine, the resolution is what matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opening hours.&lt;/strong&gt; GBP allows split shifts and bank holiday overrides. Schema needs the openingHoursSpecification array, repeated for each window. If your client closes 12 to 1 for lunch on Wednesdays, that needs to be in the JSON-LD too or Google flags inconsistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Address line breaks.&lt;/strong&gt; GBP shows the address on a single line. Schema needs streetAddress as one field, the rest split out. Easy to misalign during migration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The multi-location pattern for service businesses
&lt;/h2&gt;

&lt;p&gt;About a quarter of my clients serve multiple Welsh towns. The clean approach is one LocalBusiness schema for the primary registered address, plus a Service schema per town, linked via areaServed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Emergency Plumbing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Plumber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Plumbing Services"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://exampleplumbing.co.uk"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"areaServed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Aberdare"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This goes on the town-specific page (eg /plumber-in-aberdare). The town pages do the long-tail work, the homepage LocalBusiness schema does the rich-result work, and Google reconciles the two via the shared provider reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I have seen actually move in Search Console
&lt;/h2&gt;

&lt;p&gt;For sites where I have implemented this correctly from scratch, the pattern in Search Console after about 12 weeks is consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Impressions for "[service] in [town]" queries climb meaningfully&lt;/li&gt;
&lt;li&gt;The rich-result count in the "Enhancements" tab fills in (you want LocalBusiness, Sitelinks, eventually Reviews)&lt;/li&gt;
&lt;li&gt;The site starts appearing in the Local Pack for several town queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will not put numbers on it because client traffic patterns differ wildly and I do not want to promise specific growth. What I will say is that schema is the cheapest local SEO intervention available, takes maybe two hours to implement properly on a Next.js site, and is the single most common thing missing on the audits I run for Welsh small business sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three mistakes I see repeatedly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Schema for the wrong @type.&lt;/strong&gt; Generic LocalBusiness when there is a specific subtype available. Plumber, Electrician, RoofingContractor, HVACBusiness, Carpenter, etc. The specific type is what triggers the trade-relevant rich result.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No &lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt; field.&lt;/strong&gt; When a site has multiple schema blocks (LocalBusiness + breadcrumbs + Service), they all need an &lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt; and they need to reference each other. Without &lt;a class="mentioned-user" href="https://dev.to/ids"&gt;@ids&lt;/a&gt;, Google often picks the wrong block as canonical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stale schema after a phone change.&lt;/strong&gt; A client changes their mobile number, updates GBP, forgets the website. Two weeks later the rich result disappears. I now check schema alignment quarterly as part of the maintenance retainer.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  TL;DR for fellow devs building for UK local businesses
&lt;/h2&gt;

&lt;p&gt;LocalBusiness schema is the highest-leverage SEO change you can ship on a Next.js client site. Use specific subtypes, align exactly with GBP, put it in the root layout via Script beforeInteractive, and audit alignment every quarter.&lt;/p&gt;

&lt;p&gt;If you are running a similar setup for Welsh or UK trade clients and have a different pattern that works, I am genuinely interested to compare. Find me at &lt;a href="https://www.webdevwales.com" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>nextjs</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Hosting 42 Welsh Small Business Sites on Vercel: What I Actually Pay For Per Project</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Mon, 18 May 2026 15:51:57 +0000</pubDate>
      <link>https://dev.to/webdevwales/hosting-42-welsh-small-business-sites-on-vercel-what-i-actually-pay-for-per-project-j9o</link>
      <guid>https://dev.to/webdevwales/hosting-42-welsh-small-business-sites-on-vercel-what-i-actually-pay-for-per-project-j9o</guid>
      <description>&lt;p&gt;I run a small web development studio in South Wales called WebDev Wales. We've been around since 2020 and currently host 42 small business client sites on Vercel, mostly local trades and service businesses across Neath, Bridgend, Swansea, Cardiff and the valleys.&lt;/p&gt;

&lt;p&gt;This is the honest breakdown of what that costs me per project, what I include in client retainers, and where the trade-offs actually sit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Every client site lives in its own Vercel project, deployed from its own GitHub repo, on Vercel's Pro plan which I pay for at the team level. Database / CMS, if a site needs one, is usually Sanity (free tier scales surprisingly far) or Supabase. Each client gets their own DNS records pointed at Vercel, their own SSL (auto via Vercel), their own analytics dashboard. No multi-tenant shenanigans, no shared anything that could leak between clients.&lt;/p&gt;

&lt;p&gt;Why per-project rather than a monorepo or single-Vercel-project-with-domains? Because when a client leaves, they take the repo and the project with them. Zero lock-in. I've had two do exactly that and it was a 15-minute handover both times. That story is worth more in sales conversations than any feature pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually pay per site
&lt;/h2&gt;

&lt;p&gt;Per project, after four years of running this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;: most client sites run well under 5GB/month. The ones with a busy blog or a few hero videos can hit 20-40GB. Vercel Pro gives 1TB pooled across the team, so I'm not paying per-site for bandwidth at small business scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function execution / edge requests&lt;/strong&gt;: Welsh trade sites barely touch this. The few sites with contact form processing or scheduled revalidation use maybe 10-50k invocations a month. Well inside Pro's allowance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build minutes&lt;/strong&gt;: this one bites. A WordPress-to-Next.js migration with a busy content team can chew through 2,000+ build minutes if you're not careful with ISR + on-demand revalidation. I cap most clients at "deploy on push, revalidate hourly" which keeps things sane.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domains&lt;/strong&gt;: Vercel doesn't charge per domain, which is unusual and lovely. I have ~50 domains attached to my team account, most pointing at single projects, a few aliased to staging projects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the marginal cost of a new client site to me is realistically the build-minute allocation, not raw infrastructure. The Pro plan covers it until you get to maybe 100+ active sites or a few high-traffic ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Vercel costs sting
&lt;/h2&gt;

&lt;p&gt;Three areas where the bill gets uncomfortable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-traffic single sites.&lt;/strong&gt; One client gets ~40k unique visitors a month with a blog that updates weekly. Their bandwidth alone is half of what the other 41 clients use combined. Worth a per-site margin review when you take on anyone with real volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image-heavy sites with on-demand image optimisation.&lt;/strong&gt; Vercel's image transformations are metered above the Pro included quota. A client with 200 hero images and 5 sizes per image at frequent re-render hits the limit fast. I now pre-generate sizes in Next.js's static export pipeline for any client with more than 50 hero images.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preview deployments.&lt;/strong&gt; Every PR gets a preview, every preview burns build minutes. For solo-dev projects this is fine. For projects where multiple people are pushing commits to draft branches, you start to feel it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I include in client maintenance
&lt;/h2&gt;

&lt;p&gt;Each client is on a small monthly retainer (range £30-150/month depending on scope). For that they get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosting on Vercel under my account, with the project transferrable to their own Vercel account on request&lt;/li&gt;
&lt;li&gt;SSL renewal (automatic but I monitor it)&lt;/li&gt;
&lt;li&gt;Daily backups of their database / CMS to S3 (separate per-client buckets)&lt;/li&gt;
&lt;li&gt;Dependency updates monthly on a low-risk cadence (patch versions auto, minor versions reviewed, major versions consulted with the client)&lt;/li&gt;
&lt;li&gt;One small content update per month at no extra charge (a new portfolio entry, a price change, a blog post upload)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The maintenance fee covers a portion of the Vercel cost, monitoring, and the time spent on the above. It's not pure infrastructure cost recovery. it's the relationship cost of being someone they can phone when something breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I learned the hard way
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pin the Node version per project.&lt;/strong&gt; Vercel auto-upgrading Node broke three client sites the morning of a major release. Now every project has a &lt;code&gt;.nvmrc&lt;/code&gt; and a &lt;code&gt;engines&lt;/code&gt; field in package.json.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't share a single domain registrar with hosting.&lt;/strong&gt; Vercel does domains too now, but if I let them manage the registrar I'd be doing the lock-in I claim to avoid. Domains stay at Namecheap or with the client's existing registrar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build-time env vars are sticky.&lt;/strong&gt; Move a project between Vercel teams and you'll re-set every env var. Document them externally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use Vercel's "Production Branch Tracking" not main-only deploys.&lt;/strong&gt; Some clients want a "preview before live" workflow. Branch-based prod tracking gives them that without giving me a separate deployment pipeline to maintain.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest TL;DR
&lt;/h2&gt;

&lt;p&gt;Vercel isn't free. For 42 small business client sites on a Pro team plan, my monthly bill is meaningful. but the per-client marginal cost is low enough that it's basically rounding inside the retainer. The value isn't the price tag, it's the operational simplicity: every deploy is identical, every domain works the same way, every client has their own clean repo I can hand back to them on a Tuesday afternoon if they want to leave.&lt;/p&gt;

&lt;p&gt;If you're a freelancer or small studio building for UK or Welsh small businesses, the question isn't "is Vercel cheap". it's "is the maintenance overhead small enough that I can offer a £30-150/month care plan and not lose money on it." For me the answer has been yes, four years in.&lt;/p&gt;

&lt;p&gt;Find more at &lt;a href="https://www.webdevwales.com" rel="noopener noreferrer"&gt;webdevwales.com&lt;/a&gt; if you want to chat about the setup or want a second opinion on a hosting choice you're making.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>vercel</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>What I Charge to Fix the 5 Most Common WordPress Issues (UK Pricing, 2026)</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:33:49 +0000</pubDate>
      <link>https://dev.to/webdevwales/what-i-charge-to-fix-the-5-most-common-wordpress-issues-uk-pricing-2026-3mm2</link>
      <guid>https://dev.to/webdevwales/what-i-charge-to-fix-the-5-most-common-wordpress-issues-uk-pricing-2026-3mm2</guid>
      <description>&lt;p&gt;Small business owners constantly ask me what it costs to fix common WordPress problems. Most have been quoted wildly different prices by different agencies and have no idea what is reasonable. Some have been talked into £500 fixes for problems that take 30 minutes. Others have ignored issues that cost them more in lost revenue every month than the fix would cost once.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a small web development studio in Neath, South Wales. We fix WordPress sites for small businesses across Wales every week. Here is what the most common issues actually cost in 2026, what is happening under the hood, and what you should expect to pay a competent UK developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hacked or Compromised WordPress Site
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt; Google flags your site as dangerous. Strange spam links appear in your footer. Random pages you did not create show up in search results. Admin login redirects elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually happening:&lt;/strong&gt; Almost always an outdated plugin or theme has been exploited. The attacker injected malware, often a backdoor that lets them re-compromise the site even after a surface clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it takes to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take the site offline temporarily&lt;/li&gt;
&lt;li&gt;Pull the latest backup from before the compromise (this is why backups matter)&lt;/li&gt;
&lt;li&gt;If no clean backup exists, manually audit every file in wp-content for injected code&lt;/li&gt;
&lt;li&gt;Reinstall WordPress core and every plugin from fresh downloads&lt;/li&gt;
&lt;li&gt;Reset every password (admin, FTP, database, hosting)&lt;/li&gt;
&lt;li&gt;Submit a re-review request to Google to remove the warning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Realistic UK pricing:&lt;/strong&gt; £400-£800 for a clean fix on a typical small business site. Cheaper if you have a clean recent backup. Significantly more if the site has been compromised for months and Google has indexed the spam pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I charge:&lt;/strong&gt; £450 standard, includes 30 days of monitoring afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Site Loading Painfully Slowly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt; PageSpeed Insights mobile score under 30. Pages take 5+ seconds to load. Customers bouncing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually happening:&lt;/strong&gt; Usually a combination of huge unoptimised images, too many heavy plugins, no caching layer, and cheap shared hosting that is slow to respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it takes to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run a full plugin audit, deactivate anything not actively needed (you would be amazed)&lt;/li&gt;
&lt;li&gt;Compress every image to WebP format and serve responsive sizes&lt;/li&gt;
&lt;li&gt;Install a caching plugin (WP Rocket or W3 Total Cache) and configure it properly&lt;/li&gt;
&lt;li&gt;Set up a CDN (Cloudflare free tier is fine for most small businesses)&lt;/li&gt;
&lt;li&gt;If hosting is the bottleneck, migrate to a proper managed WordPress host&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Realistic UK pricing:&lt;/strong&gt; £200-£500 depending on how bad it is. Most small business sites can be moved from a 25 mobile score to 75+ in a day's work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I charge:&lt;/strong&gt; £275 for a standard speed optimisation pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Site Just Stopped Working After an Update
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt; White screen of death. Critical error message. Half the site is broken. Owner panicking because they tried to update plugins and now everything is dead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually happening:&lt;/strong&gt; A plugin update introduced a conflict, or the PHP version got bumped and a plugin no longer supports it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it takes to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access the site via FTP or hosting file manager (since admin is broken)&lt;/li&gt;
&lt;li&gt;Identify the plugin that broke things from the error logs&lt;/li&gt;
&lt;li&gt;Either roll back the plugin to the previous version or find an alternative&lt;/li&gt;
&lt;li&gt;If PHP version is the issue, downgrade temporarily and plan a proper migration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Realistic UK pricing:&lt;/strong&gt; £100-£300. Most fixes take under two hours but require knowing where to look.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I charge:&lt;/strong&gt; £125 flat for a recovery, more if it turns out to be a deeper compatibility issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Spam Comments and Form Submissions Out of Control
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt; Hundreds of spam comments per day. Contact form filling up with garbage. Spam emails being sent through the site without consent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually happening:&lt;/strong&gt; No anti-spam protection in place, and bots have found the form endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it takes to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Akismet or CleanTalk for comment spam&lt;/li&gt;
&lt;li&gt;Add hCaptcha or Cloudflare Turnstile to all forms (don't use reCAPTCHA, Google has deprioritised it for accessibility)&lt;/li&gt;
&lt;li&gt;Tighten the contact form validation&lt;/li&gt;
&lt;li&gt;Set up SPF/DKIM/DMARC properly to stop your domain being used for spam relay&lt;/li&gt;
&lt;li&gt;Consider disabling comments entirely if you are not actively moderating them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Realistic UK pricing:&lt;/strong&gt; £150-£300.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I charge:&lt;/strong&gt; £175.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Site Looks Broken on Mobile
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt; Site looks fine on desktop. On a phone, text is too small, buttons are too close together, images overflow the screen, contact form unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually happening:&lt;/strong&gt; Theme was either not properly responsive, was customised in a way that broke responsive behaviour, or relies on outdated CSS techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it takes to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit the theme on multiple device sizes (Chrome DevTools is fine for this)&lt;/li&gt;
&lt;li&gt;Fix the broken breakpoints in the theme CSS&lt;/li&gt;
&lt;li&gt;If the theme is too far gone, recommend a swap to a modern responsive theme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Realistic UK pricing:&lt;/strong&gt; £200-£600 depending on whether it is a CSS fix or a theme swap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I charge:&lt;/strong&gt; £275 for a standard responsive fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  What These Numbers Mean
&lt;/h2&gt;

&lt;p&gt;A reputable UK developer should be honest about how long things take and price accordingly. Watch out for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"WordPress maintenance" packages that promise to prevent these issues for £20/month.&lt;/strong&gt; That is not enough money to actually maintain anything. The provider is hoping nothing breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quotes that are mysteriously round numbers like £500 or £1000 for any of the above.&lt;/strong&gt; Real fixes have real time estimates. Round numbers usually mean the developer has not actually scoped the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Optimisation" packages that promise to "boost your SEO" without telling you what they will do.&lt;/strong&gt; Always ask for the specific actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are in Wales and have a WordPress site giving you headaches, happy to take a look and give you an honest scope before you commit to anything. No obligation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio based in Neath, South Wales. He builds and maintains websites for small businesses across Wales.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>smallbusiness</category>
      <category>freelance</category>
    </item>
    <item>
      <title>What Welsh Small Businesses Get Wrong About Local SEO (And How to Fix It in a Weekend)</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:14:16 +0000</pubDate>
      <link>https://dev.to/webdevwales/what-welsh-small-businesses-get-wrong-about-local-seo-and-how-to-fix-it-in-a-weekend-54m3</link>
      <guid>https://dev.to/webdevwales/what-welsh-small-businesses-get-wrong-about-local-seo-and-how-to-fix-it-in-a-weekend-54m3</guid>
      <description>&lt;p&gt;Most Welsh small businesses I audit are losing customers to competitors who are objectively worse at what they do, but better at being found on Google. Plumbers, cafes, tradespeople, accountants, anyone whose customers come from local search. The gap between "best business in town" and "first business that shows up when someone searches" is bigger than most owners realise.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio in Neath, South Wales, and I've audited dozens of Welsh small business websites in the last two years. The same five mistakes come up almost every time. None of them require a marketing degree to fix. Most of them you can sort over a weekend with no budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: The Google Business Profile is half-finished or unclaimed
&lt;/h2&gt;

&lt;p&gt;This is the single biggest one. Your Google Business Profile is what shows up in the map pack when someone searches "plumber Bridgend" or "web designer Swansea." It is free. It is the highest-leverage thing you can do for local visibility. And roughly 40% of the Welsh businesses I audit have either not claimed it or have claimed it and left half the fields empty.&lt;/p&gt;

&lt;p&gt;What needs to be filled in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary category.&lt;/strong&gt; Pick the most specific one. "Web Designer" not "Internet Company." "Plumber" not "Contractor." Google uses this to decide which searches you appear for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description.&lt;/strong&gt; Use all 750 characters. Mention your location, your services, what makes you different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photos.&lt;/strong&gt; Real ones. Of your work, your team, your premises. Businesses with photos get 42% more direction requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opening hours.&lt;/strong&gt; Accurate. Updated when they change. Inaccurate hours are the fastest way to lose trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services.&lt;/strong&gt; List every individual service you offer as a separate entry. This is what Google matches to specific searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Time to fix: 2-3 hours. Cost: nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: The homepage title tag says "Home"
&lt;/h2&gt;

&lt;p&gt;Open your website in a browser. Look at what the browser tab says. If it says "Home" or "Welcome" or just your business name, you have the most easily-fixable SEO problem on the internet.&lt;/p&gt;

&lt;p&gt;Your homepage title should follow this format: &lt;strong&gt;[Primary Service] in [Location] | [Business Name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examples that work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Plumber in Cardiff | Smith Plumbing Services"&lt;/li&gt;
&lt;li&gt;"Web Design in Neath, South Wales | WebDev Wales"&lt;/li&gt;
&lt;li&gt;"Family Solicitor in Swansea | Jones Legal"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the single highest-impact change you can make to your website for local SEO. I've seen sites jump from page 5 to page 2 within a few weeks just from this fix.&lt;/p&gt;

&lt;p&gt;Time to fix: 5 minutes. Cost: nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: The site has no location pages
&lt;/h2&gt;

&lt;p&gt;If you serve multiple areas, you need a dedicated page for each one. Not thin doorway pages with the location swapped out. Genuinely useful pages that mention local landmarks, talk about specific things relevant to that area, and have your NAP (name, address, phone).&lt;/p&gt;

&lt;p&gt;A web designer in South Wales might have pages for Cardiff, Swansea, Neath, Bridgend, Newport. Each page needs unique content explaining how they serve businesses in that specific area.&lt;/p&gt;

&lt;p&gt;Most Welsh small businesses I audit have one homepage and a contact page. That is one page Google can rank for one location. Five proper location pages is five pages Google can rank for five locations.&lt;/p&gt;

&lt;p&gt;Time to fix: a weekend if you write them yourself, £200-£500 if you outsource the writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: The NAP is inconsistent across the web
&lt;/h2&gt;

&lt;p&gt;NAP stands for Name, Address, Phone number. Google cross-references your NAP across every directory listing, social profile, and citation on the web to verify your business is real and located where you say.&lt;/p&gt;

&lt;p&gt;If your business name is "Smith Plumbing" on your website but "Smith Plumbing Ltd" on Yell, "Smith Plumbing Services" on FreeIndex, and "Smith's Plumbing" on Facebook, Google has to make a judgement call about whether these are all the same business. Often it decides they are not, and you split your ranking authority across multiple "businesses."&lt;/p&gt;

&lt;p&gt;Pick one exact format and use it everywhere. Same company name. Same phone format. Same address layout. Audit every existing listing and update the ones that are wrong. This is tedious. It also works.&lt;/p&gt;

&lt;p&gt;Time to fix: a Saturday afternoon if you have under 30 listings to audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 5: There are no recent reviews
&lt;/h2&gt;

&lt;p&gt;Google ranks businesses with recent, positive reviews higher than businesses with old or no reviews. "Recent" means in the last 3 months ideally. The map pack actively favours businesses that get a steady drip of new reviews.&lt;/p&gt;

&lt;p&gt;Most small business owners feel awkward asking for reviews. The simplest way around this: send a one-line text or email after every job that says "Thanks for choosing us, if you have 30 seconds a Google review would really help us out: [your direct review link]." That is it. Most people who would write a positive review will, if you ask. Almost none will if you do not.&lt;/p&gt;

&lt;p&gt;You can generate your direct review link from your Google Business Profile dashboard. Bookmark it. Send it after every completed job.&lt;/p&gt;

&lt;p&gt;Time to fix: 30 seconds per job, ongoing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like When It Works
&lt;/h2&gt;

&lt;p&gt;Six months of consistent effort on these five things will move a typical Welsh small business from "almost invisible on Google" to "showing up in the map pack for their primary services." It is not glamorous. It compounds.&lt;/p&gt;

&lt;p&gt;The businesses that do this consistently end up beating the ones with bigger marketing budgets but worse fundamentals. Local search rewards consistency more than spend.&lt;/p&gt;

&lt;p&gt;If you are in Wales and want a free audit of your own setup against this list, happy to run through it for you. No obligation, no pitch, just an honest list of what is and is not in place.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio based in Neath, South Wales. He builds websites and runs local SEO audits for small businesses across Wales.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>smallbusiness</category>
      <category>marketing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Website Maintenance for UK Small Businesses: What It Actually Costs and Why It Matters</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Thu, 23 Apr 2026 08:28:30 +0000</pubDate>
      <link>https://dev.to/webdevwales/website-maintenance-for-uk-small-businesses-what-it-actually-costs-and-why-it-matters-4cg5</link>
      <guid>https://dev.to/webdevwales/website-maintenance-for-uk-small-businesses-what-it-actually-costs-and-why-it-matters-4cg5</guid>
      <description>&lt;p&gt;I get asked about website maintenance more than almost any other question in my web development business. Usually it goes like this: "My developer built my site two years ago. I haven't touched it since. Do I need to pay for maintenance?"&lt;/p&gt;

&lt;p&gt;The answer is almost always yes. But most small business owners have no idea what that actually means, what it should cost, or what happens if they skip it.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio in Neath, South Wales, and I maintain websites for over 30 small businesses across Wales. Plumbers, cafes, accountants, tradespeople, fitness studios. This is what I've learned about what website maintenance actually involves, what it costs in the UK in 2026, and what happens when you don't do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Website Maintenance Actually Means
&lt;/h2&gt;

&lt;p&gt;The phrase "website maintenance" hides a lot of different work. When a good developer or agency offers a maintenance plan, they are usually covering some or all of these:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security updates.&lt;/strong&gt; WordPress, Joomla, Drupal, and every plugin they use release security patches constantly. If you don't apply them, your site becomes a target. A neglected WordPress site can be compromised within weeks of missing an update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backups.&lt;/strong&gt; Daily or weekly backups stored somewhere that isn't on the same server. When something breaks, this is how you recover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uptime monitoring.&lt;/strong&gt; A tool that pings your site every few minutes and alerts someone if it goes down. Without this, you only find out your site is down when a customer calls complaining.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSL certificate renewal.&lt;/strong&gt; Most are automated now but not all. An expired SSL certificate means browsers show a scary red warning and customers leave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broken link checks.&lt;/strong&gt; Internal and external links that break over time. Google penalises sites with lots of broken links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software updates.&lt;/strong&gt; PHP version updates, database updates, framework updates. These compound if ignored and eventually force an expensive migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content updates on request.&lt;/strong&gt; Changing prices, adding staff, updating service descriptions. Usually included up to a limited number of hours per month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance monitoring.&lt;/strong&gt; Checking page load times and fixing regressions when they appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Costs in the UK
&lt;/h2&gt;

&lt;p&gt;Prices for website maintenance in the UK vary enormously because the scope varies enormously. Here are honest ranges based on what I see in the South Wales market and discussions with other UK web developers:&lt;/p&gt;

&lt;h3&gt;
  
  
  DIY Maintenance: £0-£50/month
&lt;/h3&gt;

&lt;p&gt;You handle updates yourself. You need a backup plugin (UpdraftPlus or similar, £40/year for the premium version), a security plugin (Wordfence free tier is decent), and about 2 hours a month to check things.&lt;/p&gt;

&lt;p&gt;The hidden cost is your time and the risk if something goes wrong. Most small business owners who try DIY maintenance abandon it within six months because the first time a plugin update breaks their site they realise they have no idea how to fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Managed Hosting with Auto-Updates: £15-£40/month
&lt;/h3&gt;

&lt;p&gt;Services like Krystal, 20i, or WP Engine handle security updates and backups automatically. This covers the bare minimum. You're still responsible for content updates, broken link fixes, and anything that breaks.&lt;/p&gt;

&lt;p&gt;Good option if your site is simple and you don't plan to touch it often. Not a real maintenance plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standard Small Business Maintenance: £40-£100/month
&lt;/h3&gt;

&lt;p&gt;This is what most reputable UK agencies charge for a basic small business site. Includes security updates, daily backups, uptime monitoring, SSL management, a few hours of content updates per month, and emergency support when something breaks.&lt;/p&gt;

&lt;p&gt;For context, this is what I charge at WebDev Wales. £55/month for a standard brochure site with up to 2 hours of content updates included. It covers about 90% of small businesses I work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Premium Maintenance: £100-£300/month
&lt;/h3&gt;

&lt;p&gt;Adds performance optimisation reviews, SEO monitoring, monthly reporting, priority response times, more content update hours, and usually some level of strategic input. Worth it if your website is a major source of leads.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-commerce Maintenance: £150-£500/month
&lt;/h3&gt;

&lt;p&gt;E-commerce sites are more complex. Payment gateway compatibility, plugin conflicts, inventory sync issues, checkout flow monitoring, abandoned cart system health. The higher price reflects the higher risk. a broken checkout means lost revenue, not just lost visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens If You Skip Maintenance
&lt;/h2&gt;

&lt;p&gt;A few real examples from businesses I've audited:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The plumber who got hacked.&lt;/strong&gt; Their site was running WordPress 5.8 with outdated plugins. Someone exploited a known vulnerability, injected malware, and Google flagged the site as dangerous. Anyone searching for them got a warning page. It took me three days to fully clean the site, reset compromised credentials, and get Google to remove the warning. Cost to fix: £650. Cost of a £50/month maintenance plan: £300 over six months. Skipping maintenance was the more expensive option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cafe with the expired SSL.&lt;/strong&gt; Their hosting provider auto-renewed the SSL certificate for four years then changed their policy. They stopped auto-renewing and didn't notify the customer clearly. Site went from "Secure" to "Not Secure" on every browser for three weeks before anyone noticed. Reviews started dropping because customers thought the site was fake. Fix took 20 minutes. Damage took months to recover from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The accountant whose site disappeared from Google.&lt;/strong&gt; Their site was hosted on a cheap shared server that kept going down. Brief outages several times a week, sometimes lasting hours. Google's crawlers kept hitting a down site and eventually de-indexed pages. They lost about 40% of their organic traffic over four months. Nobody was monitoring uptime so nobody noticed until enquiries dropped off a cliff.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Tell If Your Current Maintenance Is Worth Paying For
&lt;/h2&gt;

&lt;p&gt;If you're already paying for maintenance and wondering if it's good value, ask your provider for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A list of software/plugin updates applied in the last 3 months. If they can't produce this, they probably aren't doing updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access to your latest backup. You should be able to download it. If they control the only copy and won't give you access, that's a hostage situation waiting to happen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uptime reports for the last 30 days. A good provider will have this automated and will share it freely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evidence of SSL certificate monitoring. Screenshot of their monitoring dashboard or a confirmation email when it last renewed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your provider can produce all four, you're in good hands. If they can produce none of them, you're paying for nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Take
&lt;/h2&gt;

&lt;p&gt;Website maintenance is unglamorous and invisible when it's done well. If your website hasn't gone down, hasn't been hacked, and is still ranking on Google, your maintenance is probably working. It's the kind of cost that feels pointless until it isn't.&lt;/p&gt;

&lt;p&gt;For a typical UK small business, expect to spend £40-£100/month for proper maintenance. Less than that and someone is cutting corners. Significantly more than that and either your site is complex or you're being overcharged.&lt;/p&gt;

&lt;p&gt;If you're in Wales and you're unsure whether your current setup is adequate, happy to take a quick look. No obligation, just honest feedback.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio based in Neath, South Wales. He builds and maintains websites for small businesses across Wales.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>smallbusiness</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>The Small Business Owner's Guide to Local SEO (No Jargon, Just Results)</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Fri, 10 Apr 2026 08:48:45 +0000</pubDate>
      <link>https://dev.to/webdevwales/the-small-business-owners-guide-to-local-seo-no-jargon-just-results-ea2</link>
      <guid>https://dev.to/webdevwales/the-small-business-owners-guide-to-local-seo-no-jargon-just-results-ea2</guid>
      <description>&lt;p&gt;Most small business owners I work with have heard of SEO. Some have even paid for it. But very few actually understand what local SEO is and why it matters more than "regular" SEO for a business that serves a specific area.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio in Neath, South Wales. Over the past four years, I have built and optimised websites for small businesses across Wales -- from plumbers in Swansea to cafes in Cardiff. Here is what I have learned about local SEO that actually moves the needle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Local SEO (and Why Should You Care)?
&lt;/h2&gt;

&lt;p&gt;Regular SEO is about ranking for broad terms like "best web design tips." Local SEO is about ranking when someone in your area searches for what you do. Think "plumber near me" or "web designer Neath."&lt;/p&gt;

&lt;p&gt;For a small business that serves a geographic area, local SEO is everything. You do not need to rank globally. You need to rank when someone 10 miles away needs your service right now.&lt;/p&gt;

&lt;p&gt;Here is the thing: local SEO has different rules from regular SEO. Google uses a separate algorithm for local results (the map pack), and the ranking factors are different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of Local SEO
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Google Business Profile (Formerly Google My Business)
&lt;/h3&gt;

&lt;p&gt;This is the single most important thing you can do for local visibility. If you have not claimed and optimised your Google Business Profile, stop reading this and go do it now. It is free.&lt;/p&gt;

&lt;p&gt;What to get right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business name&lt;/strong&gt; exactly as it appears on your signage (do not stuff keywords in here)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category&lt;/strong&gt; -- pick the most specific primary category available. "Web Designer" is better than "Internet Company"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt; -- use your full 750 characters. Mention your location, services, and what makes you different&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photos&lt;/strong&gt; -- businesses with photos get 42% more direction requests. Upload real photos of your work, your premises, your team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opening hours&lt;/strong&gt; -- keep these accurate. Incorrect hours are the fastest way to lose trust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews&lt;/strong&gt; -- more on this below&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Consistent NAP (Name, Address, Phone)
&lt;/h3&gt;

&lt;p&gt;NAP stands for Name, Address, Phone number. Google cross-references your NAP across the web to verify your business is legitimate. If your business name is "WebDev Wales" on your website but "Webdev Wales Ltd" on Yell and "Web Dev Wales" on FreeIndex, Google gets confused.&lt;/p&gt;

&lt;p&gt;Pick one exact format and use it everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your website footer&lt;/li&gt;
&lt;li&gt;Google Business Profile&lt;/li&gt;
&lt;li&gt;Every directory listing&lt;/li&gt;
&lt;li&gt;Social media profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds trivial but inconsistent NAP is one of the most common local SEO problems I see.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Local Citations (Directory Listings)
&lt;/h3&gt;

&lt;p&gt;A citation is any online mention of your business name, address, and phone number. The more consistent citations you have on reputable directories, the more confident Google is that your business is real and located where you say it is.&lt;/p&gt;

&lt;p&gt;Priority directories for UK businesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Business Profile&lt;/strong&gt; (essential)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yell.com&lt;/strong&gt; (DA 81, still relevant)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FreeIndex&lt;/strong&gt; (strong for UK service businesses)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bing Places&lt;/strong&gt; (catches Bing/Cortana searches)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yelp&lt;/strong&gt; (good domain authority)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry-specific directories&lt;/strong&gt; (e.g. Clutch, DesignRush for agencies)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need to be on 500 directories. 20-30 quality citations with consistent NAP beats 200 inconsistent ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Wins That Most Businesses Miss
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Get Reviews (and Respond to Them)
&lt;/h3&gt;

&lt;p&gt;Reviews are the second most important local ranking factor after your Google Business Profile. But most businesses never ask for them.&lt;/p&gt;

&lt;p&gt;After completing a job, send a short email or text: "Thanks for choosing us. If you have 30 seconds, a Google review would really help us out: [direct review link]."&lt;/p&gt;

&lt;p&gt;Respond to every review, positive or negative. Google counts responsiveness as a ranking signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Location Pages to Your Website
&lt;/h3&gt;

&lt;p&gt;If you serve multiple areas, create a dedicated page for each. Not thin doorway pages -- genuinely useful pages that explain your services in that area, mention local landmarks or considerations, and include your NAP.&lt;/p&gt;

&lt;p&gt;For example, a web designer in South Wales might have pages for Swansea, Cardiff, Neath, and Bridgend. Each page should have unique content about serving businesses in that specific area.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimise Your Website Title Tags
&lt;/h3&gt;

&lt;p&gt;Your homepage title should include your primary service and location. Not "Home | My Business Name" but "Web Design in Neath, South Wales | WebDev Wales."&lt;/p&gt;

&lt;p&gt;This is the single easiest SEO change you can make, and most small business websites get it wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Schema Markup
&lt;/h3&gt;

&lt;p&gt;Schema markup is code that tells Google exactly what your business is, where it is located, and what it does. It is not visible to users but it helps Google understand your site.&lt;/p&gt;

&lt;p&gt;At minimum, add LocalBusiness schema to your homepage with your name, address, phone, opening hours, and geo-coordinates. If you are using Next.js or a modern framework, this is straightforward to implement with JSON-LD.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Not to Waste Time On
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyword stuffing your Google Business Profile name&lt;/strong&gt; -- Google will suspend you&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buying fake reviews&lt;/strong&gt; -- Google is increasingly good at detecting these&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building hundreds of low-quality directory links&lt;/strong&gt; -- quality over quantity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsessing over meta keywords&lt;/strong&gt; -- Google has not used these as a ranking factor for over a decade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paying for "SEO audits" from cold emailers&lt;/strong&gt; -- if someone emails you unsolicited about your SEO, they are selling, not helping&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Long Does Local SEO Take?
&lt;/h2&gt;

&lt;p&gt;Honest answer: 3-6 months for meaningful results. Anyone promising page 1 in 30 days is either lying or using techniques that will get you penalised.&lt;/p&gt;

&lt;p&gt;The good news is that local SEO compounds. Every review, every citation, every month of consistent effort makes the next month easier. And once you are in the map pack for your primary keywords, you tend to stay there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Claim and fully optimise your Google Business Profile&lt;/li&gt;
&lt;li&gt;Audit your NAP consistency across all existing listings&lt;/li&gt;
&lt;li&gt;Submit to 10-15 quality UK directories with consistent NAP&lt;/li&gt;
&lt;li&gt;Update your website title tags to include location + service&lt;/li&gt;
&lt;li&gt;Add LocalBusiness schema markup&lt;/li&gt;
&lt;li&gt;Set up a system to request reviews after every job&lt;/li&gt;
&lt;li&gt;Create location-specific pages if you serve multiple areas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this requires a marketing degree or an agency retainer. It requires consistency and patience. Start with the Google Business Profile and work down the list.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is a web developer based in Neath, South Wales, and founder of &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;. He builds websites for small businesses across Wales, with a focus on performance, SEO, and helping local businesses get found online.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>marketing</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>What I Learned from Auditing 50 Small Business Websites in Wales</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:03:37 +0000</pubDate>
      <link>https://dev.to/webdevwales/what-i-learned-from-auditing-50-small-business-websites-in-wales-2n59</link>
      <guid>https://dev.to/webdevwales/what-i-learned-from-auditing-50-small-business-websites-in-wales-2n59</guid>
      <description>&lt;p&gt;Over the past year, I have audited roughly 50 small business websites across Wales. Plumbers, hairdressers, accountants, cafes, tradespeople, fitness studios, and everything in between. These were not enterprise sites or tech startups. They were the everyday local businesses that make up the backbone of Welsh towns.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://www.webdevwales.com/" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio based in Neath, South Wales. I started doing these audits partly to help prospective clients understand what needed fixing, and partly because I was genuinely curious about the state of small business web presence in Wales.&lt;/p&gt;

&lt;p&gt;The patterns I found were remarkably consistent. The same issues appeared over and over again, regardless of the industry, the town, or how long the business had been running.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Mobile experience is an afterthought (or non-existent)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 38 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the most common issue by far. Over 60% of web traffic in Wales comes from mobile devices, yet the majority of sites I audited were clearly designed for desktop first and then poorly adapted for smaller screens.&lt;/p&gt;

&lt;p&gt;Common problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text too small to read without zooming&lt;/li&gt;
&lt;li&gt;Buttons too close together to tap accurately&lt;/li&gt;
&lt;li&gt;Horizontal scrolling on mobile&lt;/li&gt;
&lt;li&gt;Navigation menus that do not work on touchscreens&lt;/li&gt;
&lt;li&gt;Images that load at full desktop resolution on mobile (destroying load times on 4G)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix is not complicated. Any competent developer can build a mobile-first responsive site. But many of these sites were built 5-8 years ago when mobile was less dominant, and nobody has updated them since.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. No meta descriptions on any page
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 31 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one shocked me the most. Over 60% of the sites had zero meta descriptions set. This means Google is guessing what to show in search results, and it usually guesses wrong.&lt;/p&gt;

&lt;p&gt;I saw search results that displayed cookie consent text, footer navigation, or random mid-sentence fragments. The business owner had no idea this was happening because they never Googled themselves.&lt;/p&gt;

&lt;p&gt;The fix takes about 30 seconds per page and has an immediate impact on click-through rates from search.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Page titles that say "Home" or nothing at all
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 27 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Page titles are one of the strongest on-page SEO signals. A title like "Home" tells Google absolutely nothing about what your business does or where it is located.&lt;/p&gt;

&lt;p&gt;A good title for a local business looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Joe's Plumbing | Emergency Plumber in Swansea | 24/7 Call-Outs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A bad title looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I found sites with titles like "DefaultHomePage," "Untitled," and in one case, "Test Site - DO NOT PUBLISH." That last one had been live for two years.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. No Google Business Profile, or an unclaimed one
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 22 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nearly half the businesses either had no Google Business Profile at all, or had one that was unclaimed with outdated information. This is free real estate on Google that directly affects whether you show up in local search and Google Maps.&lt;/p&gt;

&lt;p&gt;One business had a Google profile with the wrong phone number, wrong opening hours, and a photo of a completely different business. They had no idea because they had never claimed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. SSL certificate missing or expired
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 14 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2026, there is no excuse for this. Chrome shows a full-page security warning for sites without SSL. I found 14 sites where the certificate was either missing, expired, or misconfigured. Every single one of those businesses was losing visitors who saw the "Not Secure" warning and clicked away.&lt;/p&gt;

&lt;p&gt;Free SSL certificates are available from Let's Encrypt and most hosting providers include them at no extra cost. There is literally zero reason not to have one.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Load times over 5 seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 19 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The average load time across the 50 sites was 4.2 seconds. Google recommends under 2.5 seconds. The worst offender took 11 seconds to fully load.&lt;/p&gt;

&lt;p&gt;The usual culprits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unoptimised images (a 4MB hero image when 200KB would do)&lt;/li&gt;
&lt;li&gt;Too many plugins (WordPress sites averaged 23 plugins)&lt;/li&gt;
&lt;li&gt;Cheap shared hosting that slows to a crawl during peak hours&lt;/li&gt;
&lt;li&gt;No caching configured&lt;/li&gt;
&lt;li&gt;Third-party scripts and widgets loading synchronously&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. No clear call to action
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Found on: 35 out of 50 sites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the second most common issue. The site existed, it had information about the business, but it never told the visitor what to do next. No prominent phone number. No contact form above the fold. No "Get a Quote" button. No "Book Now" link.&lt;/p&gt;

&lt;p&gt;Many sites buried the contact page three clicks deep in the navigation. One had a contact page with just a postal address and no phone number or email.&lt;/p&gt;

&lt;p&gt;If you want someone to call you, make your phone number visible on every page. If you want them to fill out a form, put it where they can see it without scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this mean for small businesses in Wales?
&lt;/h2&gt;

&lt;p&gt;The gap between a "good enough" website and an actually effective website is not as big as most people think. The issues I found are not expensive to fix. Most of them can be addressed in a day or two of work.&lt;/p&gt;

&lt;p&gt;Here is my rough priority list for any small business in Wales that wants to improve their site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix your page titles and meta descriptions&lt;/strong&gt; (free, immediate impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claim and complete your Google Business Profile&lt;/strong&gt; (free, major local SEO benefit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your SSL certificate&lt;/strong&gt; (free or nearly free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimise your images&lt;/strong&gt; (free, significant speed improvement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a clear call to action on every page&lt;/strong&gt; (free, directly increases enquiries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test your site on mobile&lt;/strong&gt; (and fix what does not work)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider whether your site needs rebuilding&lt;/strong&gt; (if it is over 5 years old, it probably does)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At WebDev Wales, we build small business websites on Next.js starting at 675 GBP. That gets you a fast, mobile-first, SEO-optimised site with all of the above handled from day one. But even if you never hire us, fixing the items on this list will make a measurable difference to your business.&lt;/p&gt;

&lt;p&gt;The bar for small business websites in Wales is, frankly, quite low. Which means any business that puts in even a modest effort stands out immediately.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>webdesign</category>
      <category>business</category>
    </item>
    <item>
      <title>Local SEO Basics Every Small Business Website Needs</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Sun, 29 Mar 2026 15:42:26 +0000</pubDate>
      <link>https://dev.to/webdevwales/local-seo-basics-every-small-business-website-needs-1k4g</link>
      <guid>https://dev.to/webdevwales/local-seo-basics-every-small-business-website-needs-1k4g</guid>
      <description>&lt;p&gt;Every small business wants to "rank on Google." But most don't know what that actually involves, or how simple the foundations really are.&lt;/p&gt;

&lt;p&gt;I build websites for small businesses at &lt;a href="https://www.webdevwales.com" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, and local SEO is baked into every site we deliver. Here are the basics that make the biggest difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Business Profile is non-negotiable
&lt;/h2&gt;

&lt;p&gt;If you do nothing else, claim and complete your Google Business Profile. This is what shows up in the map pack when someone searches "web developer near me" or "plumber in Neath."&lt;/p&gt;

&lt;p&gt;Fill in every field. Add photos. Post updates weekly. Respond to every review. This single step drives more local traffic than anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your NAP must be consistent everywhere
&lt;/h2&gt;

&lt;p&gt;NAP stands for Name, Address, Phone number. It must be identical across your website, Google Business Profile, social media, and every directory listing.&lt;/p&gt;

&lt;p&gt;Even small differences matter. "St" vs "Street," missing postcodes, old phone numbers. Google cross-references these, and inconsistencies hurt your rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Title tags and meta descriptions matter
&lt;/h2&gt;

&lt;p&gt;Every page on your site should have a unique title tag that includes your location and service. Not "Home" or "About Us," but "Web Design Services in Neath, South Wales | WebDev Wales."&lt;/p&gt;

&lt;p&gt;Meta descriptions don't directly affect rankings, but they affect click-through rates from search results. Write them like mini adverts for each page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema markup tells Google what you are
&lt;/h2&gt;

&lt;p&gt;Structured data (schema markup) helps Google understand your business type, location, services, and reviews. LocalBusiness schema is essential for any service-area business.&lt;/p&gt;

&lt;p&gt;Most WordPress themes don't add this automatically. If your developer hasn't mentioned schema, ask them about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Page speed is a ranking factor
&lt;/h2&gt;

&lt;p&gt;Google has confirmed that Core Web Vitals affect rankings. A slow site won't outrank a fast one, all else being equal.&lt;/p&gt;

&lt;p&gt;Compress images, minimise JavaScript, use a CDN. Or better yet, build on a framework like Next.js that handles most of this automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content that answers local questions
&lt;/h2&gt;

&lt;p&gt;Write content that answers the questions your customers actually search for. "How much does a website cost in Wales?" or "Best web developer in Neath" are real searches with real intent.&lt;/p&gt;

&lt;p&gt;A simple FAQ page addressing common questions can drive significant organic traffic over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Local SEO isn't complicated, but it does require attention to detail and consistency. Get the foundations right and you'll outrank competitors who spent five times more on their website but ignored SEO entirely.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>smallbusiness</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Choose a Web Developer Without Getting Burned</title>
      <dc:creator>Jack Warner</dc:creator>
      <pubDate>Sun, 29 Mar 2026 14:36:35 +0000</pubDate>
      <link>https://dev.to/webdevwales/how-to-choose-a-web-developer-without-getting-burned-1al6</link>
      <guid>https://dev.to/webdevwales/how-to-choose-a-web-developer-without-getting-burned-1al6</guid>
      <description>&lt;p&gt;Hiring a web developer is one of the most important decisions a small business makes. It's also one of the easiest to get wrong.&lt;/p&gt;

&lt;p&gt;I've been on both sides of this. I run &lt;a href="https://www.webdevwales.com" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, building websites for small businesses in South Wales. But before that, I watched businesses around me get burned by developers who overpromised, underdelivered, or disappeared entirely.&lt;/p&gt;

&lt;p&gt;Here's what I've learned about what to look for and what to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  The red flags
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "I'll build it in WordPress with a premium theme"
&lt;/h3&gt;

&lt;p&gt;This isn't automatically a red flag, but it becomes one when the developer presents it as custom work and charges custom prices. If someone quotes you thousands for a WordPress site using a pre-built theme like Astra or Divi, you're paying for assembly, not development.&lt;/p&gt;

&lt;p&gt;Ask directly: "Are you building this from scratch or using a theme?" Both are valid approaches, but the price should reflect which one you're getting.&lt;/p&gt;

&lt;h3&gt;
  
  
  No portfolio or only showing template demos
&lt;/h3&gt;

&lt;p&gt;Every developer should be able to show you live websites they've actually built for real clients. Not mockups. Not template demos. Real, functioning websites with real businesses behind them.&lt;/p&gt;

&lt;p&gt;If they can't provide at least three examples of work they've done, that's a problem. If the examples they show all look suspiciously similar, they're probably reskinning the same template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vague pricing with no breakdown
&lt;/h3&gt;

&lt;p&gt;"It'll cost between two and five thousand" is not a quote. A proper quote breaks down what you're getting: how many pages, what functionality, what's included in the hosting, what happens after launch.&lt;/p&gt;

&lt;p&gt;If a developer can't give you a clear, itemised quote after discussing your requirements, they either don't understand your project or they're planning to add costs later.&lt;/p&gt;

&lt;h3&gt;
  
  
  They don't ask about your business
&lt;/h3&gt;

&lt;p&gt;A developer who jumps straight to talking about technology without understanding your business is building for themselves, not for you. Before any technical discussion, they should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does your business do?&lt;/li&gt;
&lt;li&gt;Who are your customers?&lt;/li&gt;
&lt;li&gt;What do you want your website to achieve?&lt;/li&gt;
&lt;li&gt;How do people currently find you?&lt;/li&gt;
&lt;li&gt;What's working and what isn't with your current site?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If they don't ask these questions, they'll build something that looks nice but doesn't actually help your business grow.&lt;/p&gt;

&lt;h3&gt;
  
  
  No mention of SEO
&lt;/h3&gt;

&lt;p&gt;If a developer builds you a beautiful website that nobody can find on Google, they've failed. Basic SEO should be built into every project from the start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper page titles and meta descriptions&lt;/li&gt;
&lt;li&gt;Fast loading speeds&lt;/li&gt;
&lt;li&gt;Mobile responsiveness&lt;/li&gt;
&lt;li&gt;Clean URL structure&lt;/li&gt;
&lt;li&gt;Image alt text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't extras. They're fundamentals. If your developer treats SEO as an optional add-on, find someone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The green flags
&lt;/h2&gt;

&lt;h3&gt;
  
  
  They show you real results, not just designs
&lt;/h3&gt;

&lt;p&gt;The best developers talk about what their websites achieved, not just how they look. Did enquiries increase? Did the business start ranking for local search terms? Did bounce rate drop?&lt;/p&gt;

&lt;p&gt;Design matters, but results matter more. A slightly less flashy site that generates leads beats a stunning site that nobody visits.&lt;/p&gt;

&lt;h3&gt;
  
  
  They explain things without jargon
&lt;/h3&gt;

&lt;p&gt;If your developer can't explain their approach in plain language, they either don't understand it themselves or they're trying to confuse you into paying more.&lt;/p&gt;

&lt;p&gt;Good developers translate technical concepts into business terms. Instead of "we'll implement lazy loading for above-the-fold content optimisation," they'll say "we'll make your site load faster so visitors don't leave before it appears."&lt;/p&gt;

&lt;h3&gt;
  
  
  They talk about what happens after launch
&lt;/h3&gt;

&lt;p&gt;A website isn't a one-off project. It needs maintenance, updates, and occasional changes. Before you hire anyone, understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who hosts the website and what does it cost?&lt;/li&gt;
&lt;li&gt;What happens if something breaks at 10pm on a Friday?&lt;/li&gt;
&lt;li&gt;How do you make content changes?&lt;/li&gt;
&lt;li&gt;What's the ongoing cost after the initial build?&lt;/li&gt;
&lt;li&gt;Do you own the code and domain, or are you locked into their platform?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers who avoid these questions are setting you up for a surprise later.&lt;/p&gt;

&lt;h3&gt;
  
  
  They have a clear process
&lt;/h3&gt;

&lt;p&gt;Professional developers follow a structured process: discovery, design, development, review, launch. They'll set timelines, show you progress, and ask for your feedback at each stage.&lt;/p&gt;

&lt;p&gt;If someone says "I'll have it ready in a couple of weeks" with no further detail, expect delays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions to ask before hiring
&lt;/h2&gt;

&lt;p&gt;Here's a checklist you can use when talking to potential developers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can you show me three live websites you've built for similar businesses?&lt;/li&gt;
&lt;li&gt;Will this be built from scratch or using a template/theme?&lt;/li&gt;
&lt;li&gt;Can you give me an itemised quote with a clear breakdown?&lt;/li&gt;
&lt;li&gt;What's included in terms of SEO?&lt;/li&gt;
&lt;li&gt;How will the site perform on mobile?&lt;/li&gt;
&lt;li&gt;What's the expected PageSpeed score?&lt;/li&gt;
&lt;li&gt;Who owns the domain, hosting, and code after launch?&lt;/li&gt;
&lt;li&gt;What's the ongoing maintenance cost?&lt;/li&gt;
&lt;li&gt;What's your process and timeline?&lt;/li&gt;
&lt;li&gt;What happens if I want changes after launch?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any developer worth hiring will answer all of these confidently and clearly. If they get defensive or evasive, that tells you everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest truth about pricing
&lt;/h2&gt;

&lt;p&gt;In the UK in 2026, here's roughly what different levels of website cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DIY website builder&lt;/strong&gt; (Wix, Squarespace): Free to £20/month. Fine for a hobby, limited for a real business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress with a premium theme&lt;/strong&gt;: £500 to £1,500. You get a functional site quickly. Limited customisation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom-built website&lt;/strong&gt;: £2,000 to £10,000+. Built specifically for your business. Better performance, better SEO, more flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cheapest option isn't always the worst, and the most expensive isn't always the best. What matters is that the price matches what you're actually getting, and that you understand the trade-offs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The developer you hire will shape how your business appears to every potential customer who finds you online. Take the time to ask the right questions, check their previous work, and make sure they understand your business before they start building.&lt;/p&gt;

&lt;p&gt;A good developer is an investment. A bad one is a very expensive mistake.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jack Warner is the founder of &lt;a href="https://www.webdevwales.com" rel="noopener noreferrer"&gt;WebDev Wales&lt;/a&gt;, a web development studio based in South Wales. He builds modern, fast websites for small and medium businesses using Next.js and specialises in helping Welsh businesses establish a strong online presence.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
    </item>
  </channel>
</rss>
