Added go pages for several ancillary events at Supabase Select (#46879)

## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

Added landing pages for some events

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Launched three Supabase Select 2026 event pages (Partner Day, VIP
Dinner, VIP Experience) with RSVP flows, agendas, host details, and
thank-you confirmations.

* **Updates**
* RSVP forms now support per-form CRM mapping and explicit field
exclusions for HubSpot.
  * Site index updated to include the new event pages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: shaziya <99940835+shaziyabandukia@users.noreply.github.com>
This commit is contained in:
Prashant Sridharanandshaziya authored and GitHub committed 2026-06-12 21:18:10 +01:00
1 parent e26dc700e4
commit 68a7e45aca
11 files changed
+773

No files matched your search

@@ -0,0 +1,34 @@
import type { GoPageInput } from 'marketing'
import Link from 'next/link'
import { Button } from 'ui'
const page: GoPageInput = {
template: 'thank-you',
slug: 'select-2026/partner-day/thank-you',
metadata: {
title: "You're confirmed | Supabase Partner Day",
description:
'Your RSVP for Supabase Partner Day in San Francisco on October 1, 2026 has been confirmed. We look forward to seeing you.',
},
hero: {
title: "You're confirmed",
description:
"We'll see you at Supabase Partner Day in San Francisco on October 1, 2026. We're looking forward to it.",
},
sections: [
{
type: 'single-column',
title: 'In the meantime',
description: 'Learn more about what we are building at Supabase.',
children: (
<div className="flex items-center justify-center gap-4">
<Button asChild type="default" size="small">
<Link href="https://supabase.com">Visit supabase.com</Link>
</Button>
</div>
),
},
],
}
export default page
@@ -0,0 +1,241 @@
import type { GoPageInput } from 'marketing'
const agenda: { time: string; session: string; notes?: string }[] = [
{
time: '2:00 - 2:30pm',
session: 'Arrival + light snacks',
notes: 'Casual opportunity to meet your fellow partners',
},
{
time: '2:30 - 2:45pm',
session: 'Welcome',
notes: 'Ecosystem momentum and why partners are so critical to the success of Supabase.',
},
{
time: '2:45 - 3:15pm',
session: 'Business update + Roadmap preview',
notes: 'An early look at what\u2019s coming at Select',
},
{
time: '3:15 - 3:45pm',
session: 'Partner demos / \u201cwins\u201d',
notes: 'Demos by some partners on what they\u2019ve built / building.',
},
{
time: '3:45 - 4:15pm',
session: 'Partner panel',
notes: 'Challenges and opportunities for partners in the Supabase ecosystem.',
},
{
time: '4:15 - 4:30pm',
session: 'Ecosystem announcements roundup + partner awards',
notes: 'Celebrate the organizations that have delivered innovative results through the year.',
},
{
time: '4:30pm and beyond',
session: 'Happy hour',
},
]
const page: GoPageInput = {
template: 'lead-gen',
slug: 'select-2026/partner-day',
metadata: {
title: 'Partner Day | Supabase Select 2026',
description:
'Join the Supabase partner community for an afternoon of business updates, partner demos, panels, and ecosystem announcements, followed by a happy hour.',
},
hero: {
title: 'Supabase Partner Day',
subtitle: 'Celebrating the Supabase ecosystem',
description:
'Spend the afternoon with the Supabase team and fellow partners. Hear a business update and roadmap preview, watch lightning demos of what partners are building, join a partner panel, and celebrate the latest ecosystem announcements and partner awards -- capped off with a happy hour.',
ctas: [
{
label: 'Reserve your spot',
href: '#rsvp',
variant: 'primary',
},
],
},
sections: [
{
type: 'single-column',
title: 'Details',
children: (
<div className="flex flex-col items-center gap-2 text-foreground-light">
<p className="text-lg font-medium text-foreground">Date</p>
<p>October 1, 2026</p>
<p className="mt-4 text-lg font-medium text-foreground">Location</p>
<p>San Francisco, CA</p>
<p className="mt-4 text-lg font-medium text-foreground">Schedule</p>
<p>2:00 PM — Arrival and light snacks</p>
<p>4:30 PM — Happy hour</p>
</div>
),
},
{
type: 'single-column',
title: 'Agenda',
children: (
<div className="border border-muted rounded-xl overflow-hidden text-left">
<table className="w-full border-collapse text-sm">
<thead>
<tr className="bg-surface-100 text-foreground">
<th className="w-40 align-top p-4 font-medium border-b border-muted">Time</th>
<th className="align-top p-4 font-medium border-b border-muted">Session</th>
<th className="align-top p-4 font-medium border-b border-muted">Notes</th>
</tr>
</thead>
<tbody>
{agenda.map((item, index) => (
<tr key={item.time} className={index > 0 ? 'border-t border-muted' : undefined}>
<td className="w-40 align-top p-4 font-medium text-foreground whitespace-nowrap">
{item.time}
</td>
<td className="align-top p-4 text-foreground">{item.session}</td>
<td className="align-top p-4 text-foreground-light">{item.notes ?? ''}</td>
</tr>
))}
</tbody>
</table>
</div>
),
},
{
type: 'feature-grid',
title: "What you'll gain",
columns: 3,
items: [
{
title: 'Strengthen key relationships',
description:
"Join Supabase's inaugural Partner Summit and build deeper connections with the Supabase team and the wider partner community in one room.",
},
{
title: 'Get recognized for your work',
description:
'Top-performing partners are celebrated with Partner Awards, recognizing your impact across product integrations and go-to-market.',
},
{
title: 'See where Supabase is heading',
description:
'Get a business update and an early look at the product roadmap, giving you forward-looking context to plan your own bets.',
},
{
title: 'Unlock new opportunities',
description:
'Be first to hear about new partner programs, partner benefits, and product integration opportunities you can take advantage of.',
},
{
title: 'Shape the partnership',
description:
"Meet the team in person to share what's working, surface points of friction, and give feedback that directly informs how we collaborate.",
},
{
title: 'Grow your visibility',
description:
"Be part of the partner ecosystem spotlight and get featured across Supabase's social channels.",
},
],
},
{
type: 'form',
id: 'rsvp',
title: 'Reserve your spot',
description: "Space is limited. Let us know you're coming.",
fields: [
{
type: 'text',
name: 'first_name',
label: 'First Name',
placeholder: 'First Name',
required: true,
half: true,
},
{
type: 'text',
name: 'last_name',
label: 'Last Name',
placeholder: 'Last Name',
required: true,
half: true,
},
{
type: 'email',
name: 'email_address',
label: 'Email',
placeholder: 'Work email',
required: true,
},
{
type: 'text',
name: 'company_name',
label: 'Company',
placeholder: 'ACME, Inc.',
required: true,
},
{
type: 'text',
name: 'job_title',
label: 'Job Title',
placeholder: 'Head of Partnerships',
required: false,
},
{
type: 'text',
name: 'phone_number',
label: 'Phone Number',
placeholder: '+1 212 555 1212',
required: false,
},
{
type: 'select',
name: 'attending',
label: 'Are you attending Select 2026?',
placeholder: 'Select an option',
required: true,
options: [
{ label: 'Yes', value: 'Yes' },
{ label: 'No', value: 'No' },
],
},
],
submitLabel: 'Confirm RSVP',
successRedirect: '/go/select-2026/partner-day/thank-you',
disclaimer:
'By submitting this form, I confirm that I have read and understood the [Privacy Policy](https://supabase.com/privacy).',
crm: {
hubspot: {
formGuid: 'a6e8cf87-5fd0-4ed0-acce-60e37447fb23',
fieldMap: {
first_name: 'firstname',
last_name: 'lastname',
email_address: 'email',
company_name: 'company',
job_title: 'jobtitle',
phone_number: 'phone',
},
// `attending` is a Notion-only field — keep it out of the HubSpot payload.
excludeFields: ['attending'],
consent:
'By submitting this form, I confirm that I have read and understood the Privacy Policy.',
},
notion: {
database_id: '37d5004b775f80e48618c7ac1013c889',
columnMap: {
first_name: 'First Name',
last_name: 'Last Name',
email_address: 'Email',
company_name: 'Company',
job_title: 'Job Title',
phone_number: 'Phone Number',
attending: 'Attending',
},
},
},
},
],
}
export default page
@@ -0,0 +1,34 @@
import type { GoPageInput } from 'marketing'
import Link from 'next/link'
import { Button } from 'ui'
const page: GoPageInput = {
template: 'thank-you',
slug: 'select-2026/vip-dinner/thank-you',
metadata: {
title: "You're confirmed | Supabase VIP Dinner",
description:
'Your RSVP for the Supabase VIP dinner at Flour + Water in San Francisco on October 1, 2026 has been confirmed. Cocktails begin at 7:00 PM and dinner starts at 7:30 PM.',
},
hero: {
title: "You're confirmed",
description:
"We'll see you at Flour + Water in San Francisco on October 1, 2026. Cocktails begin at 7:00 PM and dinner starts at 7:30 PM. We look forward to seeing you.",
},
sections: [
{
type: 'single-column',
title: 'In the meantime',
description: 'Learn more about what we are building at Supabase.',
children: (
<div className="flex items-center justify-center gap-4">
<Button asChild type="default" size="small">
<Link href="https://supabase.com">Visit supabase.com</Link>
</Button>
</div>
),
},
],
}
export default page
@@ -0,0 +1,194 @@
import type { GoPageInput } from 'marketing'
import Image from 'next/image'
import { cn } from 'ui'
import authors from '@/lib/authors.json'
const sugu = authors.find((a) => a.author_id === 'sugu_sougoumarane')
const paul = authors.find((a) => a.author_id === 'paul_copplestone')
const ant = authors.find((a) => a.author_id === 'ant_wilson')
const deepthi = authors.find((a) => a.author_id === 'deepthi_sigireddi')
const hosts = [paul, ant, sugu, deepthi]
const page: GoPageInput = {
template: 'lead-gen',
slug: 'select-2026/vip-dinner',
metadata: {
title: 'VIP Dinner | Supabase Select 2026',
description:
'Join Supabase leaders for an intimate dinner at Flour + Water in San Francisco on October 1, 2026. Cocktails at 7:00 PM, dinner at 7:30 PM.',
},
hero: {
title: 'The future of scalable databases',
subtitle: 'An intimate VIP dinner hosted by Supabase',
description:
'Join Supabase product and engineering leaders for a dinner conversation about where Postgres is headed -- from scaling beyond single-node limits to managing globally distributed workloads. Expect sharp perspectives, good food, and the opportunity to connect with other engineering leaders.',
image: {
src: '/images/landing-pages/select-2026/flourwater.jpg',
alt: 'Private dining room at Flour + Water, San Francisco',
width: 600,
height: 450,
},
ctas: [
{
label: 'Reserve your seat',
href: '#rsvp',
variant: 'primary',
},
],
},
sections: [
{
type: 'single-column',
title: 'Details',
children: (
<div className="flex flex-col items-center gap-2 text-foreground-light">
<p className="text-lg font-medium text-foreground">Date</p>
<p>October 1, 2026</p>
<p className="mt-4 text-lg font-medium text-foreground">Location</p>
<p>Flour + Water</p>
<p>San Francisco, CA</p>
<p className="mt-4 text-lg font-medium text-foreground">Schedule</p>
<p>7:00 PM — Cocktails and introductions</p>
<p>7:30 PM — Dinner and discussion</p>
</div>
),
},
{
type: 'single-column',
title: 'Your hosts',
children: (
<div className="border border-muted rounded-xl overflow-hidden">
<div className="grid grid-cols-1 sm:grid-cols-2">
{hosts.map((host, i) => (
<div
key={host?.author_id ?? i}
className={cn(
'flex flex-col items-center gap-4 p-6 sm:p-8 text-center',
i % 2 === 0 && 'sm:border-r border-muted',
i < 2 && 'sm:border-b border-muted',
i < hosts.length - 1 && 'max-sm:border-b max-sm:border-muted'
)}
>
{host?.author_image_url && (
<Image
src={host.author_image_url}
alt={host.author}
width={192}
height={192}
className="rounded-full object-cover aspect-square w-48 h-48"
/>
)}
<div className="flex flex-col items-center gap-0">
<p className="text-foreground font-medium text-base">{host?.author}</p>
<p className="text-foreground-lighter text-sm mt-2 leading-relaxed">
{host?.position && `${host.position}, `}Supabase
</p>
</div>
</div>
))}
</div>
</div>
),
},
{
type: 'form',
id: 'rsvp',
title: 'Reserve your seat',
description: "Space is limited. Let us know you're coming.",
fields: [
{
type: 'text',
name: 'first_name',
label: 'First Name',
placeholder: 'First Name',
required: true,
half: true,
},
{
type: 'text',
name: 'last_name',
label: 'Last Name',
placeholder: 'Last Name',
required: true,
half: true,
},
{
type: 'email',
name: 'email_address',
label: 'Email',
placeholder: 'Work email',
required: true,
},
{
type: 'text',
name: 'company_name',
label: 'Company',
placeholder: 'ACME, Inc.',
required: true,
},
{
type: 'text',
name: 'job_title',
label: 'Job Title',
placeholder: 'VP of Engineering',
required: false,
},
{
type: 'text',
name: 'phone_number',
label: 'Phone Number',
placeholder: '+1 212 555 1212',
required: false,
},
{
type: 'select',
name: 'attending',
label: 'Are you attending Select 2026?',
placeholder: 'Select an option',
required: true,
options: [
{ label: 'Yes', value: 'Yes' },
{ label: 'No', value: 'No' },
],
},
],
submitLabel: 'Confirm RSVP',
successRedirect: '/go/select-2026/vip-dinner/thank-you',
disclaimer:
'By submitting this form, I confirm that I have read and understood the [Privacy Policy](https://supabase.com/privacy).',
crm: {
hubspot: {
formGuid: 'd0699f2e-225a-4224-91b5-341fb5336613',
fieldMap: {
first_name: 'firstname',
last_name: 'lastname',
email_address: 'email',
company_name: 'company',
job_title: 'jobtitle',
phone_number: 'phone',
},
// `attending` is a Notion-only field — keep it out of the HubSpot payload.
excludeFields: ['attending'],
consent:
'By submitting this form, I confirm that I have read and understood the Privacy Policy.',
},
notion: {
database_id: '37d5004b775f809e8cc4e29fdec302aa',
columnMap: {
first_name: 'First Name',
last_name: 'Last Name',
email_address: 'Email',
company_name: 'Company',
job_title: 'Job Title',
phone_number: 'Phone Number',
attending: 'Attending',
},
},
},
},
],
}
export default page
@@ -0,0 +1,34 @@
import type { GoPageInput } from 'marketing'
import Link from 'next/link'
import { Button } from 'ui'
const page: GoPageInput = {
template: 'thank-you',
slug: 'select-2026/vip-experience/thank-you',
metadata: {
title: "You're confirmed | Supabase VIP Experience",
description:
'Your RSVP for the Supabase VIP dinner at Penny Roma in San Francisco on October 1, 2026 has been confirmed. Cocktails begin at 7:00 PM and dinner starts at 7:30 PM.',
},
hero: {
title: "You're confirmed",
description:
"We'll see you at Penny Roma in San Francisco on October 1, 2026. Cocktails begin at 7:00 PM and dinner starts at 7:30 PM. We look forward to seeing you.",
},
sections: [
{
type: 'single-column',
title: 'In the meantime',
description: 'Learn more about what we are building at Supabase.',
children: (
<div className="flex items-center justify-center gap-4">
<Button asChild type="default" size="small">
<Link href="https://supabase.com">Visit supabase.com</Link>
</Button>
</div>
),
},
],
}
export default page
@@ -0,0 +1,214 @@
import type { GoPageInput } from 'marketing'
import Image from 'next/image'
import authors from '@/lib/authors.json'
const sugu = authors.find((a) => a.author_id === 'sugu_sougoumarane')
const paul = authors.find((a) => a.author_id === 'paul_copplestone')
const ant = authors.find((a) => a.author_id === 'ant_wilson')
const page: GoPageInput = {
template: 'lead-gen',
slug: 'select-2026/vip-experience',
metadata: {
title: 'VIP Experience | Supabase Select 2026',
description:
'Join Supabase leaders for an intimate VIP dinner at Penny Roma in San Francisco on October 1, 2026. Cocktails at 7:00 PM, dinner at 7:30 PM.',
},
hero: {
title: 'The future of scalable databases',
subtitle: 'An intimate VIP experience hosted by Supabase',
description:
'Join Supabase product and engineering leaders for a dinner conversation about where Postgres is headed -- from scaling beyond single-node limits to managing globally distributed workloads. Expect sharp perspectives, good food, and the opportunity to connect with other engineering leaders.',
image: {
src: '/images/landing-pages/select-2026/pennyroma.jpg',
alt: 'Private dining room at Penny Roma, San Francisco',
width: 600,
height: 450,
},
ctas: [
{
label: 'Reserve your seat',
href: '#rsvp',
variant: 'primary',
},
],
},
sections: [
{
type: 'single-column',
title: 'Details',
children: (
<div className="flex flex-col items-center gap-2 text-foreground-light">
<p className="text-lg font-medium text-foreground">Date</p>
<p>October 1, 2026</p>
<p className="mt-4 text-lg font-medium text-foreground">Location</p>
<p>Penny Roma</p>
<p>San Francisco, CA</p>
<p className="mt-4 text-lg font-medium text-foreground">Schedule</p>
<p>7:00 PM — Cocktails and introductions</p>
<p>7:30 PM — Dinner and discussion</p>
</div>
),
},
{
type: 'single-column',
title: 'Your hosts',
children: (
<div className="border border-muted rounded-xl overflow-hidden">
<div className="grid grid-cols-1 md:grid-cols-3">
<div className="flex flex-col items-center gap-4 p-6 sm:p-8 md:border-r border-muted max-md:border-b text-center">
{sugu?.author_image_url && (
<Image
src={sugu.author_image_url}
alt={sugu.author}
width={192}
height={192}
className="rounded-full object-cover aspect-square w-48 h-48"
/>
)}
<div className="flex flex-col items-center gap-0">
<p className="text-foreground font-medium text-base">{sugu?.author}</p>
<p className="text-foreground-lighter text-sm mt-2 leading-relaxed">
{sugu?.position && `${sugu.position}, `}Supabase
</p>
</div>
</div>
<div className="flex flex-col items-center gap-4 p-6 sm:p-8 md:border-r border-muted max-md:border-b text-center">
{paul?.author_image_url && (
<Image
src={paul.author_image_url}
alt={paul.author}
width={192}
height={192}
className="rounded-full object-cover aspect-square w-48 h-48"
/>
)}
<div className="flex flex-col items-center gap-0">
<p className="text-foreground font-medium text-base">{paul?.author}</p>
<p className="text-foreground-lighter text-sm mt-2 leading-relaxed">
{paul?.position && `${paul.position}, `}Supabase
</p>
</div>
</div>
<div className="flex flex-col items-center gap-4 p-6 sm:p-8 text-center">
{ant?.author_image_url && (
<Image
src={ant.author_image_url}
alt={ant.author}
width={192}
height={192}
className="rounded-full object-cover aspect-square w-48 h-48"
/>
)}
<div className="flex flex-col items-center gap-0">
<p className="text-foreground font-medium text-base">{ant?.author}</p>
<p className="text-foreground-lighter text-sm mt-2 leading-relaxed">
{ant?.position && `${ant.position}, `}Supabase
</p>
</div>
</div>
</div>
</div>
),
},
{
type: 'form',
id: 'rsvp',
title: 'Reserve your seat',
description: "Space is limited. Let us know you're coming.",
fields: [
{
type: 'text',
name: 'first_name',
label: 'First Name',
placeholder: 'First Name',
required: true,
half: true,
},
{
type: 'text',
name: 'last_name',
label: 'Last Name',
placeholder: 'Last Name',
required: true,
half: true,
},
{
type: 'email',
name: 'email_address',
label: 'Email',
placeholder: 'Work email',
required: true,
},
{
type: 'text',
name: 'company_name',
label: 'Company',
placeholder: 'ACME, Inc.',
required: true,
},
{
type: 'text',
name: 'job_title',
label: 'Job Title',
placeholder: 'VP of Engineering',
required: false,
},
{
type: 'text',
name: 'phone_number',
label: 'Phone Number',
placeholder: '+1 212 555 1212',
required: false,
},
{
type: 'select',
name: 'attending',
label: 'Are you attending Select 2026?',
placeholder: 'Select an option',
required: true,
options: [
{ label: 'Yes', value: 'Yes' },
{ label: 'No', value: 'No' },
],
},
],
submitLabel: 'Confirm RSVP',
successRedirect: '/go/select-2026/vip-experience/thank-you',
disclaimer:
'By submitting this form, I confirm that I have read and understood the [Privacy Policy](https://supabase.com/privacy).',
crm: {
hubspot: {
formGuid: '3803133e-fbc9-4850-80b5-987b57cf0e8a',
fieldMap: {
first_name: 'firstname',
last_name: 'lastname',
email_address: 'email',
company_name: 'company',
job_title: 'jobtitle',
phone_number: 'phone',
},
// `attending` is a Notion-only field — keep it out of the HubSpot payload.
excludeFields: ['attending'],
consent:
'By submitting this form, I confirm that I have read and understood the Privacy Policy.',
},
notion: {
database_id: '37d5004b775f80f4b050fd6385736010',
columnMap: {
first_name: 'First Name',
last_name: 'Last Name',
email_address: 'Email',
company_name: 'Company',
job_title: 'Job Title',
phone_number: 'Phone Number',
attending: 'Attending',
},
},
},
},
],
}
export default page
+12
View File
@@ -10,6 +10,12 @@ import pgconfDev2026Contest from './events/pgconf-dev-2026/contest'
import pgconfDev2026ContestThankYou from './events/pgconf-dev-2026/contest-thank-you'
import postgresconfContest from './events/postgresconf-sjc-2026/contest'
import postgresconfContestThankYou from './events/postgresconf-sjc-2026/contest-thank-you'
import selectPartnerDay from './events/select-2026/partner-day'
import selectPartnerDayThankYou from './events/select-2026/partner-day-thank-you'
import selectVipDinner from './events/select-2026/vip-dinner'
import selectVipDinnerThankYou from './events/select-2026/vip-dinner-thank-you'
import selectVipExperience from './events/select-2026/vip-experience'
import selectVipExperienceThankYou from './events/select-2026/vip-experience-thank-you'
import startupGrindContest from './events/startup-grind-2026/contest'
import stripeSessionsContest from './events/stripe-sessions-2026/contest'
import stripeExecDinner from './events/stripe-sessions-2026/exec-dinner'
@@ -46,6 +52,12 @@ const pages: GoPageInput[] = [
datadogDinner, // remove after June 30, 2026
aiEngineerEuropeContest,
aiEngineerEuropeContestThankYou,
selectVipDinner, // remove after Select 2026
selectVipDinnerThankYou, // remove after Select 2026
selectVipExperience, // remove after Select 2026
selectVipExperienceThankYou, // remove after Select 2026
selectPartnerDay, // remove after Select 2026
selectPartnerDayThankYou, // remove after Select 2026
startupGrindContest, // remove after May 31, 2026
supabaseStripeProjects,
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

@@ -217,8 +217,10 @@ export async function submitFormAction(
let consent: string | undefined
if (crm.hubspot) {
const fieldMap = crm.hubspot.fieldMap ?? {}
const excludeFields = new Set(crm.hubspot.excludeFields ?? [])
hubspotFields = {}
for (const [formField, value] of Object.entries(payloadValues)) {
if (excludeFields.has(formField)) continue
const hsField = fieldMap[formField] ?? formField
hubspotFields[hsField] = value
}
+8
View File
@@ -201,6 +201,14 @@ export const hubspotFormConfigSchema = z.object({
* Example: { workEmail: 'email', companyName: 'company' }
*/
fieldMap: z.record(z.string(), z.string()).optional(),
/**
* Form field `name`s to NOT forward to HubSpot. Use this for fields that
* should only reach another provider (e.g. Notion-only fields). By default
* every submitted field is sent to HubSpot, so an unmapped field a HubSpot
* form doesn't define would otherwise cause the whole submission to fail.
* Example: ['attending']
*/
excludeFields: z.array(z.string()).optional(),
/** Legal consent text for GDPR. */
consent: z.string().optional(),
})