I'm exploring a pattern for Plone 6 / Volto sites where content is publicly discoverable (by Google and by logged-out visitors) but only the metadata surfaces. The full content is gated behind authentication.
This need is common in the nonprofit and education space: you want Google to index your resources so people can find them, but the actual content is for members or registered users only. Right now the only real options are to keep content private, which means Google sees nothing useful, or to publish it fully, which means anyone can read it. Plone doesn't currently offer anything between these two extremes.
What I have in mind
The core idea is a custom workflow state — something like members_only — that grants anonymous users View permission (so Plone returns a 200 OK, not a redirect to the login page), paired with a lightweight backend endpoint that returns only a safe subset of fields for unauthenticated requests — title, description, preview image, and optionally effective date and author. The full content payload never leaves the server for anonymous users.
On the Volto side, SSR checks for an auth token and fetches either the teaser endpoint or the full content endpoint accordingly. The teaser view renders the public metadata plus a clear login prompt. The <head> is fully populated with Open Graph and schema.org markup (isAccessibleForFree: false) so Google understands the content is gated and indexes the teaser honestly.
A useful side effect is that site search also becomes more meaningful for logged-out users — Plone's catalog already stores title, description, and preview image as metadata columns, so search results show useful listings for gated content. The click-through is where users are invited to log in.
We're also thinking about a control panel where site admins can configure which fields surface in the teaser — some sites may only want the title, others may want the full set. Possibly configurable per content type.
What I'm asking
Before building this from scratch as an addon, we wanted to check: has anyone already built something similar, or is there existing work in the Plone ecosystem we should be building on? Any thoughts on the approach (particularly around the workflow state and the backend endpoint) would also be welcome.