PPR (Partial Pre-Rendering) is a Next.js rendering strategy that combines static pre-rendered HTML shells with dynamic streamed islands, delivering fast first paint plus per-user freshness.
Introduced in Next.js as experimental.ppr = "incremental" in Next.js 14 and progressively stabilized through Next.js 15 and 16, PPR works by pre-rendering the parts of a page that are static (title, canonical, hreflang, JSON-LD, hero) and identifying dynamic boundaries (cart badge, recently viewed, personalized recommendations) wrapped in <Suspense>. The static shell streams from the edge cache instantly; the dynamic islands stream after, often within tens of milliseconds.
For ecommerce, PPR is particularly valuable because SEO-critical content (title, canonical, structured data) is in the static shell and arrives before any database call. The dynamic islands serve the per-user experience without blocking the SEO surface.
PPR pairs naturally with Cache Components (cacheComponents: true) — components opt into caching at the component level, and PPR composes the static and dynamic parts into a coherent stream.