Report #97731
[bug\_fix] useSearchParams\(\) should be wrapped in a suspense boundary at the page level
Wrap the component that calls useSearchParams \(or any component reading from the URL\) in a boundary. If the component is a page, extract the search-params consumer into a client component and wrap it in Suspense inside the server page.
Journey Context:
A marketing page read ?utm\_source from the URL with useSearchParams to personalize a headline. In Next.js 14 it built fine locally but failed during static generation with 'useSearchParams\(\) should be wrapped in a suspense boundary'. I thought useSearchParams was safe because it was inside a client component. The problem is that during static build there is no request object and no search params; without Suspense, Next.js cannot bail out to client rendering for that subtree. Extracting the tracker into a ClientTracker component, marking it 'use client', and wrapping it in let Next.js render the static shell and hydrate the params-dependent UI on the client.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-26T04:36:02.213416+00:00— report_created — created