Matching by who covers the address, not by who is nearest to it
A two-sided marketplace for lawn care where providers draw the area they actually serve, so a job is offered to the people who'll genuinely travel to it.
How the work was scoped
Landscaping & Lawn Care
18 weeks
Fixed price, phased
Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.
What we were brought in to do
The platform connects householders with local mowers. We built the marketplace, the provider profiles, and the service-area model that decides who sees a job at all.
A marketplace connecting householders with local grounds-maintenance providers, where the previous matching had been a radius around each provider's home postcode. Providers ignored most of what they were offered and complained about the jobs they weren't. The engagement was scoped around fixing the matching model, with the interface to follow.
Full-Stack Engineering
Where the old way broke
Radius matching is the obvious answer and the wrong one. A provider will cross town along a main road and refuse a street two miles away over a river, so a circle drawn around a postcode offers jobs nobody takes and hides jobs people want.
A circle is a poor model of where a trade will work. Providers cross town along a main road and refuse a street two miles away over a river, or won't take work in a particular area for reasons they don't have to justify. The radius offered them jobs nobody took and hid jobs they wanted, and both failures showed up only as low engagement.
Providers define the area they actually serve, in place of a distance they'll travel. Matching asks whether a job's address falls inside a declared area, which is a question with a real answer.
Coverage, not radius
Providers declare where they work, and matching asks whether the address falls inside it.
Providers draw or select the areas they actually work in, because a radius says nothing about the river, the toll bridge or the neighborhood a trade won't take jobs in. Matching then asks a question with a real answer (does this address fall inside a declared area?) using a point-in-polygon test in place of a distance comparison.
- Providers declare real coverage areas
- Point-in-polygon matching, no distance arithmetic
- Rivers, bridges and no-go areas modeled honestly
Halloway Grounds Care drags one vertex of the area they actually work, stopping at the river and cutting out a no-go estate, while the district list beside it recounts its households as they do.
A provider's public page at their own handle: priced line by line before anyone asks, next free on Thursday, the area they drew, and the last two things householders said about them.
A profile at your own handle
Providers get a page worth sharing, so the marketplace works for them as a tool.
Each provider gets a page at their own handle with their work, coverage, pricing and reviews: something worth sending to a customer directly. That flips the relationship. The marketplace becomes a tool a trade uses, where it had been a directory they were buried thirtieth in, and that's what made providers keep their listings current without being chased.
- A shareable page at the provider's own handle
- Worth sending to a customer directly, outside the marketplace
- Providers maintain their own listings without chasing
Messaging with context
The job, address and quote sit beside the conversation, so nothing gets retyped into a text thread.
The job, its address, the photos and the quote sit beside the conversation, so nobody is scrolling back through messages to find a house number. Messages are tied to the job, which means the history stays with the work and survives both parties losing the thread.
- Job, address, photos and quote beside the conversation
- Nothing re-typed from a listing into a message
- History tied to the job itself
The hedge job travels with the conversation: its reference, address, preferred morning and the £180.00 quote pinned above the messages, with the job and its quote breakdown alongside.
Three quotes for the same hedge, each broken into the work it covers and set against what firms covering the area charge, with the one above its provider's own stated range flagged.
Pricing up front
The first question is always what it costs, so it's answered before the conversation starts.
Pricing is stated before the conversation begins (call-out fee, hourly rate, typical range for the job type), because "what does it cost?" is the first question every householder has, and hiding it produced a round of messages that ended in nothing. Providers set it once per service, and a job outside the stated range gets flagged before it's quoted.
- Call-out fee, rate and typical range shown before contact
- Set once per service, never per inquiry
- Quotes outside the stated range are flagged
One model, both sides
The offer going out only to the four providers whose shape contains the address, with two near misses named and left unsent, read from the same coverage shapes the householder's search used.
Search and matching read the same coverage shapes, so what a householder sees is what a provider offered.
Search and matching read the same coverage shapes, so what a householder sees in results is exactly what a provider offered. There's no separate search index to fall out of step with the source, and a coverage change takes effect on the next search, with no reindex to wait for.
- Search and matching read one set of coverage shapes
- No separate index to drift from the source
- Coverage edits take effect on the next search
What we built together
- 01
Made the service area a declared shape, replacing the radius around a home postcode
Providers declare the areas they actually work in as shapes, and the shapes they drew during the first phase looked nothing like circles.
- 02
Matched by containment: does this address fall in this provider's area?
Matching is a containment test (does this address fall inside this provider's declared area?), which is a question with a real answer.
- 03
Gave every provider a public profile at their own handle, so they can share it
Every provider gets a public page at their own handle with work, coverage, pricing and reviews, so the listing is worth sending to a customer directly.
- 04
Built messaging into the platform so a job conversation has the job attached
Messaging was built in-platform reluctantly, after watching providers and householders lose job details in text threads they couldn't search.
- 05
Kept pricing transparent up front, because the first question is always what it costs
Pricing is stated before contact (call-out fee, rate, typical range), because "what does it cost?" is the first question and hiding it wastes a round of messages.
Operational results after launch
Coverage
Matching model
0
Jobs offered outside a provider's area
100%
Provider profiles shareable
None
Job context retyped into chat
Matching model and area levels are descriptions, not measurements. Jobs offered outside a provider's area is zero by construction: the query is a containment test. Profiles shareable and job context retyped are both capability claims about what the platform now does and no longer requires.
Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.
Phase by phase
Phase 1: The Matching Question
Coverage, Not Distance
Replaced radius matching with declared coverage. A provider says where they work, and matching answers a containment question in place of a proximity guess.
- Service Area Model
- Containment Matching
- Coverage Editor
Phase 2: The Provider
A Profile Worth Sharing
Gave each provider a public page at their own handle, so the marketplace becomes something they send people to, where it used to be a directory they were buried in.
- Provider Profiles
- Handle Routing
- Portfolio & Pricing
Phase 3: The Conversation
Messages With The Job Attached
Built messaging into the platform so the job, the address and the quote sit beside the conversation, and nobody re-explains them in a text thread.
- In-Platform Messaging
- Job Context
- Notifications
Phase 4: The Householder
Find, Compare, Ask
Built the search side on the same coverage model, so the list a householder sees is providers who'll actually come.
- Provider Search
- Coverage Filtering
- Pricing Surface
A provider's offers on the phone: every job sits inside the area they drew, with the district named on each, and the hedge job already quoted at £180.00.
About our collaboration
Replacing radius matching with declared coverage was the decision the whole build turned on. It was made in week two, after sitting with three providers and asking which jobs they turn down. Everything else (profiles, messaging, search) reads the same coverage shapes.
Phased so the coverage model landed and was validated with providers before anything was built on it, because everything downstream (search, matching, the profile) reads it. Providers drew their real areas during the first phase, and the shapes they drew looked nothing like circles, which settled the design question before it could become an argument.
What we'd carry into the next one
Proximity is a proxy for willingness to travel, and a bad one. Roads and rivers beat circles.
Distance stands in for willingness to travel and predicts it badly: a main road beats a mile, and a river beats both. A circle can't express any of it.
A marketplace profile worth sharing turns providers into a distribution channel.
A profile worth sharing turns each provider into a distribution channel. That's the difference between a marketplace they use and a directory they're buried in.
Conversation without the job attached means the job gets re-explained every time.
Without the job attached, every conversation begins with the householder re-explaining it, and that's the step that loses the ones who were nearly ready to book.
Both sides have to read the same matching model, or the marketplace shows people things that aren't true.
Search and matching have to read one coverage model, or the platform shows a householder a provider who was never actually offering to come.
One address, two matching models
A circle guesses who will travel. A drawn area says so.
Pick an address, then step through who a job there is offered to: first by a radius round each firm’s yard, then by the shapes firms drew, then the offer itself, and finally with one corner of one shape dragged. Switch tabs, or use the arrow keys once one is focused.
A circle of 2 miles round each yard. Distance stands in for willingness to travel, so the offer reaches firms across the river and misses firms that come along the main road.
What the circle decides
- Halloway Grounds CareOffered, and does work this street
- Fenwick LawnsHidden: yard outside the circle, yet works this street
- M. Adeyemi Hedges & LawnsOffered, and does work this street
- Tidy Plot Co.Hidden: yard outside the circle, yet works this street
- Kestrel Turf CareOffered, but wouldn't travel here
- Oakhurst Garden ServicesOffered, but wouldn't travel here
Radius offers 4: 2 who would not come, and hides 2 who would.
The town, firms and shapes are invented; the 2 miles radius and the drag timing are illustrative. Every contains / does-not-contain answer is computed live with a point-in-polygon test.
From a shape a provider drew to the offers a job produces
The coverage model landed and was validated with providers before anything was built on it, because everything downstream reads it: search, matching and the public profile.
- 01 · SourceCoverage drawn by the providerProviders declare the areas they actually work as shapes, drawn from where they go, so rivers, bridges and no-go areas can be expressed.
- 02 · TriggerJob posted at an addressThe job carries its address, photos and quote context from the start, so none of it is retyped into a message later.
- 03 · EnginePoint-in-polygon matchingMatching asks whether the address falls inside a declared area. A job offered outside a provider's area is impossible by construction: the query is the containment test.
- 04 · StateOne set of coverage shapesSearch and matching read the same shapes, with no separate index to fall out of step. A coverage edit takes effect on the next search, with no reindex to wait for.
- 05 · DeliveryOffer, profile and job-attached messagesMessages are tied to the job, so the address, photos and quote sit beside the conversation and the history stays with the work.
Who a job can reach
Reach, addresses & context
No job lands outside the area a provider drew
Matching is a containment test against the shape the provider declared. A job over a river they won't cross is never offered to them, by construction.
An address goes only to firms whose area contains it
The offer is sent to the providers whose shape contains the address and to nobody else; near misses are left unsent. Search reads the same shapes, so no firm is listed that wasn't offering to come.
A quote never loses its job
Messages are tied to the job, so its address, photos and quote sit beside the conversation. Nothing is retyped from a listing, and the history stays with the work.
Matching jobs by distance when it should be by where people actually go? Scope your build in 3 minutes.
Scope your buildNearby engagements
Web PlatformsA dispatch platform that keeps crews moving
A scheduling and dispatch platform with a technician mobile app, instant quoting, and routing that fits more jobs into every day.
Home & Field Services · 16 weeks
Mobile AppsA field inspection app that keeps working when the signal doesn't
A native inspection app that keeps working with zero signal in the field, syncing photos and checklists the moment a connection returns, with push alerts routed through each platform's store-approved channels.
Home & Field Services · 10 weeks
AI & AutomationNever lose a job to a missed call again
A missed-call recovery agent that texts back instantly, captures the job details, books the slot, and keeps a busy calendar full.
Plumbing Services · 6 weeks
Let's talk
Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.














