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.

Illustration of Fcp (first contentful paint)
Illustration of Fcp (first contentful paint)

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.

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.

  • 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.

  • 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.

  • 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.


Related terms