Fixed-Scope Work

Measure First. Then Fix What the Numbers Point At.

Slow pages, slow APIs, a cloud bill climbing faster than your traffic. Performance work on React and Node applications that starts with evidence rather than a guess about what is probably wrong.

The Usual Mistake

Most Performance Work Fixes the Wrong Thing

Not through carelessness. Through starting from an opinion about where the time goes instead of a measurement of where it actually goes.

A fortnight of memoisation on a page whose delay was one slow query
A bundle shrunk by a third with no measurable change to load time
Testing only on a fast laptop on office broadband
Averages hiding the slow tail that actually generates complaints
A bigger instance quietly paying for a problem nobody diagnosed
Gains that erode within months because nothing watches for regressions
How It Runs

Measure, Prioritise, Fix, Protect

1. Establish a baseline

Real user monitoring where it exists, profiling where it does not, and traces through the slow path end to end. We want the shape of the slow tail, not an average. Without a baseline there is no way to tell afterwards whether anything actually improved.

2. Find the causes, in order of size

Frontend and backend are profiled separately, because a slow page is roughly as often a slow query as it is a rendering problem. The output is a written list of causes with an estimate of effort and expected impact against each, so you can choose what is worth doing rather than being handed a bill for all of it.

3. Fix the top of the list

Highest impact for lowest effort first, each change measured against the baseline individually. Batching ten fixes into one release makes it impossible to know which one worked, and which one quietly made something else worse.

4. Leave something watching

Performance budgets in CI, monitoring on the paths that mattered, and an alert when a number moves the wrong way. A fix with no regression check is a temporary fix, and six months later it is usually gone.

Where the Time Usually Goes

Frontend, Backend, and the Bit in Between

React Frontend

  • Renders triggered by unstable props and context that changes too often
  • Long lists without virtualisation on mid-range phones
  • Bundle size, code splitting, and what is genuinely on the critical path
  • Images, fonts and layout shift during load
  • Data fetching that refetches on every focus because server state is treated as client state

Node Backend

  • Queries in a loop where one query would do
  • Missing indexes, and indexes that exist but are not used
  • Synchronous work blocking the event loop
  • Absent or badly scoped caching
  • Memory growth in a long-running process nobody restarts

Everything Between

  • Chatty APIs that need several round trips to draw one screen
  • Payload sizes nobody has looked at since the feature shipped
  • Third-party scripts blocking the main thread
  • Cold starts on serverless under real traffic patterns
  • Background jobs doing work that is no longer needed
Scope

What This Engagement Does and Does Not Cover

Included

Measurement and Diagnosis

Baseline, profiling, a written prioritised list of causes with effort estimates, and the reasoning behind the order.

Included

Fixes and Verification

Implementation of the agreed items, each measured individually, plus budgets and monitoring so the gains hold.

Possible, Scoped Separately

Structural Change

If the honest answer is an architectural change rather than tuning, we say so and quote it as its own piece of work.

Not Included

Infrastructure Costs and Licences

Monitoring tools, cloud spend and third-party licences are billed to you directly, never marked up through us.

Developer profiling a Node service and reviewing timing data
When to Hire Instead

A One-Off Fix Is Not Always the Right Purchase

If one specific path is slow and everything else is fine, fixed scope is exactly right. Measure it, fix it, leave a check behind, done.

If performance keeps degrading every few sprints, the problem is not any single slow path — it is that nobody currently owns the number. That is a hiring problem rather than a project, and a developer joining your team with performance in their remit will serve you far better than another engagement six months from now.

Compare engagement models
FAQ

Before You Commission Performance Work

How do you know what to fix before you start?

We do not, and neither does anyone else who tells you otherwise on a sales call. The first part of any performance engagement is measurement: real user data if you have it, profiling if you do not, and traces through the slow path end to end. Only then is there a list worth quoting against. Teams that skip this step reliably spend a fortnight optimising something that was never the bottleneck.

Can you guarantee a specific improvement?

No, and be wary of anyone who does before looking at your code. What we will commit to is a measured baseline, a prioritised list of causes with an estimated effort against each, and honest reporting of what each change actually achieved. Sometimes the honest answer after measurement is that the biggest win is a database index rather than anything in the JavaScript at all.

Is this a fixed-scope project or a developer engagement?

It can be either. A focused audit-and-fix on a specific slow path works well as fixed scope. Ongoing performance work, the kind that stops regressions creeping back in every sprint, is better served by a developer joining your team with performance as part of their remit. We will say which one your situation actually calls for.

Our cloud bill is rising faster than our traffic. Is that a performance problem?

Usually yes, and it is one of the more satisfying kinds to work on because the result shows up on an invoice. Runaway spend is commonly caused by inefficient queries hitting the database far more often than anyone realises, missing caching, oversized instances compensating for a slow code path, or a background job doing work that no longer needs doing. The fix often pays for the engagement.

Will the improvements survive after you leave?

Only if measurement stays in place, which is why we set up budgets and monitoring as part of the work rather than as an optional extra. A performance fix with no regression check is a temporary fix. We would rather leave you with a number your team watches than a one-off improvement that quietly erodes over the next six months.

Tell Us What Feels Slow

Describe the page, the endpoint or the bill. We will tell you what we would measure first and what a realistic engagement looks like.