diff --git a/apps/web/app/api/v1/users/route.ts b/apps/web/app/api/v1/users/route.ts index e746e34393..df26c45800 100644 --- a/apps/web/app/api/v1/users/route.ts +++ b/apps/web/app/api/v1/users/route.ts @@ -2,7 +2,11 @@ import { NextResponse } from "next/server"; import { prisma } from "@formbricks/database"; import { EMAIL_VERIFICATION_DISABLED, INVITE_DISABLED, SIGNUP_ENABLED } from "@formbricks/lib/constants"; -import { sendInviteAcceptedEmail, sendVerificationEmail } from "@formbricks/lib/emails/emails"; +import { + sendGettingStartedEmail, + sendInviteAcceptedEmail, + sendVerificationEmail, +} from "@formbricks/lib/emails/emails"; import { env } from "@formbricks/lib/env.mjs"; import { deleteInvite } from "@formbricks/lib/invite/service"; import { verifyInviteToken } from "@formbricks/lib/jwt"; @@ -50,6 +54,8 @@ export async function POST(request: Request) { if (!EMAIL_VERIFICATION_DISABLED) { await sendVerificationEmail(user); + } else { + await sendGettingStartedEmail(user); } await sendInviteAcceptedEmail(invite.creator.name, user.name, invite.creator.email); @@ -81,6 +87,8 @@ export async function POST(request: Request) { // send verification email amd return user if (!EMAIL_VERIFICATION_DISABLED) { await sendVerificationEmail(user); + } else { + await sendGettingStartedEmail(user); } return NextResponse.json(user); } catch (e) { diff --git a/packages/lib/authOptions.ts b/packages/lib/authOptions.ts index b79d3ad886..98d14a6a5d 100644 --- a/packages/lib/authOptions.ts +++ b/packages/lib/authOptions.ts @@ -10,6 +10,7 @@ import { prisma } from "@formbricks/database"; import { createAccount } from "./account/service"; import { verifyPassword } from "./auth/util"; import { EMAIL_VERIFICATION_DISABLED } from "./constants"; +import { sendGettingStartedEmail } from "./emails/emails"; import { env } from "./env.mjs"; import { verifyToken } from "./jwt"; import { createMembership } from "./membership/service"; @@ -113,6 +114,7 @@ export const authOptions: NextAuthOptions = { } user = await updateUser(user.id, { emailVerified: new Date() }); + await sendGettingStartedEmail(user); return user; }, @@ -221,6 +223,7 @@ export const authOptions: NextAuthOptions = { identityProvider: provider, identityProviderAccountId: account.providerAccountId, }); + await sendGettingStartedEmail(userProfile); // Default team assignment if env variable is set if (env.DEFAULT_TEAM_ID && env.DEFAULT_TEAM_ID.length > 0) { // check if team exists diff --git a/packages/lib/emails/email-template.ts b/packages/lib/emails/email-template.ts index e3e3bae902..8ba3d9f737 100644 --- a/packages/lib/emails/email-template.ts +++ b/packages/lib/emails/email-template.ts @@ -15,7 +15,7 @@ export const withEmailTemplate = (content: string) => font-family: "Poppins", "Helvetica Neue", "Segoe UI", Helvetica, sans-serif; font-size: 15px; - font-weight: 300; + font-weight: 500; line-height: 26px; margin: 0; color: #1e293b; @@ -143,7 +143,7 @@ export const withEmailTemplate = (content: string) => " >
- + Formbricks Logo Formbricks ${new Date().getFullYear()}. All rights reserved.
Imprint | Privacy Policy diff --git a/packages/lib/emails/emails.ts b/packages/lib/emails/emails.ts index 401db4029b..893ee1b756 100644 --- a/packages/lib/emails/emails.ts +++ b/packages/lib/emails/emails.ts @@ -33,6 +33,10 @@ interface TEmailUser { email: string; } +interface TEmailUserWithName extends TEmailUser { + name: string | null; +} + export interface LinkSurveyEmailData { surveyId: string; email: string; @@ -78,11 +82,12 @@ export const sendVerificationEmail = async (user: TEmailUser) => { )}`; await sendEmail({ to: user.email, - subject: "Welcome to Formbricks 🤍", - html: withEmailTemplate(`

Welcome!

- To start using Formbricks please verify your email by clicking the button below:

- Confirm email
-
+ subject: "Please verify your email to use Formbricks", + html: withEmailTemplate(`

Almost there!

+ To start using Formbricks please verify your email below:

+ Verify email

+ You can also click on this link:
+ ${verifyLink}

The link is valid for 24h.

If it has expired please request a new token here: Request new verification

@@ -90,6 +95,34 @@ export const sendVerificationEmail = async (user: TEmailUser) => { }); }; +export const sendGettingStartedEmail = async (user: TEmailUserWithName) => { + await sendEmail({ + to: user.email, + subject: "Get started with Formbricks 🤸", + html: withEmailTemplate(` +

Turn customer insights into irresistable experiences

+ Formbricks can do it all +

Welcome to Formbricks! 🤗

+

We're the fastest growing Experience Management platform! Gracefully collect feedback without survey fatigue. Are you ready?

+
+ Create your survey
+
+ Formbricks can do it all +

Collect feedback everywhere!

+

Formbricks is very versatile. Run:

+ +

All on one, open source platform ✅

+ Create your survey
+

Life is short, craft something irresistable!
The Formbricks Team 🤍

+ `), + }); +}; + export const sendForgotPasswordEmail = async (user: TEmailUser) => { const token = createToken(user.id, user.email, { expiresIn: "1d", @@ -187,7 +220,7 @@ export const sendResponseFinishedEmail = async ( View all responses + }/responses?utm_source=email_notification&utm_medium=email&utm_content=view_responses_CTA">View all responses

Start a conversation 💡

diff --git a/packages/lib/membership/service.ts b/packages/lib/membership/service.ts index f88b3112ac..6f482fc94f 100644 --- a/packages/lib/membership/service.ts +++ b/packages/lib/membership/service.ts @@ -116,7 +116,6 @@ export const createMembership = async ( data: Partial ): Promise => { validateInputs([teamId, ZString], [userId, ZString], [data, ZMembership.partial()]); - console.log("createMembership", teamId, userId, data); try { const membership = await prisma.membership.create({