Technical SEO audit · Responsival

Where BTArtbox’s product schema falls off the crawl

Every one of the 569 English product pages on btartboxnails.com exceeds Googlebot’s 2 MB fetch limit. On 112 of them the Product schema sits past the cutoff and is never downloaded. On another 360 it survives by less than 150 KB.

Property
btartboxnails.com
Scope
569 EN product pages
Measured
2026-09-08
Method
Uncompressed byte offsets
Crawl errors
0 of 569
01

The three findings

112 pages
Broken now
19.7% of catalog

Product schema is downloaded by no one

Googlebot stops fetching at 2,097,152 uncompressed bytes. On these 112 pages the Product JSON-LD block begins after that point, so it is not in the portion Google receives. No price, no availability, no rating, no rich result. The deepest case sits at 3.672 MB, roughly 1.6 MB past the line.

360 pages
One change away
63.3% of catalog

Schema clears the cutoff by under 150 KB

This is the finding that matters more than the first. The median Product block lands at 1.894 MB, about 207 KB of headroom. A theme update, a new app embed, a longer description or a handful of extra reviews pushes these pages over. Combined with the 112 already broken, 472 of 569 pages (83%) are either failing or within 150 KB of failing.

373 pages
Conflicting markup
65.6% of catalog

Two competing Product entities on one URL

These pages serve two separate Product JSON-LD blocks, roughly 5 KB apart. One carries offers only; the second adds aggregateRating. Duplicate top-level entities for the same item give Google no basis to choose, and the review markup is the copy at risk: on 111 pages the rating block is the one past the cutoff. This is independent of page weight and cheap to fix.

02

Where the bytes go

The horizontal axis below is byte position inside a single HTML response, from the first byte to 4 MB. Each bar counts product pages whose first Product block begins in that 100 KB slice. The vertical rule is Google’s documented stopping point.

358 pages26 pages2 MB fetch cutoff · 2,097,152 bytes0.00.51.01.52.02.53.03.54.0 MBOrganization at 1.541 MBmedian offset of the first JSON-LD blockProduct at 1.894 MBmedian offset of the first Product blockPage ends at 3.169 MBmedian total response size

n = 569 English product pages. Bars are counts of pages by the byte offset of their first Product JSON-LD block; the tall bar at 1.85–1.95 MB holds 358 pages. Red bars are past the fetch cutoff.

First Product block inside the fetched portion
First Product block past the cutoff (never fetched)

Read the same measurement as margin rather than position, and the exposure is clearer. Bands are exclusive and cover all 569 pages.

Past the cutoffschema never fetched11219.7%Within 50 KB beloweffectively at the line81.4%50–150 KB belowone theme change from failing35261.9%More than 150 KB belowholding, still over 2 MB total9717.0%

Distance from the first Product block to the 2 MB cutoff. Every page is counted once. Figures are labeled directly rather than by color alone.

03

Why the pages are this heavy

The schema itself is not the problem. A Product block on this site is about 1,613 bytes. What matters is the 1.5 MB of markup that precedes it, which is why the block ends up where it does.

  • Nothing structured appears in the first 1.54 MB. The Organization block is the earliest JSON-LD on every page, at a median offset of 1.541 MB. The first Product block follows at 1.894 MB. Three quarters of the fetch budget is spent before Google sees a single structured-data entity.
  • Inline JavaScript is 59% of the response. Median inline script content per page is 1.867 MB across a median of 76 script tags. The largest single inline script has a median of 0.553 MB and reaches 1.333 MB on the worst page. Moving even the largest of these to an external file would pull most of the catalog back under the limit, since external resources are fetched separately and carry their own budget.
  • Every product page renders roughly 489 image tags. The range is 466 to 631, and it barely varies by product. That is a recommendation, collection or swatch grid being rendered server-side into every PDP rather than loaded on demand.
  • The weight is structural, not content-driven. The lightest page in the product sitemap is /products/message at 2.296 MB, and /products/gift-card is 2.321 MB. Pages with essentially no product content still exceed the limit, which means the theme, not any individual product, sets the floor.
  • For scale: Google’s John Mueller has noted that 90% of pages carry under 151 KB of HTML. The median BTArtbox product page is 3.169 MB, about 21 times that, and 1.58 times the fetch limit. The full English catalog is 1.75 GB of HTML.
04

Correction to the figures sent on 21 August

Three product pages were quoted in the earlier summary. All three figures are confirmed by this crawl. One product was referred to by a tidied-up display name rather than its actual URL, which would have made it hard to look up; the corrected handle is below.

As labeled 21 AugActual URL handleClaimed totalMeasured totalClaimed schema atMeasured schema atStatus
XCOATTIPS French, Short Square White/products/french-x-coat-tips®-short-square-white-tips3.52 MB3.529 MB3.32 MB3.334 MBPast cutoff
Bare Mixed Shades, Short Almond/products/xcoattips®-bare-mixed-shades-short-almond2.64 MB2.647 MB2.48 MB2.486 MBPast cutoff
Midnight Bride Stiletto/products/midnight-bride-stiletto-nails-soft-gel-press-on3.13 MB3.181 MB1.89 MB1.895 MB207 KB margin

Worth stating plainly: on Midnight Bride the Product block is inside the fetched portion. The original summary reported that figure accurately rather than rounding it past the line, and the same nuance holds across the catalog. The correct claim is not “the schema is past the cutoff” but “every page exceeds the limit, and on one page in five the schema is already beyond it.”

05

Method, and how to reproduce it

Google’s crawling documentation states that “Googlebot crawls the first 2MB of a supported file type” [1]. The same page says the fetch stops once that limit is reached and only the portion already downloaded is passed on for indexing consideration, and that the limit is applied to uncompressed data. That last detail is why this audit measures uncompressed bytes and not transfer size.

The 2 MB HTML figure was moved into that page in a February 2026 documentation update. Google stated the behavior itself did not change, only where it was written down; the previous 15 MB figure now describes a default across Google’s crawlers and fetchers rather than Googlebot’s HTML limit [2][3].

Paste the following into the browser console on any product page to reproduce a single row of the table. It reports the total uncompressed byte length of the HTML and the byte offset at which each JSON-LD block opens.

(async () => {
  const html = await (await fetch(location.href, {cache:'no-store'})).text();
  const enc = new TextEncoder(), LIMIT = 2 * 1024 * 1024;
  console.log('TOTAL', enc.encode(html).length, 'bytes');
  const re = /<script[^>]*application\/ld\+json[^>]*>([\s\S]*?)<\/script>/gi;
  let m;
  while ((m = re.exec(html))) {
    const at = enc.encode(html.slice(0, m.index)).length;
    let types = 'UNPARSEABLE', rating = false;
    try {
      const data = JSON.parse(m[1].trim());
      const nodes = [].concat(data['@graph'] || data);
      types = nodes.map(x => x['@type']).filter(Boolean).join('+');
      rating = nodes.some(x => x.aggregateRating);
    } catch (e) {}
    console.log(' ', at, 'bytes', (at/1048576).toFixed(3)+'MB', types,
      rating ? '[aggregateRating]' : '', at > LIMIT ? 'PAST 2MB' : '');
  }
})();

Scope and limits of this measurement

  • User agent. These figures are the HTML a standard browser receives. The browser fetch API cannot override the User-Agent header, so a Googlebot-UA comparison was not run. If the theme or any installed app varies its output by user agent, these numbers would not capture it. Confirming parity takes one curl request with Googlebot’s UA string.
  • Position, not behavior. This audit measures where markup sits in the file. It does not observe Google’s actual parsing. The confirmation step is the Rich Results Test [4] and validator.schema.org [5] on a page from each band; pages whose schema is past the cutoff should show no eligible Product result.
  • Locales. The English catalog was measured: 569 URLs. The sitemap carries 6,828 product URLs in total, roughly twelve locale variants of each page. Locale pages were not crawled and are assumed to share the theme’s weight profile, which is worth verifying before any estimate of total crawl waste.
  • Point in time. Measured 8 September 2026. Shopify themes and third-party apps change without notice and page weights drift, which is why the numbers here differ slightly from the 21 August figures on the same URLs. Re-run before acting on any single row.
  • Offsets are tag positions. Each offset is the byte position of the opening script tag, so the entity itself begins a few bytes later. Both a page’s total and its offsets are uncompressed UTF-8 byte lengths, matching Google’s stated basis.

Sources

[1]Googlebot — Google Search Central documentation. Fetch size limits, cutoff behavior, uncompressed basis.
[2]Googlebot File Limit Is 15MB, 2MB & 64MB For PDF — Search Engine Roundtable, 4 February 2026. Context on the documentation change.
[4]Rich Results Test — Google. Verification of rich-result eligibility per URL.
[5]Schema Markup Validator — schema.org. Raw syntax validation, including duplicate entities.
[6]Googlebot and the 15 MB thing — Google Search Central Blog, June 2022. The earlier figure, kept for reference.
06

The 25 pages furthest past the cutoff

Ranked by how deep the first Product block sits beyond the 2 MB line. Every one of these is an XCOATTIPS French tip or kit variant, which is where the heaviest templates live. The strip in each row uses the same 0–4 MB axis as the chart above: the shaded bar is the extent of the page, the hairline is the 2 MB cutoff, the marker is where the first Product block begins. Full figures for all 569 pages are in the accompanying CSV.

Product handleTotal HTMLProduct block atMargin to 2 MB2nd Product atReviewsInline JSimg tagsPositionStatus
xcoattips®-pink-pastel-french-kit-almond3.8653.672−1712 KB3.72282.320621Past cutoff
xcoattips®-french-short-almond-pink-pastel-tips3.6863.494−1530 KB3.544422.285543Past cutoff
xcoattips®-pink-pastel-french-kit-short-square3.5933.400−1433 KB3.449212.212541Past cutoff
xcoattips®-french-medium-almond-pink-pastel-tips3.5803.388−1421 KB3.437112.206531Past cutoff
xcoattips®-french-short-square-pink-pastel-tips3.5723.379−1412 KB3.429332.172543Past cutoff
xcoattips®-french-long-square-pink-pastel-tips3.5583.366−1398 KB3.416212.158543Past cutoff
xcoattips®-french-short-almond-red-tips3.5503.357−1389 KB3.40692.203515Past cutoff
xcoattips®-french-short-square-pink-pastel-tips-13.5433.351−1384 KB3.401302.148543Past cutoff
xcoattips®-pink-pastel-french-kit-medium-coffin3.5393.348−1381 KB3.39822.175533Past cutoff
xcoattips®-french-extra-short-oval-pink-pastel-tips3.5303.338−1370 KB3.38792.163527Past cutoff
french-x-coat-tips®-short-square-white-tips3.5293.334−1366 KB3.386931.965631Past cutoff
xcoattips®-french-peach-medium-almond-red-pastel-tips3.5013.310−1341 KB3.359142.155515Past cutoff
xcoattips®-french-short-almond-blue-pastel-tips3.5013.308−1339 KB3.358212.093551Past cutoff
xcoattips®-french-long-ballerina-pink-pastel-tips3.4913.297−1329 KB3.34752.108535Past cutoff
xcoattips®-french-short-square-red-tips3.4863.295−1326 KB3.344112.140515Past cutoff
french-x-coat-tips®-short-almond-white-tips3.4753.283−1313 KB3.333232.025575Past cutoff
xcoattips®-french-short-almond-purple-pastel-tips3.4463.253−1283 KB3.303182.034551Past cutoff
french-x-coat-tips®-short-coffin-white-tips3.4393.246−1276 KB3.296232.011563Past cutoff
xcoattips®-french-long-square-red-tips3.4193.227−1256 KB3.276112.075515Past cutoff
xcoattips®-french-white-long-square-white-tips3.4083.215−1244 KB3.26681.909598Past cutoff
french-x-coat-tips®-extra-short-square-white-tips3.3703.176−1204 KB3.227461.918575Past cutoff
xcoattips®-french-long-square-blue-pastel-tips3.3333.141−1168 KB3.191131.929551Past cutoff
french-x-coat-tips®-kit-short-coffin3.3313.139−1166 KB3.188321.944544Past cutoff
french-x-coat-tips®-kit-extra-short-oval3.3273.135−1162 KB3.184201.876576Past cutoff
xcoattips®-brighter-pastel-french-kit-almond3.3273.134−1162 KB3.184101.915561Past cutoff

All figures in MB unless labeled. Margin is the distance from the first Product block to the 2 MB cutoff; negative means the block is past it. Reviews is the reviewCount carried in the aggregateRating block.

Prepared by Responsival · measured 8 September 2026 · 569 of 569 pages fetched, 0 errors. All byte figures are uncompressed UTF-8 lengths of the HTML response, measured client-side with the script in section 05.