Layouts · Trades and call-out services · The full pattern

Trades and call-out services: the full pattern

Plan it first: the blueprint It lists the pages you need and what to write on each one.

I fix, install, clean or move things at the customer’s place.

Sites like this: plumber, electrician, heating engineer, cleaner, landscaper, removals, appliance repair, mobile mechanic.

What a visitor comes to find out

“Can you come, to me, soon, for roughly what, and are you legit?”

Untested Worked out from research and real briefs. No site has been built from it yet, so treat it as reasoning to check, not a tested template.

Illustration · one way it could look
The pattern, on a phone
Left: an illustration of one way the homepage could look, with example wording. It isn’t a finished site, and the look is chosen in Design. Right: the same homepage as the pattern draws it, on a phone.

Planning a site? Read from the top. Designing or building one? Jump to the structure or the file.

Explore the website

Eight kinds of page. Home is on every site like this; the other seven depend on the business. Pick a situation to see which pages stay.

Show the plan for

On every page, when the business needs itAlways-there call or bookLanguage switch

On every siteDepends on the businessLeft out for this businessOne page for each item

Home

“Can you come, to me, soon, for roughly what, and are you legit?”

Status
Always
Address
/
Nine sections, top to bottom
What this is · Main action · Where we work · Proof · Services · Prices · What happens next · Who you’ll deal with · What clients say

How visitors move through it

  • HomeAll servicesOne page per service
  • Every other page is one click from the homepage.
  • The main action (call now until the business says otherwise) sits on every page, and on urgent work a call-or-book bar follows the visitor everywhere.

Why it works

Someone with a problem at home needs to know, fast: can you come, when, to my area, roughly for how much, and are you legit?

So the homepage leads with The phone (or the quote), the area covered, and proof that can be checked. Not the firm’s story.

What each part of the homepage is for

  1. What this is always

    Trade and town in plain words.

  2. Main action always

    Call, quote or book, chosen by how urgent the work is and what a ready visitor should do.

  3. Where we work always

    The eligibility check, next to the action.

  4. Proof depends

    Registrations, insurance, review count: what each must show comes from the field’s rules.

  5. Services depends

    Job types, each linking to its priced page.

  6. Prices depends

    With one service, its prices sit on home.

  7. What happens next always

    What happens after you call: who comes, when, what it costs to come.

  8. Who you’ll deal with depends

    Who turns up.

  9. What clients say depends

    Attributed, dated, sourced.

On every page

  • Always-there call or book required when it applies

    Emergency work: reaching you must be possible from every view, with the hours it’s answered. How it looks is Design’s.

  • Always-there call or book recommended when it applies

    Work needed within days: persistent access recommended, not required.

  • Language switch required when it applies

    Several languages: a way to switch is required on every page. Where and how it shows is Design’s.

Which button leads

The main action changes with how people buy. The first rule that matches the business wins.

  1. How soon do people usually need you? Right now, it’s an emergency

    Phone, then message (WhatsApp, Viber, SMS)

    In an emergency people phone. The call goes on every view, with when it is answered. observed

  2. What should a ready visitor do? Ask for a quote

    Request a quote, then phone

    Planned jobs are compared on quotes; photos let the trade price without a visit. observed

  3. What should a ready visitor do? Book a time

    Book a time or dates, then phone

    Fixed-price jobs (an MOT, a boiler service, a weekly clean) can be booked outright. observed

  4. What should a ready visitor do? Message us

    Message (WhatsApp, Viber, SMS), then phone

    Where customers message first (most of the Tirana briefs we studied), the message is the action. observed

  5. Otherwise

    Phone, then request a quote

    Until the brief says otherwise, the phone is what all five sampled trades sites lead with. observed

Check before you build

  • Whether builders belong here or in Portfolio (see Boundary cases). unknown
  • Whether the B2B variant (hauliers, contractors who quote) holds. unknown
  • Whether a per-area page with real local content (jobs done there, the local engineer) is worth having. unknown
  • No trades site has been built from this or tested with visitors. unknown
  • The proof section gives registrations, insurance and reviews a place. What each must show depends on the field’s own rules, not on this pattern. our decision
  • Before/after images only of the same job, from the same angle. our reasoning

Make it yours

A pattern is a starting point. Some of it holds for every business like this, some of it bends, and some of it only you can answer.

Holds for every site

  • Home
  • On the homepage: What this is, Main action, Where we work, What happens next

Depends on the business

  • All services If: How many distinct services or offers? 7 or more
  • One page per service Not if: How many distinct services or offers? One
  • One page per area If: Do you have real local content for each area you cover (jobs done there, the person based there)? Yes, real content per area
  • Prices If: Can you publish prices? Yes, fixed prices or “From” prices or ranges; How many distinct services or offers? 7 or more
  • Finished jobs If: What proof do you actually have? Finished work we can show
  • About and people If: Do clients care which person they get? Yes, they pick or meet a named person or The team matters, not who
  • Quote or booking If: What should a ready visitor do? Ask for a quote or Book a time or Send an enquiry

One pattern, two situations

The same homepage, drawn by the pattern from each situation’s answers. Sections the answers leave out are gone.

Emergency call-out Phone first and reachable on every view; steps lead with how fast you come.
Main button
Call now
Pages
Home, All services, One page per service, One page per area, Prices, About and people
Left out
Finished jobs, Quote or booking
Quoted planned work Compared on quotes: a photo-upload quote form leads; typical prices replace a price list.
Main button
Get a quote
Pages
Home, One page per service, One page per area, Finished jobs, About and people, Quote or booking
Left out
All services, Prices

What you’ll need to supply

For the homepage alone. Nobody can write these for you; the file marks each one as still to supply.

What this is
What you do, in plain words
Where we work
Towns and areas, as text
What happens next
Step

Questions only you can answer

  1. How soon do people usually need you?
  2. What should a ready visitor do?
  3. Can you publish prices?
  4. How many distinct services or offers?
  5. What proof do you actually have?
  6. Do clients care which person they get?
  7. Do you have real local content for each area you cover (jobs done there, the person based there)?
  8. How many languages?

What changes with the answers

How soon do people usually need you? Right now, it’s an emergencyCall becomes primary on every view; steps lead with “how fast we come”.
Can you publish prices? Only by quoteNo prices page; each service says what the quote depends on; quote form with photos.
How many distinct services or offers? OneA one-page site: no service pages.
What proof do you actually have? Finished work we can showAdds finished-job pages, the only place before/after belongs.
How many languages? Two or moreLanguage switcher in the page frame.
Answer for your own business

The plan, every drawing and the file on this page redraw as you answer.

Your brief

Answer what you know and the drawings redraw. Anything you skip stays open, and goes into your site plan as a question, never a guess.

Or start from a real brief

What proof do you actually have?

Inspect the structure

Every page as a wireframe: the sections in order, what each one is for, and what moves on a phone. Select a violet label for its job, the content it needs and every page it appears on.

Home answers “Can you come, to me, soon, for roughly what, and are you legit?”

On a phone · Reachable at every scroll position, one thumb away (a fixed bar is one way; Design decides).

On a phone · Moves up: “do you cover me?” is answered before anything else.

On a phone · Shrinks to one line, detail one tap away.

Example wording.

Use it in Design and Build

Everything above, as one file you can hand on. It describes the site’s structure. It doesn’t design or build anything.

In the file
8 pages, 43 sections in order, the main action, and what each section needs from you
Still to decide
12 open questions. Anything you haven’t answered travels as a question, never a guess.
In Design
The order of pages and sections is the hierarchy to design. The look, type and images are yours to choose.
With a coding agent
Give it the file with your design. It lists every page, its address and its sections in order, and marks the content you still have to write.

JSON is for coding agents and other tools. Markdown reads like a document, for people.

What it isn’t: a finished site, a template to publish, or proof the structure works for your business. Status: untested.

See a test plumber’s plan, worked through

For designers and developers: what each stage reads

Design reads

  • pages[].name, job and order (the hierarchy)
  • pages[].modules[] in order, with jobs and role
  • status “depends” (unresolved) vs optional
  • page_frame with required/recommended strength
  • pages[].phone_first and phone_notes (the phone order)
  • primary_action label and intent

Read pages[] in order and modules[] in order: that is the hierarchy. jobs[] say what each module must achieve; status "depends" means unresolved, not optional. Look, type, imagery and Elements are Design’s; nothing here prescribes them.

Build reads

  • pages[].route and one_per (routes and repeating pages)
  • pages[].modules[] in order
  • modules[].slots with need, many and any profile obligation
  • primary_action.intent and second_routes (implemented per platform)
  • page_frame (required/recommended)
  • left_out (must stay out)
  • entities, when the project names them

Make one route per page (one per entity where one_per is set), modules in the given order, every slot with need "required" filled before ship. Implement each action so it achieves its intent on this project’s platform. Do not read why as an instruction.

QA checks: Check that each included module does its jobs, required slots are filled with real content, left_out items stayed out, and the primary action leads where its label says.

Your site plan, as a file

Project IA file · 0.2

Trades and call-out services

No project named · 2026-10-06 · pattern maturity: reasoned, not built

From the Strategy brief

  • How soon do people usually need you?Right now, it’s an emergency
  • What should a ready visitor do?Phone us
  • How many distinct services or offers?2 to 6
  • What proof do you actually have?Registrations, licenses, memberships, Reviews or ratings
  • Can you publish prices?unanswered
  • Do clients care which person they get?unanswered
  • Do you have real local content for each area you cover (jobs done there, the person based there)?unanswered
  • How many languages?unanswered

Primary action

Phone

Reach the business by phone, now

Build decides (likely tel)

Second route: Message (WhatsApp, Viber, SMS)

On every page

  • Always-there call or book required
  • Language switch required depends

Pages, in order · modules in reading order

  1. Home

    /

    1. What this is orient · explain1 required slot
    2. Main action act1 required slot
    3. Where we work orient · reassure1 required slot
    4. Proof prove · reassure0 required slots
    5. Services explain · explore1 required slot
    6. What happens next explain · reassure1 required slot
    7. Who you’ll deal with reassure · prove depends2 required slots
    8. What clients say prove1 required slot
  2. One page per service × each service

    /services/{service}

    1. Item summary orient · explain2 required slots
    2. Prices reassure · explain depends2 required slots
    3. What happens next explain · reassure1 required slot
    4. Who you’ll deal with reassure · prove depends2 required slots
    5. Proof prove · reassure0 required slots
    6. What clients say prove1 required slot
    7. Questions people ask reassure optional1 required slot
    8. Main action act1 required slot
  3. One page per area × each area depends

    /areas/{area}

    1. Item summary orient · explain2 required slots
    2. Services explain · explore optional1 required slot
    3. Pictures of the real thing demonstrate · prove1 required slot
    4. Who you’ll deal with reassure · prove depends2 required slots
    5. What clients say prove1 required slot
    6. Main action act1 required slot
  4. About and people depends

    /about

    1. Who you’ll deal with reassure · prove2 required slots
    2. Proof prove · reassure0 required slots
    3. Main action act depends1 required slot

Left out, and why

  • Home: Prices left out because the answer to “How many distinct services or offers?” is “2 to 6”
  • page: All services left out because the answer to “How many distinct services or offers?” is “2 to 6”
  • page: Prices left out because the answer to “How many distinct services or offers?” is “2 to 6”
  • page: Finished jobs left out because the answer to “What proof do you actually have?” is “Registrations, licences, memberships, Reviews or ratings”
  • page: Quote or booking left out because the answer to “What should a ready visitor do?” is “Phone us”

Open questions

  • Can you publish prices?
  • Do clients care which person they get?
  • Do you have real local content for each area you cover (jobs done there, the person based there)?
  • How many languages?
  • Whether builders belong here or in Portfolio (see Boundary cases).
  • Whether the B2B variant (hauliers, contractors who quote) holds.
  • Whether a per-area page with real local content (jobs done there, the local engineer) is worth having.
  • No trades site has been built from this or tested with visitors.

Design reads Read pages[] in order and modules[] in order: that is the hierarchy. jobs[] say what each module must achieve; status "depends" means unresolved, not optional. Look, type, imagery and Elements are Design’s; nothing here prescribes them.

Build reads Make one route per page (one per entity where one_per is set), modules in the given order, every slot with need "required" filled before ship. Implement each action so it achieves its intent on this project’s platform. Do not read why as an instruction.

QA checks Check that each included module does its jobs, required slots are filled with real content, left_out items stayed out, and the primary action leads where its label says.

Where it goes next
The raw file
{
  "format": "aesthetary.ia-structure",
  "version": "0.2",
  "made": {
    "by": "Aesthetary IA Library",
    "on": "2026-10-06",
    "pattern": "local-trade",
    "pattern_maturity": "reasoned, not built"
  },
  "project": {
    "name": null,
    "note": "Facts below are the brief. Anything unanswered is listed, never assumed."
  },
  "copy_guidance": {
    "source": "Aesthetary Website Blueprints: the same copywriting guidance the blueprint pages show",
    "how_to_use": {
      "formula": "An instruction, not text to publish. Write original copy for this project that does what the formula describes, using the project’s real facts. Never publish the formula, or anything in square brackets.",
      "why_it_works": "The reasoning behind the section, for whoever writes the copy. Use it to judge a draft; don’t put it on the page.",
      "illustrative_example": "Written for a made-up business to show the formula applied. Never reuse its wording, names, places, numbers or quotes.",
      "project_content": "The project’s own facts are the brief’s answers, any entities and project decisions, and the slots marked “to supply”. Fill slots only with real content from the business. If it isn’t available, leave the slot visibly empty and list it; never invent reviews, ratings, registrations, prices or results."
    }
  },
  "brief": {
    "answered": {
      "urgency": {
        "question": "How soon do people usually need you?",
        "answer": "Right now, it’s an emergency",
        "value": "emergency"
      },
      "main_action": {
        "question": "What should a ready visitor do?",
        "answer": "Phone us",
        "value": "call"
      },
      "services": {
        "question": "How many distinct services or offers?",
        "answer": "2 to 6",
        "value": "few"
      },
      "proof": {
        "question": "What proof do you actually have?",
        "answer": "Registrations, licences, memberships, Reviews or ratings",
        "value": [
          "register",
          "reviews"
        ]
      }
    },
    "unanswered": [
      {
        "fact": "prices",
        "question": "Can you publish prices?"
      },
      {
        "fact": "people",
        "question": "Do clients care which person they get?"
      },
      {
        "fact": "area_pages",
        "question": "Do you have real local content for each area you cover (jobs done there, the person based there)?"
      },
      {
        "fact": "languages",
        "question": "How many languages?"
      }
    ]
  },
  "site_pattern": {
    "id": "local-trade",
    "name": "Trades and call-out services",
    "problem": "Someone with a problem at home needs to know, fast: can you come, when, to my area, roughly for how much, and are you legit?",
    "leads_with": "The phone (or the quote), the area covered, and proof that can be checked. Not the firm’s story."
  },
  "primary_action": {
    "role": "call",
    "label": "Phone",
    "intent": "Reach the business by phone, now",
    "outcome": "inquiry",
    "implementation": "Build decides (likely tel)",
    "decided": true,
    "second_routes": [
      {
        "role": "message",
        "label": "Message (WhatsApp, Viber, SMS)",
        "intent": "Start a written conversation in the app they already use"
      }
    ],
    "why": "In an emergency people phone. The call goes on every view, with when it is answered.",
    "stated_preference": {
      "role": "call",
      "label": "Phone",
      "answer": "Phone us"
    },
    "follows_preference": true
  },
  "page_frame": [
    {
      "module": "persistent-action",
      "name": "Always-there call or book",
      "strength": "required",
      "status": "include",
      "why": "Emergency work: reaching you must be possible from every view, with the hours it’s answered. How it looks is Design’s.",
      "presentation": "Design decides; Build implements.",
      "copy": {
        "formula": "[Same main action] + [when it’s answered]",
        "why_it_works": "Keeps the main action one tap away as people scroll, so nobody has to hunt for your number.",
        "illustrative_example": "“Call now · answered 24 hours”, fixed at the bottom of the phone screen."
      }
    },
    {
      "module": "language-switch",
      "name": "Language switch",
      "strength": "required",
      "status": "depends",
      "depends_on": [
        "languages"
      ],
      "why": "Several languages: a way to switch is required on every page. Where and how it shows is Design’s.",
      "presentation": "Design decides; Build implements.",
      "copy": {
        "formula": "[Each language, named in itself]",
        "why_it_works": "Lets people switch to their language, named in that language.",
        "illustrative_example": "“English · Polski”"
      }
    }
  ],
  "pages": [
    {
      "page": "home",
      "name": "Home",
      "route": "/",
      "phone_first": [
        "action",
        "service-area",
        "proof-strip"
      ],
      "phone_notes": [
        {
          "module": "action",
          "note": "Reachable at every scroll position, one thumb away (a fixed bar is one way; Design decides)."
        },
        {
          "module": "service-area",
          "note": "Moves up: “do you cover me?” is answered before anything else."
        },
        {
          "module": "proof-strip",
          "note": "Shrinks to one line, detail one tap away."
        }
      ],
      "status": "include",
      "job": "Can you come, to me, soon, for roughly what, and are you legit?",
      "modules": [
        {
          "module": "proposition",
          "name": "What this is",
          "jobs": [
            "orient",
            "explain"
          ],
          "status": "include",
          "role": "Positioning",
          "latitude": null,
          "slots": [
            {
              "slot": "what",
              "name": "What you do, in plain words",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "who",
              "name": "Who it is for",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "where",
              "name": "Where (town or area)",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Trade and town in plain words.",
          "copy": {
            "formula": "[The jobs you do + where + how fast you come], then [your price promise + who turns up]",
            "why_it_works": "Someone with a leak or a broken boiler is scanning for three answers: do you do this job, do you cover my area, and how soon. Answering all three in the first line keeps them from going back to the search results.",
            "illustrative_example": "“Boiler repairs and emergency leaks, across the city.” Then: “Fixed call-out price. An engineer on the way, day or night.”"
          }
        },
        {
          "module": "action",
          "name": "Main action",
          "jobs": [
            "act"
          ],
          "status": "include",
          "role": "Primary action",
          "latitude": null,
          "slots": [
            {
              "slot": "primary",
              "name": "Primary action (a role, not a label)",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "secondary",
              "name": "Second route",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reassurance",
              "name": "Terms at the action",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Call, quote or book, chosen by urgency and main_action.",
          "copy": {
            "formula": "[Call or book + who answers], with [call-out fee + when the phone is answered]",
            "why_it_works": "An urgent customer wants to act now. Saying who picks up, and what the visit costs before they call, removes the two worries that stop them dialing.",
            "illustrative_example": "“Call now, an engineer answers”, with “Call-out fee £— · answered 24 hours” beside it."
          }
        },
        {
          "module": "service-area",
          "name": "Where we work",
          "jobs": [
            "orient",
            "reassure"
          ],
          "status": "include",
          "role": "Local information",
          "latitude": null,
          "slots": [
            {
              "slot": "areas",
              "name": "Towns and areas, as text",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "edge",
              "name": "What happens just outside",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "map",
              "name": "Map",
              "need": "optional",
              "content": "to supply"
            }
          ],
          "why": "The eligibility check, next to the action.",
          "copy": {
            "formula": "[Where you work, as place names] + [what happens just outside]",
            "why_it_works": "Answers “do you cover me?” straight away, so people outside your area don’t waste a call and people inside it don’t wonder.",
            "illustrative_example": "“Leeds, Horsforth, Pudsey, Morley and Wetherby. Just outside? Ask; we add a travel charge of £—.”"
          }
        },
        {
          "module": "proof-strip",
          "name": "Proof",
          "jobs": [
            "prove",
            "reassure"
          ],
          "status": "include",
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "registers",
              "name": "Registrations",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "insurance",
              "name": "Insurance",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reviews-summary",
              "name": "Review source, count and date",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "clients",
              "name": "Named clients (with permission)",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Registrations, insurance, review count: what each must show comes from the field’s rules.",
          "copy": {
            "formula": "[Verifiable evidence that reduces hesitation], each with a way to check it",
            "why_it_works": "Gives people something they can check, so they don’t have to take your word for it.",
            "illustrative_example": "“Gas Safe registered · no. — · Check the register ↗”"
          }
        },
        {
          "module": "service-index",
          "name": "Services",
          "jobs": [
            "explain",
            "explore"
          ],
          "status": "include",
          "role": "Service navigation",
          "latitude": null,
          "slots": [
            {
              "slot": "items",
              "name": "Services",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "grouping",
              "name": "Grouped by need, client type or life event",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "price-hint",
              "name": "Price or “from” price per service",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Job types, each linking to its priced page.",
          "copy": {
            "formula": "[Job + “from” price], one line each, in the words customers search for",
            "why_it_works": "People arrive with a specific job in mind. Seeing that exact job, with a rough price, tells them they’re in the right place without reading further.",
            "illustrative_example": "“Emergency leak repair · from £—”, “Boiler repair · from £—”, “Boiler service · from £—”."
          }
        },
        {
          "module": "steps",
          "name": "What happens next",
          "jobs": [
            "explain",
            "reassure"
          ],
          "status": "include",
          "role": "What happens next",
          "latitude": null,
          "slots": [
            {
              "slot": "step",
              "name": "Step",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "when",
              "name": "Time per step",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "cost",
              "name": "Cost per step",
              "need": "optional",
              "content": "to supply"
            }
          ],
          "why": "What happens after you call: who comes, when, what it costs to come.",
          "copy": {
            "formula": "[What they do first] → [what you do next + how fast] → [the work] → [how it ends + what it costs]",
            "why_it_works": "Takes the unknown out of getting in touch: what happens after the first click, who does it, how long it takes and what it costs.",
            "illustrative_example": "“1 You call or send a photo. 2 We give you a time, usually the same day. 3 The engineer fixes it and shows you what was wrong. 4 You pay the price we agreed.”"
          }
        },
        {
          "module": "people",
          "name": "Who you’ll deal with",
          "jobs": [
            "reassure",
            "prove"
          ],
          "status": "depends",
          "depends_on": [
            "people"
          ],
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "name",
              "name": "Name and role",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "register",
              "name": "Personal registration and number",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "photo",
              "name": "Photo (consented)",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "does",
              "name": "What they do for you",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "book-with",
              "name": "Book with this person",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Who turns up.",
          "copy": {
            "formula": "[Name + role] + [what this person does for the customer]",
            "why_it_works": "Puts names and faces on the business. That matters most when you come into someone’s home or handle their money or health.",
            "illustrative_example": "“Dan Shaw, heating engineer. Services and repairs most boilers in the north of the city. Gas Safe no. —.”"
          }
        },
        {
          "module": "reviews",
          "name": "What clients say",
          "jobs": [
            "prove"
          ],
          "status": "include",
          "role": "Supporting evidence",
          "latitude": null,
          "slots": [
            {
              "slot": "quotes",
              "name": "Quote, name or initials, context, date, where it was left",
              "need": "required",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Attributed, dated, sourced.",
          "copy": {
            "formula": "[A real customer’s words + the specific result], with name or initials, place, date and where it was left",
            "why_it_works": "Lets someone like the visitor say it for you. A quote about the job they need does more than general praise.",
            "illustrative_example": "An illustration of the shape, for a made-up business: “Water through the kitchen ceiling at 9pm; fixed by 11.” Sam, Headingley, March, on Google. Use your real reviews."
          }
        }
      ]
    },
    {
      "page": "services",
      "name": "One page per service",
      "route": "/services/{service}",
      "page_pattern": "service",
      "one_per": "service",
      "status": "include",
      "job": "Do you do exactly this, for how much?",
      "modules": [
        {
          "module": "item-header",
          "name": "Item summary",
          "jobs": [
            "orient",
            "explain"
          ],
          "status": "include",
          "role": "Positioning",
          "latitude": null,
          "slots": [
            {
              "slot": "title",
              "name": "Title",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "summary",
              "name": "One-line summary",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "status",
              "name": "Price, status or date",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Names the service and who it is for, in the visitor’s words.",
          "copy": {
            "formula": "[The job, named the way customers say it] + [who it’s for + price from + how soon]",
            "why_it_works": "Confirms the visitor found the exact job they searched for, and answers the first two questions: how much, and how soon.",
            "illustrative_example": "“Boiler repair: most makes, from £—, usually fixed within a day.”"
          }
        },
        {
          "module": "price-list",
          "name": "Prices",
          "jobs": [
            "reassure",
            "explain"
          ],
          "status": "depends",
          "depends_on": [
            "prices"
          ],
          "role": "Price",
          "latitude": null,
          "slots": [
            {
              "slot": "items",
              "name": "Item and price (or “from” price)",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "includes",
              "name": "What’s included",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "tax",
              "name": "Tax shown or included",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "extras",
              "name": "Extra fees (call-out, deposit, travel)",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "depends",
              "name": "What changes the price",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "updated",
              "name": "Last updated",
              "need": "optional",
              "content": "to supply"
            }
          ],
          "why": "The price for this service, with what’s included and any extra fees.",
          "copy": {
            "formula": "[This job + fixed or “from” price] + [what’s included] + [what could add to it]",
            "why_it_works": "The price of this one job, what’s included and what could add to it.",
            "illustrative_example": "“Boiler service · £— including VAT · parts extra, quoted before we start.”"
          }
        },
        {
          "module": "steps",
          "name": "What happens next",
          "jobs": [
            "explain",
            "reassure"
          ],
          "status": "include",
          "role": "What happens next",
          "latitude": null,
          "slots": [
            {
              "slot": "step",
              "name": "Step",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "when",
              "name": "Time per step",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "cost",
              "name": "Cost per step",
              "need": "optional",
              "content": "to supply"
            }
          ],
          "why": "What happens from the first call to the finished job: the question that stops people booking.",
          "copy": {
            "formula": "[What they do first] → [what you do next + how fast] → [the work] → [how it ends + what it costs]",
            "why_it_works": "Takes the unknown out of getting in touch: what happens after the first click, who does it, how long it takes and what it costs.",
            "illustrative_example": "“1 You call or send a photo. 2 We give you a time, usually the same day. 3 The engineer fixes it and shows you what was wrong. 4 You pay the price we agreed.”"
          }
        },
        {
          "module": "people",
          "name": "Who you’ll deal with",
          "jobs": [
            "reassure",
            "prove"
          ],
          "status": "depends",
          "depends_on": [
            "people"
          ],
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "name",
              "name": "Name and role",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "register",
              "name": "Personal registration and number",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "photo",
              "name": "Photo (consented)",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "does",
              "name": "What they do for you",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "book-with",
              "name": "Book with this person",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Who provides this service, when clients pick a person.",
          "copy": {
            "formula": "[Name + role] + [what this person does for the customer]",
            "why_it_works": "Puts names and faces on the business. That matters most when you come into someone’s home or handle their money or health.",
            "illustrative_example": "“Dan Shaw, heating engineer. Services and repairs most boilers in the north of the city. Gas Safe no. —.”"
          }
        },
        {
          "module": "proof-strip",
          "name": "Proof",
          "jobs": [
            "prove",
            "reassure"
          ],
          "status": "include",
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "registers",
              "name": "Registrations",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "insurance",
              "name": "Insurance",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reviews-summary",
              "name": "Review source, count and date",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "clients",
              "name": "Named clients (with permission)",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "The registration or licence that covers this specific work (a gas engineer’s categories, a solicitor’s practice area).",
          "copy": {
            "formula": "[Verifiable evidence that reduces hesitation], each with a way to check it",
            "why_it_works": "Gives people something they can check, so they don’t have to take your word for it.",
            "illustrative_example": "“Gas Safe registered · no. — · Check the register ↗”"
          }
        },
        {
          "module": "reviews",
          "name": "What clients say",
          "jobs": [
            "prove"
          ],
          "status": "include",
          "role": "Supporting evidence",
          "latitude": null,
          "slots": [
            {
              "slot": "quotes",
              "name": "Quote, name or initials, context, date, where it was left",
              "need": "required",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Reviews about this service rather than the firm in general.",
          "copy": {
            "formula": "[A real customer’s words + the specific result], with name or initials, place, date and where it was left",
            "why_it_works": "Lets someone like the visitor say it for you. A quote about the job they need does more than general praise.",
            "illustrative_example": "An illustration of the shape, for a made-up business: “Water through the kitchen ceiling at 9pm; fixed by 11.” Sam, Headingley, March, on Google. Use your real reviews."
          }
        },
        {
          "module": "faq",
          "name": "Questions people ask",
          "jobs": [
            "reassure"
          ],
          "status": "optional",
          "role": "Reassurance",
          "latitude": null,
          "slots": [
            {
              "slot": "items",
              "name": "Question and answer",
              "need": "required",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Only the questions people ask about this service.",
          "copy": {
            "formula": "[Real customer objection + direct answer]",
            "why_it_works": "Answers the doubts that stop people acting, in the words they use when they ask.",
            "illustrative_example": "“Do you charge if you can’t fix it? You pay the call-out fee only, and we tell you what it would take.”"
          }
        },
        {
          "module": "action",
          "name": "Main action",
          "jobs": [
            "act"
          ],
          "status": "include",
          "role": "Primary action",
          "latitude": null,
          "slots": [
            {
              "slot": "primary",
              "name": "Primary action (a role, not a label)",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "secondary",
              "name": "Second route",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reassurance",
              "name": "Terms at the action",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "The page’s one action, with this service’s terms beside it.",
          "copy": {
            "formula": "[Call or book + who answers], with [call-out fee + when the phone is answered]",
            "why_it_works": "An urgent customer wants to act now. Saying who picks up, and what the visit costs before they call, removes the two worries that stop them dialing.",
            "illustrative_example": "“Call now, an engineer answers”, with “Call-out fee £— · answered 24 hours” beside it."
          }
        }
      ]
    },
    {
      "page": "areas",
      "name": "One page per area",
      "route": "/areas/{area}",
      "page_pattern": "location",
      "one_per": "area",
      "status": "depends",
      "depends_on": [
        "area_pages"
      ],
      "job": "Have they worked near me, and who would come?",
      "modules": [
        {
          "module": "item-header",
          "name": "Item summary",
          "jobs": [
            "orient",
            "explain"
          ],
          "status": "include",
          "role": "Positioning",
          "latitude": null,
          "slots": [
            {
              "slot": "title",
              "name": "Title",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "summary",
              "name": "One-line summary",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "status",
              "name": "Price, status or date",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "The area, named the way locals name it.",
          "copy": {
            "formula": "[Area or branch name] + [what you’ve done here + who covers it]",
            "why_it_works": "Shows you really work here: the place, the work you’ve done there and who would come.",
            "illustrative_example": "“Plumbers in Horsforth: — jobs here last year. Dan covers Horsforth and Rawdon.”"
          }
        },
        {
          "module": "service-index",
          "name": "Services",
          "jobs": [
            "explain",
            "explore"
          ],
          "status": "optional",
          "role": "Service navigation",
          "latitude": null,
          "slots": [
            {
              "slot": "items",
              "name": "Services",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "grouping",
              "name": "Grouped by need, client type or life event",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "price-hint",
              "name": "Price or “from” price per service",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Only if what you offer differs here.",
          "copy": {
            "formula": "[Job + “from” price], one line each, in the words customers search for",
            "why_it_works": "People arrive with a specific job in mind. Seeing that exact job, with a rough price, tells them they’re in the right place without reading further.",
            "illustrative_example": "“Emergency leak repair · from £—”, “Boiler repair · from £—”, “Boiler service · from £—”."
          }
        },
        {
          "module": "media",
          "name": "Pictures of the real thing",
          "jobs": [
            "demonstrate",
            "prove"
          ],
          "status": "include",
          "role": "Supporting evidence",
          "latitude": null,
          "slots": [
            {
              "slot": "images",
              "name": "Image with alt text and caption",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "credit",
              "name": "Photographer or source",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Jobs actually done in this area. Without them the page is a doorway page.",
          "copy": {
            "formula": "[A photo of the real thing] + [what it shows + where or when]",
            "why_it_works": "Shows the real thing, so people can judge it for themselves.",
            "illustrative_example": "“Before and after: the same boiler cupboard, Roundhay, June.”"
          }
        },
        {
          "module": "people",
          "name": "Who you’ll deal with",
          "jobs": [
            "reassure",
            "prove"
          ],
          "status": "depends",
          "depends_on": [
            "people"
          ],
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "name",
              "name": "Name and role",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "register",
              "name": "Personal registration and number",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "photo",
              "name": "Photo (consented)",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "does",
              "name": "What they do for you",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "book-with",
              "name": "Book with this person",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Who is based here.",
          "copy": {
            "formula": "[Name + role] + [what this person does for the customer]",
            "why_it_works": "Puts names and faces on the business. That matters most when you come into someone’s home or handle their money or health.",
            "illustrative_example": "“Dan Shaw, heating engineer. Services and repairs most boilers in the north of the city. Gas Safe no. —.”"
          }
        },
        {
          "module": "reviews",
          "name": "What clients say",
          "jobs": [
            "prove"
          ],
          "status": "include",
          "role": "Supporting evidence",
          "latitude": null,
          "slots": [
            {
              "slot": "quotes",
              "name": "Quote, name or initials, context, date, where it was left",
              "need": "required",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Reviews from customers in this area.",
          "copy": {
            "formula": "[A real customer’s words + the specific result], with name or initials, place, date and where it was left",
            "why_it_works": "Lets someone like the visitor say it for you. A quote about the job they need does more than general praise.",
            "illustrative_example": "An illustration of the shape, for a made-up business: “Water through the kitchen ceiling at 9pm; fixed by 11.” Sam, Headingley, March, on Google. Use your real reviews."
          }
        },
        {
          "module": "action",
          "name": "Main action",
          "jobs": [
            "act"
          ],
          "status": "include",
          "role": "Primary action",
          "latitude": null,
          "slots": [
            {
              "slot": "primary",
              "name": "Primary action (a role, not a label)",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "secondary",
              "name": "Second route",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reassurance",
              "name": "Terms at the action",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Call or quote, as on home.",
          "copy": {
            "formula": "[Call or book + who answers], with [call-out fee + when the phone is answered]",
            "why_it_works": "An urgent customer wants to act now. Saying who picks up, and what the visit costs before they call, removes the two worries that stop them dialing.",
            "illustrative_example": "“Call now, an engineer answers”, with “Call-out fee £— · answered 24 hours” beside it."
          }
        }
      ]
    },
    {
      "page": "about",
      "name": "About and people",
      "route": "/about",
      "page_pattern": "people",
      "status": "depends",
      "depends_on": [
        "people"
      ],
      "job": "Who you are letting into your home.",
      "modules": [
        {
          "module": "people",
          "name": "Who you’ll deal with",
          "jobs": [
            "reassure",
            "prove"
          ],
          "status": "include",
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "name",
              "name": "Name and role",
              "need": "required",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "register",
              "name": "Personal registration and number",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "photo",
              "name": "Photo (consented)",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "does",
              "name": "What they do for you",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "book-with",
              "name": "Book with this person",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "Name, role, what they do for you, registration.",
          "copy": {
            "formula": "[Name + role] + [what this person does for the customer]",
            "why_it_works": "Puts names and faces on the business. That matters most when you come into someone’s home or handle their money or health.",
            "illustrative_example": "“Dan Shaw, heating engineer. Services and repairs most boilers in the north of the city. Gas Safe no. —.”"
          }
        },
        {
          "module": "proof-strip",
          "name": "Proof",
          "jobs": [
            "prove",
            "reassure"
          ],
          "status": "include",
          "role": "Trust & proof",
          "latitude": null,
          "slots": [
            {
              "slot": "registers",
              "name": "Registrations",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            },
            {
              "slot": "insurance",
              "name": "Insurance",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reviews-summary",
              "name": "Review source, count and date",
              "need": "conditional",
              "content": "to supply"
            },
            {
              "slot": "clients",
              "name": "Named clients (with permission)",
              "need": "conditional",
              "many": true,
              "content": "to supply"
            }
          ],
          "why": "Each person’s registration with a check link, on their own page.",
          "copy": {
            "formula": "[Verifiable evidence that reduces hesitation], each with a way to check it",
            "why_it_works": "Gives people something they can check, so they don’t have to take your word for it.",
            "illustrative_example": "“Gas Safe registered · no. — · Check the register ↗”"
          }
        },
        {
          "module": "action",
          "name": "Main action",
          "jobs": [
            "act"
          ],
          "status": "depends",
          "depends_on": [
            "people"
          ],
          "role": "Primary action",
          "latitude": null,
          "slots": [
            {
              "slot": "primary",
              "name": "Primary action (a role, not a label)",
              "need": "required",
              "content": "to supply"
            },
            {
              "slot": "secondary",
              "name": "Second route",
              "need": "optional",
              "content": "to supply"
            },
            {
              "slot": "reassurance",
              "name": "Terms at the action",
              "need": "conditional",
              "content": "to supply"
            }
          ],
          "why": "“Book with this person”, when clients choose.",
          "copy": {
            "formula": "[Call or book + who answers], with [call-out fee + when the phone is answered]",
            "why_it_works": "An urgent customer wants to act now. Saying who picks up, and what the visit costs before they call, removes the two worries that stop them dialing.",
            "illustrative_example": "“Call now, an engineer answers”, with “Call-out fee £— · answered 24 hours” beside it."
          }
        }
      ]
    }
  ],
  "left_out": [
    {
      "what": "Home: Prices",
      "why": "left out because services is “2 to 6”"
    },
    {
      "what": "page: All services",
      "why": "left out because services is “2 to 6”"
    },
    {
      "what": "page: Prices",
      "why": "left out because services is “2 to 6”"
    },
    {
      "what": "page: Finished jobs",
      "why": "left out because proof is “Registrations, licences, memberships, Reviews or ratings”"
    },
    {
      "what": "page: Quote or booking",
      "why": "left out because main_action is “Phone us”"
    }
  ],
  "constraint_profiles": [],
  "field_rules": "Not applied. Rules for this field (what it must show) will add requirements to existing sections once they are approved; they never change the structure.",
  "open_questions": [
    "Can you publish prices?",
    "Do clients care which person they get?",
    "Do you have real local content for each area you cover (jobs done there, the person based there)?",
    "How many languages?",
    "Whether builders belong here or in Portfolio (see Boundary cases).",
    "Whether the B2B variant (hauliers, contractors who quote) holds.",
    "Whether a per-area page with real local content (jobs done there, the local engineer) is worth having.",
    "No trades site has been built from this or tested with visitors."
  ],
  "receives": {
    "design": [
      "pages[].name, job and order (the hierarchy)",
      "pages[].modules[] in order, with jobs and role",
      "status “depends” (unresolved) vs optional",
      "page_frame with required/recommended strength",
      "pages[].phone_first and phone_notes (the phone order)",
      "primary_action label and intent"
    ],
    "build": [
      "pages[].route and one_per (routes and repeating pages)",
      "pages[].modules[] in order",
      "modules[].slots with need, many and any profile obligation",
      "primary_action.intent and second_routes (implemented per platform)",
      "page_frame (required/recommended)",
      "left_out (must stay out)",
      "entities, when the project names them"
    ]
  },
  "handoff": {
    "design": "Read pages[] in order and modules[] in order: that is the hierarchy. jobs[] say what each module must achieve; status \"depends\" means unresolved, not optional. Look, type, imagery and Elements are Design’s; nothing here prescribes them.",
    "build": "Make one route per page (one per entity where one_per is set), modules in the given order, every slot with need \"required\" filled before ship. Implement each action so it achieves its intent on this project’s platform. Do not read why as an instruction.",
    "qa": "Check that each included module does its jobs, required slots are filled with real content, left_out items stayed out, and the primary action leads where its label says.",
    "copy": "Write each section’s copy from copy.formula and the project’s real facts; check it against copy.why_it_works. Never reproduce copy.illustrative_example or publish text in square brackets. The guidance is a set of recommendations to test with real visitors, not a promise of results."
  }
}
The research behind it10 statements · 3 sourced · 4 untested or unknown

Use it when

  • The work happens at the customer’s place and the customer comes to the site with a job in mind. observedour brief study
  • Prices, a register number and the towns covered are what customers check before calling. sourcedsite sampleHSEBrightLocal 2026

Not when

Boundary cases

Which sections go on which pages

● required · ◐ conditional on the brief · ○ common, not required. Select a section to find it in the drawings.

Job on the page · sectionHomeAll servicesOne page per serviceOne page per areaPricesFinished jobsAbout and peopleQuote or booking
PositioningRequired
RequiredRequiredRequired
Primary actionRequiredRequiredRequiredRequiredRequiredConditionalCommon
Local informationRequired
Trust & proofConditionalConditionalConditional
ConditionalConditionalConditionalRequired
Service navigationConditionalRequiredCommon
PriceConditionalConditionalRequired
What happens nextRequiredRequiredCommonRequired
Supporting evidenceConditionalConditionalConditionalCommon
RequiredRequired
Required
Conditional
ReassuranceCommonCommon
The offerCommon
Next stepRequired
Conversion pointRequired
Required

What the research says

  • Twenty of the 118 business briefs we studied were trades that needed this structure, and nothing in the library served them. observedour brief studyAesthetary
  • The page structure of five UK plumbing and heating sites: phone and emergency status first, Gas Safe number, prices or “no call-out fee”, towns covered, who turns up. Garages and cleaners share it. observedsite samplesite sample
  • For trades, ratings and review count weigh more than in any other industry; “a professional-looking website” came ninth of eleven reasons for choosing. sourcedBrightLocal 2026

Rules for your field

What a business in this field must show (a registration, prices with tax) depends on its own rules, not on this pattern. Those rules are still being worked out, so none are applied here as requirements.

Common structural mistakes

  • Leading with “about us, family-run since…” when the visitor has water coming through the ceiling. our reasoning
  • Per-town pages with swapped place names. Google’s spam policy names pages targeted at specific cities that funnel users to one page as doorway abuse. sourcedGoogle
  • “No call-out fee” in the footer and a fee at the door. our decisionfrom our software-site guidance, untested here