diff --git a/apps/web/src/server/service/campaign-service.ts b/apps/web/src/server/service/campaign-service.ts index 40964ec..4af9bc3 100644 --- a/apps/web/src/server/service/campaign-service.ts +++ b/apps/web/src/server/service/campaign-service.ts @@ -20,6 +20,11 @@ import { logger } from "../logger/log"; import { createWorkerHandler, TeamJob } from "../queue/bullmq-context"; import { SuppressionService } from "./suppression-service"; +const CAMPAIGN_UNSUB_PLACEHOLDER_TOKENS = [ + "{{unsend_unsubscribe_url}}", + "{{usesend_unsubscribe_url}}", +]; + export async function sendCampaign(id: string) { let campaign = await db.campaign.findUnique({ where: { id }, @@ -71,6 +76,18 @@ export async function sendCampaign(id: string) { throw new Error("No HTML content for campaign"); } + const unsubPlaceholderFound = CAMPAIGN_UNSUB_PLACEHOLDER_TOKENS.some( + (placeholder) => + campaign.content?.includes(placeholder) || + campaign.html?.includes(placeholder) + ); + + if (!unsubPlaceholderFound) { + throw new Error( + "Campaign must include an unsubscribe link before sending" + ); + } + await sendCampaignEmail(campaign, { campaignId: campaign.id, from: campaign.from,