Simply put: when you check with the Google Official Rich Results Test tool, it shows “No rich results detected”;
But looking at Search Console, it prompts “Missing offer field” (for example, product price or stock information is not labeled correctly).
Because less than 40% of pages can fully execute JavaScript during Google crawling, many product (Product) markups dynamically generated by JS are not captured by crawlers at all.
For example, an e-commerce website selling food failed to add the “nutrition” sub-item (such as calories, protein content, etc.) in the Recipe markup. As a result, the “recipe cards with nutritional information” that could have been displayed dropped by more than half (the display rate fell by 62%), losing thousands of clicks every day.
There was also a news website where the “datePublished” format in the Article markup was wrong (for example, written as “2023/12/31” instead of the standard “2023-12-31”), causing hot news to fail to trigger “Featured Snippets” (the prominent cards at the top of the search results page), missing out on a lot of exposure.

Table of Contens
ToggleTroubleshooting Steps
From the data, the distribution of problems is quite clear: about 65% of preview failures are because the JSON-LD code is written incorrectly or missing necessary attributes (such as fields that should be labeled are not, or the format is wrong);
20% is because the page uses JavaScript to dynamically load content, but it was not rendered during Google crawling;
The remaining 15% is due to slow page loading or login requirements, preventing the crawler from reading the markup at all.
The testing tool may use old data cache by default, resulting in 48% of new problems not being detected; even with “Live Test,” it only covers 35% of JS-generated content, leaving many dynamic markups unverified.
If the site does not have HTTPS enabled, 18% of structured markup will be directly ignored; if the page takes more than 5 seconds to load, 22% of Google crawlers will give up crawling early, and naturally won’t read your markup.
Structured Data Syntax and Attribute Verification
Structured data verification needs to focus on JSON-LD syntax accuracy (bracket/quote/comma errors account for 42%-31% of syntax issues), completeness of required attributes (Product missing offers accounts for 38%, Article missing datePublished accounts for 29%), and type nesting standardization (e.g., Recipe failing to nest NutritionInformation leads to a 57% increase in parsing failure rate).
JSON-LD Syntax Errors
Mismatched brackets and quotes (accounting for 42% of syntax errors):
Example error code:
{
“@context”: “https://schema.org”,
“@type”: “Product”,
“name”: “Wireless Headphones”,
“image”: “https://example.com/headphones.jpg”,
} // Missing closing brace “}”Fix: Use the “bracket matching” function of a code editor (such as the Bracket Pair Colorizer plugin for VS Code) to check the symmetry of
{},[], and""line by line.
Redundant commas (accounting for 31% of syntax errors):
Example error code:
“offers”: {
“@type”: “Offer”,
“price”: “99.99”, // Redundant comma at the end here
“priceCurrency”: “USD”
},Fix: JSON specifications do not allow a comma after the last attribute of an object/array; it must be manually deleted or automatically corrected using online formatting tools (such as JSONLint).
Data type errors (accounting for 27% of syntax errors):
For example, the date format does not use the ISO 8601 standard (it should be "2023-10-05T08:00:00+08:00" instead of "2023/10/05"), or the price is not using a string type ("price": 99.99 should be changed to "price": "99.99").
Schema.org explicitly requires that numerical attributes must match the format of the corresponding type, otherwise they will be judged as “invalid values.”
Completeness of Required Attributes
Different Schema types have clear requirements for “required attributes,” and the absence of any attribute will result in the failure to generate rich results.
According to Google’s Rich Results Guidelines (2024), the following are required attributes for high-frequency markups and the consequences of missing them:
| Markup Type | Required Attributes | Missing Rate | Example Consequence |
|---|---|---|---|
| Product | name, image, offers | 38% | Unable to display price and purchase links |
| Article | headline, datePublished, author | 29% | Does not trigger “Featured Snippets” |
| LocalBusiness | name, address, telephone | 35% | Map cards cannot be linked to the location |
| Recipe | name, description, recipeIngredient | 41% | Does not display ingredient lists and steps |
Case Study: A gourmet website’s rich result display rate dropped from 12% to 5% because the Recipe markup was missing recipeIngredient (a required attribute).
After the fix, adding the ingredient list (e.g., "recipeIngredient": ["200g Flour", "2 Eggs"]), the display rate recovered to 10% within 3 days.
Nesting Standards for Types
Complex Schema types need to achieve semantic correlation through nesting; incorrect nesting will prevent Google from identifying attribute ownership.
Schema.org 2023 data shows that nesting errors account for 49% of attribute verification failures. Typical scenarios include:
Nutritional information for Recipe: Needs to be nested under the NutritionInformation type, rather than directly as an attribute of Recipe:
// Wrong (not nested)
“calories”: “350 kcal”// Correct (nested within NutritionInformation)
“nutrition”: {
“@type”: “NutritionInformation”,
“calories”: “350 kcal”,
“fatContent”: “12g”
}
Location information for Event: Needs to nest the Place type, containing sub-attributes such as address and geographic coordinates:
“location”: {
“@type”: “Place”,
“name”: “Convention Center”,
“address”: {
“@type”: “PostalAddress”,
“streetAddress”: “123 Main St”,
“addressLocality”: “San Francisco”
},
“geo”: {
“@type”: “GeoCoordinates”,
“latitude”: “37.7749”,
“longitude”: “-122.4194”
}
}
Verification Method: Use the “Nested Entities” tab of the Schema.org validator to check if the nesting level conforms to standards (e.g., NutritionInformation must be a direct subtype of Recipe).
Dual Validation with Google and Schema.org
Google Structured Data Testing Tool: Focuses on “Rich Result Compatibility” and will prompt “This markup cannot generate rich results” along with specific reasons (e.g., “Missing offers field”). Schema.org Validator: Focuses on “Semantic Specification” and will check if attribute values match the Schema definition (e.g., whether priceCurrency is an ISO 4217 currency code).
Limitations of Testing Tools
Google testing tools are affected by caching mechanisms (48% old data remains) and live test coverage (35%-50% dynamic content). Data shows that relying solely on testing tools may miss 22% of real issues.
Caching Mechanism
The Google Structured Data Testing Tool caches page markup by default, and 48% of test results will show old data from 48 hours ago (Search Console Help Center, 2023).
If you recently modified JSON-LD markup but haven’t cleared the cache, the test results may still show the error status from before the modification.
Case Study: After an educational website updated the Course markup for course information, the testing tool still prompted “Missing description field”—after clearing the cache, the results returned to normal.
Coping Methods:
- Manually click “Clear Cache” (trash can icon) in the upper right corner of the tool before each test to avoid interference from historical data.
- For frequently updated pages (such as e-commerce product pages), it is recommended to append a timestamp parameter (e.g.,
?v=20240315) during testing to force the tool to crawl the latest version.
Live Testing
The live test function (switching to the “Live Test” tab after entering a URL) simulates Googlebot crawling and executing page JavaScript, but its capability is limited: it can only capture 35%-50% of dynamically generated markup (Google Engineering Blog, 2024).
Reasons for failure to capture include:
- JS Execution Latency: Markup is generated by asynchronous requests (such as fetch), and the testing tool’s waiting time is insufficient (default timeout is 3 seconds).
- Framework Compatibility: The hydration process of SPA frameworks like React/Vue may not be fully simulated, resulting in markup not being injected into the DOM.
A news site used React to generate Article markup. The live test showed “No rich results,” but the markup actually existed after the page rendered—because the JS execution took 4.2 seconds, exceeding the tool’s default waiting time.
Coping Methods:
- Check page JS execution time (using Lighthouse or the Performance tab in Chrome DevTools) to ensure markup loads within 3 seconds.
- For SPA sites, use pre-rendering techniques like window.__INITIAL_STATE__, or manually trigger JS execution in the testing tool (such as clicking page interaction buttons).
Coverage Report
The “Coverage” report of the testing tool (located at the bottom of the results page) shows Google’s understanding of the page, but only provides surface-level conclusions (e.g., “No eligible markup found”) without explaining specific errors in depth.
Common Vague Prompts and Meanings:
| Prompt | Possible Reason | Verification Method |
|---|---|---|
| “Some markup ignored” | Nesting error or attribute type mismatch | Check nesting levels with Schema.org validator |
| “Markup not associated with page main entity” | mainEntityOfPage missing or pointing to the wrong place |
Check if the markup contains the mainEntityOfPage field |
| “Resource inaccessible” | Image/URL is HTTP or 404 status | Manually visit the URL in the markup to verify the status code |
Case Study: A recipe website showed “Some markup ignored” during testing. The Schema validator found that the nutrition field of Recipe was not correctly nested under the NutritionInformation type. After correction, the coverage report updated to “All markup valid.”
Supplementary Third-Party Tools
Relying solely on Google testing tools may miss 22% of real issues (HTTP Archive, 2023), requiring cross-verification with other tools:
- Schema.org Validator: Checks semantic compliance (e.g., whether
priceCurrencyfollows ISO 4217 codes). A cross-border e-commerce site misused “US” instead of “USD” forpriceCurrency; while the Google testing tool reported no errors, the Schema validator caught the issue. After the fix, the rich results display rate increased by 19%. - curl Command Testing: Use
curl -H "User-Agent: Googlebot" URLto simulate a Googlebot crawl and check if the markups in the raw HTML are output correctly (especially useful for server-side rendered pages).
Page Accessibility and Crawling
Page accessibility is the “underlying foundation” for rich results generation—if Googlebot cannot crawl or access the page, the markup will not be recognized.
Google’s 2023 “Search Quality Guidelines” state that 60% of rich result preview failures are strongly correlated with page accessibility issues.
Public Accessibility
Pages must be fully open to Googlebot, without login walls, membership restrictions, or regional blocks.
Data shows that 15% of preview failures stem from pages being open only to specific users (Search Console Help Center, 2024).
Scenarios:
- A membership-based food website set the
Recipedetail pages to “view after registration,” preventing Googlebot from crawling required fields likerecipeIngredient. The testing tool consistently showed “no results”; after removing the login restriction, the rich results display rate recovered from 0 to 8% within 3 days. - A cross-border beauty brand hid price information from Southeast Asian users, causing the
offersfield (containing price) in theProductmarkup to be uncrawlable. After the fix, rich result clicks in the Southeast Asian region increased by 25%.
Verification Methods:
- Access the page using Chrome Incognito mode (disabling cookies and login status) to confirm the content is fully visible;
- Use AccessiBe to simulate IPs from different regions to check for geographical targeting restrictions (e.g., “visible only to US users”).
Page Loading Speed
The HTTP Archive 2023 report shows that for pages taking more than 5 seconds to load, 22% of crawlers will terminate the crawl early.
Specific Impacts:
- If the
Productmarkup is located at the bottom of the product page, a loading timeout will cause Googlebot to miss that section entirely; - Asynchronously loaded
Articlemarkup (such as author information generated via AJAX) will likewise be ignored if it takes too long.
Verification:
- Use PageSpeed Insights to test the “LCP (Largest Contentful Paint)” metric for mobile/desktop—it needs to be within 2.5 seconds (Google’s performance requirement);
- Optimization Actions:
- Compress Images: Use WebP format instead of JPG/PNG to reduce file size by 50% (e.g., a 1MB JPG becomes only 400KB after converting to WebP);
- Lazy Load Non-Critical Resources: Set bottom ads, sidebar comments, etc., to “load only when scrolled into the viewport”;
- Enable Gzip Compression: Reduce HTML/CSS file size through server configuration (e.g., Nginx
gzip on;).
Case Study: An electronics e-commerce page had an initial load time of 6.2 seconds and an LCP of 3.8 seconds. After optimization, the load time dropped to 3.5 seconds and LCP < 2 seconds. Googlebot’s crawl success rate rose from 75% to 92%, and Product rich result display rates increased by 19%.
HTTPS Encryption
All URLs related to structured data (images, detail page links, offers.url) must use HTTPS.
Google explicitly requires this, as non-HTTPS resources may be judged as “insecure,” leading to 18% of preview failures (Google Developer Documentation, 2023).
Common Errors:
- Image links using HTTP (e.g.,
http://example.com/headphones.jpg), making theProduct‘simagefield invalid; - The
urlattribute of anArticlepointing to an HTTP version (e.g.,http://blog.example.com/post-123), which Google ignores.
Verification:
- Manually check all URLs in the markups to ensure they start with “https://”;
- Test the website’s SSL certificate with SSL Labs—ensure there are no expirations or configuration errors (such as not enabling TLS 1.2 or higher).
Fix: After a fashion website fixed all HTTP image links, the Product rich results display rate rose from 12% to 30%, and the “invalid markup resource” error prompts in Search Console completely disappeared.
Fixing Common Error Types
Fixing common errors requires addressing four major categories of problems:
- JSON-LD Syntax Errors (38%)
- Missing Required Attributes (29%)
- Non-standard Nesting (22%)
- Dynamic Content Not Captured (11%)
Data shows that after fixing these one by one, the success rate of rich result previews can increase from 45% to 82% (Google 2024 Case Study).
JSON-LD Syntax Errors
JSON-LD syntax errors account for 38% of structured data problems, mainly consisting of mismatched brackets (42%), redundant commas (31%), and data type errors (27%). After fixing these, the markup recognition rate can rise to over 95% (Google 2024 data).
Google’s 2024 “Structured Data Error Report” shows that 38% of rich result preview failures stem from JSON-LD syntax errors.
Mismatched Brackets and Quotes
Mismatched brackets ({}) and quotes ("") are the most common syntax issues, accounting for 42% of all JSON-LD errors (Schema.org 2023 validation data).
These errors usually stem from oversight during coding, such as missing a closing symbol or quotes not being in pairs.
Specific Case: A Course markup for an online education platform once failed because a closing brace was missing, causing the Google testing tool to display “Invalid JSON”:
{
“@context”: “https://schema.org”,
“@type”: “Course”,
“name”: “Digital Marketing Fundamentals”,
“description”: “Learn SEO and SEM techniques” // Missing the final “}”
Fix Methods:
- Use the “symbol matching” function of a code editor (such as the Bracket Pair Colorizer plugin for VS Code); brackets of different colors will visually show where closures are missing;
- Paste JSON code into online tools like JSONLint; the tool will directly mark the error location (e.g., “Expected ‘}’, got ‘EOF'”).
Fix Result: After the platform corrected this, the Course markup was successfully parsed, rich results display rate recovered from 0 to 7%, and the “invalid structured data” error prompt in Search Console disappeared.
Redundant Commas
Redundant commas refer to adding an extra comma after the last attribute of an object ({}) or array ([]), accounting for 31% of syntax errors (Google Developer Documentation, 2024).
Typical Scenario: In an Offer markup for an e-commerce site, there was an extra comma after the price field:
“offers”: {
“@type”: “Offer”,
“price”: “99.99”, // Redundant trailing comma
“priceCurrency”: “USD”
}When the parser encounters this comma, it expects another attribute; since there isn’t one, it judges the entire
offersobject as invalid.
Fix Methods:
- Use tools like JSONLint to automatically format the code; the tool will delete redundant commas;
- Manual Check: There must never be a comma after the last attribute of an object or array (strictly required by JSON specifications).
A clothing e-commerce site once had 30% of its product markups invalidated by redundant commas. After fixing them, the valid markup rate rose to 95%, and Product rich result impressions increased by 22%.
Data Type Errors
JSON-LD requires attribute values to strictly match the data types defined by Schema.org. Such errors account for 27% of syntax issues (Schema.org 2023).
Common errors include:
- Incorrect Date Format: Failure to use the ISO 8601 standard (should be
"2023-10-05T08:00:00+08:00", instead of"2023/10/05"or"October 5, 2023"); - Incorrect Numeric Types: Using numbers instead of strings for attributes like price or rating (e.g.,
"price": 99.99should be changed to"price": "99.99", and"ratingValue": 4.5must be kept in string format).
Case Study: In the Article markup of a food blog, datePublished used "2023-10-05" (correct), but reviewRating.ratingValue was mistakenly written as the number 4.5 instead of the string "4.5".
The Google testing tool prompted “Invalid rating value,” preventing the Featured Snippet from being generated.
After the fix, the rating value was changed to a string, and the Featured Snippet display rate rose from 10% to 28%.
Verification Basis: Schema.org explicitly stipulates that ratingValue must be of the “Text” type (string). Even if the content is a number, it must be enclosed in quotes—a detail many developers easily overlook.
Missing Required Attributes
Missing required attributes account for 29% of structured data errors. The missing rate varies significantly across different markup types (Product missing offers accounts for 38%, Article missing datePublished accounts for 29%). Following the Schema specifications to complete these fields can restore over 80% of rich results (Google 2024 Case Study).
Product
Product is the most commonly used markup for e-commerce. Its required attributes are name, image, and offers (as defined by Schema.org).
Among them, offers is the core—it must contain sub-attributes like price, priceCurrency, and availability (stock). The missing rate is as high as 38% (Google Search Console 2023 data).
After Missing: A clothing e-commerce site had missing offers in its Product markup for a long time, leading to:
- Testing tools showing “No rich results”;
- Search results only displaying the title and description, without price or purchase buttons;
- A click-through rate 40% lower than competitors (who all displayed complete product cards).
Fix: Add the offers field to clarify price and availability:
“offers”: {
“@type”: “Offer”,
“price”: “89.99”,
“priceCurrency”: “USD”,
“availability”: “https://schema.org/InStock”
} Within 3 days, the rich result display rate recovered from 0 to 15%, search CTR increased by 22%, and conversions rose by 18%.
Article
The required attributes for Article (news/blogs) are headline, datePublished, and author.
Among them, datePublished is key for Google to judge content “freshness”—it has a missing rate of 29% (Google 2024 Content Ecosystem Report).
After Missing: A tech blog failed to include datePublished in its Article markup, resulting in:
- Inability to trigger “Featured Snippets”;
- Article rankings falling behind competitors published at the same time (who all displayed publication dates);
- A drop in user trust—content without a date is often perceived as “outdated.”
Fix: Add the publication date in ISO 8601 format:
“datePublished”: “2024-03-15T10:00:00+08:00” Featured Snippet display rate rose from 10% to 35%, article CTR increased by 25%, and the probability of ranking in the top 3 rose by 19%.
LocalBusiness
The required attributes for LocalBusiness are name, address, and telephone. The address field is the core for Google to link map cards—missing rate is 35% (Google My Business 2023 data).
After Missing: A coffee shop’s LocalBusiness markup lacked a complete address (only the city was listed), leading to:
- No map card in search results;
- Users unable to navigate directly to the shop;
- Local traffic 50% lower than nearby competitors.
Fix: Add a detailed address using the PostalAddress type:
“address”: {
“@type”: “PostalAddress”,
“streetAddress”: “123 Main St”,
“addressLocality”: “Seattle”,
“addressRegion”: “WA”,
“postalCode”: “98101”
} Map cards went live within 24 hours, local search traffic increased by 40%, and store visits rose by 28%.
Recipe
The required attributes for Recipe are name, description, and recipeIngredient (ingredient list).
The recipeIngredient is the “core content” of a recipe—missing rate is 41% (AllRecipes 2024 User Survey).
After Missing: A food website’s Recipe markup didn’t list ingredients, resulting in:
- Ingredient lists and steps not being displayed;
- Users unable to determine if the recipe met their needs;
- Saves being 60% lower than competitors.
Fix: Add a structured ingredient list:
“recipeIngredient”: [
“200g Flour”,
“2 Eggs”,
“150ml Milk”,
“50g Sugar”
] The display rate for ingredient lists and steps rose from 8% to 25%, saves increased by 32%, and the probability of being selected as a “Popular Recipe” by Google rose by 21%.
Non-standard Type Nesting
The “nesting of types” in structured data is the core logic of Schema.org—parent types pass semantic associations by containing child types. For instance, a Recipe needs to nest the NutritionInformation child type via the nutrition field for Google to understand that “these calories belong to this dish.”
The Essence of Nesting Errors
The Schema.org type system is a “tree hierarchy”: parent types define core attributes, and child types extend specific details.
For example:
- Recipe (parent) is the “recipe content,” which needs to link NutritionInformation (child) via the
nutritionfield to pass details like “calories and fat content”; - Event (parent) is the “event information,” which needs to link Place (child) via the
locationfield to pass location info like “address and coordinates.”
Consequences of Errors: If you skip the child type and place attributes directly under the parent, Google will determine the “attribute ownership is unclear” and ignore that content.
For instance, if a food site writes "calories": "350 kcal" directly in Recipe instead of nesting it under NutritionInformation, the Google testing tool will prompt “Unrecognized calories field,” causing nutritional facts to disappear from rich results.
4 Common Nesting Errors
(1) Recipe: Nutritional info not nested under NutritionInformation
Error Scenario: A food blog’s Recipe markup puts calories and fat directly under the parent type:
{
“@type”: “Recipe”,
“name”: “Tomato Scrambled Eggs”,
“nutrition”: { // Error: nutrition is a parent attribute that requires a nested child type
“calories”: “350 kcal”,
“fatContent”: “12g”
}
}
Issue: Google cannot recognize that attributes under “nutrition” belong to “nutritional information,” so they aren’t displayed.
Fix: Nest the nutritional information under the NutritionInformation child type:
{
“@type”: “Recipe”,
“name”: “Tomato Scrambled Eggs”,
“nutrition”: {
“@type”: “NutritionInformation”, // Add child type
“calories”: “350 kcal”,
“fatContent”: “12g”
}
}Effect: The display rate of nutritional facts in this blog’s rich results rose from 8% to 25%, and user saves increased by 32% (AllRecipes 2024 data).
(2) Event: Location info not nested under Place and PostalAddress
Error Scenario: A conference website’s Event markup uses a simple address string without hierarchical nesting:
{
“@type”: “Event”,
“name”: “Digital Marketing Summit”,
“location”: “San Francisco Convention Center” // Error: location needs nested Place and PostalAddress
}
Issue: Google cannot parse the structured info of the address, so map cards are not displayed.
Fix: Nest Place and PostalAddress child types:
{
“@type”: “Event”,
“name”: “Digital Marketing Summit”,
“location”: {
“@type”: “Place”,
“name”: “San Francisco Convention Center”,
“address”: {
“@type”: “PostalAddress”,
“streetAddress”: “123 Mission St”,
“addressLocality”: “San Francisco”,
“addressRegion”: “CA”,
“postalCode”: “94105”
},
“geo”: {
“@type”: “GeoCoordinates”,
“latitude”: “37.7890”,
“longitude”: “-122.4030”
}
}
}Effect: After the fix, map cards appeared in search results, event CTR increased by 40%, and registrations rose by 28% (Google Events 2023 data).
(3) Product: Review info not nested under Review or AggregateRating
Error Scenario: An e-commerce platform’s Product markup lists a rating score without nesting the AggregateRating child type:
{
“@type”: “Product”,
“name”: “Wireless Headphones”,
“reviewScore”: “4.5” // Error: reviewScore must be nested under AggregateRating
}Issue: Google cannot recognize “4.5” as the product’s aggregate rating, so star ratings are not displayed.
Fix: Nest the AggregateRating child type:
{
“@type”: “Product”,
“name”: “Wireless Headphones”,
“aggregateRating”: {
“@type”: “AggregateRating”,
“ratingValue”: “4.5”,
“reviewCount”: “120”
}
}Effect: The star rating display rate for this product rose from 15% to 50%, and conversions increased by 19% (Shopify 2024 data).
(4) Article: Author info not nested under Person
Error Scenario: A tech blog’s Article markup lists the author’s name as a string without nesting the Person child type:
{
“@type”: “Article”,
“name”: “2024 SEO Trends”,
“author”: “John Doe” // Error: author needs nested Person child type
}Issue: Google cannot identify the author’s identity details, so the “Author” label is not displayed.
Fix: Nest the Person child type:
{
“@type”: “Article”,
“name”: “2024 SEO Trends”,
“author”: {
“@type”: “Person”,
“name”: “John Doe”,
“url”: “https://example.com/author/johndoe”
}
}Effect: The “Author” label display rate for the article rose from 20% to 60%, and user trust increased by 25% (Google Authorship 2023 data).
Dynamic Content Not Captured
Dynamic content refers to content generated in real-time via JavaScript (JS), AJAX, or Single Page Application (SPA) frameworks—such as pages built with React/Vue, infinite scroll article lists, or recipe steps that load after clicking a button.
The markup for such content (e.g., Product price, Article reviews) does not appear in the initial HTML; instead, it is dynamically injected by client-side JS.
However, Googlebot’s mechanism is to “crawl the initial HTML first, then execute JS.” If JS execution is too slow or content relies solely on client-side rendering, rich results fail to generate.
The Google Engineering Blog (2024) points out that 40% of dynamic pages fail to have their markups read by crawlers because they lack pre-rendering.
Uncrawlable Dynamic Content
Googlebot’s crawl process follows two steps:
- Download Initial HTML: Retrieves the basic structure of the page (excluding JS-generated content);
- Execute JS: Simulates a browser to run JS and fetch dynamic content (requires waiting for JS to complete).
But the crawler’s “patience” is limited:
- If JS execution exceeds 3 seconds, Googlebot may terminate early, missing dynamic markups (Lighthouse 2023 data);
- If content depends on “user interaction” (like clicking “Load More”), the crawler will skip it.
Case Study: A news site built an SPA using React, where the Article comment section was loaded dynamically via JS.
The testing tool showed “No rich results”—even though the comment markup actually existed, JS hadn’t finished executing when Googlebot crawled, so comments weren’t in the initial HTML.
3 High-Frequency Issues
(1) SPA (Single Page Application): Initial HTML is empty, markups not included
An SPA is “one page, dynamically replaced content.” The initial HTML is usually an empty <div id="root"></div>, with all content injected by JS.
Without pre-rendering, the initial HTML Googlebot crawls contains no structured data, and markups cannot be identified. Data: A travel site’s Tour markup was generated by React with an empty initial HTML.
Search Console showed “No eligible markup found,” and rich result display rate was 0. After switching to Server-Side Rendering (SSR), the initial HTML contained the full Tour markup, and the display rate rose from 0 to 28%.
(2) AJAX Loading: Content fetched asynchronously, crawler didn’t wait
AJAX is used to load content dynamically (like product lists or reviews in infinite scroll), but crawlers won’t wait indefinitely—if content loading exceeds the crawler’s “timeout threshold” (approx. 3 seconds), markups will be missed.
Case Study: An e-commerce platform’s “You May Also Like” product list was loaded via AJAX, with Product markups generated by JS.
The testing tool showed “Some markups ignored”—the AJAX request hadn’t finished during crawling, so product info wasn’t included.
After using pre-rendering tools (Prerender.io) to generate HTML with the full product list, markup recognition rose from 60% to 95%.
(3) Lazy Loading: Content triggered later, exceeding crawler wait time
Lazy Loading is used to optimize speed by loading elements like HowTo steps or Recipe ingredients only when scrolled into view. But if the delay is too long (e.g., over 2 seconds), the crawler might miss it.
Data: A home decor site’s HowTo markup (e.g., “how to install a bookshelf”) had a 2-second lazy load delay.
Google testing tools prompted “Unrecognized step fields”—the crawler didn’t wait for loading to finish.
After shortening the delay to under 1 second, the step display rate rose from 18% to 43%.
Three Fix Methods
(1) Pre-rendering: Server generates full HTML for crawlers
Pre-rendering involves running JS on the server to generate HTML containing all dynamic content before sending it to the crawler.
Tools like Prerender.io or Nginx pre-rendering modules can automatically identify crawler requests and return pre-rendered HTML.
Effect: After an e-commerce SPA used Prerender.io, the crawl success rate for Product markups rose from 75% to 92%, and rich result display rate rose from 5% to 28%.
(2) Server-Side Rendering (SSR): Frameworks render JS content directly
SSR uses frameworks like Next.js (React) or Nuxt.js (Vue) to render JS components into HTML strings on the server side before sending them to the client.
This ensures the initial HTML contains full markups, so crawlers don’t need to wait for JS. Case Study: A news site was refactored with Next.js, and the Article comment section was generated via SSR.
Googlebot retrieved the Comment markup directly during crawling, Featured Snippet display rate rose from 10% to 50%, and comment interaction increased by 35%.
(3) Optimize JS Execution Time: Ensure markups load within 3 seconds
If pre-rendering or SSR is not feasible, you must optimize JS execution to ensure dynamic markups load within 3 seconds.
Use Lighthouse or the Performance tab in Chrome DevTools to check loading times:
- Compress JS Files: Use Webpack or Rollup to reduce file size;
- Lazy Load Non-Critical JS: Set scripts that don’t affect markups (like ads or analytics) to
asyncordefer; - Cache Resources: Use a CDN to cache JS files and reduce loading time.
Data: A media site optimized JS execution from 4.2 seconds to 2.5 seconds, raising Googlebot’s crawl success rate from 68% to 90% and the Article rich result display rate by 22%.
Final thought: One correct line of JSON, a standardized nesting structure, or timely pre-rendering can be the difference between having rich results or not.



