mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 01:45:10 +03:00
Added a new AWS Activate offer page (#44957)
## 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 a new go page for AWS Activate offers. Needed to embed a HubSpot form directly as it has conditional formatting, which is not supported on the go pages natively. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * New AWS Activate Offer landing page added to the platform * Integrated form system for capturing user information in the offer flow <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
1 parent
cacee2585b
commit
7f8cc65fa9
3 files changed
+215
No files matched your search
@@ -16,6 +16,7 @@ import stripeExecDinnerThankYou from './events/stripe-sessions-2026/exec-dinner-
|
||||
import stripeMeetingScheduler from './events/stripe-sessions-2026/meeting-scheduler'
|
||||
import stripeParty from './events/stripe-sessions-2026/party'
|
||||
import sxswContest from './events/sxsw-2026/contest'
|
||||
import awsActivateOffer from './lead-gen/aws-activate-offer'
|
||||
import exampleLeadGen from './lead-gen/example-lead-gen'
|
||||
import amoe from './legal/amoe'
|
||||
import amoeThankYou from './legal/amoe-thankyou'
|
||||
@@ -29,6 +30,7 @@ import figmaWebinarMay2026ThankYou from './webinar/figma-webinar-may2026-thankyo
|
||||
import promptToProdSentry from './webinar/prompt-to-prod-sentry'
|
||||
|
||||
const pages: GoPageInput[] = [
|
||||
awsActivateOffer,
|
||||
exampleLeadGen,
|
||||
byocEarlyAccess,
|
||||
amoe,
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
import type { GoPageInput } from 'marketing'
|
||||
|
||||
import HubSpotFormEmbed from './components/HubSpotFormEmbed'
|
||||
|
||||
const page: GoPageInput = {
|
||||
template: 'lead-gen',
|
||||
slug: 'aws-activate-offer',
|
||||
metadata: {
|
||||
title: 'Get $300 in Supabase credits through AWS Activate',
|
||||
description:
|
||||
'Exclusively for VC-backed startups accessing Supabase through AWS Activate. Apply to receive $300 in Supabase credits.',
|
||||
noIndex: true,
|
||||
},
|
||||
hero: {
|
||||
title: 'Get $300 in Supabase credits through AWS Activate',
|
||||
description:
|
||||
'This offer is exclusively for VC-backed startups accessing Supabase through AWS Activate. Complete the form below to apply.',
|
||||
image: {
|
||||
src: 'https://zhfonblqamxferhoguzj.supabase.co/functions/v1/generate-og?template=partnerships&layout=icon-only©=%5B%24300%5D+in+credits+for%0AAWS+Activate+startups&icon=supabase.svg&icon2=aws.svg',
|
||||
alt: 'Supabase and AWS Activate: $300 in credits for eligible startups',
|
||||
width: 600,
|
||||
height: 315,
|
||||
},
|
||||
ctas: [
|
||||
{
|
||||
label: 'Apply for your credits',
|
||||
href: '#form',
|
||||
variant: 'primary',
|
||||
},
|
||||
],
|
||||
},
|
||||
sections: [
|
||||
{
|
||||
type: 'single-column',
|
||||
title: 'About the offer',
|
||||
description:
|
||||
'Supabase is the easy-to-use, open-source managed Postgres with integrated backend services. With this exclusive AWS Activate offer, eligible startups receive $300 in Supabase credits to build, scale, and ship faster.',
|
||||
},
|
||||
{
|
||||
type: 'feature-grid',
|
||||
title: 'What the credits unlock',
|
||||
description: 'An all-in-one suite built on Postgres. Use one or all.',
|
||||
columns: 3,
|
||||
items: [
|
||||
{
|
||||
title: 'Database',
|
||||
description: 'A full Postgres instance hosted in the cloud.',
|
||||
},
|
||||
{
|
||||
title: 'Auth',
|
||||
description:
|
||||
'A complete user management system with email, social, and passwordless login.',
|
||||
},
|
||||
{
|
||||
title: 'Storage',
|
||||
description: 'Upload and serve files of any size.',
|
||||
},
|
||||
{
|
||||
title: 'Edge Functions',
|
||||
description: 'Server-side TypeScript functions, distributed globally at the edge.',
|
||||
},
|
||||
{
|
||||
title: 'Realtime',
|
||||
description: 'Live sync for collaborative applications, powered by Postgres replication.',
|
||||
},
|
||||
{
|
||||
title: 'Vector',
|
||||
description: 'pgvector for fast semantic search and embedding storage.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'steps',
|
||||
title: 'Eligibility requirements',
|
||||
description: 'To qualify for this offer you must:',
|
||||
items: [
|
||||
{ title: 'Be a VC-backed startup with less than $5M in total funding' },
|
||||
{ title: 'Have an active AWS account' },
|
||||
{ title: 'Not have previously redeemed this offer' },
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'faq',
|
||||
title: 'Frequently asked questions',
|
||||
items: [
|
||||
{
|
||||
question: 'Who is this offer for?',
|
||||
answer:
|
||||
'VC-backed startups with less than $5M in total funding and an active AWS account.',
|
||||
},
|
||||
{
|
||||
question: 'What can I use the credits for?',
|
||||
answer:
|
||||
'Credits apply to any Supabase product including database, auth, storage, and edge functions.',
|
||||
},
|
||||
{
|
||||
question: 'How long does it take to hear back?',
|
||||
answer:
|
||||
"We review applications within 5 business days. You'll receive a confirmation email once submitted.",
|
||||
},
|
||||
{
|
||||
question: 'What happens after I apply?',
|
||||
answer:
|
||||
'If your application is approved, a member of our team will reach out to activate your credits.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'single-column',
|
||||
id: 'form',
|
||||
title: 'Apply for your credits',
|
||||
children: (
|
||||
<div className="mx-auto w-full max-w-2xl border border-muted rounded-2xl p-6 sm:p-8">
|
||||
<HubSpotFormEmbed portalId="19953346" formId="db2718f8-1f23-4fe1-aaab-b4924dc4ca54" />
|
||||
</div>
|
||||
),
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default page
|
||||
@@ -0,0 +1,92 @@
|
||||
'use client'
|
||||
|
||||
import { useEffect, useId } from 'react'
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
hbspt?: {
|
||||
forms: {
|
||||
create: (config: { portalId: string; formId: string; target: string }) => void
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const HUBSPOT_SCRIPT_SRC = 'https://js.hsforms.net/forms/embed/v2.js'
|
||||
|
||||
function loadHubSpotScript(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (window.hbspt) {
|
||||
resolve()
|
||||
return
|
||||
}
|
||||
|
||||
const existing = document.querySelector<HTMLScriptElement>(
|
||||
`script[src="${HUBSPOT_SCRIPT_SRC}"]`
|
||||
)
|
||||
if (existing) {
|
||||
existing.addEventListener('load', () => resolve(), { once: true })
|
||||
existing.addEventListener(
|
||||
'error',
|
||||
() => reject(new Error('Failed to load HubSpot form script')),
|
||||
{
|
||||
once: true,
|
||||
}
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
const script = document.createElement('script')
|
||||
script.src = HUBSPOT_SCRIPT_SRC
|
||||
script.async = true
|
||||
script.defer = true
|
||||
script.onload = () => resolve()
|
||||
script.onerror = () => reject(new Error('Failed to load HubSpot form script'))
|
||||
document.body.appendChild(script)
|
||||
})
|
||||
}
|
||||
|
||||
export default function HubSpotFormEmbed({
|
||||
portalId,
|
||||
formId,
|
||||
}: {
|
||||
portalId: string
|
||||
formId: string
|
||||
}) {
|
||||
const targetId = `hubspot-form-${useId().replace(/:/g, '-')}`
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false
|
||||
|
||||
const mountForm = async () => {
|
||||
try {
|
||||
await loadHubSpotScript()
|
||||
if (cancelled || !window.hbspt) return
|
||||
|
||||
const target = document.getElementById(targetId)
|
||||
if (!target) return
|
||||
|
||||
// Reset target to avoid duplicate forms on remounts.
|
||||
while (target.firstChild) {
|
||||
target.removeChild(target.firstChild)
|
||||
}
|
||||
|
||||
window.hbspt.forms.create({
|
||||
portalId,
|
||||
formId,
|
||||
target: `#${targetId}`,
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('[go/hubspot] Failed to initialize HubSpot form embed', error)
|
||||
}
|
||||
}
|
||||
|
||||
mountForm()
|
||||
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [formId, portalId, targetId])
|
||||
|
||||
return <div id={targetId} />
|
||||
}
|
||||
Reference in new issue
Block a user