payload-plugin-newsletter 0.22.0 → 0.24.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/dist/server.d.ts CHANGED
@@ -493,6 +493,7 @@ interface Subscriber {
493
493
  [key: string]: boolean | undefined;
494
494
  };
495
495
  source?: string;
496
+ importedFromProvider?: boolean;
496
497
  utmParameters?: {
497
498
  source?: string;
498
499
  medium?: string;
package/dist/server.js CHANGED
@@ -454,6 +454,17 @@ var createSubscribersCollection = (pluginConfig) => {
454
454
  admin: {
455
455
  description: "Where the subscriber signed up from"
456
456
  }
457
+ },
458
+ // Import tracking
459
+ {
460
+ name: "importedFromProvider",
461
+ type: "checkbox",
462
+ defaultValue: false,
463
+ admin: {
464
+ description: "Indicates this subscriber was imported from an external provider via webhook",
465
+ position: "sidebar",
466
+ readOnly: true
467
+ }
457
468
  }
458
469
  ];
459
470
  if (pluginConfig.features?.utmTracking?.enabled) {
@@ -2442,6 +2453,9 @@ function verifyBroadcastWebhookSignature(payload, signature, timestamp, secret)
2442
2453
  // src/types/webhooks.ts
2443
2454
  var WEBHOOK_EVENT_TYPES = {
2444
2455
  // Subscriber events
2456
+ SUBSCRIBER_CREATED: "subscriber.created",
2457
+ SUBSCRIBER_UPDATED: "subscriber.updated",
2458
+ SUBSCRIBER_DELETED: "subscriber.deleted",
2445
2459
  SUBSCRIBER_SUBSCRIBED: "subscriber.subscribed",
2446
2460
  SUBSCRIBER_UNSUBSCRIBED: "subscriber.unsubscribed",
2447
2461
  // Broadcast events
@@ -2469,6 +2483,15 @@ async function handleSubscriberEvent(event, req, config) {
2469
2483
  const { payload } = req;
2470
2484
  const subscribersSlug = config.subscribersSlug || "subscribers";
2471
2485
  switch (event.type) {
2486
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_CREATED:
2487
+ await handleSubscriberCreated(event, payload, subscribersSlug);
2488
+ break;
2489
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_UPDATED:
2490
+ await handleSubscriberUpdated(event, payload, subscribersSlug);
2491
+ break;
2492
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_DELETED:
2493
+ await handleSubscriberDeleted(event, payload, subscribersSlug);
2494
+ break;
2472
2495
  case WEBHOOK_EVENT_TYPES.SUBSCRIBER_SUBSCRIBED:
2473
2496
  await handleSubscriberSubscribed(event, payload, subscribersSlug);
2474
2497
  break;
@@ -2515,6 +2538,7 @@ async function handleSubscriberSubscribed(event, payload, subscribersSlug) {
2515
2538
  subscriptionStatus: "active",
2516
2539
  subscribedAt: data.subscribed_at,
2517
2540
  externalId: data.id,
2541
+ importedFromProvider: true,
2518
2542
  attributes: data.attributes || {}
2519
2543
  }
2520
2544
  });
@@ -2557,6 +2581,111 @@ async function handleSubscriberUnsubscribed(event, payload, subscribersSlug) {
2557
2581
  throw error;
2558
2582
  }
2559
2583
  }
2584
+ async function handleSubscriberCreated(event, payload, subscribersSlug) {
2585
+ const { data } = event;
2586
+ try {
2587
+ const existing = await payload.find({
2588
+ collection: subscribersSlug,
2589
+ where: {
2590
+ email: {
2591
+ equals: data.email
2592
+ }
2593
+ },
2594
+ limit: 1
2595
+ });
2596
+ if (existing.docs.length > 0) {
2597
+ const subscriber = existing.docs[0];
2598
+ await payload.update({
2599
+ collection: subscribersSlug,
2600
+ id: subscriber.id,
2601
+ data: {
2602
+ name: data.name || subscriber.name,
2603
+ externalId: data.id,
2604
+ source: data.source || subscriber.source,
2605
+ // Don't change subscription status on created event
2606
+ ...data.attributes && { attributes: data.attributes }
2607
+ }
2608
+ });
2609
+ console.log("[Subscriber Handler] Updated existing subscriber on created event:", data.email);
2610
+ } else {
2611
+ await payload.create({
2612
+ collection: subscribersSlug,
2613
+ data: {
2614
+ email: data.email,
2615
+ name: data.name,
2616
+ subscriptionStatus: "pending",
2617
+ // New subscribers start as pending
2618
+ externalId: data.id,
2619
+ source: data.source,
2620
+ importedFromProvider: true,
2621
+ attributes: data.attributes || {}
2622
+ }
2623
+ });
2624
+ console.log("[Subscriber Handler] Created new subscriber:", data.email);
2625
+ }
2626
+ } catch (error) {
2627
+ console.error("[Subscriber Handler] Error handling created event:", error);
2628
+ throw error;
2629
+ }
2630
+ }
2631
+ async function handleSubscriberUpdated(event, payload, subscribersSlug) {
2632
+ const { data } = event;
2633
+ try {
2634
+ const existing = await payload.find({
2635
+ collection: subscribersSlug,
2636
+ where: {
2637
+ email: {
2638
+ equals: data.email
2639
+ }
2640
+ },
2641
+ limit: 1
2642
+ });
2643
+ if (existing.docs.length > 0) {
2644
+ const subscriber = existing.docs[0];
2645
+ await payload.update({
2646
+ collection: subscribersSlug,
2647
+ id: subscriber.id,
2648
+ data: {
2649
+ name: data.name || subscriber.name,
2650
+ ...data.attributes && { attributes: data.attributes }
2651
+ }
2652
+ });
2653
+ console.log("[Subscriber Handler] Updated subscriber:", data.email);
2654
+ } else {
2655
+ console.warn("[Subscriber Handler] Subscriber not found for update:", data.email);
2656
+ }
2657
+ } catch (error) {
2658
+ console.error("[Subscriber Handler] Error handling updated event:", error);
2659
+ throw error;
2660
+ }
2661
+ }
2662
+ async function handleSubscriberDeleted(event, payload, subscribersSlug) {
2663
+ const { data } = event;
2664
+ try {
2665
+ const existing = await payload.find({
2666
+ collection: subscribersSlug,
2667
+ where: {
2668
+ email: {
2669
+ equals: data.email
2670
+ }
2671
+ },
2672
+ limit: 1
2673
+ });
2674
+ if (existing.docs.length > 0) {
2675
+ const subscriber = existing.docs[0];
2676
+ await payload.delete({
2677
+ collection: subscribersSlug,
2678
+ id: subscriber.id
2679
+ });
2680
+ console.log("[Subscriber Handler] Deleted subscriber:", data.email);
2681
+ } else {
2682
+ console.warn("[Subscriber Handler] Subscriber not found for deletion:", data.email);
2683
+ }
2684
+ } catch (error) {
2685
+ console.error("[Subscriber Handler] Error handling deleted event:", error);
2686
+ throw error;
2687
+ }
2688
+ }
2560
2689
 
2561
2690
  // src/webhooks/handlers/broadcast.ts
2562
2691
  var STATUS_MAP = {
package/dist/types.d.cts CHANGED
@@ -838,6 +838,7 @@ interface Subscriber {
838
838
  [key: string]: boolean | undefined;
839
839
  };
840
840
  source?: string;
841
+ importedFromProvider?: boolean;
841
842
  utmParameters?: {
842
843
  source?: string;
843
844
  medium?: string;
package/dist/types.d.ts CHANGED
@@ -838,6 +838,7 @@ interface Subscriber {
838
838
  [key: string]: boolean | undefined;
839
839
  };
840
840
  source?: string;
841
+ importedFromProvider?: boolean;
841
842
  utmParameters?: {
842
843
  source?: string;
843
844
  medium?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-plugin-newsletter",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "Complete newsletter management plugin for Payload CMS with subscriber management, magic link authentication, and email service integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",