Marketing Sites Are Not Product Apps
Most visitors to your marketing surface are not asking for an application shell. They want a fast answer, a credible proof point, and a clear next step.
The Intent Behind Marketing Traffic
Landing pages, blogs, changelog pages, and lightweight documentation hubs are usually visited by people trying to answer a few simple questions fast:
- What is this?
- Why should I trust it?
- What should I do next?
Inside the product, permissions and live data drive most decisions. On the homepage, people are mostly scanning for a reason to trust you and a sensible next step. They are not there for a miniature application runtime.
Why Application Thinking Hurts Marketing
Marketing surfaces are mostly read-heavy. They change on a human cadence—campaigns, launches, editorial calendars—not on every keystroke inside a logged-in workspace.
Habit stacks up cost. Teams reach for heavy client frameworks by default, then pay in:
- Bundle size
- Hydration work
- Hosting complexity
- Unstable performance under spikes
Read-Heavy vs Interaction-Heavy Surfaces
A useful rule of thumb is to separate the public experience into two kinds of surfaces:
- Read-heavy surfaces: homepage, feature pages, blog, changelog, docs marketing, comparison pages
- Interaction-heavy surfaces: dashboards, settings, onboarding flows, internal tools, collaborative product experiences
Keep the first group simple and fast. Reserve dynamic rendering, heavier state, and authenticated data paths for the second.
Static site generation (SSG) is the deliberate choice to pre-render HTML at build time and serve it from a CDN so the default path is fast, cacheable, and boring in the best sense of the word.
This article is a composite use case. It blends patterns we have seen across startups and small teams: real constraints, common architecture decisions, and outcomes expressed as directional ranges, not audited benchmarks for a single company.
The Scenario
Picture a B2B SaaS company with a sharp product and a marketing site that cannot keep up.
Team Composition and Constraints
The cast is small:
- A marketing lead who needs to ship copy and experiments without waiting on a release train
- Two engineers who are already on the hook for the core product
- Traffic that spikes around launches, conference mentions, and partner emails
This is not a giant platform team with a dedicated performance budget and a staffed content engineering group. It is a lean team trying to keep momentum without drowning in maintenance work.
Traffic Behavior Patterns
Marketing traffic is not smooth. It comes in waves:
- New launch announcements
- Newsletter campaigns
- Sales follow-up links
- Social sharing
- Paid acquisition bursts
- Partner referrals
Fragile dynamic stacks often look fine at steady state, then wobble right when attention spikes.
Existing Architecture Problems
The pain is familiar.
The public site still runs on the same patterns the team used for an early MVP: server-rendered pages on modest instances, a database behind the marketing homepage, and enough dynamic glue that “just caching harder” never quite sticks.
Loads lag on mobile. Time to first byte swings when the database warms up or a background job competes for CPU. Paid campaigns work, but bounce rates on the homepage stay stubbornly high.
Real Business Impact
Nobody argues about whether the product should be dynamic. The debate is whether the marketing layer should inherit the product’s runtime complexity by default.
The consequences are not abstract:
- Slower first impressions on mobile
- Lower conversion efficiency from paid traffic
- More engineering interruptions tied to non-product pages
- Harder publishing workflows for the people actually writing the content
The marketing site is not your app. It is the front door. If the door sticks, fewer people walk through.
Goals the Team Actually Had
They wrote the goals down before touching the stack. That sounds obvious, but it is what separates a migration from a rewrite that chases trends.
Business Goals
Improve Perceived Speed on Mobile
The team wanted paid and organic visitors to hit a page that loaded quickly on real devices, not just during a desktop audit.
They wanted less drop-off at the hero and a calmer first few seconds on a real phone.
Give Marketing a Safer Publishing Path
Marketing needed a way to ship updates without opening up production systems or waiting for product release cycles for every homepage edit.
That meant a workflow where copy, sections, and content structure could move faster while still remaining reviewable.
Survive Traffic Spikes Without Midnight Scaling
Traffic spikes should not require someone to resize instances, warm caches by hand, or chase database bottlenecks for a content page.
Engineering Goals
Reduce Moving Parts in the Public Perimeter
The more logic running on the critical request path, the more ways a landing page can become slow or brittle. The team wanted fewer runtime dependencies on the anonymous public edge.
Keep Content in Version Control
They wanted content changes to be:
- Reviewable
- Previewable
- Easy to diff
- Easy to revert
Preserve Room for Small Interactive Wins
The goal was not “no JavaScript ever.” It was to preserve space for selective interactivity—a calculator, tabs, demo snippet, or signup widget—without turning the whole surface into a SPA.
Those goals fit static generation for the content-heavy routes and still leave room for APIs and authenticated experiences where they belong.
Why Static Generation Fit the Problem
Pre-rendered HTML is a Performance Strategy
When HTML is generated at build time and served as files from the edge, the browser’s first meaningful paint is not stuck waiting on your origin to assemble a document on every request.
Studies keep linking small speed gains on mobile to bounce rate, engagement, and conversion shifts you can actually see in the data.1 Google’s performance learning path pulls together how that work ties to retention and revenue across published case studies.2
Static output does not magically fix bad images or enormous JavaScript bundles. It removes an entire class of variability from the first response: no per-request template merge, no cold database connection on the critical path for the document shell.
CDNs Turn Files into a Traffic Strategy
A static artifact is a file with a URL. CDNs cache those files close to users and serve them with predictable behavior, which is why edge delivery is the natural companion to SSG.
Caching is a deep topic; the practical contract is still simple: immutable hashed assets and explicit cache policies beat heroic server tuning when you want repeat visits to stay fast. For how validators, freshness lifetimes, and cache hierarchies interact, MDN’s HTTP caching guide is the reference most teams keep open.3
Security Gets Quieter at Request Time
A fully static public site shrinks the runtime attack surface: no server-side code executing per page view, no database connection from the marketing homepage, no session store for anonymous readers.
None of that removes supply-chain risk in your build pipeline or replaces dependency hygiene. It does narrow the request path for anonymous marketing traffic toward “serve bytes” instead of “run a program on every view.” NIST’s secure software development guidance still applies end to end.4
Editorial Workflows Become Easier to Reason About
Static generation is as much about publishing nerves as it is about milliseconds.
A build artifact can be previewed, reviewed, and approved before it goes live. On small teams, the same people juggle copy, performance, and launch readiness—so that workflow matters as much as the CDN.
A Simple Mental Model
Think in two layers.
Content Layer (Static Candidate)
This includes pages that can be authored ahead of time and rebuilt when facts change:
- Homepage
- Pricing explainer pages
- Product overview pages
- Blogs
- Changelog entries
- Public documentation hubs
- Comparison pages
- Use-case pages
Application Layer (Dynamic Candidate)
This includes flows that depend on private data, personalization, or request-time decisions:
- Logged-in dashboards
- Billing
- User-specific recommendations
- Live collaboration
- Secure internal tools
- Per-account configuration
The mistake is treating “our company uses React” as proof the marketing homepage must hydrate like a client app. The default that tends to age better is a static document with progressive enhancement, with real client complexity isolated to the few places that earn it.
Progressive Enhancement as a Practical Middle Path
A practical middle ground looks like this:
- Render the core page as static HTML
- Make sure the primary content and CTA work without JavaScript
- Add client behavior only where it clearly helps someone understand or convert
That pattern tends to age well: fast by default, honest about where scripts actually help.
What They Shipped
Information Architecture That Respects Scanning
They reorganized the marketing surface into three obvious lanes:
- Product story: homepage, product pillars, comparison snippets, proof
- Continuity: blog, guides, changelog
- Action: pricing, signup, contact, demo request
Each lane had one primary job. Cross-links were intentional, not decorative.
A Landing Structure That Still Converts
The homepage followed a pattern that stays legible on a phone:
- Hero with a single headline, a supporting line, and one dominant call to action
- Proof with logos or quotes near the top, not buried below the fold
- Feature blocks that read as outcomes, not internal module names
- A lightweight interactive demo only where it clarified differentiation, not as a gate to read text
- Signup with minimal fields up front, deferring friction to step two
This is classic conversion work. Static generation does not replace good copy or credible proof. It drops the usual excuses: slow first paint, layout thrash from late-loading shells, and “works fine on Wi-Fi” blind spots.
Content Velocity Without Giving Up Review
Markdown in Git was enough for most posts and changelog entries. Pull requests became the editorial workflow: preview links for stakeholders, diffs for accuracy, and an audit trail by default.
For larger edits, they paired Markdown with a headless CMS later. The important part was the contract: the CMS publishes to the repo or build pipeline, and the site still ships as static HTML at the edge.
Progressive Enhancement Where It Helped
They avoided shipping a client router for the whole marketing domain.
Where interactivity mattered—tabs on a comparison section, an embedded calculator, a small demo—they loaded isolated scripts and treated JavaScript as an enhancement, not the container for primary content.
Core content remained readable if JavaScript failed. That still matters when a script breaks, when assistive tech is picky, and when you want crawlers to see roughly what humans see.
Reusable Patterns Across More Than One Page
Once the system was in place, the team was not just improving the homepage. They were building a repeatable publishing model for:
- Campaign pages
- Long-form educational posts
- Feature announcements
- Changelog updates
- Sales-supporting comparison pages
The real win is rarely a single fast page. It is a simpler model for the whole public content surface.
Outcomes They Measured Honestly
This is the part of a use case where teams reach for big round percentages.
Those numbers can be true for one audit and still mislead the next team if they are copied without context. Here is a more honest framing.
First-Load Experience
Directional outcomes (composite, not a single audited engagement):
- First-load experience: median time-to-first-byte for marketing HTML moved from “hundreds of milliseconds and spiky” to “edge-fast and boring” after the static cutover
This did not guarantee perfect scores everywhere, but it reduced request-path variability in a way users could feel.
Engineering Interrupt Rate
- Engineering interrupt rate: fewer pages routed through dynamic infrastructure meant fewer on-call surprises tied to marketing traffic alone
That is easy to miss on a dashboard. Simpler infrastructure often shows up as fewer interruptions, not a dramatic chart line.
Cost Curve
- Cost curve: hosting for the public marketing shell trended toward CDN + build minutes, rather than always-on app servers sized for spikes
It is not free, but the spend pattern is often easier to model for read-heavy traffic.
Experiment Cadence
- Experiment cadence: marketing shipped more copy and layout tests per month because changes did not require coordinating with the product release train for every tweak
If you need board-ready numbers, measure them on your URLs with your analytics and your Core Web Vitals field data. Use public research for why speed matters, not as a stand-in for your own instrumentation.1:12:1
Visual Comparison (Composite)
This table is not a benchmark lab result. It is a planning tool teams use when comparing default operating models.
| Dimension | Typical dynamic marketing origin | Static-first marketing shell |
|---|---|---|
| First HTML response | Depends on app server health and warm caches | Served from edge cache after deploy |
| Spike handling | Often means scaling instances or queuing | CDN absorbs anonymous read traffic |
| Runtime DB dependency | Common if content is queried per request | Removed for public pages when content is prebuilt |
| Operational focus | Patch cadence + capacity planning for public stack | Build pipeline hygiene + cache headers + asset pipeline |
How to Read the Table
Dynamic rendering is not wrong by default. Anonymous, read-mostly pages often just do not need the same cost structure as your application stack.
As traffic grows, that gap gets harder to ignore.
Monorepos when marketing sits next to the product
Static marketing is only half the picture when you ship a web app, mobile clients, or multi-tenant SaaS under one brand—or several brands and domains that still need to feel like one platform.
You do not need one giant SPA for everything. A monorepo is the usual answer: multiple apps and packages in one versioned workspace, each built and deployed with the right tool for its job, sharing what should be shared and nothing else.
Why Teams Reach for a Monorepo Here
Brand and product surfaces multiply fast: marketing homepages, campaign landings, blogs, portfolio or case-study sites, docs marketing, then the actual product shell, admin consoles, internal tools, and sometimes white-label or tenant-specific domains.
Without a deliberate layout, every surface becomes its own island: duplicated tokens, “marketing blue” drifting from “app blue,” copy that disagrees with in-product language, integrations rebuilt for every launch.
A monorepo pulls those problems into shared packages and clear app boundaries so marketing and product move on related tracks instead of silent forks.
A Common Shape (Marketing Static, Product Dynamic)
One pattern that scales well:
apps/marketing(or similar): static-first site—SSG or hybrid content tooling, edge-friendly output, fast landings and editorial surfaces. Primary CTAs point to sign up and sign in on the product origin you control.apps/web(orapps/product): the authenticated application—framework and runtime chosen for sessions, data fetching, and complex UI state, not for anonymous readers skimming a hero.packages/design-system/packages/ui: tokens, primitives, and components both surfaces import—so typography, spacing, and key components stay aligned without coupling unrelated deploys.packages/config,packages/sdk, shared schemas: cut duplicate env handling, API clients, and validation rules across apps and jobs.- Services and data access: optional app or package boundaries for APIs, background workers, and database access patterns—kept out of the static marketing request path but versioned next to the code that consumes them.
The same workspace can also host admin tools, content ops utilities, fixture apps, and other private or local-only projects. Those stay behind auth or never leave the developer machine, but they still benefit from shared libraries and the same CI graph.
Multi-Brand and Multi-Tenant Reality
For multi-tenant or multi-domain brands, the monorepo is a coordination layer: shared design language and shared integration code, while each tenant or brand still gets its own routes, content sets, or deploy targets as your pipeline allows.
The marketing app might build several static outputs (per brand, per locale, or per campaign) from shared packages—without forcing the core product build to absorb every marketing experiment.
The Trade You Are Signing
Monorepos add upfront complexity: workspace tooling, task graphs, caching, permissions, and “who owns this package?” discipline.
What you buy back day to day is less repeated work: fewer one-off decisions, faster cross-surface updates when tokens or APIs shift, and one place to read how marketing hands off to product at signup.
If you are already paying the monorepo tax without seeing the upside, the fix is usually governance and boundaries—not throwing away shared code altogether.
When Static Is the Wrong Default
Static generation is not a badge. It is a fit decision.
Cases That Need Dynamic Rendering
Reach for dynamic rendering, personalization, or hybrid patterns when:
- The HTML must differ based on private per-user state evaluated at request time
- Content changes faster than your rebuild and promotion cadence can tolerate
- You need strong guarantees around freshness for regulated or financial disclosures without a controlled republish flow
- The page is really an application: multi-step authenticated workflows, collaborative editing, or heavy server-side coordination
Hybrid Patterns Worth Considering
Modern platforms blur the line with incremental regeneration, hybrid routing, and edge compute. The useful framing is not “static versus dynamic forever.” It is pick the simplest delivery model per route, then wire the pieces with explicit boundaries.
Most SaaS teams land there in practice.
Migration Pattern They Followed
They borrowed a disciplined sequence from larger migrations, then kept the steps small enough for a lean team.
1. Inventory Routes
They classified each route as:
- Read-mostly
- Truly dynamic
- Hybrid but progressively simplifiable
That prevented the migration from becoming a vague rewrite.
2. Prototype One High-Traffic Page
They tested one page as static HTML with the real content model before expanding the pattern across the site.
This gave them signal on performance, workflow, and deployment behavior without overcommitting.
3. Align Assets and Cache Behavior
They standardized long-cache filenames for fingerprinted assets and cleaned up how CSS, JS, and images were delivered.
4. Cut Over in Slices
They moved the public surface incrementally:
- Homepage first
- Then blog
- Then changelog
That kept risk bounded and made rollback easier.
5. Watch Real-User Metrics
They tracked real-user metrics and search impressions after each slice, not only Lighthouse in local Wi-Fi conditions.
If you want a deeper technical tour of static generation, start with performance framing you can explain to a teammate, then expand from there.2:2
How Luckgrid Fits
Luckgrid is a lean digital workshop: product design, engineering, and architecture for teams that want to move fast without giving up structure—full stack delivery, token-driven UI systems, integrations, and architecture that survives the next pivot.5
We're not selling you a static-site generator. We help teams decide and ship the right delivery model for each surface—often static-first HTML at the edge for marketing and education, with clear lines where dynamic systems still earn their keep.
Where We Typically Plug In
Where we typically plug in on a cutover like this:
- Architecture and migration sequencing so you do not boil the ocean or strand SEO mid-move
- Performance and UX so story, proof, and CTAs read clearly on real networks—not only in Lighthouse on Wi-Fi
- Developer experience so content and engineering share a workflow that is reviewable, previewable, and dull to operate in the good way
- Open, inspectable foundations through an open source first mindset: speed, control, and long-term maintainability instead of vendor theater5:1
If your marketing layer still carries product-era complexity, static generation is often the fastest way to get back to shipping sentences and sections instead of babysitting servers. If you want that path designed and built with the same rigor as the rest of your product, that is the work we take on.
Open Source Monorepo Templates
We also help teams design and harden monorepos so marketing, product, and internal apps share design systems and services without turning every deploy into a monolith. Luckgrid ships and maintains open starter templates you can fork today:
- Luna — monorepo starter with moonrepo, Bun, SolidStart for the product web app, and a FastAPI + Pydantic AI API. It ships a static marketing site for the same product: Markdown-first pages, shared tokens and primitives from the repo’s internal design system, and build scripts that output HTML and CSS without requiring Solid on that surface. Sign-up and sign-in stay in the SolidStart app; the launch pad stays thin and edge-friendly.
- Gnosys — Turborepo + pnpm workspace aimed at framework-agnostic apps: Astro for content-heavy surfaces, Solid where you need interactivity, shared Tailwind design system packages, plus space for services and internal packages as you grow.
FAQ
Is a static marketing site bad for SEO?
No. Crawlers are fine with well-formed static HTML. What hurts SEO is thin content, slow pages, unstable URLs, and messy information architecture—not “missing” a client-side router.
Do we have to give up personalization?
Keep personalization where it earns its cost. Public pages stay static. Dashboards, account views, and account-specific pricing can stay dynamic behind login, or hydrate in after the static shell is already on screen.
What about preview for marketers?
Treat preview as part of deployment: branch builds, preview URLs, approvals. You can still use a CMS. You just do not want anonymous readers hitting a surprise execution path on the public edge.
Is static always cheaper?
Often, for read-heavy traffic, because you are not keeping always-on compute hot just to serve HTML. Builds, CDN egress, and people time still show up on the invoice—model the full line item instead of repeating a slogan.
How does this relate to SPAs?
A SPA can be the right tool for a real application. A marketing site rarely is one. If most people only read, give them HTML that reads.
Can static sites still support interactive components?
Yes. Static-first is not “no JavaScript.” It means the default payload is fast HTML, and you add components where they actually help—calculators, comparison tabs, small demos, richer forms.
How do marketers preview and approve changes safely?
Tie previews to pull requests or draft publishing flows. Review, approval, and QA stay visible; production stays a published artifact instead of a live CMS runtime.