Web development
Fast, secure, maintainable websites built in modern frameworks and CMS platforms — engineered so performance and accessibility survive the first year of edits.
SBPO Consulting · Search
Technical SEO is not a ranking tactic. It is the set of conditions that must be true before any of your content is eligible to compete: pages that can be reached, rendered, resolved to a single address and understood. Most of the wins are unglamorous, and most of them stay won.
Where we come in
Most search advice is about competition: what to say, and how to say it better than whoever currently sits above you. Technical SEO is a duller question that comes first. Can a crawler reach the page, render it, resolve it to a single address, and work out what it is about?
That distinction changes what a fix is worth. A content improvement moves one page a few positions if it lands. A technical fix either unlocks an entire class of pages or it does not, and when it does, the effect is a step change rather than a nudge. It also tends to stay fixed, which is why it is worth doing properly once instead of repeatedly.
The other reason to take it seriously is defensive. Technical damage is almost never caused by carelessness. It is caused by a developer adding a filter, a marketer duplicating a landing page for a campaign, or a replatform renaming every URL on the site. Each decision was reasonable in isolation. The traffic goes anyway.
We crawl the site the way a search engine would — render-enabled, following redirects, using Screaming Frog SEO Spider or Sitebulb — and then reconcile that crawl against three other datasets: your XML sitemaps, the Search Console page indexing report, and, on larger sites, raw server logs.
The reconciliation is where the findings live. A URL in the sitemap that the crawl cannot reach is orphaned, because nothing on the site links to it. A URL the crawl reaches that is absent from the sitemap is either deliberate or an oversight, and most site owners cannot say which without checking. A URL that Search Console reports as “Crawled — currently not indexed” is usually a quality or duplication judgement rather than a technical fault, and attacking it with technical fixes burns a sprint for nothing. Getting that classification right is most of the value of an audit.
The output is deliberately not a list of every deviation from best practice. Ten thousand duplicate title tags are one templating decision, not ten thousand problems, and a report that presents them as ten thousand problems is padding sold by the page.
Internal linking is where technical SEO meets web design, because click depth is a navigation decision before it is a search one. Pages buried many clicks from the homepage are recrawled less often and treated as less important, and the remedy is usually a hub page or a change to the navigation rather than anything a crawler would call technical.
Crawl budget, meanwhile, is the most over-diagnosed problem in the field. Google’s own guidance scopes it to sites with more than a million unique pages that change roughly weekly, or more than ten thousand that change daily. Below that, an accurate sitemap and a server that responds promptly is generally enough. If someone has quoted you for crawl budget optimisation on a two-hundred-page brochure site, ask them to show you the constraint.
robots.txt, noindex and rel="canonical" do three different jobs, and using one to do another’s job is the most common self-inflicted injury we find.
robots.txt controls crawling, not indexing. Google is explicit that a page disallowed in robots.txt can still be indexed if other sites link to it, with the URL and its anchor text appearing in results even though the content was never fetched. Blocking a page in order to keep it out of search is therefore the wrong instrument, and it produces the familiar “Indexed, though blocked by robots.txt” warning.
noindex removes a page from the index, but only if the crawler can fetch it. Combining a robots.txt disallow with a noindex tag guarantees the noindex is never seen. We find this pairing on a large share of the sites we audit, almost always applied by someone who reasonably assumed the two measures would reinforce each other.
rel=“canonical” is a strong signal, not an instruction. Google’s documentation ranks redirects as the strongest canonicalisation signal, rel=canonical as strong, and sitemap inclusion as weak. When Google selects a different canonical from the one you declared, that is a disagreement rather than a bug, and the remedy is to remove the ambiguity — consistent internal linking, one version in the sitemap, one version linked from navigation — rather than to repeat the declaration more emphatically.
Faceted navigation is where all three converge, and where large catalogues lose control. A store that generates a crawlable URL for every combination of colour, size and price band can produce more URLs than it has products. The resolution is a policy decision about which facet combinations have genuine search demand and deserve indexing, which should be crawlable but not indexed, and which should never be linked at all. That policy belongs in a document rather than in a developer’s memory, and it is a large enough problem in retail that e-commerce SEO treats it as a first-class concern.
Google processes JavaScript in three phases: it crawls the URL, queues the page for rendering in a headless Chromium instance, and indexes the rendered HTML. Client-side content can therefore be indexed. The caveats are what catch people out.
Links must be real anchor elements with href attributes, because that is what Googlebot extracts to discover pages; a clickable div with a click handler is not a link as far as crawling is concerned. Scripts blocked in robots.txt cannot run, so the content they would have produced does not exist. Content that only appears after a user interaction may never be seen at all. And a client-side route that draws an error message while the server returns HTTP 200 is a soft 404: it will be crawled, judged empty, and quietly dropped.
There is a wider point that has grown more important. Several crawlers that matter commercially do not execute JavaScript, including some that feed answer engines and social previews. Google itself still recommends server-side rendering or pre-rendering, and that recommendation now carries more weight than it did when Googlebot was the only audience worth planning for. Rendering strategy is a build decision as much as a search one — see web development — and it should be settled before the framework is chosen rather than argued about afterwards.
The thresholds are public and specific. Largest Contentful Paint within 2.5 seconds, Interaction to Next Paint at or below 200 milliseconds, Cumulative Layout Shift at or below 0.1, each assessed at the 75th percentile of real page loads and segmented by device.
That percentile is the part most reports skip. Lighthouse and PageSpeed Insights lab runs simulate one visit on a synthetic device; Chrome UX Report data is what your actual users experienced. When the two disagree — a green lab score against failing field data — the field data is what counts, and the usual explanation is that your real audience is on slower devices and worse networks than the simulation assumed.
INP is where most sites now fail, because it replaced First Input Delay with something considerably harder to pass. FID measured the responsiveness of the first interaction only. INP looks at interactions across the whole visit and reports near the worst of them, so sites that felt fine under the old metric often discover that a heavy tag manager, an expensive hydration step or a long event handler has been costing them responsiveness for years.
We are also straightforward about the return. Page experience is a genuine signal but a weak one next to relevance, so performance work rarely produces a ranking jump on its own. It produces revenue, because people leave slow pages, and it makes paid traffic cheaper by wasting less of it. That is the honest business case, and it is the stronger one anyway.
Structured data does not improve rankings. It makes a page eligible for search features, and it helps a search engine resolve what an entity on the page actually is. Both are worth having; neither is a growth strategy.
We implement in JSON-LD against Schema.org types, validate with the Rich Results Test, and map every property to a field the CMS genuinely holds so the markup cannot drift away from the page. That last point is a policy rather than a preference. Google’s structured data guidelines require markup to describe content visible to the reader, and mismatched or invented markup risks losing rich result eligibility or attracting a manual action. Review markup on a page with no reviews is the classic example, and it is still remarkably common.
The types worth the maintenance are those tied to a feature you can actually earn or an entity worth disambiguating: organisation and site identity, breadcrumbs, articles, products with real offer data, and local business markup where physical locations exist. Entity clarity has become more valuable as answer engines started assembling responses from structured sources, but the requirement to describe what is really on the page has not loosened to accommodate that.
International sites can declare localised versions three ways — HTML link elements, HTTP headers, or annotations in the XML sitemap — and all three carry the same rule: the relationship must be reciprocal. If two pages do not both point at each other, the annotations are ignored entirely. There is no partial credit for a nearly-correct implementation.
Broken implementations nearly always fail for one of four reasons: the self-referencing annotation is missing, one variant points at a URL that redirects, the annotations sit on non-canonical URLs, or a language and region code has been invented rather than taken from the valid list. The x-default value is also widely misunderstood — it is the fallback for users whose settings match none of your versions, not a synonym for the English page.
Log file analysis tells you what Googlebot actually requested, how often, and what status codes it received, as opposed to what you believe it should have done. On a small site this is theatre. It becomes genuinely useful once crawl allocation is a real constraint, or when indexing problems persist after the obvious causes have been eliminated.
What it typically reveals: crawl activity dominated by parameter URLs, redirect chains and 404s; important templates fetched far less often than trivial ones; and pages you assumed were ignored being crawled regularly and simply not indexed, which moves the diagnosis from technical to editorial.
A migration is the one project where technical SEO has an unambiguous, measurable value: the traffic you keep. It is also the project where the work is most often scheduled after launch, which is roughly like planning the parachute during the descent.
Every existing URL is inventoried first, from a crawl, from Search Console, from analytics and from backlink data. That last source matters because a page with almost no traffic may hold the external links propping up everything around it. Each URL is then mapped to a single-hop, server-side permanent redirect pointing at the closest genuine equivalent, not at the homepage. Google advises against long redirect chains and recommends retaining redirects for at least a year, which in practice means a year after the last important external link has been updated rather than a year after launch.
Then the new sitemap is submitted, internal links are rewritten to point at final destinations rather than leaning on the redirects, and index coverage is watched closely. Some ranking movement during a move is expected. Knowing which movement is normal reprocessing and which is a genuine loss is the real skill, and it is why the audit that precedes a migration matters more than the report that follows it.
Three different problems filed under one label. Duplication is a consolidation problem: several URLs competing to represent one thing, usually caused by parameters, protocol or trailing-slash variants, or the same item published under several categories. Thin pages are a quality problem, and no amount of technical work makes them worth indexing; the honest options are to improve, merge or remove them. Orphans are a linking problem: pages nothing links to, reaching the index through the sitemap and treated with the importance that implies.
Only one of the three is solved by a canonical tag. Applying a technical fix to a quality problem is how sites end up with a beautifully tidy index and exactly the same amount of traffic.
Most of the technical damage we are called in to repair was caused by a deployment. The next most common cause is a CMS setting changed by someone who did not know it was a search decision: a staging environment promoted with its noindex tag intact, a plugin update rewriting robots.txt, a sitemap that stopped regenerating and went unnoticed for months.
Continuous monitoring costs a fraction of an audit and catches more. Scheduled crawls, alerts on robots.txt and meta robots changes, sitemap URL counts, status code distributions, and field performance tracked by template. If the choice is between one thorough audit and modest monitoring running continuously, take the monitoring. Feeding that signal into the same place as the rest of your reporting is a job for analytics engineering rather than another dashboard nobody opens.
We do not publish figures, because the same three words describe wildly different pieces of work. The variables are not secret, and knowing them will help you compare quotes honestly.
Site size and template count. Template count matters more than page count. A large site assembled from a dozen templates is a smaller job than a small site where every page is bespoke.
Platform. A mainstream CMS with a known set of failure modes is faster to audit than a bespoke application whose rendering behaviour has to be established from first principles.
Diagnosis versus implementation. An audit that ends in a document costs less than an engagement where we ship the fixes, and the right choice depends on whether your engineering team has capacity to act. An unimplemented audit is worth nothing, so be realistic about this at the start rather than the end.
Migrations and internationalisation. Both add work that has to land on a fixed date, and both are far cheaper to plan than to repair.
Technical SEO is the foundation layer of the wider organic search programme, and on its own it is rarely sufficient — a perfectly crawlable site still has to say something worth ranking. It overlaps most heavily with the build, which is why we would rather be in the room while the site is being developed than called in afterwards to explain why the new framework cost you a third of your traffic.
If you are mid-migration, or watching index coverage fall and wanting a second opinion, tell us what you are seeing and we will say whether it is a technical problem at all. Often enough it is not, and that is a cheaper answer than the alternative.
Scope
Every engagement is scoped in writing before it starts. These are the artefacts that leave our hands and become yours.
A render-enabled crawl reconciled against Search Console, your XML sitemaps and analytics, written up as issues ranked by expected impact and implementation effort rather than by severity colour. Every item names the pages affected and states what "fixed" looks like, so it can be handed straight to a developer.
A page-type-level statement of what should be indexed, what should be crawlable but not indexed, and what should not be crawled at all, with the specific mechanism for each. This is the document that stops robots.txt, noindex and canonical tags being used interchangeably.
A side-by-side comparison of source HTML and rendered HTML for every template, showing what a crawler that executes JavaScript sees, what one that does not sees, and which content depends on user interaction to exist. Includes the link graph as extracted from real href attributes.
Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift taken from Chrome UX Report field data, segmented by template and device, with the specific cause of each failure identified rather than a generic list of Lighthouse opportunities.
JSON-LD templates for each page type, mapped to the fields your CMS actually holds, validated against the Rich Results Test, and written so the markup describes content that is genuinely visible on the page rather than asserted about it.
For replatforms and redesigns: every existing URL mapped to a single-hop destination, a pre-launch and post-launch checklist, a rollback position, and the monitoring plan for the period after the switch. Delivered before the migration, not after it.
Click depth analysis, an orphaned page list, and concrete proposals for hub and navigation changes, expressed as changes to templates and components so the improvement survives the next hundred pages you publish.
Scheduled crawls and alerting configured on the things that silently break a site: robots.txt changes, noindex appearing in production, sitemap counts moving, status code shifts and field performance regressions.
How it runs
Read-only access to Search Console, analytics and, where they exist, server logs. Before proposing anything we want to know which URLs earn traffic today, which are indexed, and where the crawler is spending its time. Diagnosing a technical problem without that is guesswork dressed as expertise.
A rendered crawl and a raw crawl, run separately, then reconciled against the sitemap and the Search Console page indexing report. The differences between those four datasets are where nearly every real finding comes from.
Ten thousand duplicate title tags are one templating decision, not ten thousand issues. We group findings by root cause so the fix list is a handful of code changes rather than a spreadsheet nobody will ever finish working through.
Each recommendation states the template involved where we can see it, the expected behaviour, the acceptance test, and what should not change. We would rather write one unambiguous ticket than three paragraphs of best practice that leave the engineer guessing.
Changes are checked against real user data and real index behaviour, not against a synthetic score. A performance fix that improves a Lighthouse number and nothing in Chrome UX Report has not worked yet, and we will say so rather than report the number that flatters us.
Most technical SEO damage is inflicted by a routine deployment or a CMS setting nobody thought was a search decision. We leave monitoring in place so the next one is caught in days rather than discovered in a quarterly review.
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.
Every issue we raise comes with the method used to find it and the URLs affected, so your team can reproduce it independently. If you cannot verify a finding yourself, we have not written it up properly.
We do not serve different content to crawlers than to people, and we do not build pages whose only purpose is to catch a query and pass the visitor elsewhere. The spam policies are public, and the consequences of ignoring them land on your domain rather than ours.
Recommendations are written as testable outcomes — this URL returns this status, this element appears in rendered HTML, this field is present in the JSON-LD — rather than as advice. Ambiguity is the main reason technical SEO tickets sit untouched in backlogs.
Performance is judged on Chrome UX Report data at the 75th percentile, matching how Core Web Vitals are actually assessed, not on a synthetic run on a fast machine. We will tell you when a green Lighthouse score is not reflected in what your users experience.
Questions
On-page SEO is about what a page says and how it says it: the topic, the headings, the depth, the internal links pointing at it. Technical SEO is about whether the page can be reached, rendered, indexed and attributed to one canonical address in the first place. The simplest framing is that technical SEO decides eligibility and on-page SEO decides competitiveness. A perfectly written page blocked in robots.txt will not rank, and a technically flawless page about something nobody searches for will not either.
A full audit is worth repeating when something structural changes: a replatform, a redesign, a large content migration, a new international market, or a shift in how the CMS generates URLs. Between those events, continuous monitoring is far more useful than a periodic deep audit, because the failures that really cost you — a noindex tag shipped to production, a robots.txt overwritten by a deployment, a sitemap that quietly stopped updating — appear suddenly and keep costing for as long as nobody notices. If you only have appetite for one of the two, choose the monitoring.
Sometimes, and rarely dramatically. Page experience signals are real but weak compared with relevance and links, so a slow page about the right thing will usually still outrank a fast page about the wrong thing. Where performance work clearly pays is in revenue: people abandon slow pages before they see anything, and the users you lose first are the ones on mid-range phones and poor connections. We recommend Core Web Vitals work on its commercial merits and treat any search benefit as a bonus rather than the business case.
Usually yes, with caveats worth understanding. Google crawls the URL, queues the page for rendering in a headless Chromium instance, and indexes the rendered HTML, so client-side content can be indexed but only after that second pass and only if the scripts it needs are not blocked. Links have to be genuine anchor elements with href attributes to be discovered, content that only appears after a click may never be seen, and several crawlers that matter commercially do not execute JavaScript at all. Server-side rendering or pre-rendering removes the entire class of problem, which is why Google still recommends it.
By treating the redirect map as a deliverable rather than a launch-day task. Every existing URL is inventoried from a crawl, Search Console, analytics and backlink data — that last source matters because a page with almost no traffic may hold the external links supporting everything around it — and mapped to a single-hop, server-side permanent redirect to the closest genuine equivalent, never to the homepage as a catch-all. Google advises keeping redirect chains short and retaining redirects for at least a year. After the switch, the new sitemap is submitted, internal links are rewritten to point at final destinations, and index coverage is watched closely, because some movement during a move is normal and telling that apart from a real loss is the actual skill.
The ones tied to a search feature you are genuinely eligible for, or to an entity worth disambiguating, and no more. For most sites that means organisation and site identity markup, BreadcrumbList, Article for editorial content, Product with real offer and review data for retail, and LocalBusiness where physical locations exist. Marking up everything Schema.org defines does not help. Google requires structured data to describe content visible on the page, and mismatched or invented markup risks losing rich result eligibility or attracting a manual action, so review markup on a page with no reviews is a liability rather than an optimisation.
For some of it, yes. Configuration, metadata, sitemaps, redirects and structured data can often be handled inside the CMS or by us directly with the right access. Rendering strategy, template logic, faceted navigation and performance work usually need someone who can change the application itself. We are happy to implement where we have access and the stack is one we work in, and equally happy to write tickets for your engineers, but we will always state plainly which of the two a given fix requires. A recommendation nobody can action is not a recommendation.
The drivers are site size, template count, platform, and how much of the engagement is diagnosis versus implementation. A twenty-template site on a mainstream CMS is a much smaller piece of work than a bespoke JavaScript application with several hundred thousand URLs, multiple languages and a faceted catalogue. Whether server logs are available, whether a migration falls inside the scope, and whether you want fixes specified or shipped all move the number materially. We scope against those variables in writing before quoting, rather than pricing an audit as a fixed product and discovering the real shape of the site afterwards.
Adjacent work
Fast, secure, maintainable websites built in modern frameworks and CMS platforms — engineered so performance and accessibility survive the first year of edits.
Category architecture, product templates that hold up across thousands of SKUs, faceted navigation brought under control, and replatform migrations that do not cost you the revenue you already have.
Entity foundations, content a model can quote accurately, crawler access decided on purpose rather than by default, and measurement that admits what AI visibility data can and cannot tell you.
Part of our SEO practice.
Search
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.