How Steeren fits together
How Steeren fits together
Steeren is one operated system that sits behind your website. Instead of stitching together a CMS, a form tool, a CRM, an email platform, and an analytics product, you get all of it on a single source of truth: content, lead capture, a lightweight CRM, newsletters, nurturing, and analytics.
This page is the orientation map. If you just want to ship content, you don't need it - open the dashboard and start writing. Read this when you're deciding where Steeren ends and your own site begins, or when something doesn't behave the way you expected and you want a mental model to reason against.
Your workspace
A workspace is the home for everything in your marketing: your content, your leads, your brand context, your analytics, and the people on your team. Everything you create lives inside one workspace, and workspaces don't share data - your posts, leads, and visitors are yours alone.
You invite teammates into a workspace and give each one a role:
| Role | Can do |
|---|---|
| Owner | Everything, including managing other owners |
| Admin | Manage members and all content |
| Member | Create and edit content |
| Viewer | Read-only access |
[!NOTE] A workspace always keeps at least one owner - you can't remove the last one. That's a safety rail so a workspace can never be left without someone in charge.
What you get, on one source of truth
Steeren runs the parts of your marketing that benefit from being connected:
- Content - your blog posts and the pages built around them, with drafts, publish history, images, and reusable building blocks like callouts, FAQs, charts, and CTAs.
- Lead capture - forms you embed on your site. A submission becomes a contact in your CRM automatically.
- A lightweight CRM - contacts moving through a simple lifecycle (lead -> MQL -> SQL -> customer), companies, deals, and a per-contact activity timeline.
- Brand context - a single place that holds your company profile, industry, products, ideal customer, positioning, and writing style. This is what grounds the content you generate and how new leads get scored.
- Newsletters and nurturing - email issues and multi-step sequences that run off the same contacts and content.
- Analytics - page visits, CTA clicks, search queries, keyword tracking, and competitor visibility, all tied back to the content that drove them.
The point of keeping these together is that they reinforce each other. The same brand context that writes your posts also scores your leads. The form on a post feeds the same CRM your newsletter sends from. You maintain one set of facts about your business, not five.
Three ways to get a site
Steeren owns your content, leads, context, and analytics. Your site - the pages, layout, and styling your visitors actually see - is a separate thing, and you have a choice about how to run it. The content underneath stays the same whichever you pick.
- Self-host your own site. Build and host the site yourself - Next.js on Vercel, a static export, your own server, whatever you prefer. It reads your content and sends analytics back to Steeren over a public API. You own the deploy.
- Let Steeren host it for you. Steeren scaffolds a Next.js site for you, keeps it in a repo, and hosts it. You get a custom site without running the infrastructure.
- Use the built-in blog. If you don't want a custom site at all, Steeren can serve your posts directly on your own subdomain or a custom domain. Nothing to build.
Most people start with the built-in blog or a managed site and move to self-hosting only if they want full control of the front end. You can connect a custom domain in any of the three.
Three ways to operate it
However your site is hosted, there are three ways to actually drive Steeren day to day. Pick whichever fits the moment - they all do the same things.
| You want to... | Use |
|---|---|
| Work hands-on | The dashboard |
| Automate from your own code | An API key |
| Ask an AI assistant to do it | An MCP connection |
The dashboard is the human cockpit. Write and edit posts in the editor, review and publish, manage leads, set up forms and CTAs, and watch your analytics. There are no save buttons - your edits save as you type, and the screen updates live as background work finishes or a teammate makes a change, with no reloads. If a teammate edits the same post, their changes merge in around what you're actively typing, so nothing you're working on gets clobbered.
An API key lets your own scripts and backend do the same operations programmatically. Generate a key in your workspace settings and call the same actions you'd take in the dashboard.
An MCP connection lets an AI assistant - ChatGPT, Claude, or another MCP client - work on your behalf. You connect it to a specific workspace and approve it, and from then on it can create posts, generate content, search contacts, publish, and so on. It's scoped to the one workspace you approved, and it does exactly what you could do yourself.
The same operation is available all three ways on purpose. A person publishing in the dashboard, a script publishing with an API key, and an assistant publishing for you all do the identical thing.
For developers: putting content on your own site
If you're self-hosting, your site reads content from Steeren at request time and renders it. Two published npm packages make that straightforward:
@nukipa/site-sdk- a typed client for the public API. You point it at your workspace and call methods likegetTenant,listPosts,getPostBySlug,listRelatedPosts,listFolders,getFormBySlug,submitForm,recordVisit, andrecordCtaClick.- A post renderer - a
<PostBody>component that turns a post into real elements, resolving its embedded building blocks (callouts, FAQs, charts, CTAs, lead forms) for you. It ships as@nukipa/post-renderer-reactfor Next.js / React sites and@nukipa/post-renderer-vuefor Vue / Nuxt sites. Pick the one matching your stack.
A minimal blog index in a Next.js app, using the SDK and the React renderer:
import { createNukipaClient } from '@nukipa/site-sdk';
import { headers } from 'next/headers';
const client = createNukipaClient({
gatewayUrl: process.env.NUKIPA_GATEWAY_URL!,
getHost: async () =>
process.env.NUKIPA_TENANT_HOST
|| (await headers()).get('x-forwarded-host')
|| (await headers()).get('host')
|| ''
});
const tenant = await client.getTenant();
const posts = await client.listPosts({ limit: 10 });
await client.recordVisit({ path: '/blog' });
[!TIP] Your workspace is resolved by the request host. A verified custom domain maps to your workspace; otherwise your Steeren subdomain does. In production, set
NUKIPA_TENANT_HOST(or let your reverse proxy forward the real host) so the same code always serves the right content. If a host isn't supplied,recordVisitcan't attribute the page view - so always provide one.
[!NOTE] A post is one portable string of content, not a pile of hand-edited HTML. You don't author or parse the internal markup yourself -
<PostBody>renders it, and the editor round-trips it. The full content-authoring reference lives in the content docs.
Tracking calls are deliberately forgiving: a flaky analytics ping never blocks your page from rendering. At the SDK level you can still see when a call didn't land - recordVisit returns null if the visit wasn't recorded - it just never surfaces to your visitor.
[!TIP] The concepts here are the boundary, not the full developer reference. For the complete SDK method list and integration details, see the SDK and integration docs.
Behaviors worth knowing
A few things behave in specific ways. None of them are surprising once you know them, but they're the questions people ask first.
Edits don't go live until you publish again. Your site serves the published version of a post, not your working draft. Editing changes the draft; the live post only updates when you hit Publish. So if you made an edit and the live site looks unchanged, you most likely haven't republished yet.
Unpublishing takes a post offline immediately. The moment you unpublish, the post goes offline and its URL stops resolving. There's no waiting for a rebuild.
A form submission becomes a lead - and is never lost. When a visitor submits a form, Steeren captures the submission and creates a contact in your CRM. New leads from forms come in unowned and at the start of the lifecycle, then get scored in the background against your brand context - without making the visitor wait. If the CRM step ever hiccups, the submission itself is still safe: it's captured, and the dashboard inbox shows any that didn't sync so you can reconcile them. Nothing a visitor sends you gets dropped.
A note on the CRM lifecycle
Each CRM contact has two separate things you can set, which are easy to confuse:
- Stage - where the contact is in your funnel: lead -> MQL -> SQL -> customer -> disqualified.
- Status - how you've dispositioned the contact, independent of where they are in the funnel.
Leads created by a form start at the lead stage and unowned. The automatic scoring suggests where a contact belongs, but it doesn't move them for you - a person or an assistant applies the change, so you always stay in control of your pipeline.
FAQ
Is my website hosted by Steeren? It can be, or not - your choice. You can self-host your own site, let Steeren scaffold and host one for you, or use the built-in blog if you don't want a custom site at all. In every case your content, leads, context, and analytics live in Steeren.
What's the difference between a workspace and a tenant? Nothing - they're the same thing. One customer's marketing lives in one workspace.
Which post renderer do I use?
@nukipa/post-renderer-react for a Next.js / React site, and @nukipa/post-renderer-vue for a Vue / Nuxt site. Same content, same <PostBody> component, different framework.
Can an AI assistant do everything I can do in the dashboard? Largely yes. Once you connect and approve an assistant against a workspace, it can run the same operations you can - creating posts, generating content, searching contacts, publishing - scoped to that one workspace.
I published an edit but the live site didn't change - why? Your site serves the published version, not your live draft. The live post only updates when you publish again. If you've edited but not republished, the live site stays on the previous version. (Unpublishing, by contrast, takes a post offline right away.)
A form was submitted but the lead isn't in the CRM - where did it go? It's safe. The submission is always captured even if the CRM step didn't complete at that moment. Check the dashboard inbox for that form - you'll find it there and can reconcile or re-score it.
Where do brand voice and ideal-customer details come from? From your brand context - a single place that holds your company profile, industry, products, ideal customer, positioning, and writing style. It's set up during onboarding (Steeren can populate it by reading your company website) and is what grounds both the content you generate and how new leads are scored.