mirror of
https://github.com/formbricks/formbricks.git
synced 2025-12-30 10:19:51 -06:00
Compare commits
2 Commits
4.4.3
...
ReviewBot/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71075ea36a | ||
|
|
bcf039030e |
@@ -137,3 +137,7 @@ ENTERPRISE_LICENSE_KEY=
|
|||||||
|
|
||||||
# set to 1 to skip onboarding for new users
|
# set to 1 to skip onboarding for new users
|
||||||
# ONBOARDING_DISABLED=1
|
# ONBOARDING_DISABLED=1
|
||||||
|
|
||||||
|
# Send new users to customer.io
|
||||||
|
# CUSTOMER_IO_API_KEY=
|
||||||
|
# CUSTOMER_IO_SITE_ID=
|
||||||
|
|||||||
27
packages/lib/customerio.ts
Normal file
27
packages/lib/customerio.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { TUser } from "@formbricks/types/user";
|
||||||
|
|
||||||
|
import { env } from "./env.mjs";
|
||||||
|
|
||||||
|
export const createCustomerIoCustomer = async (user: TUser) => {
|
||||||
|
if (!env.CUSTOMER_IO_SITE_ID || !env.CUSTOMER_IO_API_KEY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const res = await fetch(`https://track-eu.customer.io/api/v1/customers/${user.id}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
Authorization: `Basic ${auth}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
id: user.id,
|
||||||
|
email: user.email,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
if (res.status !== 200) {
|
||||||
|
throw new Error(`Error sending user to CustomerIO: ${await res.text()}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error sending user to CustomerIO:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,6 +7,9 @@ export const env = createEnv({
|
|||||||
* Will throw if you access these variables on the client.
|
* Will throw if you access these variables on the client.
|
||||||
*/
|
*/
|
||||||
server: {
|
server: {
|
||||||
|
CUSTOMER_IO_API_KEY: z.string().optional(),
|
||||||
|
CUSTOMER_IO_SITE_ID: z.string().optional(),
|
||||||
|
NEXT_PUBLIC_POSTHOG_API_HOST: z.string().optional(),
|
||||||
WEBAPP_URL: z.string().url().optional(),
|
WEBAPP_URL: z.string().url().optional(),
|
||||||
DATABASE_URL: z.string().url(),
|
DATABASE_URL: z.string().url(),
|
||||||
ENCRYPTION_KEY: z.string().length(64).or(z.string().length(32)),
|
ENCRYPTION_KEY: z.string().length(64).or(z.string().length(32)),
|
||||||
@@ -96,6 +99,8 @@ export const env = createEnv({
|
|||||||
* 💡 You'll get type errors if not all variables from `server` & `client` are included here.
|
* 💡 You'll get type errors if not all variables from `server` & `client` are included here.
|
||||||
*/
|
*/
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
|
CUSTOMER_IO_API_KEY: process.env.CUSTOMER_IO_API_KEY,
|
||||||
|
CUSTOMER_IO_SITE_ID: process.env.CUSTOMER_IO_SITE_ID,
|
||||||
WEBAPP_URL: process.env.WEBAPP_URL,
|
WEBAPP_URL: process.env.WEBAPP_URL,
|
||||||
DATABASE_URL: process.env.DATABASE_URL,
|
DATABASE_URL: process.env.DATABASE_URL,
|
||||||
ENCRYPTION_KEY: process.env.ENCRYPTION_KEY,
|
ENCRYPTION_KEY: process.env.ENCRYPTION_KEY,
|
||||||
@@ -146,7 +151,7 @@ export const env = createEnv({
|
|||||||
AZUREAD_CLIENT_ID: process.env.AZUREAD_CLIENT_ID,
|
AZUREAD_CLIENT_ID: process.env.AZUREAD_CLIENT_ID,
|
||||||
AZUREAD_CLIENT_SECRET: process.env.AZUREAD_CLIENT_SECRET,
|
AZUREAD_CLIENT_SECRET: process.env.AZUREAD_CLIENT_SECRET,
|
||||||
AZUREAD_TENANT_ID: process.env.AZUREAD_TENANT_ID,
|
AZUREAD_TENANT_ID: process.env.AZUREAD_TENANT_ID,
|
||||||
AIR_TABLE_CLIENT_ID: process.env.AIR_TABLE_CLIENT_ID,
|
AIRTABLE_CLIENT_ID: process.env.AIRTABLE_CLIENT_ID,
|
||||||
DEFAULT_TEAM_ID: process.env.DEFAULT_TEAM_ID,
|
DEFAULT_TEAM_ID: process.env.DEFAULT_TEAM_ID,
|
||||||
DEFAULT_TEAM_ROLE: process.env.DEFAULT_TEAM_ROLE,
|
DEFAULT_TEAM_ROLE: process.env.DEFAULT_TEAM_ROLE,
|
||||||
ONBOARDING_DISABLED: process.env.ONBOARDING_DISABLED,
|
ONBOARDING_DISABLED: process.env.ONBOARDING_DISABLED,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { TMembership } from "@formbricks/types/memberships";
|
|||||||
import { TUser, TUserCreateInput, TUserUpdateInput, ZUser, ZUserUpdateInput } from "@formbricks/types/user";
|
import { TUser, TUserCreateInput, TUserUpdateInput, ZUser, ZUserUpdateInput } from "@formbricks/types/user";
|
||||||
|
|
||||||
import { SERVICES_REVALIDATION_INTERVAL } from "../constants";
|
import { SERVICES_REVALIDATION_INTERVAL } from "../constants";
|
||||||
|
import { createCustomerIoCustomer } from "../customerio";
|
||||||
import { updateMembership } from "../membership/service";
|
import { updateMembership } from "../membership/service";
|
||||||
import { deleteTeam } from "../team/service";
|
import { deleteTeam } from "../team/service";
|
||||||
import { formatDateFields } from "../utils/datetime";
|
import { formatDateFields } from "../utils/datetime";
|
||||||
@@ -171,6 +172,9 @@ export const createUser = async (data: TUserCreateInput): Promise<TUser> => {
|
|||||||
id: user.id,
|
id: user.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// send new user customer.io to customer.io
|
||||||
|
createCustomerIoCustomer(user);
|
||||||
|
|
||||||
return user;
|
return user;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,8 @@
|
|||||||
"DEFAULT_TEAM_ROLE",
|
"DEFAULT_TEAM_ROLE",
|
||||||
"ONBOARDING_DISABLED",
|
"ONBOARDING_DISABLED",
|
||||||
"CRON_SECRET",
|
"CRON_SECRET",
|
||||||
|
"CUSTOMER_IO_API_KEY",
|
||||||
|
"CUSTOMER_IO_SITE_ID",
|
||||||
"DEBUG",
|
"DEBUG",
|
||||||
"EMAIL_VERIFICATION_DISABLED",
|
"EMAIL_VERIFICATION_DISABLED",
|
||||||
"ENCRYPTION_KEY",
|
"ENCRYPTION_KEY",
|
||||||
|
|||||||
Reference in New Issue
Block a user