Structured Data for Subscription & Paywalled Content (CreativeWork): Documents Guide

If your site offers content behind a paywall or requires registration, you can use schema.org JSON-LD to clearly indicate which parts are not accessible for free. Properly marking paywalled sections helps Google distinguish legitimate subscription models from cloaking (which violates spam policies) and ensures your paywalled content is still crawled and indexed where intended.
Note: Only implement this if you want your paywalled content indexed. Otherwise, skip this guide and block indexing via
robots.txt
ornoindex
.
Example: NewsArticle with Paywalled Section
htmlCopyEdit<html>
<head>
<title>Article headline</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "Article headline",
"image": "https://kumarharshit.in/thumbnail1.jpg",
"datePublished": "2025-02-05T08:00:00+08:00",
"dateModified": "2025-02-05T09:20:00+08:00",
"author": {
"@type": "Person",
"name": "John Doe",
"url": "https://kumarharshit.in/profile/johndoe123"
},
"description": "A most wonderful article",
"isAccessibleForFree": false,
"hasPart": {
"@type": "WebPageElement",
"isAccessibleForFree": false,
"cssSelector": ".paywall"
}
}
</script>
</head>
<body>
<div class="non-paywall">
Non-Paywalled Content
</div>
<div class="paywall">
Paywalled Content
</div>
</body>
</html>
Guidelines
You must follow Google’s general structured data and technical guidelines plus these paywall-specific rules:
- Format: JSON-LD or Microdata are both accepted.
- Selectors: Use only class selectors (e.g.,
.paywall
) incssSelector
. - No Nesting: Don’t nest one paywalled section inside another.
- Mark Only Paywalled Parts: Wrap each subscription-only section in its own element with a unique class.
Violation Warning: Misusing these properties (e.g., to hide cloaked content) may render your pages ineligible for search results. Review Spammy Structured Markup for details.
Step-by-Step Implementation
- Wrap Paywalled Sections htmlCopyEdit
<body> <p>Visible to all users.</p> <div class="paywall">Subscribers only content.</div> </body>
- Add or Extend Your CreativeWork Schema
Within your existingCreativeWork
(e.g.,NewsArticle
) JSON-LD, include: jsonCopyEdit"isAccessibleForFree": false, "hasPart": { "@type": "WebPageElement", "isAccessibleForFree": false, "cssSelector": ".paywall" }
- Validate
- Run your page through the Rich Results Test.
- Fix any critical errors before deployment.
Multiple Paywalled Sections
If you have more than one paywalled area, supply an array under hasPart
:
jsonCopyEdit"hasPart": [
{
"@type": "WebPageElement",
"isAccessibleForFree": false,
"cssSelector": ".section1"
},
{
"@type": "WebPageElement",
"isAccessibleForFree": false,
"cssSelector": ".section2"
}
]
Supported CreativeWork Types
This paywall markup works with any CreativeWork or its subtypes:
- Article
- NewsArticle
- Blog
- Comment
- Course
- HowTo
- Message
- Review
- WebPage
You can even combine types:
jsonCopyEdit"@type": ["Article", "LearningResource"]
Required vs. Recommended Properties
Property | Type | Required? | Notes |
---|---|---|---|
isAccessibleForFree | Boolean | ✔️ | Must be false for paywalled content. |
hasPart.cssSelector | CssSelectorType | ✔️ | References the HTML class wrapping paywalled section(s). |
hasPart.@type | Text (WebPageElement ) | ✔️ | Identifies the paywalled segment. |
hasPart.isAccessibleForFree | Boolean | ✔️ | Must be false . |
Tip: Adding more
hasPart
entries lets you precisely define each paywalled block on complex pages.
AMP Considerations
- For AMP pages with subscriptions, implement
amp-subscriptions
. - Ensure your authorization endpoint allows Google’s bots the same access as users—mismatches can trigger content mismatch errors in Search Console.
Generative AI in Search
When Google’s AI Overviews or AI Mode generate previews, they follow your page’s preview controls (e.g., meta tags or data-nosnippet
).
Ensuring Crawl & Index Access
- Use the URL Inspection Tool to verify Googlebot can fetch both free and paywalled sections.
- If you want parts excluded from snippets, apply
data-nosnippet
ormax-snippet
meta tags.
Troubleshooting
- CMS Users: Forward any Search Console errors to your developer or plugin support.
- General Errors: Check the Unparsable Structured Data report.
- Manual Actions: Use the Manual Actions report in Search Console if flagged.
- Re-indexing Delays: Allow a few days after deployment for Google to re-crawl.
- Search & Indexing FAQ: For more crawling/indexing guidelines, see Google’s Crawling and Indexing FAQ.
For community support, post questions in the Google Search Central forum.
About the Author
Harshit Kumar is a seasoned SEO Specialist & consultant specializing in structured data and content indexing strategies. With over seven years of experience, he helps publishers and developers properly implement schema markup—boosting both visibility and compliance. Connect with Harshit at KumarHarshit.in.
Leave a Reply