Skip to content

Website, Funnels & Public Surface

Synced from docs/generated/erd/ — do not hand-edit.
Regenerate with bun run docs:erd (needs staging reader), then this script runs automatically.
Labels: docs/db/erd-table-labels.yml · Runbook: docs/runbooks/erd-schema-docs.md

Website builder config/pages, funnels, blog, public lead capture, member
benefits (hot_deals, job_postings), exchange visibility layer. Catalog §3.5–3.7, §5.1.

Org site config and pages

Name Columns Comment Type
blog_posts 21 BASE TABLE
website_config 26 BASE TABLE
website_pages 18 BASE TABLE

Landing pages and conversion capture

Name Columns Comment Type
contact_submissions 22 BASE TABLE
form_analytics 11 BASE TABLE
form_starts 7 BASE TABLE
form_views 7 BASE TABLE
funnel_assets 11 BASE TABLE
funnel_conversions 17 BASE TABLE
funnel_form_submissions 11 BASE TABLE
funnel_page_variants 11 BASE TABLE
funnel_pages 16 BASE TABLE
funnel_templates 9 BASE TABLE
funnels 20 BASE TABLE

Deals and job board

Name Columns Comment Type
hot_deals 32 BASE TABLE
job_postings 29 BASE TABLE

Cross-org content visibility

Name Columns Comment Type
exchange_distribution_targets 5 BASE TABLE
exchange_engagement 6 BASE TABLE
exchange_items 8 BASE TABLE
exchange_propagation_rules 7 BASE TABLE
exchange_publications 8 BASE TABLE
exchange_submissions 9 BASE TABLE
exchange_visibility 5 BASE TABLE

Peer org↔org partnerships with per-direction grants (#5192)

Name Columns Comment Type
public.org_partnerships 15 Peer org<->org partnership — invite/accept/pause/revoke lifecycle; one LIVE row per pair (pending/active/paused), revoked is terminal, expired can still be revoked — Not: The association/hierarchy subsystem; this is a direct, independent relationship between two orgs BASE TABLE
public.partnership_grants 15 One direction’s scope of an org_partnerships row (channels, object types, caps) — asymmetric, at most one row per (partnership, granting org) — Not: org_partnerships itself; a grant never implies the reverse direction is also scoped BASE TABLE
Name Columns Comment Type
organizations 40 BASE TABLE
erDiagram

"public.blog_posts" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.contact_submissions" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.exchange_distribution_targets" }o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.exchange_engagement" }o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.exchange_propagation_rules" |o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.exchange_publications" |o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.exchange_submissions" }o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.exchange_visibility" |o--|| "public.exchange_items" : "FOREIGN KEY (exchange_item_id) REFERENCES exchange_items(id) ON DELETE CASCADE"
"public.form_starts" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.form_views" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.funnel_conversions" }o--o| "public.funnel_page_variants" : "FOREIGN KEY (variant_id) REFERENCES funnel_page_variants(id) ON DELETE SET NULL"
"public.funnel_conversions" }o--o| "public.funnel_pages" : "FOREIGN KEY (page_id) REFERENCES funnel_pages(id) ON DELETE SET NULL"
"public.funnel_conversions" }o--|| "public.funnels" : "FOREIGN KEY (funnel_id) REFERENCES funnels(id) ON DELETE CASCADE"
"public.funnel_form_submissions" }o--|| "public.funnel_pages" : "FOREIGN KEY (page_id) REFERENCES funnel_pages(id) ON DELETE CASCADE"
"public.funnel_form_submissions" }o--|| "public.funnels" : "FOREIGN KEY (funnel_id) REFERENCES funnels(id) ON DELETE CASCADE"
"public.funnel_page_variants" }o--|| "public.funnel_pages" : "FOREIGN KEY (page_id) REFERENCES funnel_pages(id) ON DELETE CASCADE"
"public.funnel_pages" }o--|| "public.funnels" : "FOREIGN KEY (funnel_id) REFERENCES funnels(id) ON DELETE CASCADE"
"public.hot_deals" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.job_postings" }o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"
"public.org_partnerships" }o--|| "public.organizations" : "FOREIGN KEY (initiated_by_org_id) REFERENCES organizations(id)"
"public.org_partnerships" }o--|| "public.organizations" : "FOREIGN KEY (org_a_id) REFERENCES organizations(id)"
"public.org_partnerships" }o--|| "public.organizations" : "FOREIGN KEY (org_b_id) REFERENCES organizations(id)"
"public.organizations" }o--o| "public.organizations" : "FOREIGN KEY (parent_org_id) REFERENCES organizations(id) ON DELETE SET NULL"
"public.partnership_grants" }o--|| "public.organizations" : "FOREIGN KEY (granting_org_id) REFERENCES organizations(id)"
"public.partnership_grants" }o--|| "public.organizations" : "FOREIGN KEY (receiving_org_id) REFERENCES organizations(id)"
"public.partnership_grants" }o--|| "public.org_partnerships" : "FOREIGN KEY (partnership_id) REFERENCES org_partnerships(id) ON DELETE CASCADE"
"public.website_config" |o--|| "public.organizations" : "FOREIGN KEY (org_id) REFERENCES organizations(id)"

"public.blog_posts" {
  text org_id ""
}
"public.contact_submissions" {
  text org_id ""
}
"public.exchange_distribution_targets" {
  uuid exchange_item_id ""
}
"public.exchange_engagement" {
  uuid exchange_item_id ""
}
"public.exchange_items" {
  uuid id ""
}
"public.exchange_propagation_rules" {
  uuid exchange_item_id ""
}
"public.exchange_publications" {
  uuid exchange_item_id ""
}
"public.exchange_submissions" {
  uuid exchange_item_id ""
}
"public.exchange_visibility" {
  uuid exchange_item_id ""
}
"public.form_analytics" {
}
"public.form_starts" {
  text org_id ""
}
"public.form_views" {
  text org_id ""
}
"public.funnel_assets" {
}
"public.funnel_conversions" {
  uuid funnel_id ""
  uuid page_id ""
  uuid variant_id ""
}
"public.funnel_form_submissions" {
  uuid funnel_id ""
  uuid page_id ""
}
"public.funnel_page_variants" {
  uuid id ""
  uuid page_id ""
}
"public.funnel_pages" {
  uuid funnel_id ""
  uuid id ""
}
"public.funnel_templates" {
}
"public.funnels" {
  uuid id ""
}
"public.hot_deals" {
  text org_id ""
}
"public.job_postings" {
  text org_id ""
}
"public.org_partnerships" {
  uuid id ""
  text initiated_by_org_id ""
  text org_a_id ""
  text org_b_id ""
}
"public.organizations" {
  text id ""
  text parent_org_id "#671 self-referencing hierarchy pointer. NULL = root org. Direct writes are blocked by trg_block_direct_parent_org_id_writes for every role except service_role/postgres/supabase_admin — the only write path for authenticated/interactive callers is public.reparent_organization(). Cycle-prevented by trg_prevent_org_hierarchy_cycle. #quot;Is association#quot; is derived (EXISTS a child), never stored."
}
"public.partnership_grants" {
  text granting_org_id ""
  uuid partnership_id ""
  text receiving_org_id ""
}
"public.website_config" {
  text org_id ""
}
"public.website_pages" {
}

Generated by tbls