Core Web Vitals

How to reduce TTFB in WordPress: most of it happens before your server runs any PHP

By Davide Conti · Performance engineer · 10 Aug 2026 · 12 min read

Time to First Byte is five phases, and three of them are finished before WordPress runs a single line of code. Redirects, DNS and the connection handshake all happen while your server is still unaware that anyone wants anything. Only the last two phases belong to PHP, the database and your host.

That split is the whole article, because it decides whether the standard advice applies to you. Almost every “reduce TTFB in WordPress” guide optimises phase five and skips the rest. If your problem is an http-to-https-to-www redirect chain, or an origin server on another continent, you can tune PHP all week and move nothing.

A hand lifting the receiver of an office desk phone — TTFB is the wait between asking and the first word coming back
TTFB is the silence between asking and the first word of the answer. Some of that silence is the line, not the person.

TTFB is five phases, three of them off your server

Google defines TTFB as the sum of redirect time, service worker startup time where one exists, DNS lookup, connection and TLS negotiation, and then the request itself up to the moment the first byte of the response arrives (web.dev, verified August 2026). Good is 0.8 seconds or less, poor is over 1.8 seconds, at the 75th percentile of real page views.

Read that list slowly. The browser has to resolve your domain, open a connection, negotiate TLS and follow any redirects before your server is even asked for a page. On a WordPress site with a redirect chain and a distant origin, that prelude can be the majority of the number. Everything the usual checklist talks about — caching, plugins, queries, PHP version — lives in the last phase.

One more framing that saves a lot of wasted effort: TTFB is not a standalone score to beat. It is the first leg of Largest Contentful Paint, and web.dev’s healthy shape for LCP allocates it roughly 40% of the budget. So the question is never “is my TTFB good” in isolation. It is how much of your LCP target you have already spent before the first byte arrives.

Glowing fibre-optic strands — three of the five phases of TTFB happen on the network, before the server hears the request
Distance is not a setting you can tune. It is either shorter or it is not.

The one metric where a better host is the answer

We normally tell people the opposite. Changing host rarely fixes a slow site — the plugins, the images and the code travel with it, so the bottleneck arrives at the new server intact. “We need a faster host” is the reflex diagnosis precisely because it is the one that is nobody’s fault.

TTFB is the exception, and it is the only one. It measures your server answering, so hardware, PHP version, database and physical location genuinely set the floor. web.dev’s own advice on the server phase is close to a shrug — “a general rule of thumb is to ensure that your website’s host is capable of handling the traffic you send to it” (verified August 2026) — because past a point there is nothing clever left to do, only a better machine.

And it is still the third move, not the first. Ahead of it come two cheaper things. One: the phases before your server, where a collapsed redirect chain costs nothing and can return more than a hosting upgrade. Two: a page cache, which changes the question from “how fast does my server build this page” to “how fast does my server hand over a file it built earlier”. web.dev makes the point that with caching in place only the first visitor in each caching window pays the full latency back to the origin server (verified August 2026). Buying a faster machine before that is paying, monthly, to run PHP that should not have run.

Bakery shelves stocked with bread and pastries already baked — a page cache serves a response built before the visitor asked
A page cache is the shelf. Without one, every customer waits for the oven.

What makes TTFB long on WordPress

Same five phases, mapped onto what actually goes wrong on a WordPress install. The phase column is the one to read first — it tells you whether the row is even yours to fix on the server.

FactorPhaseWhat it costs youThe fix
Redirect chain (http → https → www)Before the serverA full round trip per hop, paid before anything else startsCollapse to a single server-level redirect and point your internal links and canonicals at the final URL
Slow or distant DNSBefore the serverA delay before the connection is even openedA DNS provider with a wide anycast network — most CDNs include one
Distance to the origin, old TLS setupBefore the serverThe handshake costs more the further away the server isServe from the edge, keep HTTP/2 or HTTP/3 and a modern TLS config on
No page cacheServerEvery visitor pays for the full WordPress bootstrap, theme and plugin loadA page cache. The single largest lever on most WordPress sites
Plugins doing work on every requestServerQueries and outbound HTTP calls during init, on every uncached pageFind them with a profiler, remove what earns nothing
Database: bloated autoload, repeated queriesServerThe same lookups re-run on every single requestTrim autoloaded options, add a persistent object cache — WordPress’ own object cache is non-persistent by default
WP-Cron firing on page loadServerOne unlucky visitor waits for whichever scheduled job was dueDISABLE_WP_CRON in wp-config.php plus a real system scheduler hitting wp-cron.php
End-of-life PHPServerSlower execution, and no security fixesPHP 8.3 or greater, which is what WordPress.org recommends

The WP-Cron row surprises people, so here is the mechanism in the documentation’s own words: “WP-Cron works by checking, on every page load, a list of scheduled tasks to see what needs to be run”, and it “does not run constantly as the system cron does; it is only triggered on page load” (WordPress Developer Resources, verified August 2026). The handbook is blunt about the cost once you have a real scheduler: leaving it on “is no longer necessary and will contribute to extra resource usage on your server”.

The database row has the same shape. WordPress’ object cache is “non-persistent” by default, which means cached data “resides in memory only and only for the duration of the request” and “will not be stored persistently across page loads unless you install a persistent caching plugin” (WordPress Developer Resources, verified August 2026). Every request starts from nothing. That is also why Site Health nags about it.

What each hosting tier actually buys you

No typical millisecond figures here, because the honest answer is that they vary more between two providers in the same tier than between tiers. What does not vary is what you are buying, and which part of TTFB it can and cannot touch.

TierWhat you are actually buyingWhat it fixes for TTFBWhat it will not fixWhen it is the right call
Budget shared hostingA slice of a machine shared with a lot of neighboursNothing on its own — this is usually the floor you are trying to leaveAnything, once your traffic outgrows the slice. Response times move with the neighboursA brochure site with light traffic and a page cache doing the work
Managed WordPress hostingTuned PHP and database, server-level caching, support who know WordPressThe server phase, mostly by giving you a good cache you did not configure yourselfDistance to your visitors, redirect chains, your own plugin loadMost business sites and small shops. The best value per hour of your time
VPS or cloud you tune yourselfDedicated resources and full control of the stackThe server phase, as far as your configuration skill goesNothing you do not configure — an untuned VPS can be slower than good shared hostingCustom stacks, heavy WooCommerce, someone on the team who runs servers
Origin plus edge-cached HTMLYour pages held on servers physically near your visitorsDistance, TLS negotiation and the server phase together, for cached pagesLogged-in users, cart and checkout — those bypass the cache by designAn audience spread across countries, or a content site with stable pages
Statically pre-rendered siteHTML files built ahead of time, with no PHP in the request path at allThe server phase, by deleting itYour publishing workflow, which now runs through a build stepSites that do not need a CMS in the request path — the reasoning behind our Next.js builds

Note the fourth row’s limitation, because it catches shop owners out. Edge caching your HTML does impressive things for anonymous visitors and nothing at all for the person holding a cart — which is why a WooCommerce buyer gets the slowest version of the store. If your revenue happens on uncacheable pages, the server phase is not optional and the tier you pick has to be sized for it.

What to do, in order

  1. Get the field number. PageSpeed Insights shows real-user TTFB alongside the vitals. If it is under 0.8 seconds, close the tab and go and work on something else.
  2. Split it before you fix it. The network panel in DevTools breaks the navigation request into DNS, connection, TLS and waiting. If “waiting” is small and the rest is not, none of the WordPress advice applies to you.
  3. Kill the redirect chain. Request your bare domain over http and count the hops to the final URL. Any number above one is free time you are giving away.
  4. Put a page cache in place and confirm it is actually serving — check the response headers, not the plugin’s dashboard. Then re-measure. Most sites stop here.
  5. Now look at the server phase properly. Server-Timing headers or a profiler will tell you whether the time is PHP, the database or an outbound call a plugin makes on every request.
  6. Do the cheap server work: PHP 8.3 or later, autoloaded options trimmed, a persistent object cache, WP-Cron moved to the system scheduler.
  7. Only now consider moving. If the server phase is still heavy on a tuned, cached site, the machine is the bottleneck and changing host is the correct answer rather than the lazy one. Match the tier to the table above and to where your visitors are.

When it is not worth chasing

If your field TTFB is already under 0.8 seconds, stop. TTFB is not a Core Web Vital, and web.dev says as much: “Because TTFB isn’t a Core Web Vitals metric, it’s not absolutely necessary that sites meet the ‘good’ TTFB threshold” (verified August 2026). It matters as a share of your LCP budget, not as a trophy. Once it is a reasonable fraction of your target, the next 200 milliseconds are worth far less than the render-blocking script you have been ignoring.

And do not buy a bigger server to avoid configuring a cache. This is the expensive version of the same afternoon’s work: a hosting upgrade is a monthly cost that makes PHP faster, where a page cache is a one-off change that stops PHP running. Doing them in that order means paying every month for something you had already fixed. Worth saying too: if your site is slow but your TTFB is fine, moving host will change nothing and you will have spent a weekend proving it.

Where the work does pay: a site failing LCP in Search Console where the field TTFB is eating half the budget, an origin on the wrong continent from its visitors, or a WooCommerce install where the pages that make money are the ones the cache cannot serve. That is what our WordPress speed optimisation work starts from — the split first, the spending last.

Frequently asked questions

What is a good TTFB?

0.8 seconds or less is good and anything over 1.8 seconds is poor, measured at the 75th percentile of real page views (web.dev, verified August 2026). Worth knowing before you panic: TTFB is not itself a Core Web Vital, and web.dev says so directly — it is not absolutely necessary that sites meet the good threshold. Treat it as a budget rather than a grade, because whatever TTFB spends is spent before your Largest Contentful Paint clock has moved at all.

Will a faster host fix my TTFB?

More often than for any other speed metric, yes — TTFB measures your server answering, so the machine genuinely matters. But it is the third move, not the first. If you have no page cache, you are about to pay monthly for a faster machine to run PHP that should never have been run. If your TTFB is going into a redirect chain or the distance between your visitors and your origin, a bigger server in the same data centre changes nothing.

Why does my TTFB look fine in one test and terrible in another?

Three reasons, and they are all real. Lab tools measure from one location, so distance to your origin shows up or does not depending on where the test ran. Some lab measurements exclude the redirect and DNS time that field data includes. And a cached page is a completely different request from an uncached one: with a page cache in place, only the first visitor after each purge pays the full trip back to the origin. Judge with field data, diagnose in the lab.

Does a CDN reduce TTFB?

Only if it caches your HTML. This is the distinction most guides skip. A CDN that serves your images, CSS and JavaScript from the edge does nothing for TTFB, because TTFB is measured on the navigation request — the HTML document — and that request is still travelling all the way to your origin. A CDN that caches and serves the HTML page itself at the edge is a different product, and it is the one that moves the number.

Does WP-Cron slow down my site?

It can, and the mechanism is documented: WP-Cron works by checking, on every page load, a list of scheduled tasks to see what needs to be run, and it is only triggered on page load rather than running constantly like a system cron. Most of the time that check is cheap. The problem is the visitor who happens to arrive when a heavy job is due and ends up waiting for it. Setting DISABLE_WP_CRON and calling wp-cron.php from a real system scheduler moves that cost off your visitors.

Does upgrading PHP reduce TTFB?

It shortens the PHP execution part of the server phase, which is only one slice of one of the five phases, so treat it as a contribution rather than a cure. The stronger reason to do it anyway is that WordPress.org currently recommends PHP 8.3 or greater, and PHP 7.4 and below have reached official end of life — running an unsupported version is a security position, not a performance one.

Sources (verified August 2026): web.dev — Time to First Byte (TTFB); web.dev — Optimize Time to First Byte; WordPress Developer Resources — WP-Cron; WordPress Developer Resources — WP_Object_Cache; WordPress.org — Requirements.

Before you pay for a bigger server

Send us the URL. You get back how your TTFB splits across the five phases, how much of it is on your server at all, and whether moving host would change anything — with the numbers.

Not sure where to start? We’ll audit your site for free

Send us your website address: we’ll analyse it and tell you what to improve, no strings attached. In a hurry? Message us straight away on WhatsApp.