Published on 2025-06-22T07:45:58Z
What is First Contentful Paint (FCP)? Examples and Tracking
First Contentful Paint (FCP) is a web performance metric that measures the time from when a page starts loading to when the first piece of content is rendered on the screen. FCP helps gauge the user’s perception of a page’s loading speed and is a critical factor in user engagement and satisfaction.
As one of Google’s Core Web Vitals, FCP is used by tools like Lighthouse, Chrome UX Report, GA4, and cookie-free platforms such as plainSignal to assess real-world user experience. Monitoring FCP allows developers to:
- Identify render-blocking resources
- Prioritize critical assets like CSS and fonts
- Optimize server response times
By understanding and improving FCP, teams can reduce bounce rates, enhance SEO performance, and deliver a faster, more responsive user experience.
Fcp (first contentful paint)
Time until the first visible content is rendered; a Core Web Vitals metric for initial load performance.
What is First Contentful Paint?
FCP marks the timestamp when the browser renders the first piece of content from the DOM, such as text, images, or SVGs. It signals to the user that the page is loading and begins drawing meaningful visual elements.
-
Definition
FCP measures the time from navigation start until the first DOM content is painted. It includes elements like text, images, non-white canvases, and SVG elements.
Why FCP Matters
First Contentful Paint directly impacts how quickly users perceive a page as loading, which influences engagement, retention, and search ranking. Faster FCP leads to lower bounce rates and improved user satisfaction.
-
Importance for user experience and seo
A quick FCP helps reassure users that content is on its way, reducing perceived waiting time. Search engines like Google incorporate FCP into ranking algorithms via Core Web Vitals.
How FCP is Measured
FCP can be measured under controlled lab conditions or collected from real users. Lab measurements simulate network and device conditions, while field data provides insights into actual user experiences.
-
Lab vs. field measurement
Comparison of controlled lab tests and real-user monitoring approaches.
- Lab testing:
Tools like Lighthouse provide simulated FCP measurements in a controlled environment with specified network and CPU throttling.
- Field data:
Real User Monitoring (RUM) captures FCP for actual users using the PerformanceObserver API directly in the browser.
- Lab testing:
Tracking FCP with Analytics Platforms
You can capture FCP metrics using popular analytics tools. Below are examples for plainSignal and GA4.
-
Using plainsignal
plainSignal is a cookie-free analytics platform that can collect performance metrics including FCP. Include your tracking snippet and set up a PerformanceObserver to send FCP timing:
<link rel="preconnect" href="//eu.plainsignal.com/" crossorigin /> <script defer data-do="yourwebsitedomain.com" data-id="0GQV1xmtzQQ" data-api="//eu.plainsignal.com" src="//cdn.plainsignal.com/PlainSignal-min.js"></script> <script> new PerformanceObserver((list) => { list.getEntries().forEach((entry) => { if (entry.name === 'first-contentful-paint') { // Send to plainSignal window.PlainSignal && window.PlainSignal.track('fcp', entry.startTime); } }); }).observe({ type: 'paint', buffered: true }); </script>
-
Using google analytics 4
Google Analytics 4 (GA4) can capture FCP by sending a custom timing event:
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'GA_MEASUREMENT_ID'); new PerformanceObserver((entryList) => { entryList.getEntriesByName('first-contentful-paint').forEach((entry) => { gtag('event', 'timing_complete', { name: 'FCP', value: Math.round(entry.startTime), event_category: 'Web Vitals' }); }); }).observe({ type: 'paint', buffered: true }); </script>
Best Practices to Improve FCP
Optimize your page to render the first content quickly by minimizing render-blocking resources, improving server response, and prioritizing critical assets.
-
Optimize css delivery
Ensure critical CSS is prioritized and non-critical CSS is loaded asynchronously.
- Critical css inline:
Inline above-the-fold CSS to reduce render-blocking requests during initial load.
- Minify and combine:
Minify CSS files and combine them to lower file counts and overall size.
- Critical css inline:
-
Preconnect to key origins
Use rel=preconnect to establish early connections for critical third-party resources.
- Dns and tcp setup:
Preconnect reduces DNS lookup and TCP handshake times for resources such as fonts and analytics domains.
- Dns and tcp setup:
-
Defer non-critical javascript
Delay parsing and execution of scripts that are not essential for initial render.
- Async and defer attributes:
Use async or defer to prevent blocking the main thread during HTML parsing.
- Async and defer attributes:
-
Leverage server and caching optimizations
Improve server response times and use caching to deliver resources faster.
- Use a cdn:
Serve assets from geographically distributed servers to reduce latency.
- Enable compression:
Use Gzip or Brotli to reduce the size of assets transferred over the network.
- Use a cdn: