Technical SEO for SPAs: A Framework for Dynamic Schema Deployment on React & Vue.js Websites
You just delivered a stunning new website for your client. It’s built on React, it’s lightning-fast, and the user experience is flawless. The client is thrilled. A few weeks later, a question comes in: “Why aren’t our product ratings showing up in Google search results?”
You check the site. The schema markup is there. You can see it in the browser’s developer tools. So, what’s the problem?
You’ve just hit one of the most common—and frustrating—technical SEO bottlenecks for modern websites: the disconnect between client-side rendered JavaScript and search engine crawlers. While your user’s browser sees a perfectly structured page, Googlebot might only be seeing a blank slate.
This challenge isn’t niche; it’s the new normal. But for agencies that can master it, this offers a powerful competitive advantage.
The Core Challenge: Why SPAs and Traditional Schema Don’t Always Mix
Single Page Applications (SPAs), typically built with frameworks like React or Vue.js, create amazing user experiences by loading content dynamically without full page reloads. They run primarily on the user’s device (the ‘client-side’), pulling in data and updating the view as needed.
Schema markup (or structured data) is the code vocabulary that helps search engines understand the context of your content. It’s what turns a simple product page listing into a rich result with ratings, price, and availability right in the SERP.
The conflict arises from how this data is delivered. If your SPA injects schema markup using JavaScript after the initial page load, search engine crawlers, which are on a tight ‘crawl budget,’ may not wait around long enough to see it. Google’s John Mueller has pointed out that while Googlebot has gotten better at rendering JavaScript, the process isn’t flawless. A 2023 study by Onely confirmed this, finding that Googlebot failed to render key content on 15% of client-side rendered websites.
When a crawler misses your schema, your client misses out on valuable SERP real estate and the higher click-through rates that come with it.
Static vs. Dynamic Schema: Choosing the Right Approach
Not all schema is created equal, especially in an SPA context. Your implementation strategy depends entirely on the nature of the page content.
Static Schema: This is hardcoded JSON-LD, typically placed in the
of the HTML document. It’s perfect for pages where the content rarely changes, like your “About Us,” “Contact,” or homepage Organization schema. It’s simple, reliable, and easy for crawlers to find.Dynamic Schema: This is generated on the fly, based on the specific content of a page. Think of a product page with changing prices and reviews, a blog post with a unique author and publish date, or an event page with a specific time and location. For any content-rich, database-driven website, dynamic schema is essential.
The stakes are high. According to a survey by Ahrefs, only 31.3% of websites use schema markup, yet those that do often see significant CTR improvements. Failing to implement dynamic schema correctly means leaving that opportunity on the table.

A Replicable Framework for Dynamic Schema Deployment
Getting dynamic schema right on an SPA isn’t about finding a magic plugin; it’s about following a structured process. Here’s a framework your agency can adapt for any React or Vue.js project.
Step 1: Audit Your Rendering Strategy (The Foundation)
Before you write a single line of schema, you need to know how the website is delivered to browsers and bots. Is it pure Client-Side Rendering (CSR), Server-Side Rendering (SSR), or a hybrid approach?
The rendering method is the single most important factor for SEO success on an SPA. While CSR can be made to work, SSR (using frameworks like Next.js for React or Nuxt.js for Vue) is the gold standard. SSR delivers a fully-formed HTML page to the crawler, with all the content and schema already in place. This step, a critical part of any technical SEO audit for agencies, removes virtually all guesswork for search engines.
Step 2: Use a State Management Solution to Centralize Data
For dynamic schema to be accurate, it needs to pull from the same data source as the content the user sees. Using a state management library (like Redux for React or Vuex for Vue) is the best way to guarantee this consistency.
By centralizing your page data (product info, article details, etc.) in a single ‘store,’ you create a single source of truth. Both your user-facing components and your schema-generating component can pull data from this same place, eliminating the risk of mismatches.
Step 3: Create a Dynamic JSON-LD Component
Instead of scattering schema scripts across your application, create a single, reusable component responsible for generating the JSON-LD. This component should:
- Accept data (props) from the parent page component (e.g., product details).
- Format that data into the correct JSON-LD structure.
- Inject the formatted data into a
Try Our SEO Tool - Free For 3 Months
Try now with no cost, no contract and an automatic end after 3 months. Watch real traffic, leads and revenue roll in before you spend a single dollar.
