# Pages & Sales Pages


Your site needs two kinds of pages, and they are built differently. There are the pages a
visitor expects to find — a front page, something about you, the terms and privacy pages,
maybe a blog — which you write the way you write anything. And there is the sales page: one
per offer, built on a designed template, where the words matter more than anywhere else on
the site and where your assistant does the first draft.

This chapter is both. It shows the pages a new site starts with and how to make more, the
sales page from the starter letter to live, and the rule the platform enforces so a page with
"[rewrite me]" prompts on it never reaches a buyer. A path such as *Sales and marketing → My Pages*
names a group in the admin's navigation and the page under it.

## Concepts

**A page has a kind, a format and an address.** The kind says what the page is for: a general
page, a blog post, the front page, terms, privacy policy, cookie policy, or a thank-you
page. The format says how its content is stored: *Rich Text* for anything you write in the
editor, *HTML* for a page you or your assistant author as markup (a plan feature), and the
*designed* format of sales pages, where content lives in named slots on a template. Every
page is served at `/page/<slug>`; *Serve at site root* makes it answer at `/<slug>` as well,
unless the slug is a name the platform reserves. A page is public the moment it exists — there
is no draft step for ordinary pages — and it appears in the site's sitemap and in its
`/llms.txt`, the page agents read to learn what a site offers.

**A new site starts with four pages.** A front page at `/` titled with the site's name,
carrying a welcome line and a *site contents* block that lists what the site shows the public
— its pages, its live offers, its podcast — plus terms, privacy and cookie-policy pages at `/terms`, `/privacy` and `/cookies`, all
written as starting points for you to edit. These four kinds are *standard* pages: a site has
one active page of each, and if you write a second front page or a new terms page you make it
the active one from the list. The site header and footer wrap every page: the logo on the left
(the logged-out menu is only *Login* and *Forgot your password?*; there is no site menu to
edit), and the Terms, Privacy and Cookies links underneath.

**A sales page belongs to an offer.** It is the page a buyer reads before the checkout, and it
points at the offer it sells — the price on the page and the buy button are wired to the offer
and change with it. An offer gets its sales page when it is created (the Selling chapter), and
several pages may sell one offer, with one of them the offer's own. Sales pages are not listed
under *My Pages*; you reach one from its offer.

**A sales page is slots on a template.** The template — today there is one for selling,
*Sales Page*, a full-length letter for an audience that has never heard of you — fixes which
sections exist and in what order: the hero with its headline, subheadline and badges; the
problem; a two-column comparison; how it works, in steps; your approach; proof; what you get;
why the price; the call to action; and the FAQ. The hero and the call to action are always
there; every other section can be shown or hidden, and sections with lists (badges, rows,
steps, deliverables, questions) take as many items as you like. What you cannot do is reorder
sections or invent new ones; the freedom is in the words. Rich slots take bold, italic and
lists, and body copy takes no links, so the only click on the page is the buy button. The look
is a theme that draws its colours and fonts from your brand (Getting Started), not from the page.

**Placeholders never go public.** A new sales page is a *starter letter*: every section filled
from what the offer knows, with bracketed prompts where only you know the substance —
*"[What staying stuck costs them]"*. Publishing the offer is refused while any of those remain,
from the offer's edit page, from the wizard and from your assistant alike, and the refusal
lists each one with a link to the spot in the editor. Until the offer is published its sales
page answers visitors with a 404; you, signed in as the Headmaster, see it with a banner saying
so, exactly as buyers will once it is live. A scheduled offer's page is public before the
launch, so you can send traffic to it.

**HTML pages are for the assistant to write and you to touch up.** On plans with custom HTML
pages, a page can be stored as markup — the natural output of an assistant that designs a
page for you. You can edit the source, but the everyday path is *touch-up*: open the live page
as the Headmaster, click the pencil, and the text that is safe to change is highlighted; you fix
a word, bold a phrase, save, and the page is live. Structure and styling stay with the source.

## Hands-on

### The pages you start with

Mira's site came with a front page, terms, privacy and cookie pages. *Sales and marketing → My Pages*
lists them with their kind, address and format, filtered by chips (*Front Pages*, *Blog Posts*,
*Terms*, …) or searched by title. *Edit* opens the editor, *Preview* the public page in a new
tab, *Copy* duplicates one, and the lightning button on an inactive standard page makes it the
active one. The *Set up your site* checklist on the admin home keeps *Edit your front page*
unticked until the front page has been saved once.

Mira says: *"Rewrite my front page: who I am, what the course does, and keep the list of what
is on the site."* The assistant reads it with `omumu_page_get` (by slug or id) and writes it
back with `omumu_page_update` — title, tagline, search description, contents, image or slug —
keeping the site contents block, which is an embed in the content rather than text. In the
admin, the editor is the page's content with a *Page Settings & SEO* panel: title, slug,
*Serve at site root*, search description and kind; *Save* publishes at once.

### Add a page

*"Make an About page at /about-mira: I was a developer for fifteen years, now I teach people who
don't code to automate the boring parts of their week."*

`omumu_page_create` takes the slug, title, kind and contents — Markdown is fine for a page
written in conversation; it is stored as rich text — and returns the public address.
`omumu_page_list` shows every page, filtered by kind. In the admin: *New Page* asks for title,
slug, kind and format (*Rich Text Editor* or *HTML Editor*, the latter only on plans that
include it) and opens the editor. To put an opt-in form on a page, write
`[optin-form id="…"]` on a line of its own; the Audience & Email chapter has the forms.

### Write a blog

A blog post is a page of the *Blog Post* kind. The public blog lives at `/blog`, each post at
`/blog/<slug>`, with RSS and Atom feeds at `/blog/feed.rss` and `/blog/feed.atom`. Create posts
as any other page (`omumu_page_create` with type `blog`, or *New Page* with the kind set to
Blog Post); the *Blog Posts* chip under *My Pages* lists them. There is a separate *Blog
Management* page at `/admin/blog` with the same list, but nothing in the navigation links to it.

### Write the sales page

Mira's offer *Automate Your Week* has a sales page full of prompts. She says: *"Rewrite my sales
page from these notes: the problem is Sunday evenings lost to spreadsheets, the first win is a
report that builds itself, refunds within 14 days, no questions."*

The assistant calls `omumu_template_list` once to see the template's sections and the fields
each slot takes, reads the page with `omumu_page_get`, and writes the whole slot document back
with `omumu_page_update` — the full page every time, not one section; the template, the offer
and the price are fixed facts the document cannot change. A field the template does not have
is dropped without a word, so it checks the result. When the page is clean, publishing the
offer with `omumu_offer_update` goes through; while prompts remain, it fails with the list
(section, field, excerpt, editor path), and `omumu_offer_get` shows the same list under
`salesPagePlaceholders` for a check before trying.

In the admin, *Sales and marketing → Offers*, the offer, *Edit sales page* opens the page on its real look:
click any text and type; *Show or hide this section* on the optional sections; *Add badge*,
*Add row*, *Add step*, *Add testimonial*, *Add item*, *Add question* for the lists; the buy
button's label is editable, its destination is not. *Save page* makes it live for anyone who
can see the page; *View live page* shows it. From the public page, the pencil in the corner
brings the Headmaster back to the editor.

### Publish, and what buyers see

Publishing is the offer's *Valid From* (the Selling chapter). With placeholders left, the edit
page refuses and lists them, each a link to its section; fix them, save, and publish again. Once
live, the page shows the site header and footer, the price from the offer, and a buy button
that goes straight to the checkout. Pausing or ending the offer keeps the page up; unpublishing
hides it again.

### Author a page in HTML

*"Design me a one-page launch announcement in HTML with a countdown-style headline, our
colours, and a link to the sales page."*

`omumu_page_create` with `encoding: MANAGED_HTML` stores the markup as given and serves it
inside the site header and footer. Editing it in the admin — the source editor and the
touch-up alike — needs a plan with custom HTML pages; without one the page is shown read-only
there. Afterwards Mira
opens the live page, clicks the pencil, and lands in *Touch up copy*: highlighted text can be
edited and formatted (bold, italic, underline, highlight), dimmed text is protected, and *Save*
says *Your changes are live*. If the page changed under her meanwhile, nothing is saved and she
reloads. Changing the structure means *Edit source*, which is the markup itself.

### What you cannot do yet

Stated plainly: ordinary pages have no draft state — a page is public the moment it exists, and
only sales pages follow their offer's status. There is no site menu to edit; the logged-out
header links only to sign-in, so pages reach each other through the front page's contents block
and your own links. Sales pages are not listed under *My Pages*, and nothing links the blog's
own admin page. One selling template, one theme per template, no reordering of sections, no
images inside a sales page beyond the brand. And the sales page's only buy button is at the
end of the letter; the hero shows the price and the access badge, not a button.

## Reference

### `omumu_page_create`

Creates a new page. The page is live on the public site immediately — there is no draft step — and the result's publicUrl is the address it is served at. Two modes:

**Slot page (recommended for sales pages):** Pass 'template' (discriminator from omumu_template_list) and 'slotJson' (whole-document slot JSON validated against that template). For SALES templates, also pass 'offerId'. Wiring fields (offerId, purpose) must be tool parameters — never inside slot contents.

**Classic page:** Pass 'contents' with optional 'encoding' (QUILL_JSON or MANAGED_HTML). MANAGED_HTML is available but de-emphasised for selling pages — prefer slot pages instead.

- **Write category:** standard write
- **Access:** requires the `PAGE_WRITE` permission

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `contents` | string | no | Classic page content. Raw HTML when encoding is MANAGED_HTML, Quill JSON or markdown otherwise. Not used when creating slot pages. |
| `encoding` | string | no | Content encoding for classic pages: QUILL_JSON (default) or MANAGED_HTML. Not used when creating slot pages. |
| `offerId` | string | no | Offer ID this sales page sells. Required for SALES templates; must be a valid offer belonging to this site. Never pass inside slot contents. |
| `slotJson` | string | no | Whole-document slot JSON validated against the named template. Required when 'template' is provided. |
| `slug` | string | yes | The page URL slug (e.g., 'my-course-launch') |
| `template` | string | no | Template discriminator from omumu_template_list (e.g. 'sales-cold-traffic'). Required for slot page creation; causes slotJson validation against the named template. |
| `title` | string | no | The page title |
| `type` | string | no | Page type: blog, frontpage, userpage, terms, privacy, cookies, template, block, offer, thank_you |

### `omumu_page_delete`

Deletes a page by ID

- **Write category:** standard write
- **Access:** requires the `PAGE_DELETE` permission

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageId` | string | yes | The page ID to delete |

### `omumu_page_get`

Gets a page by ID or slug. At least one of pageId or slug must be provided. The result's 'public' field is false for a sales page whose offer is not published (visitors get a 404 there until it is), true otherwise.

- **Write category:** read-only
- **Access:** requires the `PAGE_READ` permission

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageId` | string | no | The page ID (provide this or slug) |
| `slug` | string | no | The page slug (provide this or pageId) |

### `omumu_page_list`

Lists all pages for the current site, optionally filtered by type

- **Write category:** read-only
- **Access:** requires the `PAGE_READ` permission

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `excludeOfferPages` | boolean | no | Exclude auto-generated offer pages |
| `type` | string | no | Filter by page type: blog, frontpage, userpage, terms, privacy, cookies, template, block, offer, thank_you |

### `omumu_page_update`

Updates a page. The change is live on the public site immediately — there is no draft step — and the result's publicUrl is the address the page is served at. For slot pages (encoding SLOT_JSON), pass 'slotJson' with the full updated slot document — wiring (offerId, purpose) is immutable on update and is not re-validated here. For classic pages, pass any combination of 'title', 'tagline', 'metaDescription', 'contents', 'image', or 'slug'.

- **Write category:** standard write
- **Access:** requires the `PAGE_WRITE` permission

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `contents` | string | no | New content for classic pages. Format depends on page encoding: raw HTML for MANAGED_HTML pages, Quill JSON for QUILL_JSON pages. |
| `image` | string | no | New header image URL |
| `metaDescription` | string | no | New meta description for SEO |
| `pageId` | string | yes | The page ID |
| `rootPublished` | boolean | no | Serve the page at the site root (/\<slug>) in addition to /page/\<slug>. Reserved platform names (admin, terms, courses, ...) are refused. Both addresses keep working; rendered links, canonical metadata, and the sitemap use the root URL. Omit to leave unchanged. |
| `slotJson` | string | no | Full updated slot JSON document for slot pages (encoding SLOT_JSON). The template discriminator is read from the existing slot document. Wiring is immutable. |
| `slug` | string | no | New URL slug (changes the page URL) |
| `tagline` | string | no | New tagline |
| `title` | string | no | New title |

### `omumu_template_list`

Returns all registered page templates with their section layouts and per-section JSON schema. Call this tool first when building a slot page so you know which template discriminator to pass to omumu_page_create and what slot fields each section expects. Each entry includes: 'name' (the discriminator), 'purpose' (e.g. SALES), 'sections', and 'schema'.

- **Write category:** read-only
- **Access:** requires the `PAGE_READ` permission

No parameters.
