- A page is a record (route, SEO, flags) plus its file
pages/<slug>.liquid. The display name becomes the slug: "Our Services" → /our-services.add_pageneedstext: the page's HTML + Liquid, shaped like an existing page ({% render 'header' %}…{% render 'footer' %}). The first page is home. - Set
seo.titleandseo.descriptionon every page. A page withoutseo.titlefalls back to the site-level title — never to its display name — so every page ships the same<title>. The site-level title/description are edited withupdate_siteand read withselect_site. seo.jsonLdis one schema.org object (FAQPage, Article, BreadcrumbList);seo.schemais an array, one<script type="application/ld+json">each.- Page markup is the file: per-page head code is a tag in the file's
<head>, body classes go on the file's<body>, and a landing page without chrome simply omits the{% render 'header' %}/{% render 'footer' %}lines.update_pagerefusesheadCode,footerCode,bodyClassandhide*with that guidance. update_page({ policy })sets who may open a page and how it looks on its own:password(hashed, never shown back),access(condition groups; a denied visitor getsfailActionredirect+redirectUrl, orshow-page+fallbackPath),bodyClass,themeOverrides(CSS variables for this page);""or[]clears a key.list_pages({ pageId })reads it back. To gate a page on a plan useaccesswith the auth condition, or gate the content inside the page (seemembers). It takes effect on publish.isHiddenpages are not reachable by URL. You can't delete the last page; deleting home promotes the next page.pathPatternmakes a detail page: the URL tail AFTER the page's slug, literal segments or:param, no leading slash. Page "Car" +:slugserves /car/<slug>; page "Shop" +products/:handleserves /shop/products/<handle>. The segment count must match exactly. Read captures asrequest.params.<name>. A tail that doesn't fit, or a filter that matches no row, serves the 404 page. Empty string clears.