How to Do SEO for Paywalled Content

On this page

Paywalled content fails at SEO when Googlebot is treated exactly like a paying user and shown only the teaser. Google then has a thin snippet to evaluate against competitors’ full free articles, and your page loses. The sanctioned fix is flexible sampling: show Googlebot the full article while serving users the paywall, and declare that gap with structured data (isAccessibleForFree:false plus a hasPart/cssSelector block) so Google understands the divergence is intentional and not cloaking. The catch is that the markup only legitimizes showing the bot more; it does nothing for the user-engagement signals that hard paywalls degrade. Both Googlebot-visible content and real user engagement are ranking inputs, so you have to address both.

The default failure mode

If your server detects no subscription and returns the teaser to everyone, including Googlebot, you have handed Google a few paragraphs to index. A free competitor covering the same topic gives Google a complete article. On relevance and depth, the complete article wins almost every time. Worse, if you instead try to show Googlebot the full content while hiding it from users without declaring it, you risk being read as cloaking, serving search engines something different from users, which is a violation. Flexible sampling exists precisely to resolve that tension legitimately.

Flexible sampling and the cloaking exception

Flexible sampling is Google’s explicit, sanctioned exception to the cloaking rule for paywalled publishers. You may show Googlebot the full article and show users a preview or paywall, provided you declare the paywalled structure with structured data. The declaration is what converts an otherwise-suspicious bot-versus-user divergence into a recognized, allowed pattern.

The structured-data pattern has two parts. At the top level of your NewsArticle or CreativeWork/Article markup, set isAccessibleForFree to false. Then add a hasPart entry that also sets isAccessibleForFree to false and uses cssSelector to point at the DOM element wrapping the gated content (a class such as .paywall, for example). That tells Google: the page is not fully free, here is exactly which section is gated, and here is the selector that identifies it.

Without that markup, the content divergence between bot and user has no declared explanation, and Google may treat it as cloaking. With it, the divergence is sanctioned. This is the single most important implementation detail to get right, and the most common place practitioners get it wrong.

Metered versus lead-in, and why hard paywalls lose

Two sampling strategies are common:

  • Metered access gives each user a quota of free articles before the wall engages. Returning visitors hit the wall; first-time and within-quota visitors read the full piece.
  • Lead-in shows a partial free portion of every article and gates the remainder.

A hard paywall, where the user gets essentially nothing before being asked to subscribe, performs worst. The reason is engagement, not indexing. A visitor who lands from search and immediately hits a wall bounces fast, and that pattern of immediate dissatisfaction is a negative signal. The structured data protects you against being penalized for cloaking; it does not protect you against users bouncing off a wall. So a correctly marked-up hard paywall can still underperform, because the markup and the engagement are two separate problems and the markup only solves one.

A word on the familiar sampling numbers. Industry guidance commonly suggests metering somewhere in the range of around 10 free articles per user per month, with the observation that user satisfaction degrades once the paywall triggers on more than roughly 10 percent of visits. Those are flexible-sampling conventions and rules of thumb, not figures Google mandates. Treat the lead-in proportion the same way: any “show this percentage free” number you see circulating is a convention to tune against your own data, not a Google requirement. Implement the markup correctly and then tune the sampling against your retention and engagement metrics.

The lead-in has to deliver real value

If you use a lead-in, the free portion must contain a genuine, concrete insight and end at a natural breakpoint, not mid-sentence and not as filler before “subscribe to continue.” A lead-in that delivers an actual takeaway earns the reader’s trust enough to consider subscribing and reads as satisfying rather than baiting. A lead-in that is throat-clearing produces the same fast bounce as a hard wall. The free portion is doing double duty: it has to be substantial enough to read as helpful and pointed enough to make the rest worth paying for.

Discover, AMP, and site-wide quality

Subscription content can still appear across Search surfaces, including Top Stories and Discover, so a correctly implemented paywall does not exclude you from those placements. Do not reach for AMP to get there. AMP is no longer required for Top Stories (that requirement was removed when the page-experience update rolled out), and it has historically created friction with paywalls, since a logged-in user arriving at an AMP page from search could still be confronted with a login wall. AMP is not a ranking lever; do not adopt it for that reason.

One site-wide consideration for freemium models: the free content you do publish openly shapes how Google perceives overall site quality. If your free articles are thin or low-effort while the good material sits behind the wall, the visible portion drags down site-level quality perception. Keep the openly accessible content genuinely valuable.

Match the markup type to the content type

The structured-data type you choose has to describe what the page actually is. Use NewsArticle for news reporting; use Article or the broader CreativeWork for non-news pieces such as analysis, research, or evergreen guides. The isAccessibleForFree and hasPart pattern works the same way across these types, but mislabeling a how-to guide as a news article to chase a particular surface undermines trust in your markup. Describe the page honestly. The one detail that breaks implementations more than the type choice is the cssSelector: it must point at the element that genuinely wraps the gated content in the rendered DOM. If a template change renames that wrapper class, the selector silently stops matching, so re-verify it after any front-end change to the article template.

Common implementation failures to rule out

Three recurring mistakes account for most paywall-SEO problems beyond the teaser-to-everyone default. The first is serving the full content to Googlebot but forgetting the structured data entirely, which leaves the bot-versus-user divergence undeclared and exposed to a cloaking interpretation. The second is declaring isAccessibleForFree:false at the article level but omitting the hasPart block, so Google knows the page is gated but not which section. The third is a stale cssSelector pointing at an element no longer present, which is functionally the same as having no hasPart at all. Validate the markup in the Rich Results Test and confirm with URL Inspection that the content Google sees is the full article, and you rule out all three at once.

Implementation and testing

Build and verify in this order:

  1. Add the isAccessibleForFree:false markup at the article level and the matching hasPart/cssSelector block identifying the gated section, using NewsArticle for news or CreativeWork/Article otherwise.
  2. Validate the structured data in the Rich Results Test.
  3. Use URL Inspection in Search Console to confirm Googlebot is seeing the full rendered content, not the teaser.
  4. Compare the bot view against the user view to confirm the gate behaves as declared: full content to Googlebot, paywall to users, with the divergence matching your markup.
  5. Choose metered or a substantial lead-in over a hard paywall, and confirm the free portion delivers a real insight.

Then set expectations on recovery. After fixing the markup, Google has to recrawl and re-evaluate the now-visible full content. Improvement follows the normal recrawl-and-reassessment cadence, not an instant flip.

Frequently Asked Questions

Is showing Googlebot the full article cloaking?
Not when you declare it with flexible-sampling structured data. Flexible sampling is Google’s sanctioned exception: full content to Googlebot, paywall to users, declared via isAccessibleForFree:false and a hasPart/cssSelector block. Undeclared, the same divergence does risk being treated as cloaking.

How many free articles should I allow per month?
Common industry guidance points to roughly 10 per user per month, with satisfaction degrading once the wall triggers on more than about 10 percent of visits. These are flexible-sampling conventions, not Google rules. Tune them against your own engagement and retention data.

Do I need AMP for paywalled content to appear in Top Stories?
No. AMP is no longer required for Top Stories, and it has historically complicated paywalls. Subscription content can appear in Top Stories and Discover without AMP when implemented correctly.

Sources

Google Search Central, Subscription and paywalled content (structured data): https://developers.google.com/search/docs/appearance/structured-data/paywalled-content
Google Search Central, Cloaking (spam policies): https://developers.google.com/search/docs/essentials/spam-policies
Google Search Central, Rich Results Test: https://search.google.com/test/rich-results