What Is First Contentful Paint?

Published
14 min read

First Contentful Paint measures when the first document content appears. Learn thresholds, candidates, causes and practical improvements.

What Is First Contentful Paint?

First Contentful Paint, or FCP, measures the time from navigation until the browser first renders content from the document, such as text, an image, a canvas drawing or visible SVG content.

FCP answers an early loading question: has the page begun to show meaningful document content rather than only a blank screen or default background? It does not indicate that the main content is complete, that the largest element is visible or that controls are interactive. A small heading can trigger FCP while a product image and body copy remain delayed. The metric depends on every step before the first eligible paint, including redirects, server response, HTML discovery, blocking styles, fonts, scripts and browser rendering. A fast FCP should represent useful and stable content, not a decorative dot added merely to move the timestamp.

  • Starts at navigation
  • Ends at the first contentful document paint
  • Can be triggered by text or visual content
  • Occurs before or at later paint milestones
  • Varies by route, device and cache state
  • Does not prove page completion
  1. Frame the decision raised by What Is First Contentful Paint.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
FCP fundamentals
QuestionAnswerWhy it matters
What is timed?Navigation to first contentful paintEarly visual feedback
What can count?Text, image, canvas or SVG contentCandidate type varies
Is the page complete?NoLater content may remain
Is FCP a Core Web Vital?NoUseful diagnostic metric
What precedes it?Network and rendering pathMultiple causes
Can it be gamed?SuperficiallyContent usefulness still matters

FCP is valuable when the first painted content is both timely and representative of a page that is genuinely progressing.

What Is a Good FCP Score?

A practical FCP target is 1.8 seconds or less at the 75th percentile of page loads, separated for mobile and desktop; above 1.8 through 3.0 seconds needs improvement, while above 3.0 seconds is poor.

Percentile monitoring matters because averages hide users on slower devices, distant networks and cold caches. Separate device populations and route families so a fast home page does not conceal weak article or product templates. FCP is not a Core Web Vital, so the threshold is diagnostic rather than a complete search or experience verdict. A page can meet 1.8 seconds yet delay its primary content much longer. Conversely, a slightly slower first paint can accompany a coherent server-rendered page that quickly completes. Use the range to find templates with avoidable blank-screen time and verify changes through downstream LCP, CLS and interaction evidence.

  • Good: 1.8 seconds or less
  • Needs improvement: above 1.8 through 3.0 seconds
  • Poor: above 3.0 seconds
  • Evaluate the 75th percentile
  • Separate mobile and desktop populations
  • Review route families, not only sitewide data
  1. Frame the decision raised by What Is a Good FCP Score.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
FCP thresholds
RangeClassificationAction
≤ 1.8 sGoodProtect against regression
> 1.8–3.0 sNeeds improvementTrace critical path
> 3.0 sPoorPrioritize shared blockers
Fast FCP, slow LCPSmall early content onlyTrace main content
Slow one templateTemplate dependency issueFix shared route
Field slow, lab fastPopulation mismatchInspect real conditions

Use the FCP threshold to locate avoidable blank-screen delay while judging the full page through later content and interaction outcomes.

What Counts as Contentful Paint?

Contentful paint includes rendered text and eligible visual content associated with the document, such as images, canvas output and SVG descendants; a default background alone does not make the page contentful.

The first qualifying candidate differs by template. An article may render a headline first. A product page may show a logo or product image. An application shell may remain blank until JavaScript inserts text. Web fonts can delay visible text depending on style and display behavior. CSS background images and generated visual content require attention to the browser’s paint rules and discovery chain. Cross-origin frames may have reporting limitations. Identify the actual first content in a visual timeline rather than assuming it is the hero. If the candidate is a tiny navigation label while the body remains blank, the metric can be numerically good but experientially incomplete.

  1. Capture a visual loading timeline.
  2. Find the first frame with document content.
  3. Identify the text or visual candidate.
  4. Trace its styles and resource dependencies.
  5. Compare mobile and desktop layouts.
  6. Confirm the content is useful and stable.
  • Evidence for What Counts as Contentful Paint: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
Possible FCP candidates
CandidateTypical routeDependency
Headline textArticleHTML, CSS and font
Navigation labelSite shellHeader styles
Logo imageLanding pageImage discovery
Product imageProduct pageResponsive media
Canvas outputInteractive pageJavaScript execution
SVG contentIllustrated pageMarkup and style

The first contentful candidate should be identified from evidence because its type determines which request or rendering phase needs improvement.

FCP vs First Paint and Largest Contentful Paint

First Paint marks the browser’s first non-default rendering, FCP marks the first document content, and Largest Contentful Paint measures when the largest eligible visible content element renders.

These metrics describe different moments. First Paint can occur before visible text or imagery. FCP shows that document content has begun to appear. LCP aims to represent the main visible content later in the load. A page can have closely grouped values when complete server HTML and critical assets render together. It can also show a wide FCP-to-LCP gap when a small heading appears quickly but a hero image is discovered late. Diagnose each gap rather than choosing one metric as the entire loading experience. FCP improvements that delay LCP through bandwidth competition are not successful.

  • First Paint: first non-default rendered output
  • FCP: first text or visual document content
  • LCP: largest eligible visible content paint
  • TTFB: first response byte before paint
  • CLS: visual stability during the visit
  • INP: responsiveness to interaction
  1. Frame the decision raised by FCP vs First Paint and Largest Contentful Paint.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
Paint and experience metrics
MetricMomentDiagnostic question
TTFBFirst response byteWhen does delivery begin?
First PaintFirst browser renderHas any visual output started?
FCPFirst document contentIs content appearing?
LCPLargest visible candidateIs main content visible?
CLSUnexpected movementIs layout stable?
INPInteraction-to-frame latencyDoes input respond promptly?

FCP should be interpreted as one milestone in a sequence from response start to complete, stable and responsive content.

What Causes Slow First Contentful Paint?

Slow FCP commonly comes from redirects, high TTFB, render-blocking CSS, font delays, synchronous scripts, large initial HTML dependencies, client-rendered shells and main-thread work before the first frame.

Every delay before eligible content paint can contribute. Multiple redirects postpone the document request. A slow origin delays HTML. Stylesheets can block text and layout, while chained imports add discovery rounds. Font behavior can keep text invisible or cause fallback changes. Synchronous scripts pause parsing, and large JavaScript bundles may build all visible content only after execution and API calls. Third-party tags can compete for network and main-thread time. Even after resources arrive, expensive style calculation or script execution can postpone rendering. Break the timeline into response, discovery, transfer and render phases before optimizing.

  • Canonical or tracking redirect chains
  • Slow Time to First Byte
  • Large or chained blocking stylesheets
  • Font files delaying visible text
  • Synchronous JavaScript during parsing
  • Client-side route and API dependencies
  • Main-thread work before first paint
  1. Frame the decision raised by What Causes Slow First Contentful Paint.
  2. Render the page with its required scripts and resources.
  3. Compare content, links, metadata and canonical signals.
  4. Trace each difference to the responsible template or script.
  5. Apply the fix and repeat both observations.
Slow FCP causes
PhaseCauseEvidence
NavigationRedirect chainRequest trace
ResponseHigh TTFBNavigation timing
DiscoveryLate stylesheet or fontWaterfall initiator
TransferLarge critical filesResource timing
ExecutionBlocking JavaScriptMain-thread trace
RenderStyle or layout workPerformance timeline

Slow FCP is best addressed by locating the earliest dominant delay in the page’s actual critical path.

How Do CSS, Fonts and JavaScript Affect FCP?

CSS, fonts and JavaScript affect FCP by controlling when content can be styled, made visible and painted. Critical rules should arrive early, text should have a readable strategy and nonessential scripts should not block parsing.

The browser needs applicable CSS to lay out and paint document content. One global stylesheet may include far more than the current route requires. Critical CSS can shorten the path when it stays synchronized with the design system, while aggressive asynchronous loading can create unstyled content. Fonts require a deliberate fallback and display policy so text can appear without disruptive reflow. JavaScript scheduling should reflect real dependencies: deferred code can wait until parsing completes, independent code may load asynchronously, and primary public content should not require a large client bundle when stable HTML can deliver it. The render-blocking resources guide covers these scheduling choices in depth.

  1. Identify styles required for the initial route.
  2. Remove unrelated CSS from the critical path.
  3. Provide readable fallback typography.
  4. Load only proven critical font files early.
  5. Defer nonessential ordered scripts.
  6. Delay independent third-party work.
  7. Verify visual and functional regressions.
  • Evidence for How Do CSS, Fonts and JavaScript Affect FCP: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
FCP dependency choices
ResourceHelpful behaviorRisk
Critical CSSEarly route stylingInline drift or excess
Route CSSDirect early discoveryLarge unused bundle
Fallback fontVisible early textMetric mismatch
Font preloadEarlier critical faceBandwidth competition
Deferred scriptParsing continuesLate required behavior
Async third partyIndependent schedulingMain-thread contention

The fastest sustainable FCP delivers enough CSS and typography for useful content while keeping optional scripts and styles outside the first-paint path.

How Do You Improve First Contentful Paint?

Improve FCP by reducing redirects and TTFB, delivering useful HTML early, minimizing blocking styles, using a stable font strategy, scheduling noncritical scripts later and reducing main-thread work before the first frame.

Start with the largest measured phase. Fix Time to First Byte when the document itself begins late. Ensure public page meaning exists in the initial response instead of waiting for client-side rendering. Split or reduce blocking CSS while protecting required layout. Use a readable fallback and avoid preloading every font weight. Defer optional scripts and third parties. Prioritize the smallest useful first view, but do not insert meaningless content just to trigger FCP. Retest LCP and CLS so faster first content does not delay the main element or destabilize the page.

  1. Identify the actual first content candidate.
  2. Decompose navigation, response and render delay.
  3. Remove avoidable redirects.
  4. Deliver useful route HTML early.
  5. Reduce blocking CSS and font dependencies.
  6. Reschedule noncritical JavaScript.
  7. Limit early main-thread work.
  8. Verify downstream metrics and content quality.
  • Evidence for How Do You Improve First Contentful Paint: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
FCP fix map
FindingCandidate fixRegression check
High TTFBCache or origin improvementFreshness and status
Empty shellServer or static contentData accuracy
Blocking CSSRoute-aware critical deliveryDesign consistency
Font delayFallback and subset strategyText stability
Parser-blocking scriptDefer or removePrimary actions
Main-thread delayReduce early executionInteraction readiness

The strongest FCP improvement makes genuinely useful content appear earlier without stealing priority from the page’s main content or stability.

How Do You Audit First Contentful Paint?

Audit FCP by segmenting field percentiles, capturing regional lab traces, identifying the first content candidate and mapping every redirect, response, stylesheet, font, script and rendering task that precedes it.

Begin with mobile and desktop field distributions by route family. Select representative fast and slow URLs, including cold and warm cache states. Capture navigation timing, waterfall, paint entries, main-thread trace and visual filmstrip. Identify what triggered FCP and whether it is useful. Compare FCP with TTFB and LCP to isolate the blank-screen phase and the later main-content gap. Test consent, fonts, client rendering and third parties. Group defects by shared template or dependency, then verify each change across affected routes. Monitor production percentiles after release instead of relying only on a passing lab run.

  1. Segment field FCP by device and route.
  2. Select representative and slow URLs.
  3. Capture navigation, waterfall and paint timing.
  4. Identify the first contentful element.
  5. Trace every dependency before its paint.
  6. Compare TTFB, FCP and LCP gaps.
  7. Test shared fixes across templates.
  8. Monitor production after deployment.
  • Evidence for How Do You Audit First Contentful Paint: the raw html returned by the server
  • The rendered DOM after required scripts run
  • Content, links and metadata that differ between those states
  • Network, console and hydration failures tied to the page
  • A repeatable test at the exact URL and device context
FCP audit worksheet
CheckEvidencePass condition
Population75th-percentile segmentsAffected routes known
CandidateVisual timelineUseful first content
ResponseNavigation timingNo avoidable initial delay
CSS/fontsDependency waterfallEfficient paint path
ScriptsExecution traceNo unnecessary blocking
RenderingMain-thread timelinePrompt first frame
RegressionTemplate suiteStable complete content
ReleaseField trendSustained improvement

Start with a relevant free SEO check, continue the evidence workflow in Novaverb, and review pricing when comparing continuous monitoring with a one-time manual review.

A complete FCP audit connects a real-user blank-screen delay to the first painted content and the dependency that held it back.