Web design
Research-led website design that turns a visitor into an enquiry — accessible, fast, and grounded in what your buyers are actually trying to do.
SBPO Consulting · Build
A site is fast on launch day because someone made it fast. It is still fast a year later because someone built it so that adding a page cannot quietly break it. We set performance and accessibility budgets before the first component is written, and hand over something your own team can maintain without us.
Where we come in
Design decides what a page should be. Development decides whether it is still that thing on a throttled mobile connection, under a screen reader, with a fourteen-word headline, after two years of edits by people who were not in the original meeting.
Our web development services cover the sites people read and act on: marketing sites, service and sector sites, content platforms, documentation, publisher sites and lead-generation builds. Where visitors sign in and the software has accounts, roles, dashboards and state, that is web application development — a different discipline with a different definition of finished. Where the site takes money for products, e-commerce development brings its own constraints around catalogue, checkout and payment compliance.
Almost everything below is about decisions that are cheap to make at the start and expensive to revisit later. That is most of what this job actually is.
This is the first real decision, and it is usually made by habit rather than by argument. It should be made by argument.
Pages are built once at deploy time and served as files from a CDN. Nothing computes per request, so the site is fast almost by default, cheap to host, and has a very small attack surface — there is no application server to compromise. The cost is that anything which changes must trigger a rebuild, so a catalogue of two hundred thousand pages that updates hourly is a poor fit. For a marketing site with a few hundred pages and a few edits a day, static is close to a free win, and it is why this site is built in Astro.
Each request is rendered on demand. This is the right answer when content is personalised, when stock or pricing must be current to the second, or when the page depends on who is asking. The cost is real infrastructure: you now have a server that can be slow, can fall over, and must be scaled and patched. Server rendering is not a performance problem in itself, but it moves the performance work from build time to runtime, where it is harder.
Most real sites are mixed. Marketing pages are static, a search page renders on the server, a dashboard fragment loads client-side after authentication. Modern frameworks — Next.js and Astro among them — support this per route rather than per project, which means the sensible answer is to choose per page rather than adopting one mode as an identity. What matters is that the decision is deliberate and written down. Sites that get slow rarely got slow through one bad choice; they got slow because nobody owned the decision at all.
TypeScript, and types that mean something. Not because JavaScript is unworkable, but because the person maintaining a content model in eighteen months needs the compiler to tell them what a field can contain.
Semantic HTML before anything else. A <button> is focusable, announced correctly, and works with a keyboard and voice control without a line of script. A <div> with a click handler is none of those things and needs four extra attributes to approximate one. Most accessibility failures we find in audits are recreations of behaviour that browsers already provide.
Progressive enhancement where the platform allows it. Forms submit, navigation works, content renders — then JavaScript improves the experience. Sites built as pure client-side applications fail completely when a single bundle fails to load, and they fail invisibly.
Fewer dependencies, chosen conservatively. Every package is a permanent obligation: a supply-chain risk, a maintenance burden and a possible reason your build breaks in a year. We would rather write forty lines than install a package with three hundred transitive dependencies to avoid them.
Components with all their states drawn. Loading, empty, error and disabled states are where builds usually diverge from designs, because they are the states nobody puts in the Figma file. We ask for them, and where they are missing we specify them rather than inventing them silently.
There is no universally correct content management system, and anyone who tells you otherwise is describing their own skill set rather than your problem. The variables that actually decide it are: how many people edit, how technical they are, how much page composition they need to do without a developer, and how much of a security surface you are prepared to own.
WordPress remains the default for good reasons. The editor talent pool is enormous, non-technical teams are already trained on it, and the plugin ecosystem solves common problems in an afternoon. Its costs are equally real: a much larger attack surface, plugin conflicts that surface at inconvenient moments, and performance that must be actively defended rather than assumed. Used carefully — a curated plugin list, a properly built theme, managed hosting — it is a perfectly good choice. Used carelessly it becomes the site nobody dares to update.
Headless platforms such as Sanity, Contentful and Strapi separate the content from its presentation. Content becomes structured, reusable across a website and an app, and the front-end can be built in whatever renders fastest. The trade-offs are that you build the editing experience rather than inheriting it, page composition is more constrained by design, and there is a per-seat cost that grows with the team.
Git-based content — Markdown or MDX files in the repository, edited through a lightweight interface — gives you version history, review workflows and zero content-platform cost. It suits technical teams and documentation-style content and suits a marketing team of six non-technical editors very badly.
We recommend one, explain the trade-off we accepted, and note the conditions under which the answer would change. If your team already runs one platform confidently, that competence is a legitimate reason to keep it, and it frequently outweighs a technical advantage nobody in your organisation can operate.
A performance audit at the end of a project tells you what you already lost. The work that matters happens earlier, at the point where someone decides the hero has a background video.
The three Core Web Vitals are the useful shared vocabulary. Largest Contentful Paint should occur within 2.5 seconds, Interaction to Next Paint should be 200 milliseconds or less, and Cumulative Layout Shift should stay at or below 0.1 — each assessed at the 75th percentile of real page loads, split between mobile and desktop. That percentile matters more than the numbers: it means a site that is quick for most visitors and dreadful for a quarter of them is failing, which is exactly the profile of a site tested only on office broadband.
In practice, the recurring causes are unglamorous. Images shipped far larger than the space they occupy. Web fonts that block rendering or swap to a differently-proportioned fallback and shift the layout. Third-party marketing tags added through a tag manager by someone with no visibility of the cost, each competing for the same main thread as your own code. Client-side rendering used for content that could have been HTML.
So we set a budget before the build starts, wire it into continuous integration with Lighthouse CI, and let a regression fail the pipeline. And we monitor field data after launch, because lab scores measure a simulated visit on a machine that is not your customer’s.
Correct document structure is not two jobs. A single heading hierarchy that reflects the actual outline of the page helps a screen reader user navigate by heading, and helps a search engine understand what the page is about. Descriptive link text serves someone tabbing through links out of context and serves the crawler resolving what the destination is. Landmarks, labels and a sensible focus order are the same work as a clean, parseable document.
The floor is WCAG 2.2 at AA: a contrast ratio of at least 4.5:1 for body text and 3:1 for large text and interface components, every function reachable by keyboard, focus never entirely obscured by sticky headers or cookie banners, and adequate target sizes for touch. We test with automated tooling on every build, which catches perhaps a third of real issues, and by hand for the rest — because no automated checker can tell you whether your focus order makes sense or whether your alt text is useful.
Search engines process JavaScript-heavy pages in stages. Google crawls the HTML first, queues the page for rendering, then indexes what the render produces — and as Google’s own documentation puts it, a page “may stay on this queue for a few seconds, but it can take longer than that”. If your critical content and links only exist after client-side JavaScript executes, you have introduced a dependency on that queue for no benefit. Server-rendered or statically generated HTML removes the question entirely.
The rest of the build-side search work is mechanical and easy to get right if it is planned: one canonical URL per piece of content with consistent internal linking, a redirect map applied at launch rather than after the ranking drop, valid JSON-LD structured data that describes content genuinely visible on the page, an accurate sitemap, and titles and headings that are part of the content model rather than generated from a template pattern. Where the site already earns traffic, this should be run alongside a technical SEO workstream from the beginning of the project rather than as a launch-week checklist.
Most sites of any size talk to something else: a CRM, a booking system, a payment provider, a mailing platform, an ERP, an analytics stack. Building the happy path is straightforward. What separates a robust build from a fragile one is what happens when the other side is slow, rate-limited or down.
An enquiry form that posts directly to a CRM and shows an error when that CRM times out has just thrown away a lead. The same form that writes the submission to its own store first, then syncs, loses nothing and can be retried. We build integrations with explicit timeouts, retries with backoff, idempotency where a duplicate write would cause harm, and a visible record of what failed. Credentials live in a secret store rather than in the repository, and every integration is documented with its data mapping so that the next person can see what the site believes a lead actually is. Getting the measurement side of that right is often a conversation with our data and analytics team rather than a purely engineering one.
Deployment should be boring. A change is committed, continuous integration runs the type checks, tests, accessibility checks and performance budget, a preview environment appears for review, and a merge ships it. That takes a day or so to set up and pays for itself the first time it catches something.
We use GitHub Actions for the pipeline, and match the host to the architecture rather than to preference: static and hybrid builds on Vercel, Netlify or Cloudflare; WordPress on managed hosting with its own caching and staging. Whatever the platform, three things are non-negotiable. Every account is registered to you. Every deployment can be rolled back. And backups are verified by actually restoring one, because an untested backup is a belief, not a plan.
Web security for a content site is mostly discipline rather than cleverness. The OWASP Top Ten is the standard reference for the risk categories worth designing against, and most real incidents on small and mid-sized sites come from a short list: an outdated plugin or dependency with a known vulnerability, a weak or reused administrator credential, an unvalidated file upload, or a form endpoint with no rate limiting.
The measures that address them are equally short. Keep dependencies patched and remove the ones you are not using. Enforce multi-factor authentication on every administrative account. Serve a Content Security Policy, which limits what injected script can do if something does get through and is one of the few controls that helps after a failure rather than before it. Validate input server-side regardless of what the client already checked. Put a web application firewall in front of anything with a login.
The inconvenient part: a plugin-heavy site is a security posture you are choosing, not an accident. Every plugin is code from a third party running with full access to your database. That is a defensible trade if the plugin list is short, curated and maintained. It is not defensible if nobody can say why nineteen of them are installed.
We write end-to-end tests in Playwright for the journeys that make you money — the enquiry form, the search, the checkout step, the sign-up — because those are the paths where a silent regression is expensive. Alongside that: keyboard and screen reader passes on interactive components, a real-device check across the browsers your analytics say your visitors actually use rather than a generic matrix, and content stress tests with the longest and shortest realistic values.
Launch day should be uneventful. Redirects mapped and tested, monitoring live before the DNS change rather than after, a restore rehearsed, and a documented path back to the previous version. Where the site already ranks, Google recommends keeping redirects in place for at least a year, because signal transfer takes time and pulling them early is a self-inflicted wound.
We do not publish a price, because the drivers vary more than any headline figure would suggest. The ones that genuinely move it are: the number of distinct templates rather than the number of pages; whether a design system exists or must be built; how many integrations there are and whether their APIs are documented and stable; whether content is migrated automatically or by hand; how many editorial roles and permission levels the CMS needs; the browser and device matrix in scope; and whether the site must be delivered in more than one language.
Two things reliably cost more than clients expect. Content migration from an unstructured legacy site is slow work that resists automation. And approval structures — the number of people who must sign off, and how quickly they do — shape a schedule more than any technical decision. We scope against those variables in writing before quoting, and we would rather show you a wide range with its reasons than a precise number that is fictional.
Development rarely arrives on its own. If the site needs to be designed as well as built, that is web design, and having both under one roof mostly saves you the detail loss that happens at handover. If people sign in and use the thing repeatedly rather than reading it, the discipline you want is product interface design feeding an application build rather than a website one. And if the current site already earns organic traffic, the migration needs planning from day one rather than from launch week.
If you are not sure which of those you need, tell us what the site has to change and we will say which — including when the answer is less work than you were expecting.
Scope
Every engagement is scoped in writing before it starts. These are the artefacts that leave our hands and become yours.
Version-controlled source in your Git organisation from the first commit, with a readable history, meaningful branches and no dependency on our accounts to deploy. If you replace us tomorrow, the next team clones the repository and works.
Every component built with its full set of states — default, hover, focus, active, disabled, loading, empty and error — so pages are assembled from tested parts rather than reinvented per template. This is what stops the site drifting within a year.
CMS fields modelled around the content, not around the current page layout, with validation, help text and sensible defaults. Editors get guardrails instead of a free-text field that lets them break the layout.
Lighthouse CI or an equivalent budget wired into the deployment workflow so a regression in Largest Contentful Paint or bundle size fails the build rather than being discovered by a customer three months later.
Every connection to a CRM, payment provider, mailing platform or analytics tool documented with its authentication method, its data mapping, and what the site does when that third party is slow or unavailable.
Written instructions for shipping a change, reverting one, restoring a backup, rotating a credential and reaching the hosting provider. Written for someone who is not us and is having a bad morning.
End-to-end tests covering the journeys that make you money, plus a recorded pass across the browser and device matrix agreed in scope, so "it works" is a claim with evidence behind it.
A walkthrough of the codebase, the CMS and the deployment process, with every account, DNS record, API key and repository transferred into your ownership rather than held on your behalf.
How it runs
Traffic patterns, editorial workload, integration list, compliance obligations, and who will maintain this after launch. The last of those changes the architecture more than any other answer, and it is the one most briefs leave out.
Static, server-rendered or hybrid; which CMS; where it is hosted. We write down the reasoning and the trade-offs accepted, so the decision can be revisited later by someone who was not in the room.
Design tokens, layout primitives and components first, then templates assembled from them. Building page by page produces a site that looks finished and behaves like six separate projects stitched together.
The CMS is modelled and populated with real content, integrations are connected with their error states handled, and measurement is configured before launch rather than retrofitted once someone asks what is working.
Automated end-to-end tests, keyboard and screen reader passes, real devices for the top traffic segments, and a performance check against Core Web Vitals thresholds on a throttled connection rather than on office fibre.
Redirect map applied, monitoring live, backups verified by actually restoring one, and a defined path back to the previous version. A launch you cannot reverse is not a launch, it is a bet.
Documentation, a walkthrough, transferred credentials and an agreed support arrangement. We would rather answer questions for a while than have the codebase abandoned because nobody understood it.
Tooling
We pick tools for the problem, not for the résumé. Where a platform is a poor fit we will say so before you have paid for it.
Non-negotiables
These are checkable. Ask us to demonstrate any of them on your own project before you sign anything.
A page-weight and Core Web Vitals budget is agreed at the start and checked automatically on every deployment. A change that breaks the budget fails CI. Budgets that live in a document rather than in the pipeline are decoration.
Navigation, forms and content work with markup and CSS wherever the platform allows it. JavaScript enhances; it is not the load-bearing wall. This is the cheapest accessibility, performance and resilience decision available.
Keyboard operation, focus visibility, accessible names and contrast are checked with automated tooling on every build and by hand on every interactive component before release.
We prefer fewer, well-maintained packages over convenient ones with large transitive trees, and we keep them patched. Every dependency is a permanent maintenance obligation you inherit.
Repository, hosting, DNS, CMS and third-party API credentials are registered to you. Agencies that hold client infrastructure in their own accounts are creating leverage, not convenience.
Questions
It depends on who edits the site, how often content changes, and what has to be personalised per visitor. A content-heavy marketing site with a small editorial team is usually best served by a static or mostly static build in Astro or Next.js with a headless CMS. A site with a large non-technical editorial team and a plugin-dependent workflow is often better on WordPress, even though it is less fashionable. We write the recommendation down with the trade-offs we accepted, and if your team already knows one stack well, that is a legitimate reason to choose it over a technically superior one nobody can maintain.
WordPress gives you an enormous editor talent pool, a mature plugin ecosystem and page-building tools your marketing team can use immediately. Its costs are a larger security surface, plugin conflicts, and performance that has to be defended continuously. A headless CMS such as Sanity or Contentful gives you clean structured content, faster front-ends and a much smaller attack surface, at the price of building the editing experience yourself and losing the plugin shortcuts. Worth noting: WordPress can also be used headlessly through its built-in REST API, which suits teams that want the familiar editor with a modern front-end. The honest question is not which is better but which failure mode you would rather live with.
Yes, and we treat that as a design constraint rather than a bonus. Content is modelled as structured fields with validation and guidance, so an editor can change a headline, add a case study or publish a landing page without asking a developer and without being able to break the layout. Where a section genuinely should not be editable, we say so and explain why rather than leaving a trap. If your team wants the ability to compose new page layouts themselves, that is a different and larger build, and it should be decided at scoping rather than discovered later.
By making slowness visible before it ships. A performance budget runs in the deployment pipeline, so an added script or an unoptimised hero image fails the build instead of quietly costing you a second of load time. Third-party tags are the most common culprit and the least governed: every marketing tag added through a tag manager runs on the main thread and competes with your own code. We recommend a tag review as part of ongoing maintenance, images served in modern formats at the sizes actually used, fonts subset and preloaded, and field data from real visits monitored rather than relying on lab scores alone.
Either, but the accounts are registered to you in both cases. We will recommend a host based on the architecture — a static or hybrid build sits naturally on Vercel, Netlify or Cloudflare, while a plugin-heavy WordPress site belongs on managed WordPress hosting with its own caching and staging. If you have an existing arrangement or a procurement requirement to stay with a particular provider, we will build for it and tell you plainly if it constrains something.
We start with a paid technical review before quoting the remaining work, because quoting an unfamiliar codebase without reading it is how projects go wrong for both sides. That review covers dependency health, test coverage, build reproducibility, security posture and how much of the existing work is worth keeping. Sometimes the answer is that finishing it is cheaper; sometimes it is that a rebuild costs less than the archaeology. We will tell you which even when the second answer is worth more to us, because inheriting a codebase we have talked ourselves into is bad for everyone.
At minimum: dependency and platform security updates, uptime and error monitoring, verified backups, and a defined response path when something breaks. Beyond that it usually includes performance monitoring against agreed budgets, small content and template changes, and a periodic review of third-party scripts, which tend to accumulate silently. What maintenance is not is a retainer that quietly funds nothing — every arrangement we run states what is checked, how often, and what you receive as evidence it happened.
Adjacent work
Research-led website design that turns a visitor into an enquiry — accessible, fast, and grounded in what your buyers are actually trying to do.
Custom web application development for SaaS products, customer portals, dashboards and internal tools — with the scope discipline that decides whether a first release ships at all.
Online store builds on Shopify, WooCommerce, Adobe Commerce or a headless stack — with the catalogue structure, checkout and migration planning that decide whether it earns.
Build
Send us the problem, the constraint and the deadline. You will get a considered reply from someone who would actually do the work — not a templated proposal.