payload-plugin-newsletter 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## [0.25.0] - 2025-08-08
2
+
3
+ ### Changed
4
+ - **Improved welcome email behavior**: Plugin now properly handles all subscription scenarios
5
+ - New signups via frontend: Send welcome email ✓
6
+ - Resubscriptions via frontend: Send welcome email ✓
7
+ - Webhook imports (new subscribers): No welcome email ✓
8
+ - Webhook reactivations: No welcome email ✓
9
+ - **Resubscription support**: Users who resubscribe through the frontend now receive a "Welcome back" email
10
+ - **Better UX**: Welcome emails now check the `importedFromProvider` flag by default
11
+
12
+ ### Fixed
13
+ - Fixed missing welcome emails for user-initiated resubscriptions
14
+ - Fixed unwanted welcome emails for webhook-imported subscribers
15
+
16
+ ## [0.24.0] - 2025-08-08
17
+
18
+ ### Added
19
+ - **Skip welcome email for webhook imports**: Added `importedFromProvider` field to subscribers
20
+ - Set to `true` for all subscribers created via webhook events
21
+ - Allows projects to skip welcome emails for bulk imports from Broadcast
22
+ - Field is read-only in admin UI to prevent accidental changes
23
+
1
24
  ## [0.23.0] - 2025-08-07
2
25
 
3
26
  ### Added
package/dist/client.d.ts CHANGED
@@ -12,6 +12,7 @@ interface Subscriber {
12
12
  [key: string]: boolean | undefined;
13
13
  };
14
14
  source?: string;
15
+ importedFromProvider?: boolean;
15
16
  utmParameters?: {
16
17
  source?: string;
17
18
  medium?: string;
@@ -2967,6 +2967,17 @@ var createSubscribersCollection = (pluginConfig) => {
2967
2967
  admin: {
2968
2968
  description: "Where the subscriber signed up from"
2969
2969
  }
2970
+ },
2971
+ // Import tracking
2972
+ {
2973
+ name: "importedFromProvider",
2974
+ type: "checkbox",
2975
+ defaultValue: false,
2976
+ admin: {
2977
+ description: "Indicates this subscriber was imported from an external provider via webhook",
2978
+ position: "sidebar",
2979
+ readOnly: true
2980
+ }
2970
2981
  }
2971
2982
  ];
2972
2983
  if (pluginConfig.features?.utmTracking?.enabled) {
@@ -3077,7 +3088,7 @@ var createSubscribersCollection = (pluginConfig) => {
3077
3088
  } else {
3078
3089
  console.warn("[Newsletter Plugin] No email service configured for subscriber creation");
3079
3090
  }
3080
- if (doc.subscriptionStatus === "active" && emailService) {
3091
+ if (doc.subscriptionStatus === "active" && emailService && !doc.importedFromProvider) {
3081
3092
  try {
3082
3093
  const settings = await req.payload.findGlobal({
3083
3094
  slug: pluginConfig.settingsSlug || "newsletter-settings"
@@ -3123,6 +3134,30 @@ var createSubscribersCollection = (pluginConfig) => {
3123
3134
  console.warn("[Newsletter Plugin] No email service configured");
3124
3135
  }
3125
3136
  }
3137
+ if (doc.subscriptionStatus === "active" && previousDoc.subscriptionStatus === "unsubscribed" && !doc.importedFromProvider && emailService) {
3138
+ try {
3139
+ const settings = await req.payload.findGlobal({
3140
+ slug: pluginConfig.settingsSlug || "newsletter-settings"
3141
+ });
3142
+ const serverURL = req.payload.config.serverURL || process.env.PAYLOAD_PUBLIC_SERVER_URL || "";
3143
+ const html = await renderEmail("welcome", {
3144
+ email: doc.email,
3145
+ siteName: settings?.brandSettings?.siteName || "Newsletter",
3146
+ preferencesUrl: `${serverURL}/account/preferences`
3147
+ }, pluginConfig);
3148
+ await emailService.send({
3149
+ to: doc.email,
3150
+ subject: settings?.brandSettings?.siteName ? `Welcome back to ${settings.brandSettings.siteName}!` : "Welcome back!",
3151
+ html
3152
+ });
3153
+ console.warn(`Welcome email sent to resubscribed user: ${doc.email}`);
3154
+ } catch (error) {
3155
+ console.error("Failed to send resubscription welcome email:", error);
3156
+ }
3157
+ if (pluginConfig.hooks?.afterSubscribe) {
3158
+ await pluginConfig.hooks.afterSubscribe({ doc, req });
3159
+ }
3160
+ }
3126
3161
  if (doc.subscriptionStatus === "unsubscribed" && previousDoc.subscriptionStatus !== "unsubscribed") {
3127
3162
  doc.unsubscribedAt = (/* @__PURE__ */ new Date()).toISOString();
3128
3163
  if (pluginConfig.hooks?.afterUnsubscribe) {