Website, Funnels & Public Surface
Synced from
docs/generated/erd/— do not hand-edit.
Regenerate withbun 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
Description
Section titled “Description”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.
Tables
Section titled “Tables”Website builder
Section titled “Website builder”Org site config and pages
| Name | Columns | Comment | Type |
|---|---|---|---|
blog_posts |
21 | BASE TABLE | |
website_config |
26 | BASE TABLE | |
website_pages |
18 | BASE TABLE |
Funnels
Section titled “Funnels”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 |
Member benefits (public)
Section titled “Member benefits (public)”Deals and job board
| Name | Columns | Comment | Type |
|---|---|---|---|
hot_deals |
32 | BASE TABLE | |
job_postings |
29 | BASE TABLE |
Exchange
Section titled “Exchange”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 |
Partnerships
Section titled “Partnerships”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 |
Relations
Section titled “Relations”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

