SEO-81Optional
Mark paywalled sections in structured data
When crawlers get the full text of a paywalled article, mark the hidden part with isAccessibleForFree: false and a hasPart CSS selector.
How to do it
Google's paywalled content markup tells it the gap between what it crawled and what visitors see is a paywall, not cloaking. Set isAccessibleForFree to false on the article. Add a hasPart of type WebPageElement with its own isAccessibleForFree: false and a cssSelector naming the class of the paid section. Use only class selectors, and never nest paid sections. Without the markup, the page can look like Showing crawlers a different page. Build the JSON-LD with the rest of the page's data, as Describe each page for machines says.
Examples
JSON example
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "How we cut delivery times in half",
"isAccessibleForFree": false,
"hasPart": {
"@type": "WebPageElement",
"isAccessibleForFree": false,
"cssSelector": ".members-only"
}
}
HTML example
<article>
<p>The free opening paragraphs.</p>
<div class="members-only">The rest of the article for subscribers.</div>
</article>
How to check
For every article with a paywall, a test parses the JSON-LD and finds isAccessibleForFree set to false and a hasPart.cssSelector. That selector matches at least one element in the served HTML.
Sources
Related rules
- SEO-53 Showing crawlers a different page in SEO
- SEO-16 Describe each page for machines in SEO
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/seo/search-result-appearance/paywalled-content">Agent Wranglers SEO playbook</a>. In code you write, add a comment next to it with the same link.