19/06/2026

SEO in Dorset: How We Built a Ranking System for Local Service Businesses

A technical walkthrough of the local SEO system we built for service businesses across Dorset, covering schema implementation, Core Web Vitals fixes and automated content refresh.

Share

SEO in Dorset: How We Built a Ranking System for Local Service Businesses

Local SEO in Dorset isn't broken—it's just that most agencies treat it like a checkbox exercise. They add your business to a directory, sprinkle some keywords into your homepage, and call it done. Then they wonder why you're still invisible when someone in Poole searches for what you actually do.

We've spent the last two years building and refining a local SEO system specifically for service businesses operating across Dorset—Bournemouth, Poole, Christchurch, Wimborne, Ferndown and the surrounding areas. This post walks through the actual architecture: the schema markup patterns that work, the Core Web Vitals bottlenecks we hit, the content automation layer that keeps pages fresh without manual rewrites, and the trade-offs we made when Google's local algorithm shifted in late 2023.

If you run a business in Dorset and you're trying to show up when your prospects search locally, this is how we approach it from the ground up.

SEO in Dorset: How We Built a Ranking System for Local Service Businesses

What Makes Local SEO in Dorset Different

Dorset sits in a strange middle ground for local search. You're not London, where every postcode is hyper-competitive and every business has an in-house SEO team. But you're also not rural Wales, where showing up in the local pack is trivial because there are only three competitors.

Bournemouth and Poole form a continuous urban area with over 400,000 people. Christchurch, Wimborne, Ferndown and Verwood add density. Then you have coastal towns—Swanage, Lyme Regis, Weymouth—where seasonal search volume spikes hard in summer and collapses in winter.

The result: Google's local algorithm treats Dorset inconsistently. A plumber in Bournemouth competes in a different tier than a plumber in Blandford Forum, even though both serve BH postcodes. If your SEO system doesn't account for this, you either over-optimise for low-value terms or under-optimise for the terms that actually convert.

We learned this the hard way. Early client work assumed Bournemouth-focused optimisation would lift rankings across the county. It didn't. Google's local pack pulls heavily from proximity signals, and a business registered in BH1 will struggle to rank in DT postcodes without deliberate structural changes.

The Stack: What We Actually Use

Our Dorset Local SEO system is built on four layers:

  1. Schema markup — LocalBusiness, Service, FAQPage and Review schema injected via JSON-LD, dynamically populated from Supabase.
  2. Core Web Vitals optimisation — Next.js with server-side rendering (SSR), image optimisation via Vercel's edge network, lazy-loading below the fold.
  3. Automated content refresh — A Supabase-backed CMS that pulls live keyword data from a SerpAPI pipeline and regenerates service area pages monthly.
  4. Google Business Profile automation — Posts, Q&A updates and review response workflows run through Make or Zapier, triggered by Supabase webhooks.

We don't use WordPress. We don't use page builders. Everything is code-first, deployed on Vercel, with Postgres (via Supabase) as the single source of truth for business data, service descriptions and location targeting.

Why Next.js and SSR

Google's local algorithm penalises slow sites harder than national SEO. A half-second delay in Largest Contentful Paint (LCP) can drop you out of the local pack entirely, especially in competitive Bournemouth searches.

We tried client-side rendering (CSR) initially—React app, static JSON pulled on page load. LCP hovered around 3.2 seconds on mobile. Google Search Console flagged it as "poor" for Core Web Vitals. Local pack visibility tanked.

Switching to Next.js with SSR cut LCP to 1.1 seconds. The entire page HTML renders server-side before it hits the browser. Images are optimised and served from Vercel's edge cache. The difference in rankings was measurable within three weeks.

Schema Markup: The Patterns That Actually Work

Most Dorset businesses either have no schema or they have broken schema that Google ignores. We've tested every LocalBusiness subtype and every Service schema pattern. Here's what works:

LocalBusiness schema — Use the most specific subtype available. If you're a plumber, use Plumber, not LocalBusiness. If you're an accountant, use AccountingService. Google uses the subtype to match search intent.

Service schema — Nest a Service array inside LocalBusiness. Each service gets its own entry with name, description, areaServed and offers. This is what populates the "Services" section in the Knowledge Panel.

AggregateRating — Only add this if you have real reviews and the numbers match your Google Business Profile. Google cross-checks. If the schema says 4.8 stars but your GBP says 4.2, the schema gets ignored.

FAQPage — We add FAQ schema to every service page. The questions mirror what people actually type into Google: "How much does a boiler service cost in Bournemouth?" Google pulls these into the "People also ask" section, which drives secondary traffic.

All schema is injected as JSON-LD in the <head>. We don't use microdata. JSON-LD is easier to validate, easier to debug, and Google's Rich Results Test handles it cleanly.

The schema is populated dynamically from Supabase. When a client updates their service list or service areas, the schema regenerates automatically. No manual JSON editing.

The Build: Service Area Pages and Content Automation

Most local SEO guides tell you to create a page for every town you serve. That's correct. What they don't tell you is that creating 20 near-identical pages will get you penalised for thin content unless each page has genuine unique value.

We solve this with a hybrid model: template-driven structure + automated unique content blocks.

How the Service Area Pages Work

Each service area page (e.g., /plumbing-bournemouth, /plumbing-poole) follows the same H1-H2-H3 structure:

  • H1: [Service] in [Town] — e.g., "Emergency Plumbing in Bournemouth"
  • H2: What We Do (service description, always unique)
  • H2: Why Choose Us in [Town] (proof points, case study data specific to that area)
  • H2: Areas We Cover Near [Town] (bulleted list of surrounding postcodes)
  • H2: Frequently Asked Questions (3–5 FAQs, schema-matched)

The service description and proof points are pulled from Supabase and customised per location. We don't just swap the town name into a template—we write or generate distinct paragraphs that reference local landmarks, postcode-specific data, or client results from that area.

The SerpAPI Refresh Pipeline

Here's where automation comes in. Every 30 days, a Make or Zapier workflow triggers:

  1. Pull the target keyword (e.g., "emergency plumber Bournemouth") from Supabase.
  2. Query SerpAPI for the current top 5 ranking pages.
  3. Extract the H2 headings and meta descriptions from those pages.
  4. Feed the data into a prompt that generates three unique content blocks: a 100-word "Why [Town]" section, a 150-word case study snippet, and 3 FAQs.
  5. Write the new content back to Supabase.
  6. Trigger a Vercel redeployment, which regenerates the static page with the updated content.

This keeps the pages fresh without manual rewrites. Google sees updated dateModified timestamps in the schema. The content shifts enough to avoid duplication penalties but stays on-brand and factually accurate because the prompts are tightly constrained.

We don't use this for the core service description—that's always human-written. We use it for the supplementary blocks that would otherwise be copy-paste jobs.

Core Web Vitals: The Bottlenecks We Hit

Local SEO in Dorset means mobile-first. Over 70% of "near me" searches happen on mobile. If your site doesn't load fast on a 4G connection in a Tesco car park, you lose.

LCP: Largest Contentful Paint

Target: under 2.5 seconds. We hit this by:

  • Hero image optimisation — WebP format, 1200x630px, under 80KB. Served from Vercel's edge cache with a Cache-Control header set to 1 year.
  • Font loading — We inline critical font files as base64 in the <head>. No external font requests. Saves 200–400ms on mobile.
  • SSR — The entire above-the-fold HTML renders server-side. The browser doesn't wait for JavaScript to paint the page.

CLS: Cumulative Layout Shift

Target: under 0.1. The killer here is images without explicit width and height attributes. Every <img> tag in our system has both set in the HTML. This reserves layout space before the image loads, preventing the page from jumping.

We also set aspect-ratio in CSS for responsive images. Combined with width and height, this eliminates CLS entirely on service pages.

INP: Interaction to Next Paint

Target: under 200ms. This one bit us when we added a chatbot widget. The widget injected a 120KB JavaScript bundle that blocked the main thread. INP spiked to 340ms. We lazy-loaded the widget—it only loads after the user scrolls below the fold. INP dropped back to 150ms.

Google Business Profile: Automation Without Spam

Your Google Business Profile (GBP) is the single most important ranking factor for local pack visibility in Dorset. More important than backlinks. More important than on-page keyword density.

We automate three GBP tasks without crossing into spam territory:

1. Weekly Posts

Every Monday, a Make or Zapier workflow pulls a pre-written post from Supabase and publishes it via the Google My Business API. The posts rotate through service highlights, seasonal offers, and case study snippets. Each post includes a CTA link back to the relevant service page.

Google favours profiles that post regularly. Weekly is the sweet spot—daily feels spammy, monthly isn't enough.

2. Q&A Monitoring and Response

We set up a webhook that triggers whenever someone asks a question on the GBP listing. The workflow:

  1. Logs the question in Supabase.
  2. Sends a Slack notification to the client.
  3. If the question matches a pre-defined FAQ (stored in Supabase), auto-posts the answer within 10 minutes.

Fast responses signal active management to Google. It also prevents competitors from posting fake questions.

3. Review Response Templates

When a new review comes in, the workflow checks the star rating. If it's 4 or 5 stars, it pulls a thank-you template from Supabase, personalises it with the reviewer's name, and posts the response. If it's 1–3 stars, it alerts the client via email and Slack but doesn't auto-respond—negative reviews need human attention.

The Trade-Offs We Made

No Multi-Location Schema

Google's multi-location schema (hasMap, branchOf) is fragile. We tested it for a client with offices in Bournemouth and Poole. Google merged the two profiles into one Knowledge Panel and dropped the Poole location from the local pack entirely.

We reverted to separate GBP listings with separate landing pages. No schema linking between them. Rankings recovered within two weeks.

No Backlink Outreach for Local Pages

We don't chase backlinks for service area pages. The ROI isn't there. A backlink from a Dorset news site to your /plumbing-bournemouth page might lift that page's authority slightly, but it won't move the needle on local pack rankings.

We focus backlink efforts on the homepage and pillar content (guides, case studies). Those pages pass authority down via internal links.

No Keyword Stuffing in H1s

Early tests tried H1s like "Emergency Plumber Bournemouth | 24/7 Plumbing Bournemouth | Boiler Repair Bournemouth". Google hated it. The pages ranked worse than a clean H1: "Emergency Plumbing in Bournemouth".

We now use one primary keyword per H1. Secondary keywords go in H2s and body copy.

What We Measure

Every Dorset SEO client gets a Supabase dashboard that tracks:

  • Local pack rankings — Position 1–3 for target keywords in target postcodes, pulled weekly via SerpAPI.
  • GBP insights — Search views, map views, website clicks, direction requests. Pulled via the Google My Business API.
  • Core Web Vitals — LCP, CLS, INP for each service area page, pulled from Google Search Console API.
  • Organic traffic by postcode — We append UTM parameters to GBP links so we can see which towns drive the most traffic.

The dashboard updates daily. Clients get a weekly summary email with ranking changes, traffic trends, and action items.

Common Mistakes We See in Dorset SEO

Mistake 1: Optimising for "Dorset" Instead of Towns

Searches for "plumber Dorset" have low intent and low volume. People search "plumber Bournemouth" or "plumber Poole". If your pages target the county name, you're optimising for the wrong query.

Mistake 2: Ignoring Postcode-Level Proximity

Google's local algorithm uses the searcher's precise location, not just the town. A search from BH8 (Winton) will rank differently than a search from BH1 (Bournemouth town centre), even for the same keyword.

You can't game this with on-page SEO. The only fix is to have a verified GBP listing with a real address in the target postcode.

Mistake 3: Duplicate Content Across Service Pages

If your /plumbing-bournemouth and /plumbing-poole pages are identical except for the town name, Google will pick one to rank and suppress the other. You need unique content on each page—at minimum 300 words that don't appear anywhere else on your site.

Mistake 4: Slow Mobile Load Times

We've audited 40+ Dorset business websites in the last year. Average mobile LCP: 4.1 seconds. Google's threshold for "good" is 2.5 seconds. If you're not measuring Core Web Vitals, you're losing rankings to competitors who are.

How Streamline Digital Approaches SEO in Dorset

We don't sell SEO as a standalone service. We sell systems. For Dorset businesses, that means:

  1. A Next.js website optimised for Core Web Vitals, deployed on Vercel.
  2. Schema markup dynamically generated from Supabase, validated with Google's Rich Results Test.
  3. Service area pages with automated content refresh via SerpAPI and Make or Zapier.
  4. GBP automation for posts, Q&A and review responses.
  5. A live dashboard tracking local pack rankings, GBP performance and traffic by postcode.

We build it, we deploy it, we hand over the Supabase login. You own the system. No ongoing retainers unless you want us to manage the content refresh pipeline.

Most clients see local pack visibility (top 3 positions) for their primary keyword within 8–12 weeks. Traffic typically doubles within six months. The businesses that see the fastest results are the ones with an existing GBP profile, real reviews, and a service area that maps cleanly to Dorset postcodes.

Real Results: Bournemouth-Based B2B Client

A recruitment agency in Bournemouth came to us ranking position 12–15 for "recruitment agency Bournemouth" and invisible in the local pack. They had a WordPress site with a 5.2-second mobile LCP, no schema markup, and a GBP profile that hadn't been updated in 18 months.

We rebuilt the site in Next.js, added LocalBusiness and Service schema, optimised for Core Web Vitals (LCP dropped to 1.3 seconds), and set up weekly GBP posts via Make or Zapier. We created separate service area pages for Bournemouth, Poole and Christchurch with unique case study content for each.

Results after 12 weeks:

  • Position 2 in the local pack for "recruitment agency Bournemouth"
  • Position 4 for "recruitment agency Poole"
  • Organic traffic up 118%
  • GBP direction requests up 340%

The technical foundation was Core Web Vitals and schema. The ranking lift came from consistent GBP activity and unique service area content.

Ready to act on this? Book a free 30-minute discovery call.

Frequently Asked Questions

How long does it take to rank in the local pack for Dorset searches?

For most service businesses in Bournemouth or Poole, you'll see movement within 6–8 weeks if the technical foundation is solid—Core Web Vitals under Google's thresholds, schema markup validated, and an active Google Business Profile. Smaller towns like Wimborne or Ferndown can rank faster, sometimes within 4 weeks, because competition is lower. The biggest variable is your existing GBP profile—if you have reviews and a verified address, you start ahead.

Do I need separate pages for every Dorset town I serve?

Yes, if you want to rank in those towns. Google's local algorithm prioritises pages that explicitly mention the town name in the H1, URL and content. A single "Areas We Serve" page with a list of towns won't rank for any of them. You need dedicated service area pages with at least 300 unique words per town. We automate the content generation to avoid duplication penalties while keeping each page distinct.

What's more important for Dorset SEO: backlinks or Google Business Profile?

Google Business Profile, by a wide margin. For local pack rankings, GBP signals—reviews, posts, Q&A activity, proximity—outweigh backlinks 10 to 1. We've seen businesses with zero backlinks rank in the top 3 of the local pack purely on GBP optimisation and Core Web Vitals. Backlinks help your organic rankings below the map, but they won't get you into the local pack if your GBP is neglected.

Can I do Dorset SEO on WordPress or do I need a custom build?

You can do it on WordPress, but you'll struggle with Core Web Vitals. Most WordPress themes load 2–3 MB of assets on mobile, which kills LCP. You'll need a headless WordPress setup (WordPress as a CMS, Next.js or Gatsby for the front end) or aggressive caching and image optimisation. We use Next.js because it gives us full control over performance and schema injection without fighting plugins. If you're already on WordPress, start by fixing LCP—get it under 2.5 seconds or Google will suppress your local rankings.

How much does local SEO for a Dorset business cost?

At Streamline Digital, a full local SEO system—Next.js site build, schema markup, Core Web Vitals optimisation, service area pages, GBP automation and a live ranking dashboard—starts at £4,500 for a single-location service business. Multi-location businesses (e.g., Bournemouth + Poole offices) start at £6,500. No monthly retainers required unless you want us to manage ongoing content updates or GBP activity. Most agencies charge £800–£1,500 per month for local SEO; we build you the system once and hand over the keys.

Conclusion

SEO in Dorset isn't a mystery. It's a system. Schema markup tells Google what you do and where you do it. Core Web Vitals make sure your site loads fast enough to rank. Service area pages with unique content target the towns that matter. GBP automation keeps your profile active without manual posting.

We've built this system for recruitment agencies, tradespeople, accountants, solicitors and e-commerce businesses across Bournemouth, Poole, Christchurch and the wider Dorset area. The stack is always the same: Next.js, Supabase, Make or Zapier, SerpAPI. The results are consistent: local pack visibility within 8–12 weeks, traffic up 100–200% within six months.

If you're a Dorset business and you're not showing up when your prospects search locally, the problem isn't Google—it's your technical foundation. Fix Core Web Vitals, add schema, automate your GBP, and build real service area pages. Or we'll build it for you.

Ready to stop losing local searches to competitors with worse services and better SEO? Book a free 30-minute discovery call with Streamline Digital. We'll audit your current site, show you exactly what's holding you back, and map out the system you need to rank in Dorset's local pack.

Book Your Free Call →


#LocalSEO #DorsetBusiness #SchemaMarkup #CoreWebVitals #TechnicalSEO

For more information, contact Streamline Digital: https://www.streamlinedigital.uk

Share

Hand-picked next steps from across our guides and services.

Comments

Sign in with Google to join the conversation. Comments are moderated before they appear.

Loading comments…