Good breakdown. One precision point on Fix 1: Google's rendering service does execute JS and will pick up late-injected title and meta from react-helmet-async, it is just delayed and subject to crawl budget. The crawlers that genuinely never run JS are Bing, the social unfurlers (Slack, LinkedIn, Facebook, X) and most AI search bots, so that is the real reason to get tags into the initial HTML, not "Google can't see it." On the prerender snapshot approach, watch staleness, a build-time snapshot bakes the price into the JSON-LD as of that build, and on a 400-page catalog with moving prices Rich Results starts flagging price mismatch against the live page unless you rebuild on data change or move to ISR. Also worth adding lastmod to the sitemap, loc alone gives Google almost nothing to prioritise recrawls with.
