All articles
PerformanceMay 12, 2026·4 min read

Your marketing site doesn't need to be a SPA. It needs to load.

We see the same pattern weekly: a five-page marketing site rebuilt as a client-rendered React app, shipping 400kb of JavaScript to display a headline. There's an easier way.

K
Brainofire Team
Web & Mobile Architect
Your marketing site doesn't need to be a SPA. It needs to load.

How we got here

Somewhere around 2018, 'we use React' became the default answer to 'how is your website built.' Marketing pages, blog posts, pricing tables — all of it got pulled into the same SPA the product team was shipping. It felt consistent. It was also a quiet tax on every visitor who showed up before bothering to sign up.

The product app needs to be fast *after* the first second. The marketing site needs to be fast *in* the first second. They are not the same problem, and the same tool rarely solves both well.

What a marketing site actually needs

  • HTML that renders before any JS executes
  • Images sized to the device, not the source file
  • A bundle small enough that interactivity is instant
  • A CDN cache that survives a Hacker News spike
  • A path for non-technical edits without a redeploy

Notice what isn't on that list: client-side routing, complex state, hydration of every paragraph. The site is mostly text, mostly read once, and mostly indexed by search engines that still reward the page that paints first.

What we actually ship

Static-first by default. Astro for content-heavy sites, Next.js in static or RSC mode when the team already lives in React. The output is HTML with islands of interactivity where they earn their keep — a search box, a pricing toggle, an animated hero — and plain markup everywhere else.

Images through an optimizer. No more 4MB hero shots. Every `<img>` flows through a service that emits the right size, the right format, and a `srcset` the browser can pick from. The single biggest perceived-speed win on most sites we audit.

Fonts subset and self-hosted. The Google Fonts script is convenient and slow. Three minutes to download a subsetted woff2 and inline a `font-face` rule is worth half a second of LCP on every page view forever.

The numbers from a typical audit

A client came to us last month with a Next.js marketing site shipping 380kb of JavaScript before the headline rendered. We moved the public pages to a static build, cut three dependencies that were only needed inside the product, and routed images through Vercel's optimizer. The JS dropped to 18kb. LCP went from 3.4s to 0.9s on a mid-range Android. Nothing about the design changed.

Their organic signups went up 14% the next month. We won't pretend the site was the only variable, but the conversion funnel doesn't lie — pages that paint faster get further down it.

When a SPA actually is the right call

If your homepage is the product — a live editor demo, a real-time map, an interactive configurator that needs heavy client state — fine, ship the app. We've built those. But that's a different product than a five-page site with a pricing table.

The lesson

Pick the tool that matches the page, not the team's habit. A marketing site is a document with a few buttons on it. Treat it like one and you'll spend the saved budget on the parts of the product that actually need React.

Have a project in mind?

Let's turn it into something real.

Send us a brief. We'll come back with a fixed quote and an 8-week plan within 48 hours.

Get a Quote

Keep reading

More from the studio