Total Blocking Temps (TBT)

Ce que TBT measures, the 50ms long-task math, pourquoi it's the lab proxy pour INP (pas a Core Web Vital), and Comment corriger a red score — from a SEO technique.

Première publication : 26 juin 2026 · Dernière mise à jour : 3 août 2026 · Advanced
Langues

Total Blocking Temps (TBT) is the sum of the blocking portion — the temps ci-dessus 50 ms — of every long task entre Premier affichage de contenu and Temps d’interactivité. It's a lab-only metric, the unique largest weight (30%) in the Lighthouse Performances score, and the lab proxy pour the Core Web Vital INP (it utilisé to proxy FID). It n’est pas a Core Web Vital and jamais montre up in Search Console or CrUX. Lighthouse mobile thresholds: bon ≤200 ms, poor >600 ms. Vous fix it the même façon vous fix INP — break up long JS tasks, code-split, defer or supprimer unused JS, and cut third-party script cost. My honest prendre: do it pour utilisateurs and conversions, pas pour a ranking bump.

TL;DR — TBT is the total amount of temps, entre Premier affichage de contenu and Temps d’interactivité, que the principal thread was blocked long suffisant to prevent input responsiveness. It sums the blocking portion (duration − 50 ms) of every long task (quelconque main-thread task over 50 ms). It’s a lab metric — the unique largest weight (30%) in the Lighthouse 10 score and the lab proxy pour INP — but it is pas a Core Web Vital and jamais apparaît in CrUX or Search Console. Mobile thresholds: bon ≤200 ms, poor >600 ms. Fix it comme you’d fix INP: break up long JS tasks, code-split, defer/supprimer unused JS, tame third-party scripts. My honest prendre: fix it pour utilisateurs, pas pour a ranking bump.

Evidence for this claim Lighthouse classifies mobile TBT at 200 milliseconds or less as good and above 600 milliseconds as poor. Scope: Lighthouse mobile TBT scoring guidance; desktop scoring differs. Confidence: high · Verified: Chrome Developers: Total Blocking Time

Ce que TBT en réalité measures

Google’s definition is the placer to commencer. TBT is “the total amount of temps après Premier affichage de contenu (FCP) où the principal thread was blocked pour long suffisant to prevent input responsiveness.” Le navigateur’s principal thread processes un task at a temps; pendant que it’s busy with a long chunk of fonctionner, it can’t react to a click, a tap, or a keypress. TBT quantifies how beaucoup of votre page-load window is spent in que blocked state.

Two definitions do tout the fonctionner ici:

  • A long task is “a task que runs on the principal thread pour plus que 50 milliseconds.”
  • The blocking portion of a task is its duration minus 50 ms. Tasks at or sous 50 ms contribute exactly 0 ms.

TBT is the sum of ceux blocking portions entre FCP and Temps d’interactivité (TTI). So Premier affichage de contenu is the commencer line: nothing avant the premier paint counts, parce que there’s nothing on screen to interact with yet.

Evidence for this claim TBT sums the portion above 50 milliseconds of long main-thread tasks between FCP and Time to Interactive. Scope: Lighthouse lab metric definition; not a field Core Web Vital. Confidence: high · Verified: Chrome Developers: Total Blocking Time

The worked exemple

Google’s propre table is the clearest illustration. Imagine five tasks run on the principal thread entre FCP and TTI:

Task durationBlocking temps (duration − 50 ms)
Task un: 250 ms200 ms
Task two: 90 ms40 ms
Task three: 35 ms0 ms
Task four: 30 ms0 ms
Task five: 155 ms105 ms
Total Blocking Temps345 ms

Tasks three and four are sous the 50 ms line, so ils contribute nothing. Task un blocks pour 250 − 50 = 200 ms, task five pour 155 − 50 = 105 ms. Ajouter the blocking portions — 200 + 40 + 0 + 0 + 105 — and vous obtenir 345 ms of TBT. That’s a “needs improvement” score, driven almost entirely by two heavy tasks.

Ce is the counter-intuitive partie worth internalizing: “A petit number of tasks on the principal thread doesn’t necessarily mean low blocking temps. Conversely, a grand number of tasks doesn’t necessarily lead to tons of blocking temps.” (Que framing is NitroPack’s, relayed ici — reverified contre the live source 2026-07-18.) Ce que matters is si individual tasks cross 50 ms, pas how nombreux tasks là are.

The measurement window: FCP to TTI

The window ends at Temps d’interactivité“the temps from quand lune page starts chargement to quand its principal sub-resources have chargé and it is capable of reliably responding to utilisateur input quickly.” In Lighthouse, TTI is trouvé by searching forward pour a five-second “quiet window” with aucun long tasks and aucun plus que two in-flight network requêtes.

Worth noting: TTI itself was supprimé from Lighthouse 10 parce que it proved overly sensitive to outlier network requêtes and long tasks, producing élevé variability. TBT survived and became the principal interactivity metric. As Philip Walton put it, “Newer, alternative, metrics comme Plus grand affichage de contenu (LCP), Total Blocking Temps (TBT), and Interaction jusqu’au prochain affichage (INP) are usually meilleur metrics to utiliser in placer of TTI.” TBT didn’t replace TTI as the window’s endpoint — it’s a meilleur unique number pour the même underlying problem. And TTI’s disappearance from the Lighthouse report UI isn’t the même claim as TTI ne … plus bounding Lighthouse’s par défaut navigation window — the window itself is encore mesuré que façon sous the hood.

Evidence for this claim TTI being removed as a displayed Lighthouse metric does not by itself mean TTI stopped bounding the default Lighthouse navigation TBT window. Scope: lab recommended Confidence: high · Verified: Total Blocking Time (TBT)

Un plus scoping remarque: “FCP to TTI” describes Lighthouse’s par défaut navigation audit specifically. Autre outils, or Lighthouse itself running a timespan trace au lieu de a complet page-load navigation, peut total a différent mesuré window — the 50 ms long-task math doesn’t modifier, but the commencer and fin points of ce que obtient summed are outil- and trace-mode-specific, pas a universal law of the metric.

Evidence for this claim TBT begins after FCP, but the endpoint is tool and trace-mode specific: page-load tools commonly use TTI, Lighthouse navigation audits default to stopping at TTI, and other tools or timespan traces may total a different measured window. Scope: navigation audits Confidence: high · Verified: Total Blocking Time

Is TBT a Core Web Vital? Aucun.

Ce is the la plupart courant misconception, so let’s be blunt à propos de it. The three Core Web Vitals are LCP, INP, and CLS. TBT n’est pas un of les. Google’s propre wording: “Total Blocking Temps (TBT) is a lab metrics is vital in catching and diagnosing potential interactivity problèmes que peut impact INP. Cependant, it n’est pas partie of the Core Web Vitals définir parce que ils ne sont pas field-measurable, nor do ils reflect a user-centric outcome.” (The grammar in que sentence is theirs, pas mine.)

So où fait TBT montrer up, and où doesn’t it?

  • Où vous voir it: Lighthouse, PageSpeed Insights’ lab tab, and Chrome DevTools — tout simulated/lab environments.
  • Où vous don’t: Recherche Google Console’s Core Web Vitals report, CrUX, or quelconque field données. Ceux seulement carry LCP, INP, and CLS.

Si someone indique vous they’re “watching TBT in Search Console,” they’re mistaken — GSC reports field données, and TBT isn’t a field metric.

Un correction worth being precise à propos de: TBT being lab-recommended isn’t the même as TBT being field-impossible. Vous pouvez technically compute a TBT-style total in the field with the Long Tasks API — Google dit so directement: “It is possible to mesurer TBT in the field, but we don’t recommend ce as utilisateur interaction peut affecter votre page’s TBT in façons que lead to lots of variance in votre reports.” That’s a recommendation contre it, pas a technical wall. What’s en réalité vrai sans exception is narrower: CrUX and Search Console’s Core Web Vitals report jamais carry TBT, complet arrêter — ceux pipelines seulement ever collect LCP, INP, and CLS.

TBT is the lab proxy pour INP

Here’s pourquoi TBT exists at tout. Lab outils charger une page in a simulated environment with aucun réel utilisateur, so ils can’t mesurer Interaction jusqu’au prochain affichage — INP nécessite réel clicks and taps. TBT fills que gap: “the Total Blocking Temps (TBT) metric is lab-measurable and is a proxy pour INP.”

The two are mechanically connexe: “Although INP and TBT are calculated differently, ils are les deux reflections of a blocked principal thread during the bootstrap traiter. Quand the principal thread is blocked, le navigateur is delayed in responding to utilisateur interactions.” And empirically, “A low TBT souvent correlates with a low Interaction to Suivant Paint (INP).”

But “proxy” n’est pas “substitute.” Google is explicit: “Total Blocking Temps (TBT) may be a reasonable proxy metric pour INP, but it’s pas a substitute pour INP in and of itself.” Ils diverge in réel façons:

  • Élevé TBT, fine INP. TBT measures blocking during charger. Si votre utilisateurs don’t en réalité essayer to interact during que blocked window — ils wait pour lune page to regarder finished premier — leur INP peut be fine même with an ugly TBT.
  • Fine TBT, poor INP. INP aussi covers slow event handlers and rendering fonctionner que fire après charger, plus choses comme le navigateur’s 300 ms tap delay on non-mobile-optimized pages — none of qui TBT sees.

Quand the lab and field disagree, trust the field. INP (the real-user number) takes priority over TBT (the lab estimate).

Un historical remarque que trips personnes up: TBT utilisé to be the lab proxy pour Premier Input Delay (FID). INP replaced FID as a Core Web Vital on March 12, 2024, so TBT is now INP’s proxy. The underlying mechanism jamais modifié — it’s toujours been à propos de a blocked principal thread during charger — but quelconque older article appel TBT “FID’s proxy” predates que switch.

Pourquoi TBT dominates the Lighthouse score

TBT carries the largest unique weight in the Lighthouse Performances score — 30%, a weighting introduced in Lighthouse 10 and, verified live contre Chrome’s scoring docs on 2026-07-18, encore unchanged via the current Lighthouse 13:

MetricWeight
Premier affichage de contenu10%
Speed Index10%
Plus grand affichage de contenu25%
Total Blocking Temps30%
Décalage cumulatif de mise en page25%

Treat que table as version-and-date-scoped, pas a permanent constant — Lighthouse has modifié its weights avant and peut à nouveau. Re-verify contre Lighthouse performances scoring avant quoting it in an audit deck.

Ce is the practical raison TBT matters pour le SEO audits même though it isn’t a ranking signal: a poor TBT has an outsized effect on que big Lighthouse number everyone screenshots. Addy Osmani’s worked exemple rend it concrete — removing un Intersection Observer polyfill cut TBT from 400 ms to 300 ms and lifted the Lighthouse Performances score from 63 to 70. Un fix, seven points, parce que of the 30% weight.

Un plus nuance: the “Good ≤200 ms” category threshold and the Lighthouse score are différent scales. To score 90+ on the TBT subscore vous besoin roughly ≤300 ms on mobile, and to hit 100 vous besoin ≤100 ms. (Ceux subscore figures are DebugBear’s documentation of the scoring curve, reverified contre the live source 2026-07-18.) “Good” and “100” ne sont pas the même bar.

Fait TBT affecter SEO rankings?

Pas directement — and I’ll be straighter à propos de ce que la plupart.

TBT n’est pas a ranking signal. Google’s interactivity ranking input is INP, a field metric. TBT is a diagnostic que helps vous trouver and fix the long tasks que hurt INP. Improving TBT may améliorer INP, qui pourrait marginally aider lune page Experience side of rankings — but that’s two liens of “may” away from votre positions.

And here’s my réel position on the whole Core Web Vitals question, qui I’ve written avant in my vitesse de page guide: I don’t think Core Web Vitals have beaucoup impact on SEO, and unless you’re extremely slow I généralement won’t prioritize les. Do les pour utilisateurs and conversions, pas pour a ranking bump. Que s’applique doubly to TBT, qui is a lab proxy pour a field metric pour a petit ranking input. Fix it parce que a frozen page loses vous customers — pas parce que you’re chasing a position.

Ce que causes élevé TBT

It’s almost toujours JavaScript:

  • Unnecessary JavaScript chargement, parsing, or execution — the Lighthouse audit’s propre words. Shipping a big bundle lune page doesn’t besoin at charger is the classic causer.
  • Inefficient JavaScript statements — heavy synchronous fonctionner que monopolizes the principal thread.
  • Third-party scripts — tag managers, chat widgets, analytics, ad scripts. Souvent the unique biggest contributor, and the un vous contrôler least.
  • Heavy framework bootstrap — React hydration and similaire peut run long tasks during startup.
  • Style/layout recalculation and garbage collection — forced synchronous layout, grand style recalcs, and GC pauses montrer up as main-thread tasks aussi; don’t assume every long task in the trace is JavaScript execution.

Don’t assume bundle transfer size is the whole story, soit. Trace attribution has réel gaps: cross-origin frames and worker threads have privacy and security limites on ce que a long-task observer peut report à propos de les (voir Troubleshooting), so an unattributed task in votre trace isn’t proof aucun third party is involved — it may simplement mean the attribution API isn’t allowed to tell vous.

Comment corriger élevé TBT

The fixes are the même family as the INP fixes — les deux come bas to a blocked principal thread.

  1. Trouver the long tasks. Ouvrir the Chrome DevTools Performances panel and regarder pour tasks over 50 ms (they’re flagged with red corners), or run the Lighthouse “Avoid long main-thread tasks” audit.
  2. Audit third-party scripts premier. They’re usually the easiest wins. Utiliser the DevTools Coverage and Network tabs to voir ce que chaque script costs, and lazy-load heavy embeds (YouTube, maps, chat) behind a facade.
  3. Break up the long tasks. Yield to the principal thread so le navigateur peut handle input entre chunks — “quand tasks are broken up, le navigateur peut respond to higher-priority fonctionner beaucoup sooner—notamment utilisateur interactions.” The modern API is scheduler.yield(), with a setTimeout(resolve, 0) fallback (voir the Cheat Sheets tab pour the pattern). Remarque que Google ne … plus recommends isInputPending() — yield regardless of si input is pending.
  4. Reduce the JavaScript. Code-split grand bundles so moins parses and evaluates at charger, supprimer unused JS (DevTools Coverage tab montre vous ce que), and defer non-critical scripts.
  5. Déplacer heavy computation off the principal thread. Web Workers run CPU-heavy fonctionner on a separate thread, leaving the principal thread free to respond.

A utile side effect: long tasks que block the principal thread peut aussi delay Plus grand affichage de contenu rendering, so fixing TBT parfois improves LCP aussi — surtout quand render-blocking JS is involved.

Où to go suivant

TBT lives in the Core Web Vitals family alongside its field counterpart Interaction jusqu’au prochain affichage, the chargement metrics Plus grand affichage de contenu and Premier affichage de contenu, and the lab outils Lighthouse, PageSpeed Insights, and Speed Index que report les. Si vous seulement remember un chose: TBT is the lab warning light pour field responsiveness — chase the long tasks, pas the number.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.