URL: /code/apps/sites-and-content · Id: `page:/code/apps/sites-and-content`

# Sites and content

> Your Site, its pages and the Content on them, drafted from what ranks, published by one call, and submitted to search engines on every publish.

Your [Site](https://startupbuilder.dev/business/nouns/site), its [pages](https://startupbuilder.dev/business/nouns/page) and the [Content](https://startupbuilder.dev/business/nouns/content) on them, drafted from what ranks, published by one call, and submitted to search engines on every publish.

- **System:** [Sites and content](https://startupbuilder.dev/systems/sites)
- **Nouns:** 4
- **Verbs:** 8
- **Events:** 6

## Nouns
| Noun | What it is |
| --- | --- |
| [Site](https://startupbuilder.dev/business/nouns/site) | A Site is a website as a Thing: its pages, navigation, and Brand, served on one or more Domains. |
| [Page](https://startupbuilder.dev/business/nouns/page) | A page is an addressable page of a Site, of a named type such as pricing, about one Thing or each member of a Collection. |
| [Content](https://startupbuilder.dev/business/nouns/content) | Content is authored material with a draft and a published state, such as a post, an article, or a changelog entry. |
| [Domain](https://startupbuilder.dev/business/nouns/domain) | A Domain is a hostname that points at a Thing, with a role, a status, and a lifecycle tracked as data. |

## Properties
The hub defines each Noun’s core Properties; Sites and content adds the ones a sale needs.

### Site
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `navigation` | `json` | The menus that link its pages. | The hub |

### Page
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `path` | `string` | The path under its Site, such as `/pricing`. | The hub |
| `kind` | `string` | The page type, such as `landing`, `pricing`, or `terms`. | The hub |
| `from` | `string` | Lineage: the slot it compiles from, as `Hypothesis#<slot>@v<version>`. | The hub |
| `keyword` | `Keyword` | The one term it targets, so two pages never compete. | Sites and content |
| `claims` | `json` | The facts it states, each resolving to a record before it publishes. | Sites and content |

### Content
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `title` | `string` | The headline. | The hub |
| `publishedAt` | `datetime` | When it went live. | The hub |
| `kind` | `string` | What the Content is, so each System reads its own kind. | The hub |
| `brief` | `string` | What it is for: the question it answers or the reply it came from. | Sites and content |
| `voice` | `Brand` | Whose voice it is written in. | Sites and content |

### Domain
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `hostname` | `string` | The name, such as `example.com`. | The hub |
| `role` | `string` | What the Domain does for the Thing it serves; a defensive name takes `redirect`. | The hub |
| `acquired` | `string` | One of `claimed`, `purchased`, or `connected`. | The hub |
| `state` | `string` | Where the Domain stands; `verifying`, `live`, `degraded`, `expiring` and `lapsed` are observed, the rest follow an Action. | The hub |
| `registrant` | `party` | The owner of record: the holding Company while held, or the holder of a self-serve startup’s Stripe account. | The hub |
| `expiresAt` | `datetime` | When the registration ends, as the registrar reports it; empty for a claimed Domain. | The hub |
| `autoRenew` | `boolean` | True when renewal runs without a Decision; false sends the Domain through renewal review. | The hub |
| `renewalPrice` | `money` | What the next renewal costs, which for a premium name differs from the purchase price. | The hub |
| `transferableAt` | `datetime` | The first moment the registrar allows a transfer out, after any registration, transfer or registrant lock. | The hub |
| `names` | `string` | How its subdomains are given out: explicit records only, or one-label claims by other startups. | The hub |
| `publicSuffix` | `boolean` | True once the public suffix list browsers ship carries the Domain; an issuing Domain gives out no label before then. | The hub |
| `registrarAccount` | `string` | The registrar account that holds the Domain: one per startup, never shared with a sibling. | The hub |
| `registryLock` | `boolean` | True when the registry refuses transfer, update and delete until a verified out-of-band request lifts it. | The hub |
| `certificate` | `json` | Certificate state (`pending`, `active`, `renewing` or `failed`), its expiry, and the failing check with its fix. | The hub |
| `validation` | `string` | `delegated` proves control through a CNAME to the platform; `serving` is for an apex that cannot hold one. | The hub |
| `walletsEnabled` | `boolean` | True once Stripe lists the Domain as a payment method domain on the startup’s account. | The hub |
| `carriedIdentity` | `boolean` | True once the Domain received mail, hosted a Mailbox or verified an outside account; it never resets. | The hub |
| `to` | `domain` | For a redirect: the canonical Domain it forwards to permanently, path and query kept. | The hub |

## Verbs
| Verb | What it does | Approval | On each site |
| --- | --- | --- | --- |
| [`Content.draft`](https://startupbuilder.dev/business/nouns/content/draft) | Writes a page, post or email in your voice from a brief, for your approval, every claim linked to its record. | Runs on its own | None. |
| [`Content.publish`](https://startupbuilder.dev/business/nouns/content/publish) | Puts approved Content live on your Site and every Interface once it passes the checks for its kind. | Goes out on its own | Bing |
| [`Site.publish`](https://startupbuilder.dev/business/nouns/site/publish) | Puts your Site’s current pages live on its Domain, under your Brand. | Goes out on its own | None. |
| [`Page.create`](https://startupbuilder.dev/business/nouns/page/create) | Adds a page to your Site at a path, such as `/rent-ledger-template`. | Runs on its own | None. |
| [`Page.update`](https://startupbuilder.dev/business/nouns/page/update) | Changes a page’s content, kind or path. | Runs on its own | None. |
| [`Content.create`](https://startupbuilder.dev/business/nouns/content/create) | Saves a piece of Content as a draft of one kind, such as an article or a newsletter. | Runs on its own | None. |
| [`Content.update`](https://startupbuilder.dev/business/nouns/content/update) | Changes a draft, or a published piece, which keeps its history. | Runs on its own | None. |
| [`Domain.connect`](https://startupbuilder.dev/business/nouns/domain/connect) | Attaches a domain you already hold and verifies you own it through DNS. | Runs on its own | Bing |

## Events
| Event | Emitted by |
| --- | --- |
| `Content.drafted` | [`Content.draft`](https://startupbuilder.dev/business/nouns/content/draft) |
| `Content.published` | [`Content.publish`](https://startupbuilder.dev/business/nouns/content/publish) |
| `Site.published` | [`Site.publish`](https://startupbuilder.dev/business/nouns/site/publish) |
| `Page.created` | [`Page.create`](https://startupbuilder.dev/business/nouns/page/create) |
| `Page.updated` | [`Page.update`](https://startupbuilder.dev/business/nouns/page/update) |
| `Domain.connected` | [`Domain.connect`](https://startupbuilder.dev/business/nouns/domain/connect) |

A [Trigger](https://startupbuilder.dev/business/nouns/trigger) can start a Workflow on any of them, and a Watch delivers each to your endpoint, signed ([Events and webhooks](/code/events)).

## Who operates it
| Part | Sites and content |
| --- | --- |
| Accountable | [Content lead](https://startupbuilder.dev/agents/marketing/content-lead) |
| Also calls its Verbs | [Marketing lead](https://startupbuilder.dev/agents/marketing/marketing-lead) |
| Seat | An agent holds each seat until you seat a person in it. |
| Asks you first | None of its Verbs: each runs within its seat’s Limits |

## Integrations
[Google Search Console](/code/integrations/google-search-console) · [Bing Webmaster](/code/integrations/bing-webmaster) · [Google Business Profile](/code/integrations/google-business-profile)

## Import and export
| Direction | What | How |
| --- | --- | --- |
| Import | Pages from your current site | `Page.create` for each path you keep, with a redirect for each you move |
| Export | Your Site, as files | `Collection.export` of pages and Content |

## Example
**An answer page, live and submitted.**

1. `Content.draft` writes “How do small landlords track rent?” from the 31 problem posts that ask it.
2. You approve it, and `Content.publish` puts it live once its three claims read from live records.
3. `Site.publish` pushes the Site, and the changed URL goes to Google and Bing through your connected accounts.