For B2B SaaS, the website isn’t a brochure. It’s the operational layer between your product and your CRM, the place where strangers become leads, leads become trials, and trials become revenue. Getting the architecture wrong doesn’t just slow down your marketing team; it fragments your data, splits your SEO authority, and creates a permanent engineering bottleneck on every content change.
The Problem with SaaS Marketing Stacks
Most SaaS companies end up with a marketing stack that nobody designed. It grew organically, one decision at a time, and now it looks like this:
The product lives on app.company.com, built in React or Next.js. The marketing site is on company.com, built in Webflow or Squarespace because the marketing team needed to ship landing pages without waiting for engineering. The blog is on blog.company.com (a subdomain because somebody read that subdomains are “cleaner”) running on Ghost or a basic WordPress install. The docs are on docs.company.com. There’s a Notion page linked from the footer that serves as a changelog.
That’s four or five separate systems with separate deploys, no shared component library, no shared analytics context, and no unified content strategy. Here’s what breaks:
The content team can’t publish or update the marketing site without an engineer because Webflow’s CMS limitations surface the moment you need conditional logic, dynamic filtering, or custom integrations. Every landing page request goes into the engineering sprint backlog and ships three weeks late.
SEO authority is split across domains. Every backlink to blog.company.com builds authority on the subdomain, not on company.com where your pricing page, demo request form, and product pages live. You’re running two separate SEO campaigns without realizing it, and neither reaches critical mass.
Brand consistency drifts. The product uses your design system. The marketing site uses Webflow’s version of your design system, which is close but not identical. The blog uses a Ghost theme that was “close enough” twelve months ago. Every touchpoint looks slightly different, and the cumulative effect is a lack of coherence that sophisticated buyers notice.
This is the problem that WordPress as a headless hub solves, not by adding another system, but by consolidating the content layer into one platform that both marketers and developers can work with.
What Headless WordPress Actually Means
Headless WordPress separates the content management backend from the frontend rendering. WordPress handles what it’s best at: content creation, editorial workflows, revision history, user roles, and the plugin ecosystem for SEO and integrations. A separate frontend framework handles what WordPress is worst at: rendering fast, modern, component-based pages.
The architecture looks like this: WordPress runs on an internal URL (e.g., cms.company.com or a private server) that only your content team accesses. They write and publish content using the block editor, the same interface they already know. A frontend framework (Astro, Next.js, or Remix) fetches that content via the WordPress REST API or WPGraphQL at build time. The frontend compiles everything into static HTML (or server-rendered pages for dynamic content) and deploys to company.com through your normal CI/CD pipeline.
The content team publishes in WordPress. The build triggers automatically. The site updates on company.com within minutes. No engineer in the loop for content changes. Full engineering control over the frontend architecture, component library, and performance.
The Roseville Landscape Material Supply project used exactly this pattern: WordPress as the content management layer, Astro as the static site generator, deployed to the edge. The result was 100/100 Lighthouse performance scores while maintaining a content workflow that the client’s team could operate independently.
Why Not Just Use Contentful, Sanity, or Notion?
Fair question. The headless CMS market has more options than anyone needs, and several of them are excellent. Here’s where WordPress wins and where it doesn’t.
Editorial UX for non-technical users. WordPress’s block editor is the most battle-tested content interface on the web. Your marketing hire with zero technical background can publish a formatted blog post with images, embeds, and custom blocks on day one. Contentful’s interface is powerful but requires training. Sanity Studio requires configuration before it’s usable. Notion is intuitive for internal docs but wasn’t designed as a publishing CMS, no SEO fields, no revision workflows, no content scheduling.
Plugin ecosystem for marketing operations. Yoast or RankMath for SEO metadata and sitemaps. Gravity Forms or WPForms for lead capture with direct CRM integration. ACF or Meta Box for custom fields that map cleanly to your frontend components. This ecosystem exists because millions of sites have needed these exact tools for fifteen years. No headless CMS has a comparable marketplace.
Cost. WordPress is open source. Managed hosting runs $30-150/month depending on the tier. Contentful’s enterprise pricing starts at $300/month and scales with content volume and API calls. For a SaaS company running hundreds of landing pages with high traffic, that difference compounds.
Data portability. Your WordPress content lives in a standard MySQL database that you control. You can export it, query it, migrate it. Contentful, Sanity, and Storyblok store your content in proprietary formats behind their APIs. Leaving means a migration project, not a database export.
Where WordPress loses: real-time collaborative editing (Notion and Google Docs are better for team drafting), developer experience on the API layer (Sanity’s GROQ query language is more expressive than WP REST or even WPGraphQL for complex content relationships), and initial setup overhead (a headless WordPress architecture requires more upfront configuration than signing up for a managed headless CMS). These are real trade-offs, not minor quibbles. If your team lives in Notion and your developers want a GraphQL-native CMS, Sanity might genuinely be the better call. But if your priority is a content workflow that marketing can own without engineering support, WordPress is still the pragmatic choice.
The Subdomain SEO Trap and How to Fix It
The difference between blog.company.com and company.com/blog isn’t cosmetic. It has a measurable impact on search authority.
Google treats subdomains as separate sites for the purpose of link equity and topical authority. A backlink to blog.company.com builds authority for the blog subdomain. It does not directly strengthen company.com, where your product pages, pricing page, and demo request form live. You’re building two authority profiles instead of one, and for most SaaS companies, neither reaches the critical mass needed to rank competitively.
Serving your blog from company.com/blog (a subdirectory) consolidates all link equity to one domain. Every backlink your content earns strengthens the entire site, including the commercial pages that drive revenue.
The headless architecture makes this straightforward. WordPress runs on a private URL that’s not public-facing. The frontend framework (Astro, Next.js) fetches blog content from WordPress via API and renders it at company.com/blog. The marketing site’s landing pages render at company.com/solutions, company.com/pricing, etc. Everything is one domain, one authority profile, one site in Google’s eyes.
Configuration is a routing decision in your frontend framework, not a WordPress concern. In Astro, for example, you’d create a src/pages/blog/[slug].astro route that fetches the corresponding WordPress post at build time. The WordPress installation URL never appears in the public-facing site.
The Lead Capture Architecture
The entire point of a SaaS marketing site is converting visitors into pipeline. Here’s a complete lead capture architecture built on the headless WordPress stack.
Top of Funnel
Blog posts targeting problem-aware keywords. These are the visitors who don’t know your product exists but are searching for solutions to the problem you solve. The content ranks because it’s published on a technically sound, authority-consolidated domain with proper SEO infrastructure.
Middle of Funnel
Gated content (guides, templates, benchmark reports) delivered via a form. The form is built in your frontend framework (not a WordPress form plugin, since the frontend is decoupled) and submits to your marketing automation platform (HubSpot, ActiveCampaign, Mailchimp) via API or webhook. The WordPress layer manages the content of the gated asset; the frontend handles the gate itself.
Bottom of Funnel
Demo request forms and pricing pages with conversion events firing to Google Tag Manager, which forwards to your CRM. The conversion event includes attribution data, which channel, campaign, and content piece brought this visitor.
UTM Persistence: The Technical Pattern
Attribution breaks when UTM parameters are lost between the landing page and the conversion page. A visitor clicks a LinkedIn ad with ?utm_source=linkedin&utm_medium=paid&utm_campaign=q1-launch, reads a blog post, navigates to the pricing page, and submits a demo request. By the time they submit, the UTM parameters are gone from the URL.
The fix is to capture UTMs on arrival and persist them through the session:
// Capture UTMs on any page load
function captureUTMs() {
const params = new URLSearchParams(window.location.search);
const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
utmKeys.forEach(key => {
const value = params.get(key);
if (value) {
sessionStorage.setItem(key, value);
}
});
}
// Inject UTMs into any form as hidden fields
function injectUTMs(form) {
const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
utmKeys.forEach(key => {
const value = sessionStorage.getItem(key);
if (value) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = key;
input.value = value;
form.appendChild(input);
}
});
}
// Run on page load
captureUTMs();
// Run before any form submission
document.querySelectorAll('form').forEach(form => {
form.addEventListener('submit', () => injectUTMs(form));
});
This stores UTMs in sessionStorage (persists across page navigations within the same tab, clears when the tab closes) and injects them as hidden fields into every form submission. Your CRM receives the attribution data alongside the lead data. You can now trace every demo request back to the campaign that generated it.
Fire the same data to GTM on form submission for redundancy:
window.dataLayer.push({
event: 'form_submission',
form_id: 'demo_request',
utm_source: sessionStorage.getItem('utm_source'),
utm_medium: sessionStorage.getItem('utm_medium'),
utm_campaign: sessionStorage.getItem('utm_campaign')
});
This pattern is simple, reliable, and rarely implemented correctly. Most SaaS companies discover their attribution is broken six months into a paid campaign when the CRM shows “direct” as the source for 60% of demo requests.
When This Architecture Is Overkill
If you’re a 3-person SaaS team pre-product-market-fit, don’t build this. Use Webflow or Framer for the marketing site. Write blog posts on your main domain with whatever tool is fastest. Don’t touch headless WordPress, content architectures, or UTM persistence until you have something worth marketing at scale.
This infrastructure makes sense when three conditions are true. First, you have a content team (at least two people whose job is producing and distributing marketing content. One person wearing the content hat part-time doesn’t justify the architecture overhead. Second, you’re past $1M ARR or have committed budget for a serious marketing investment. This stack costs $2-5K/month to operate (hosting, tools, maintenance) before content production costs. Third, you’re playing the 18-month SEO game, not the 30-day sprint. Content-led growth on a properly built infrastructure compounds dramatically) but it takes 12-18 months to reach the inflection point. If you need leads next month, run paid campaigns on a Webflow site and revisit this architecture when the unit economics support it.
Three Questions Before Choosing Your Marketing Stack
Can your marketing team publish content without filing an engineering ticket? If the answer is no, your stack is wrong regardless of how technically elegant it is. The best architecture is one that removes the engineering bottleneck from content operations entirely.
Is your blog on the same domain as your product marketing pages? If it’s on a subdomain, you’re splitting your SEO authority. Every month you wait to consolidate is compounding authority you’re losing.
Can you trace a closed deal back to the blog post that generated the first visit? If your attribution chain is broken (and for most SaaS companies, it is) the UTM persistence pattern above is the minimum viable fix. Without it, you’re making content investment decisions blind.
If your marketing stack doesn’t pass these three tests and you want to explore what a consolidated architecture looks like, the approach page walks through how we evaluate and plan these builds. If you already know the direction and want to talk specifics, reach out directly.