Can paywalled hasPart sections be nested in Google's markup?

The Citead team, updated

In short. Google's paywall markup forbids nested content sections and uses class selectors for each WebPageElement.

Definition: No. Google's paywalled content documentation says not to nest paywalled content sections and limits hasPart.cssSelector to class selectors such as .paywall. Separate paywalled sections are represented as separate WebPageElement objects in an array.

Key facts

  • Google's paywalled content guide, last updated 8 September 2026, says the markup applies to content intended to be crawled and indexed, and it says, “Don't nest content sections.”
  • The same guide says, “Only use .class selectors for the cssSelector property.”
  • For multiple paywalled sections, Google says to add the class names as an array and shows one WebPageElement for .section1 and another for .section2.
  • Google documents hasPart.@type as WebPageElement and hasPart.isAccessibleForFree as false for a restricted section.
  • Schema.org defines WebPageElement as “A web page element, like a table or an image.” Its cssSelector property describes a CSS selector, and multiple matches can form one conceptual web page element.

What does Google prohibit?

Google's paywalled content guide gives a direct restriction: “Don't nest content sections.” It does not give a nesting depth, exception, or alternate representation for a paywalled section inside another paywalled section. The restriction concerns the content sections identified by the paywall markup, so an implementation should keep each marked section at one level of the hasPart structure.

The guide describes the page-level CreativeWork or a more specific type such as NewsArticle, then places the restricted section in hasPart. It sets isAccessibleForFree to false on the article and on the WebPageElement that identifies the restricted section. Google's separate structured data guidance says that structured data must be a true representation of the page content.

Which CSS selectors are allowed?

Google documents only a class selector for cssSelector. The class must be present on the HTML element that wraps the paywalled section, and the JSON-LD value includes the dot before the class name:

{
  "@type": "WebPageElement",
  "isAccessibleForFree": false,
  "cssSelector": ".paywall"
}

The Google guide describes hasPart.cssSelector as a selector that references the class name set in the HTML. Schema.org's WebPageElement definition describes cssSelector more generally and says that multiple matches within a page can constitute one conceptual web page element. Google's paywall-specific rule is narrower: the documented form is .class.

How should several sections be marked up?

Google says to add a class name around each paywalled section. For more than one section, its example uses an array of hasPart objects:

"hasPart": [
  {
    "@type": "WebPageElement",
    "isAccessibleForFree": false,
    "cssSelector": ".section1"
  },
  {
    "@type": "WebPageElement",
    "isAccessibleForFree": false,
    "cssSelector": ".section2"
  }
]

The corresponding HTML uses separate class names on separate sections. Each selector therefore points to an element in the page, while the array keeps the paywalled sections as separate WebPageElement entries. The page also accepts JSON-LD and microdata as formats for specifying paywalled content.

What should be checked on the page?

Google's general structured data guidelines say not to mark up content that is invisible to readers and require structured data to represent the page content. The paywalled content guide says to make the class names in cssSelector match the HTML, to validate the implementation with the Rich Results Test, and to ensure that Googlebot can access the page when the paywalled sections are intended for crawling and indexing.

FAQ

Can I put one paywalled section inside another?

No. Google's paywalled content guide says, “Don't nest content sections.” It does not document a depth limit or an exception.

Can I use an ID selector or a descendant selector?

Google's paywalled content guide says to use only .class selectors for cssSelector. Its example uses .paywall.

How do I represent two separate paywalled sections?

Use an array of hasPart objects, with one WebPageElement and one class selector for each section. Google's example uses .section1 and .section2.

Sources

  1. Google Search Central, "Subscription and Paywalled Content Markup", 8 September 2026
  2. Schema.org, "WebPageElement - Schema.org Type", undated
  3. Google Search Central, "General Structured Data Guidelines", 10 July 2026

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark