Page Load Time: What It Is, What Is Good and How to Reduce It
Learn how page load time is measured, which numbers pass our check, and the fixes that cut seconds off a slow page.
Free to use 15 min read Updated Oct 2026
What is page load time? The quick answer
Quick answer: Page load time is how long a page takes to finish loading in the browser, counted in seconds from the start of navigation until the load event ends. Our report wants 3.00 seconds or less on one real headless Chrome visit.
- Pass: 3.00 seconds or less from navigation start to the end of the load event.
- Warning: Above 3.00 seconds and up to 5.00 seconds, shown with an amber icon.
- Fail: Above 5.00 seconds, or no usable timing could be read.
- Fix: Trim the server response, shrink images and scripts, and cache the files that repeat on every visit.
The number comes from a single lab visit, so it is a lab reading, not what every visitor experiences.
Page load time defined: what the clock starts and stops on
Page load time is the number of seconds between the browser starting to navigate to your page and the window load event finishing. Navigation starts when someone types the address or follows a link. The load event fires once the HTML, stylesheets, scripts, images and frames that the page asks for at load time have arrived and been processed.
The MDN page load time definition from MDN Web Docs frames it as the span that begins at navigation start and ends as the load event starts. It also warns that the figure is imperfect, because it varies with the device, the network and distance from the server. Our report stops the clock at loadEventEnd, a few milliseconds after the load event begins. The W3C Navigation Timing specification exposes that moment through the PerformanceNavigationTiming entry, so the value we show agrees with what you can read yourself from the browser Performance API.
What the clock misses matters as much as what it counts. Lazy loaded images far below the fold, timer driven scripts and widgets that appear after a click all arrive too late. You will also see it called website load time or page loading time. It is the same measurement, and we use page load time throughout.
Page load time vs page speed, TTFB, FCP and LCP
Load time is easy to confuse with the other speed numbers, because each one marks a different moment in the visit. The table puts them side by side with the mark that counts as good.
| Metric | What it marks | Good mark | Status |
|---|---|---|---|
| TTFB | First byte of the HTML arrives | 0.8 seconds or less | web.dev guidance |
| FCP | First text or image is painted | 1.8 seconds or less | web.dev guidance |
| LCP | Largest visible element is painted | 2.5 seconds or less | Core Web Vital |
| INP | Page responds to a tap or click | 200 ms or less | Core Web Vital |
| CLS | Layout moves around during the visit | 0.1 or less | Core Web Vital |
| Page load time | Everything needed for the load event has finished | No Google threshold | Not a Core Web Vital |
Google assesses these marks at the 75th percentile of real visits, so a single lab reading, ours included, cannot pass or fail a Core Web Vital. It can only point at a problem worth chasing.
Page load time is not a Core Web Vital, and the two can disagree. A page can paint its main content in 1.5 seconds and still log a long load time because a chat widget finishes late. The reverse happens too: a client side framework can render the hero text after an API call, long after the load event has fired, so the load time looks fine while LCP is slow.
Page speed is the umbrella word for all of them: read what page speed means for SEO for the broad view, and use our Largest Contentful Paint test page for the paint metric.
Why page load time matters for visitors and SEO
Visitors judge a slow page quickly. When nothing seems to happen they tap back or open another result, and a phone on a weak mobile connection makes every extra megabyte feel worse.
For search, be precise about what Google says. Google Search Central publishes Google page experience guidance, which states that page experience is not a single ranking signal and that relevance still comes first. Its ranking systems do favor content with good page experience, and Core Web Vitals are part of that picture. Our Core Web Vitals guide covers those metrics in detail.
The indirect effects are worth treating as expectations, not published rules. Google has said that a site which answers quickly can be crawled more heavily than one that struggles. Visitors who never have to wait are also more likely to keep reading, sign up or buy. Bounce rate in your analytics is a useful sign of that cost, though nothing Google publishes says it moves rankings.
How SEO Site Checker measures your page load time
Our audit opens your URL in a real headless Chromium browser, waits up to 20 seconds for the load event, and reads the timing the browser recorded.
The exact rule: page load time equals
loadEventEndminus the start of navigation, in seconds, rounded to two decimals. Up to 3.00 passes, above 3.00 and up to 5.00 is a warning, and above 5.00 fails.
This is a lab test of one cold visit from our server, so expect it to differ from what your visitors see. Run it yourself with the free SEO score checker.
What the browser measures
The load event waits for stylesheets, scripts written into the page (async ones included), images and iframes, and for anything those scripts add before it fires. Timers, fetch calls made after load and clicks do not hold it back. In our window of about 1280 by 720 pixels, a lazy image near the top is fetched early and counts, while images far down the page usually wait for scrolling and stay out.
Pass, warning and fail ranges
Only a pass adds to your score, because the score is passed checks divided by total checks, so an amber warning and a red fail both leave the point unearned. A 6 second result points at something structural, such as a slow server or a heavy script bundle, so read the waterfall before polishing small things.
Mobile devices, slow networks, warm cache visits and real user data are not tested, so a pass here says nothing about them.
What you see in the report
The row shows an icon, the time followed by Seconds, a short message, and a How to Fix button on a warning or a fail. The button opens the same steps you will find further down this page.
One wrinkle: the message text compares your time with a fixed 2.5 second reference, while the icon follows the 3 and 5 second rules. A result between 2.51 and 3.00 seconds therefore shows a green tick beside a message calling the page slower than that reference, and the tick is the verdict.
Two situations stop us from timing your real page. If the page does not finish loading within 20 seconds, the audit returns an error such as Unable to fetch page instead of a number. That can mean the page is too slow, or that our server could not reach it because of a DNS problem, a firewall rule or a country block. Open the URL in a private window to rule out an outage, check firewall and bot rules for blocks on data center addresses, and look in the Network panel for a request that never completes.
If a bot protection screen answers in place of your page, we time that screen and show a banner saying so. Allow the checker's requests in your firewall or CDN rules, or test again with the protection relaxed for a few minutes, otherwise the number describes the challenge page and not your site.
What is a good page load time?
There is no single ideal page load time, so treat these ranges as working guidelines, not Google thresholds.
| Load time | Verdict | What to do |
|---|---|---|
| Under about 2 seconds | Excellent | Protect it as you add scripts |
| Up to 3 seconds | Good, passes our check | Keep an eye on it after each release |
| 3 to 5 seconds | Worth improving | Work through the fixes below |
| Above 5 seconds | Needs work | Start with the server and the images |
Google sets its good marks per metric, at the 75th percentile of real visits. LCP of 2.5 seconds, INP of 200 ms and CLS of 0.1 are the three Core Web Vitals, and the official Core Web Vitals thresholds are on web.dev. The marks for FCP (1.8 seconds) and TTFB (0.8 seconds) come from separate web.dev guidance on those metrics. They are not Core Web Vitals, and the linked page does not state them.
Context changes what is acceptable. A heavy web app, a media site and a five page brochure site have different budgets, and a visitor on a congested mobile network needs a lighter page than someone on fiber. Average load times in statistics articles vary by source, device and year, so treat them as background and aim to cut a measurable chunk from your own time.
How to check page load time
You can read the number four ways, from no effort to very precise. Use more than one, because each tells you something different.
- Run the free report. Enter your address in our page load time checker and read the Page Load Time row.
- Use the Chrome DevTools Network panel. Open DevTools, switch to Network, tick Disable cache, reload the page and read the summary bar at the bottom, then study the waterfall chart for the slowest requests. DOMContentLoaded shows when the HTML was parsed, without waiting for images, and Load shows when the load event fired. Pick a profile such as Fast 4G or Slow 4G in the throttling dropdown to see how a slower connection changes the Load figure.
- Read it from the console. Once the page has fully loaded, paste the snippet below into the Console. It reads the navigation entry and divides by 1000 to give seconds. If you run it before the load event has finished, you get 0.
- Combine lab and field data. Run Lighthouse in DevTools or open PageSpeed Insights. Both work as a website speed test with lab data, and PageSpeed Insights also shows Chrome UX Report field data when your site has enough traffic, but that data covers only Chrome users over a rolling 28 day window, so it does not replace your own monitoring. Trust field data for how people really fare, and lab data to find causes.
const nav = performance.getEntriesByType('navigation')[0];
console.log(((nav.loadEventEnd - nav.startTime) / 1000).toFixed(2) + ' seconds');The snippet uses the same two values our report does. Test three times and note the median, on mobile and on desktop, for the home page, a typical product or article, and your slowest template.
Why your page load time changes between tests
Two tools rarely agree, and two runs of one tool can differ. Picture one run from a data center that reads 2.4 seconds, and a second run a minute later that reads 3.6 because an ad call answered slowly and the consent banner script finished last.
Rule of thumb: compare like with like. Use the same tool and settings, run several tests, and judge the trend, not one reading.
- Location and connection. A data center on fast fiber loads a page quicker than a phone on 4G.
- Cache state. Repeat visits reuse stored files, so a cold lab run often reads slower than what many real visitors get.
- Server and third parties. Shared hosting load, ad calls, consent banners and chat widgets finish at different times from one minute to the next.
- What gets timed. A bot protection screen can be the thing that loads, and logged in pages differ from the public one.
How to reduce page load time: fixes in order of impact
Most slow pages share a handful of causes: a slow server, unoptimized images, large JavaScript bundles, too many HTTP requests, long redirect chains, heavy web fonts and uncached files. Open the Network waterfall, sort by size and by time, and fix the largest or slowest items first.
Speed up the server response
Turn on page caching, run a current PHP version if your site uses PHP, trim slow database queries and host close to your visitors. A TTFB under 0.8 seconds is the web.dev good mark, and a late first byte delays everything after it. Our article on how hosting speed affects rankings explains the trade offs. Cut redirect chains too, so links point straight at the final URL, since each hop adds a round trip.
Shrink and modernise images
Resize each image to its displayed size, compress it, serve WebP or AVIF where you can, and always set width and height. The free Image Compressor can shrink your images and convert them to WebP or AVIF, and it needs no account.
<img src="/images/team.webp" alt="Our team at the studio" width="800" height="450">Minify, defer and remove scripts
Minify CSS and JavaScript, defer anything that is not needed for the first view, and delete plugins and tags nobody uses. Audit third party scripts one at a time, since one tag manager can pull in a dozen more files. The CSS Minifier is a quick way to shrink a stylesheet.
<script src="/js/app.min.js" defer></script>Clear render blocking files
Inline the small amount of CSS the top of the page needs and load the rest later. Preload your key font and add font-display: swap to its @font-face rule so text shows while the font downloads. The preload tag needs crossorigin even for a font on your own domain, otherwise the browser fetches the file twice. The render blocking resources page goes deeper on blocking CSS and JavaScript.
<link rel="preload" href="/fonts/body.woff2" as="font" type="font/woff2" crossorigin>Cache files and use a CDN
Browser caching lets repeat visitors reuse files. Add gzip compression or Brotli for text files, and put static files behind a CDN such as Cloudflare, which also serves them over HTTP/2. Our CDN usage test shows whether your site already uses one.
Give a file a one year lifetime only if its name changes with its content, such as app.3f9c1.css. For those, send Cache-Control: public, max-age=31536000, immutable from your build or CDN. Stable names like /images/team.webp need a shorter lifetime, so the Apache sample below uses one month for images and one week for CSS and JavaScript. Expiry only applies to the MIME types you list, and the JavaScript type depends on your server's mime.types file: older setups send application/javascript and current ones text/javascript, so the sample lists both.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/avif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>If your server runs Nginx instead of Apache, a comparable setup is below. It turns on gzip, gives images 30 days and CSS and JavaScript seven. Put the gzip lines in the http or server block of your config, keep the location blocks inside the server block, and reload with nginx -s reload. Brotli needs a module on either server, so most people get it from their host or CDN.
gzip on;
gzip_types text/css text/javascript application/javascript image/svg+xml;
location ~* \.(avif|webp|jpe?g|png|svg)$ {
expires 30d;
}
location ~* \.(css|js)$ {
expires 7d;
}Lazy load below the fold
Add loading="lazy" to images and iframes that start offscreen, but never to the main image at the top, as in <img src="/images/map.webp" alt="Office map" width="600" height="400" loading="lazy">. Total page weight drives load time, so see our guide to web page size for what a sensible budget looks like.
Retest and keep a budget
Measure after each change, not after five, so you know which fix paid off. Ticking Disable cache shows the cold load our report sees.
Rerun the report and the DevTools check each time, compare with your first reading, and write down a target time and a maximum page weight so tuning becomes a habit.
Reducing page load time on WordPress, Shopify and other platforms
The table lists the highest impact changes for common platforms.
| Platform | Highest impact changes | Where to make them |
|---|---|---|
| WordPress | Page caching plugin, image optimization plugin, current PHP version | Tools, Site Health shows the recommended PHP version, and you switch it in the host panel |
| Shopify | Remove unused apps and their leftover code, compress product images, limit font families | Online Store, Themes, Edit code, then search theme.liquid for snippets from apps you uninstalled |
| Wix and Squarespace | Fewer apps, smaller media files, lighter animations and embedded videos | Site Speed in the Wix dashboard, and embedded video blocks in Squarespace |
| Plain HTML on Apache or Nginx | Compression, cache headers, modern image formats, a CDN | Server configuration files |
Page load time checklist and performance budget
Copy this list into a ticket or release checklist and tick it off after each deploy, so a slow build is caught before visitors see it.
- Fast first byte. The server answers in under 0.8 seconds with a page cache on.
- Light images. Every image is resized, compressed, in a modern format and has width and height set.
- Lean scripts. CSS and JavaScript are minified, non critical scripts are deferred and unused plugins are gone.
- Cached files. Static files have long cache lifetimes and go out compressed or through a CDN.
- A written budget. A target load time and a maximum page weight are checked after every release.
How to Fix
The short version, the same steps you see when you click How to Fix in your report.
Why this fails: The page took longer than 3 seconds to finish loading in our test browser, counted from navigation start to the end of the load event on one cold desktop visit. Up to 3.00 passes, 3.01 to 5.00 warns and above 5.00 fails.
How to fix it:
- Open the Chrome DevTools Network panel, reload and sort by size and time to find the biggest delay.
- Compress and resize images, use WebP or AVIF, and add width and height.
- Minify CSS and JavaScript, defer scripts that are not needed for the first view, and remove unused plugins and tags.
- Turn on page caching and gzip or Brotli compression.
- Set cache lifetimes on static files and serve them through a CDN: a month for images and a week for CSS and JavaScript.
- Lazy load images below the fold, but not the main image at the top.
<img src="/img/team.webp" alt="Team" width="800" height="450" loading="lazy">
<script src="/js/app.min.js" defer></script>Use the Apache block in .htaccess, or the Nginx block in your server config:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>gzip on;
gzip_types text/css text/javascript application/javascript;
location ~* \.(webp|jpe?g|png)$ { expires 30d; }
location ~* \.(css|js)$ { expires 7d; }Platform shortcuts:
- WordPress: add a caching plugin and an image optimization plugin.
- Shopify: remove unused apps and compress theme and product images.
- Wix: cut apps and heavy media.
Re-test: Open DevTools, tick Disable cache in the Network panel, reload the page, wait for it to finish, then run const n = performance.getEntriesByType('navigation')[0]; console.log((n.loadEventEnd - n.startTime) / 1000) in the Console. Confirm the result is 3 or lower. Your connection can differ from our test browser, so run the report again with the free SEO check and look for the green tick.
Frequently Asked Questions
What is page load time?
What is a good page load time?
What is the average page load time?
Does page load time affect SEO?
How do I check page load time?
How can I reduce page load time?
What is the difference between page load time and response time?
Why does my page load time change from test to test?
See how your site scores right now
Paste your address into the free report, then use the How to Fix button on anything that needs work.
Free to use. Results in under a minute for most sites.