Being under 2,000,000 pasted bytes in the HTML Page Weight Analyzer does not, by itself, guarantee that Googlebot receives the entire HTML response from your server. The analyzer measures the UTF-8 byte size of the body text you paste and compares that single number against a transparent decimal 2,000,000-byte reference, but Google's documented per-URL crawl allowance is a different calculation: it covers uncompressed response data for a supported file and explicitly includes the HTTP header block that travels with that response. Because the tool sees only the body you supply, it cannot read your real response headers, your compression layer, or the size of any external file your markup references. The 2 MB number the interface shows is therefore a conservative body-only reference, useful for spotting pages that are obviously bloated, but not a certification that Googlebot will fetch the full response and index everything inside it.

What the 2,000,000-Byte Reference Actually Compares
Google's current documentation states that Googlebot crawls the first 2 MB of a supported file and stops fetching at the cutoff, with the limit applying to uncompressed data. A separate technical note clarifies that HTTP headers consume part of that per-URL allowance. The HTML Page Weight Analyzer takes that published figure and labels it as a decimal 2,000,000-byte body reference inside the interface. Two design choices follow from this:
- The reference is a body number, not a full-response number. Response headers, gzip or Brotli framing, and HTTP/2 frame overhead all sit outside the pasted text and outside the analyzer's calculation.
- The reference is conservative. Because the interface cannot prove where Googlebot will actually stop, it shows remaining bytes below the line or overage above it, with a header caveat kept visible so the number cannot be mistaken for a crawl guarantee.
The figure is also not timeless. Google explicitly notes that crawl limits can change, so the source link and reference date inside the tool matter more than treating the value as a permanent constant. Per Google's crawler blog post on the header allowance, the response header block is part of the same 2 MB bucket, which is the gap the analyzer does not try to bridge.
Why a Smaller Body Still Does Not Guarantee a Complete Googlebot Fetch
Three structural reasons prevent a small pasted body from translating into a complete fetch, even when the analyzer reports a comfortable margin under the 2,000,000-byte line:
- The 2 MB allowance is not a body-only number. HTTP headers travel in the same response stream as the body and consume part of the budget. A page with 1.9 MB of body text plus a 200 KB cookie header and a chunked transfer-encoding header block can already overshoot, even if the markup itself looks fine in the analyzer.
- Compression is invisible to a pasted input. Servers usually send HTML with gzip or Brotli, so the on-the-wire size is smaller than the uncompressed bytes the analyzer reports. Because Google's documented cutoff applies to uncompressed data, the compression ratio does not move that limit; what can still push a response over the line is headers and framing living inside the same uncompressed budget, which the analyzer cannot see.
- External resources are fetched separately. Googlebot and the Web Rendering Service may follow referenced stylesheets, scripts, images, frames, preload hints and media with their own per-file limits. A clean body does not save a page whose biggest assets live in 500 KB images or 1 MB JavaScript bundles, and the analyzer never claims otherwise.
Stated simply, the analyzer answers one narrow question with high confidence and refuses to extrapolate beyond it: how many UTF-8 bytes is the body you pasted, and how far is that from a published per-URL body reference? Crawling, indexing and ranking depend on many signals the tool deliberately does not estimate.
Measuring Your Page Body With the HTML Page Weight Analyzer
Open the HTML Page Weight Analyzer and work through the following steps against the real response your server is sending, not against a JavaScript-mutated DOM snapshot.
- Paste the original uncompressed HTML response body. Use View Source in your browser, a saved response body from DevTools' Network panel, or an authorized curl capture that matches the public user agent you want to test. Copying from the Elements panel after scripts run can include mutations that were not in the response and strip source details that were.
- Run the analysis. The interface parses the text inside a detached template fragment so no scripts execute, no forms submit, and no URLs are requested. UTF-8 bytes are measured through the browser's TextEncoder API rather than reported as a JavaScript string length, and the result is rendered as text.
- Review total UTF-8 bytes against the 2,000,000-byte reference. Note remaining bytes below the line or overage above it, and read the header caveat the interface keeps visible next to the comparison.
- Read the inline code, data URI and external-reference shares. Inline script and style text, embedded data: attribute values, and the bounded inventory of external resource references each tell a different part of the story.
- Fix the largest source-level hotspot, then remeasure the deployed response. The pasted body is a snapshot; HTTP headers, compression, and separately fetched resources are outside this calculation and need their own checks.
Reading the Breakdown: Inline Code, Data URIs, and External References
The byte total in the analyzer is one number, but it is built from distinct categories that respond to different fixes. The table below summarizes how each category is treated in the measurement, what the interface reports, and what kind of hotspot it usually points to.
| Source of bytes | Counted in pasted body total? | What the analyzer reports | Common hotspot signal |
|---|---|---|---|
| Inline script text | Yes | UTF-8 byte total and percentage of full source | Serialized application state, duplicated hydration data, inlined libraries |
| Inline style text | Yes | UTF-8 byte total and percentage of full source | Repeated critical CSS that a build step never split |
| Data URI attribute values | Yes, counted once as written | Total bytes across supported direct resource attributes | Base64 images, fonts or icons embedded directly in markup |
| External script src, stylesheet href, image src, preload, frame references | Only their URL text and tags | Bounded reference inventory; never downloaded | Duplicate tags, missed externalization, oversize linked assets |
| HTTP response headers | No | Not visible — the tool sees only the pasted body | Inspect with curl or DevTools; they consume part of the 2 MB bucket |
| External file payloads (CSS, JS, images, media) | No | Listed, never measured | Profile separately; their limits are independent of the HTML body |
Two measurement details keep the comparison honest. First, the analyzer uses UTF-8 bytes rather than character count, which matters because ASCII is one byte per character while accented letters, CJK text and emoji occupy more; comparing characters would mislead anyone whose page carries international content. Second, the parser uses a detached template fragment and the browser's native HTML tokenizer, so raw-text boundaries inside textarea, title, script and style are read correctly, and nested template content stays inert outside the resource inventory. For a deeper walkthrough of how external references interact with the body total, see HTML Page Weight: Are External File Sizes Included?
Fixing the Largest Hotspot and Remeasuring the Deployed Response
Use the breakdown as a debugging map rather than a score. Common hotspots and the smallest truthful response to each:
- Large inline script bytes often point to serialized application state, duplicated hydration data, or a library that was inlined for a reason that no longer applies. Move stable code to an external file with a far-future cache header and remeasure the body.
- Large inline style bytes usually mean repeated critical CSS or a build step that never split above-the-fold rules from the rest. Externalize what is not strictly page-critical and confirm the new total drops.
- Large data URI totals reveal Base64 images, fonts or icons that were embedded directly into markup. Replace each one with a linked file and remeasure, since the analyzer counts the attribute value once as it appears in the source and never decodes Base64 to add it again.
- A long external-reference inventory may reveal duplicate tags. Reference count alone is not a performance score, but ten identical preload hints or three copies of the same stylesheet are usually worth removing.
After the smallest truthful change, remeasure the real deployed response with the HTML Page Weight Analyzer, then verify response headers with curl, rendered behavior with DevTools, and indexing evidence in Search Console. Place critical metadata and content early in the response so that whatever Googlebot does fetch carries the highest-value markup first. A smaller body number improves your odds against the 2,000,000-byte reference, but it is not a guarantee that Googlebot fetches, indexes or ranks the page; those outcomes depend on headers, separately fetched resources and many signals the tool deliberately leaves outside its calculation.