publishing-model-spec · supabase_json
B2BEA.org V1 Publishing Model Spec
publishing-model-spec artifact · for B2BEA.org Rebuild · status approved
open questions
- Which exact existing page families become Sanity standard pages in V1?
- Should custom HTML imports be checked into the site repo, stored as Supabase/Sanity assets, or both?
- What is the minimum rollback behavior for static/custom pages on the first rebuild release?
- Which standard templates are required before migration starts?
- What exact GEO fields should appear in Sanity versus be generated at build time?
Agent Handoff
Start Here
publishing-model-spec artifact · for B2BEA.org Rebuild · status approved
Completion Evidence
No explicit evidence field yet. Require tests, screenshots, linked PRs, or reviewed outputs before marking complete.
Open Questions
- Which exact existing page families become Sanity standard pages in V1?
- Should custom HTML imports be checked into the site repo, stored as Supabase/Sanity assets, or both?
- What is the minimum rollback behavior for static/custom pages on the first rebuild release?
- Which standard templates are required before migration starts?
- What exact GEO fields should appear in Sanity versus be generated at build time?
Structured Payload
Machine-readable source fields
title
B2BEA.org V1 Publishing Model Spec
version
1
decisions
| id | topic | decision |
|---|---|---|
| PUB-DEC-001 | Publishing paths | V1 supports two first-class page publishing paths: Sanity standard pages and custom HTML import. |
| PUB-DEC-002 | Source of truth | Sanity owns editorial/public content. B2BEA Supabase owns application and operational data. Code/import registry owns custom HTML page artifacts. |
| PUB-DEC-003 | Internal permissions | Brett, Sarah, and Justin can publish directly in V1; production control comes from preview, required fields, lifecycle states, audit events, and rollback/archive behavior rather than complex internal RBAC. |
| PUB-DEC-004 | Public company profiles | Vendor public profiles are V1. Practitioner company public profiles are excluded from V1; company workspace is private only. |
| PUB-DEC-005 | Page metadata | Every publishable page type must satisfy hardened SEO, GEO, and social metadata requirements before publish. |
project id
a820dd0c-6cef-4133-bfbd-d802fd806e44
updated at
2026-05-06T20:04:59.971Z
artifact type
publishing-model-spec
approval rules
- Core admins can publish Sanity standard pages directly after metadata validation.
- Core admins can publish custom HTML imports directly after preview and metadata validation.
- Vendor profile changes require B2BEA review before changing public projection.
- Vendor content submissions require B2BEA review before publishing.
- Company-created jobs require B2BEA admin review before public publishing.
- Practitioner company workspace changes do not create public pages in V1.
next artifacts
- design-system-spec
- data-model-spec
- surface-specs
- custom-html-import-spec
- sanity-schema-spec
- seo-geo-social-spec
open questions
- Which exact existing page families become Sanity standard pages in V1?
- Should custom HTML imports be checked into the site repo, stored as Supabase/Sanity assets, or both?
- What is the minimum rollback behavior for static/custom pages on the first rebuild release?
- Which standard templates are required before migration starts?
- What exact GEO fields should appear in Sanity versus be generated at build time?
publishing paths
| path | purpose | examples | lifecycle | v1 acceptance | source of truth |
|---|---|---|---|---|---|
| Sanity standard page | Create normal structured public pages using reusable templates and Lovable design-system components. | - standard landing pages - about/interior pages - editorial pages - resource body content - SEO-managed content pages | - draft - preview - scheduled - published - archived | - A non-engineer core admin can create a standard page from Sanity - The page renders with approved design-system templates - Draft/preview does not appear publicly - Published content has canonical URL, SEO metadata, GEO fields, and social preview metadata - Archived pages stop appearing in navigation/search indexes | Sanity |
| Custom HTML import | Bring in custom landing pages/resources when the page needs a bespoke design outside standard templates. | - campaign landing pages - sponsored interactive resources - highly custom report/resource pages - special-purpose conversion pages | - draft - preview - published - archived - rolled_back | - Imported HTML cannot bypass site header/footer rules unless explicitly marked full-custom - Assets are local or approved external URLs - Page is addressable through a registry with owner/status - Rollback can restore prior published version or archive the page - Analytics, SEO, GEO, and social metadata hooks are present | Code/import registry plus repository artifact |
source artifacts
| version | artifact id | artifact type |
|---|---|---|
| 5 | c889a1fe-c3ce-4b0d-873c-af4e0ec8dfe4 | capability-map |
| 3 | 80328220-3deb-4cf9-a68f-d440b41a38da | production-readiness-gap-register |
| 3 | dcfc8620-9f28-4019-aeeb-de3e279fd7a7 | permission-lifecycle-matrix |
url and slug rules
- Every public page has one canonical URL.
- Slug must be unique within its page family.
- Changing a published slug requires redirect handling.
- Custom HTML imports must declare their route in the page registry.
- Archived pages should not appear in public navigation, search indexes, or sitemap output.
- Vendor public profiles keep vendor-profile URL ownership in Supabase-backed routing.
- Practitioner company public routes are not generated in V1.
page lifecycle rules
| state | public | meaning | allowed roles |
|---|---|---|---|
| draft | false | Editable but not public. | - b2bea_admin - author/vendor submitter where enabled |
| preview | false | Viewable through protected preview URL for review. | - b2bea_admin |
| submitted | false | External contributor/vendor/company has submitted for review. | - vendor_admin - author - company_admin where enabled |
| in_review | false | B2BEA is reviewing public-facing or externally submitted content. | - b2bea_admin |
| scheduled | false | Approved content scheduled for future publication. | - b2bea_admin |
| published | true | Visible publicly or to its gated audience. | - b2bea_admin |
| archived | false | Removed from public listing and navigation; may remain internally readable. | - b2bea_admin |
| rolled_back | false | Prior version restored or current custom page removed from public route. | - b2bea_admin |
analytics requirements
- page view tracking for public pages
- resource download tracking
- campaign/source attribution where available
- vendor-owned content attribution where relevant
- custom HTML pages must include standard analytics hook
- privacy-safe export boundaries
source of truth boundaries
| domain | source | examples |
|---|---|---|
| Editorial/public content | Sanity | - standard pages - articles - blog/editorial content - resource/guide/report body copy - SEO/GEO/social fields - author editorial metadata |
| Custom page artifacts | Code/import registry | - custom HTML - page-specific CSS/JS - static assets - custom resource pages |
| Profiles and organizations | B2BEA Supabase | - people - companies/organizations - vendors - vendor claims - vendor profile updates |
| Membership and entitlements | B2BEA Supabase | - memberships - roles - seats - resource/course/event access |
| Academy | B2BEA Supabase unless later split | - courses - modules - lessons - enrollments - progress - certificates |
| Surveys and forms | B2BEA Supabase | - survey definitions - questions - responses - forms - submissions - exports |
| Jobs and events operations | B2BEA Supabase | - jobs - scraped jobs - event registrations - attendees - sponsors - check-in |
| CRM pipeline | HubSpot primary | - leads - opportunities - sales activity - renewals |
| Analytics and notifications | B2BEA Supabase plus provider logs | - page views - downloads - notification event log - email delivery status |
implementation implications
- Create a page registry abstraction for custom HTML imports.
- Define Sanity schemas for standard pages and editorial/resource content.
- Create shared SEO/GEO/social metadata schema fields by page family.
- Keep Supabase-backed operational pages separate from editorial page schemas.
- Add a redirect model before allowing published slug changes at scale.
- Design preview URLs and build/deploy behavior before coding publishing workflows.
- Make SEO, GEO, social, and analytics fields required by page family, not optional afterthoughts.
hardened page metadata contract
rule
No public page publishes without complete SEO, GEO, social, indexing, and analytics metadata appropriate to its page family.
applies to
- Sanity standard pages
- custom HTML imports
- vendor public profiles
- person profiles
- articles
- resources
- guides
- reports
- events
- jobs
- courses
- survey landing/results pages where public
geo required
- LLM answer summary
- entity/topic tags
- audience
- industry/category context
- key facts
- source/author attribution
- last reviewed date
- content freshness rule
- FAQ/question-answer fields where applicable
- citation/source fields where applicable
seo required
- meta title
- meta description
- canonical URL
- index/noindex flag
- robots behavior
- slug
- H1
- primary topic/category
- breadcrumb data where applicable
- structured data type where applicable
- sitemap inclusion flag
- redirect rule when URL changes
social required
- Open Graph title
- Open Graph description
- Open Graph image
- Twitter/X card type
- social share image alt text
- LinkedIn-safe summary
- fallback image by page family
validation rules
- Metadata is validated at build/publish time
- Preview surfaces show search/social preview before publish
- Missing required metadata blocks publish for standard pages
- Custom HTML imports must declare metadata in registry/frontmatter
- Archive/noindex state updates sitemap and robots behavior
- Private/preview pages must be noindex
page family overrides
- Vendor profiles require vendor category, services, canonical vendor URL, and vendor logo/social image fallback
- Resources/guides/reports require gated/free flag, sponsor/vendor attribution where applicable, and download analytics key
- Jobs require job structured data when public and expiration/closed state handling
- Events require event structured data and registration state
- Courses require course structured data where public and entitlement/gating metadata