Suggested Labels
- Labels we suggest adding to organise your emails. Click a label
+ Labels we suggest adding to organize your emails. Click a label
to add it.
diff --git a/apps/web/app/api/lemon-squeezy/webhook/route.ts b/apps/web/app/api/lemon-squeezy/webhook/route.ts
index a9143608f3..a82887be76 100644
--- a/apps/web/app/api/lemon-squeezy/webhook/route.ts
+++ b/apps/web/app/api/lemon-squeezy/webhook/route.ts
@@ -294,6 +294,9 @@ function getSubscriptionTier({
return PremiumTier.BUSINESS_MONTHLY;
case env.NEXT_PUBLIC_BUSINESS_ANNUALLY_VARIANT_ID:
return PremiumTier.BUSINESS_ANNUALLY;
+
+ case env.NEXT_PUBLIC_COPILOT_MONTHLY_VARIANT_ID:
+ return PremiumTier.COPILOT_MONTHLY;
}
throw new Error(`Unknown variant id: ${variantId}`);
diff --git a/apps/web/app/blog/post/how-my-open-source-saas-hit-first-on-product-hunt/content.mdx b/apps/web/app/blog/post/how-my-open-source-saas-hit-first-on-product-hunt/content.mdx
index daf3fa9189..81e48afefa 100644
--- a/apps/web/app/blog/post/how-my-open-source-saas-hit-first-on-product-hunt/content.mdx
+++ b/apps/web/app/blog/post/how-my-open-source-saas-hit-first-on-product-hunt/content.mdx
@@ -172,7 +172,7 @@ Organize a list of people that will support your launch. My list was 100 people.
You can also add communities to the list. Many Slack or Discord communities have a channel to promote yourself. These are a good places to get some extra eyeballs. And of course LinkedIn, Twitter, Facebook groups, and other social media platforms you’re on.
-You could skip organizing the list ahead of time. But it adds a bit less pressure to the day of the launch if you have it organised.
+You could skip organizing the list ahead of time. But it adds a bit less pressure to the day of the launch if you have it organized.
I used a mini Notion CRM myself and had a status column for each person.
diff --git a/apps/web/env.ts b/apps/web/env.ts
index c7d19e180c..03fe64b329 100644
--- a/apps/web/env.ts
+++ b/apps/web/env.ts
@@ -66,6 +66,9 @@ export const env = createEnv({
NEXT_PUBLIC_BUSINESS_ANNUALLY_PAYMENT_LINK: z.string().default(""),
NEXT_PUBLIC_BUSINESS_MONTHLY_VARIANT_ID: z.coerce.number().default(0),
NEXT_PUBLIC_BUSINESS_ANNUALLY_VARIANT_ID: z.coerce.number().default(0),
+ // copilot
+ NEXT_PUBLIC_COPILOT_MONTHLY_PAYMENT_LINK: z.string().default(""),
+ NEXT_PUBLIC_COPILOT_MONTHLY_VARIANT_ID: z.coerce.number().default(0),
// lifetime
NEXT_PUBLIC_LIFETIME_PAYMENT_LINK: z.string().default(""),
NEXT_PUBLIC_LIFETIME_VARIANT_ID: z.coerce.number().default(0),
@@ -121,6 +124,11 @@ export const env = createEnv({
process.env.NEXT_PUBLIC_BUSINESS_MONTHLY_VARIANT_ID,
NEXT_PUBLIC_BUSINESS_ANNUALLY_VARIANT_ID:
process.env.NEXT_PUBLIC_BUSINESS_ANNUALLY_VARIANT_ID,
+ // copilot
+ NEXT_PUBLIC_COPILOT_MONTHLY_PAYMENT_LINK:
+ process.env.NEXT_PUBLIC_COPILOT_MONTHLY_PAYMENT_LINK,
+ NEXT_PUBLIC_COPILOT_MONTHLY_VARIANT_ID:
+ process.env.NEXT_PUBLIC_COPILOT_MONTHLY_VARIANT_ID,
// lifetime
NEXT_PUBLIC_LIFETIME_PAYMENT_LINK:
process.env.NEXT_PUBLIC_LIFETIME_PAYMENT_LINK,
diff --git a/apps/web/prisma/migrations/20240730122310_copilot_tier/migration.sql b/apps/web/prisma/migrations/20240730122310_copilot_tier/migration.sql
new file mode 100644
index 0000000000..2d73bced1b
--- /dev/null
+++ b/apps/web/prisma/migrations/20240730122310_copilot_tier/migration.sql
@@ -0,0 +1,2 @@
+-- AlterEnum
+ALTER TYPE "PremiumTier" ADD VALUE 'COPILOT_MONTHLY';
diff --git a/apps/web/prisma/schema.prisma b/apps/web/prisma/schema.prisma
index 199856d632..b1373a022d 100644
--- a/apps/web/prisma/schema.prisma
+++ b/apps/web/prisma/schema.prisma
@@ -374,6 +374,7 @@ enum PremiumTier {
PRO_ANNUALLY
BUSINESS_MONTHLY
BUSINESS_ANNUALLY
+ COPILOT_MONTHLY
LIFETIME
}
diff --git a/apps/web/utils/actions/premium.ts b/apps/web/utils/actions/premium.ts
index b4739bedbf..a4aa50b580 100644
--- a/apps/web/utils/actions/premium.ts
+++ b/apps/web/utils/actions/premium.ts
@@ -274,7 +274,8 @@ export async function changePremiumStatusAction(
options.period === PremiumTier.BUSINESS_ANNUALLY
? new Date(+new Date() + ONE_MONTH * 12)
: options.period === PremiumTier.PRO_MONTHLY ||
- options.period === PremiumTier.BUSINESS_MONTHLY
+ options.period === PremiumTier.BUSINESS_MONTHLY ||
+ options.period === PremiumTier.COPILOT_MONTHLY
? new Date(+new Date() + ONE_MONTH)
: null,
emailAccountsAccess: options.emailAccountsAccess,
diff --git a/apps/web/utils/premium/index.ts b/apps/web/utils/premium/index.ts
index cda2504082..9ae9911fbb 100644
--- a/apps/web/utils/premium/index.ts
+++ b/apps/web/utils/premium/index.ts
@@ -91,7 +91,8 @@ export function isOnHigherTier(
[PremiumTier.PRO_ANNUALLY]: 4,
[PremiumTier.BUSINESS_MONTHLY]: 5,
[PremiumTier.BUSINESS_ANNUALLY]: 6,
- [PremiumTier.LIFETIME]: 7,
+ [PremiumTier.COPILOT_MONTHLY]: 7,
+ [PremiumTier.LIFETIME]: 8,
};
const tier1Rank = tier1 ? tierRanking[tier1] : 0;
diff --git a/apps/web/utils/premium/server.ts b/apps/web/utils/premium/server.ts
index c6e321bcba..80191fdeda 100644
--- a/apps/web/utils/premium/server.ts
+++ b/apps/web/utils/premium/server.ts
@@ -129,6 +129,7 @@ function getTierAccess(tier: PremiumTier) {
};
case PremiumTier.BUSINESS_MONTHLY:
case PremiumTier.BUSINESS_ANNUALLY:
+ case PremiumTier.COPILOT_MONTHLY:
case PremiumTier.LIFETIME:
return {
bulkUnsubscribeAccess: FeatureAccess.UNLOCKED,
diff --git a/turbo.json b/turbo.json
index 3dd13da919..1dfa869f6f 100644
--- a/turbo.json
+++ b/turbo.json
@@ -38,27 +38,36 @@
"ADMINS",
"NEXT_PUBLIC_LEMON_STORE_ID",
+
"NEXT_PUBLIC_BASIC_MONTHLY_PAYMENT_LINK",
"NEXT_PUBLIC_BASIC_ANNUALLY_PAYMENT_LINK",
"NEXT_PUBLIC_BASIC_MONTHLY_VARIANT_ID",
"NEXT_PUBLIC_BASIC_ANNUALLY_VARIANT_ID",
+
"NEXT_PUBLIC_PRO_MONTHLY_PAYMENT_LINK",
"NEXT_PUBLIC_PRO_ANNUALLY_PAYMENT_LINK",
"NEXT_PUBLIC_PRO_MONTHLY_VARIANT_ID",
"NEXT_PUBLIC_PRO_ANNUALLY_VARIANT_ID",
+
"NEXT_PUBLIC_BUSINESS_MONTHLY_PAYMENT_LINK",
"NEXT_PUBLIC_BUSINESS_ANNUALLY_PAYMENT_LINK",
"NEXT_PUBLIC_BUSINESS_MONTHLY_VARIANT_ID",
"NEXT_PUBLIC_BUSINESS_ANNUALLY_VARIANT_ID",
+
+ "NEXT_PUBLIC_COPILOT_MONTHLY_PAYMENT_LINK",
+ "NEXT_PUBLIC_COPILOT_MONTHLY_VARIANT_ID",
+
"NEXT_PUBLIC_LIFETIME_PAYMENT_LINK",
"NEXT_PUBLIC_LIFETIME_VARIANT_ID",
"NEXT_PUBLIC_LIFETIME_EXTRA_SEATS_PAYMENT_LINK",
"NEXT_PUBLIC_LIFETIME_EXTRA_SEATS_VARIANT_ID",
+
"LICENSE_1_SEAT_VARIANT_ID",
"LICENSE_3_SEAT_VARIANT_ID",
"LICENSE_5_SEAT_VARIANT_ID",
"LICENSE_10_SEAT_VARIANT_ID",
"LICENSE_25_SEAT_VARIANT_ID",
+
"NEXT_PUBLIC_FREE_UNSUBSCRIBE_CREDITS",
"NEXT_PUBLIC_CALL_LINK",
"NEXT_PUBLIC_POSTHOG_KEY",