diff --git a/.changeset/rotten-fireants-sniff.md b/.changeset/rotten-fireants-sniff.md new file mode 100644 index 0000000..98a2c86 --- /dev/null +++ b/.changeset/rotten-fireants-sniff.md @@ -0,0 +1,5 @@ +--- +'pliny': minor +--- + +Add hubspot newsletter integration diff --git a/README.md b/README.md index 5b0fa86..991626d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Pliny provides out of the box components to enhance your static site: - Klaviyo - Mailchimp - Beehiiv + - Hubspot - Command palette search with tailwind style sheet - Algolia - Kbar (local search) diff --git a/packages/pliny/src/config.ts b/packages/pliny/src/config.ts index aa26e21..d1e1f31 100644 --- a/packages/pliny/src/config.ts +++ b/packages/pliny/src/config.ts @@ -74,7 +74,7 @@ const sampleConfig: PlinyConfig = { }, }, newsletter: { - // supports mailchimp, buttondown, convertkit, klaviyo, emailOctopus + // supports mailchimp, buttondown, convertkit, klaviyo, emailOctopus, hubspot // Please add your .env file and modify it according to your selection provider: 'buttondown', }, diff --git a/packages/pliny/src/newsletter/hubspot.ts b/packages/pliny/src/newsletter/hubspot.ts new file mode 100644 index 0000000..1b3b21e --- /dev/null +++ b/packages/pliny/src/newsletter/hubspot.ts @@ -0,0 +1,28 @@ +export const hubspotSubscribe = async (email: string) => { + const PORTAL_ID = process.env.HUBSPOT_PORTAL_ID + const FORM_ID = process.env.HUBSPOT_FORM_ID + const API_URL = 'https://api.hsforms.com/submissions/v3/integration/submit/' + + const data = { + "submittedAt": (new Date()).getTime(), + "fields": [ + { + "objectTypeId": "0-1", + "name": "email", + "value": email + } + ] + } + + const API_ROUTE = `${API_URL}/${PORTAL_ID}/${FORM_ID}` + + const response = await fetch(API_ROUTE, { + body: JSON.stringify(data), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }) + + return response +} diff --git a/packages/pliny/src/newsletter/index.ts b/packages/pliny/src/newsletter/index.ts index 9a8ba67..50ae6b2 100644 --- a/packages/pliny/src/newsletter/index.ts +++ b/packages/pliny/src/newsletter/index.ts @@ -7,9 +7,10 @@ import { mailchimpSubscribe } from './mailchimp' import { klaviyoSubscribe } from './klaviyo' import { emailOctopusSubscribe } from './emailOctopus' import { beehiivSubscribe } from './beehiiv' +import { hubspotSubscribe } from './hubspot' export interface NewsletterConfig { - provider: 'buttondown' | 'convertkit' | 'klaviyo' | 'mailchimp' | 'emailoctopus' | 'beehiiv' + provider: 'buttondown' | 'convertkit' | 'klaviyo' | 'mailchimp' | 'emailoctopus' | 'beehiiv' | 'hubspot' } export interface NewsletterRequest extends NextApiRequest { @@ -48,6 +49,9 @@ async function NewsletterAPIHandler( case 'beehiiv': response = await beehiivSubscribe(email) break + case 'hubspot': + response = await hubspotSubscribe(email) + break default: res.status(500).json({ error: `${options.provider} not supported` }) } @@ -86,6 +90,9 @@ async function NewsletterRouteHandler(req: NextRequest, options: NewsletterConfi case 'beehiiv': response = await beehiivSubscribe(email) break + case 'hubspot': + response = await hubspotSubscribe(email) + break default: return NextResponse.json({ error: `${options.provider} not supported` }, { status: 500 }) }