diff --git a/apps/www/_go/events/select-2026/partner-day-thank-you.tsx b/apps/www/_go/events/select-2026/partner-day-thank-you.tsx new file mode 100644 index 00000000000..ddb582d94f7 --- /dev/null +++ b/apps/www/_go/events/select-2026/partner-day-thank-you.tsx @@ -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: ( +
+ +
+ ), + }, + ], +} + +export default page diff --git a/apps/www/_go/events/select-2026/partner-day.tsx b/apps/www/_go/events/select-2026/partner-day.tsx new file mode 100644 index 00000000000..ca3375ca1aa --- /dev/null +++ b/apps/www/_go/events/select-2026/partner-day.tsx @@ -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: ( +
+

Date

+

October 1, 2026

+

Location

+

San Francisco, CA

+

Schedule

+

2:00 PM — Arrival and light snacks

+

4:30 PM — Happy hour

+
+ ), + }, + { + type: 'single-column', + title: 'Agenda', + children: ( +
+ + + + + + + + + + {agenda.map((item, index) => ( + 0 ? 'border-t border-muted' : undefined}> + + + + + ))} + +
TimeSessionNotes
+ {item.time} + {item.session}{item.notes ?? ''}
+
+ ), + }, + { + 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 diff --git a/apps/www/_go/events/select-2026/vip-dinner-thank-you.tsx b/apps/www/_go/events/select-2026/vip-dinner-thank-you.tsx new file mode 100644 index 00000000000..26db2d8d7e3 --- /dev/null +++ b/apps/www/_go/events/select-2026/vip-dinner-thank-you.tsx @@ -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: ( +
+ +
+ ), + }, + ], +} + +export default page diff --git a/apps/www/_go/events/select-2026/vip-dinner.tsx b/apps/www/_go/events/select-2026/vip-dinner.tsx new file mode 100644 index 00000000000..2165bf8afc9 --- /dev/null +++ b/apps/www/_go/events/select-2026/vip-dinner.tsx @@ -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: ( +
+

Date

+

October 1, 2026

+

Location

+

Flour + Water

+

San Francisco, CA

+

Schedule

+

7:00 PM — Cocktails and introductions

+

7:30 PM — Dinner and discussion

+
+ ), + }, + { + type: 'single-column', + title: 'Your hosts', + children: ( +
+
+ {hosts.map((host, i) => ( +
+ {host?.author_image_url && ( + {host.author} + )} +
+

{host?.author}

+

+ {host?.position && `${host.position}, `}Supabase +

+
+
+ ))} +
+
+ ), + }, + { + 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 diff --git a/apps/www/_go/events/select-2026/vip-experience-thank-you.tsx b/apps/www/_go/events/select-2026/vip-experience-thank-you.tsx new file mode 100644 index 00000000000..50854651cd4 --- /dev/null +++ b/apps/www/_go/events/select-2026/vip-experience-thank-you.tsx @@ -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: ( +
+ +
+ ), + }, + ], +} + +export default page diff --git a/apps/www/_go/events/select-2026/vip-experience.tsx b/apps/www/_go/events/select-2026/vip-experience.tsx new file mode 100644 index 00000000000..a51eadb4d56 --- /dev/null +++ b/apps/www/_go/events/select-2026/vip-experience.tsx @@ -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: ( +
+

Date

+

October 1, 2026

+

Location

+

Penny Roma

+

San Francisco, CA

+

Schedule

+

7:00 PM — Cocktails and introductions

+

7:30 PM — Dinner and discussion

+
+ ), + }, + { + type: 'single-column', + title: 'Your hosts', + children: ( +
+
+
+ {sugu?.author_image_url && ( + {sugu.author} + )} +
+

{sugu?.author}

+

+ {sugu?.position && `${sugu.position}, `}Supabase +

+
+
+
+ {paul?.author_image_url && ( + {paul.author} + )} +
+

{paul?.author}

+

+ {paul?.position && `${paul.position}, `}Supabase +

+
+
+
+ {ant?.author_image_url && ( + {ant.author} + )} +
+

{ant?.author}

+

+ {ant?.position && `${ant.position}, `}Supabase +

+
+
+
+
+ ), + }, + { + 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 diff --git a/apps/www/_go/index.tsx b/apps/www/_go/index.tsx index 627d0d2ca9a..8f4b1d5672f 100644 --- a/apps/www/_go/index.tsx +++ b/apps/www/_go/index.tsx @@ -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, ] diff --git a/apps/www/public/images/landing-pages/select-2026/flourwater.jpg b/apps/www/public/images/landing-pages/select-2026/flourwater.jpg new file mode 100644 index 00000000000..b8d846ba81d Binary files /dev/null and b/apps/www/public/images/landing-pages/select-2026/flourwater.jpg differ diff --git a/apps/www/public/images/landing-pages/select-2026/pennyroma.jpg b/apps/www/public/images/landing-pages/select-2026/pennyroma.jpg new file mode 100644 index 00000000000..35a27f861f0 Binary files /dev/null and b/apps/www/public/images/landing-pages/select-2026/pennyroma.jpg differ diff --git a/packages/marketing/src/go/actions/submitForm.ts b/packages/marketing/src/go/actions/submitForm.ts index dddbc498b48..d3b1a84ab7b 100644 --- a/packages/marketing/src/go/actions/submitForm.ts +++ b/packages/marketing/src/go/actions/submitForm.ts @@ -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 } diff --git a/packages/marketing/src/go/schemas.ts b/packages/marketing/src/go/schemas.ts index 77bfc038407..0323f0dcf4b 100644 --- a/packages/marketing/src/go/schemas.ts +++ b/packages/marketing/src/go/schemas.ts @@ -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(), })