@divyacon/piece-mailchimp 0.0.0-stage → 0.1.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.
Files changed (148) hide show
  1. package/LICENSE.MIT-AP +24 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +80 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/actions/add-member-to-list.d.ts +13 -0
  7. package/dist/lib/actions/add-member-to-list.d.ts.map +1 -0
  8. package/dist/lib/actions/add-member-to-list.js +172 -0
  9. package/dist/lib/actions/add-member-to-list.js.map +1 -0
  10. package/dist/lib/actions/add-note-to-subscriber.d.ts +6 -0
  11. package/dist/lib/actions/add-note-to-subscriber.d.ts.map +1 -0
  12. package/dist/lib/actions/add-note-to-subscriber.js +95 -0
  13. package/dist/lib/actions/add-note-to-subscriber.js.map +1 -0
  14. package/dist/lib/actions/add-subscriber-to-tag.d.ts +6 -0
  15. package/dist/lib/actions/add-subscriber-to-tag.d.ts.map +1 -0
  16. package/dist/lib/actions/add-subscriber-to-tag.js +65 -0
  17. package/dist/lib/actions/add-subscriber-to-tag.js.map +1 -0
  18. package/dist/lib/actions/archive-subscriber.d.ts +5 -0
  19. package/dist/lib/actions/archive-subscriber.d.ts.map +1 -0
  20. package/dist/lib/actions/archive-subscriber.js +66 -0
  21. package/dist/lib/actions/archive-subscriber.js.map +1 -0
  22. package/dist/lib/actions/create-audience.d.ts +23 -0
  23. package/dist/lib/actions/create-audience.d.ts.map +1 -0
  24. package/dist/lib/actions/create-audience.js +196 -0
  25. package/dist/lib/actions/create-audience.js.map +1 -0
  26. package/dist/lib/actions/create-campaign.d.ts +15 -0
  27. package/dist/lib/actions/create-campaign.d.ts.map +1 -0
  28. package/dist/lib/actions/create-campaign.js +157 -0
  29. package/dist/lib/actions/create-campaign.js.map +1 -0
  30. package/dist/lib/actions/create-custom-event.d.ts +7 -0
  31. package/dist/lib/actions/create-custom-event.d.ts.map +1 -0
  32. package/dist/lib/actions/create-custom-event.js +65 -0
  33. package/dist/lib/actions/create-custom-event.js.map +1 -0
  34. package/dist/lib/actions/create-tag.d.ts +5 -0
  35. package/dist/lib/actions/create-tag.d.ts.map +1 -0
  36. package/dist/lib/actions/create-tag.js +56 -0
  37. package/dist/lib/actions/create-tag.js.map +1 -0
  38. package/dist/lib/actions/find-campaign.d.ts +6 -0
  39. package/dist/lib/actions/find-campaign.d.ts.map +1 -0
  40. package/dist/lib/actions/find-campaign.js +70 -0
  41. package/dist/lib/actions/find-campaign.js.map +1 -0
  42. package/dist/lib/actions/find-customer.d.ts +9 -0
  43. package/dist/lib/actions/find-customer.d.ts.map +1 -0
  44. package/dist/lib/actions/find-customer.js +87 -0
  45. package/dist/lib/actions/find-customer.js.map +1 -0
  46. package/dist/lib/actions/find-subscriber.d.ts +7 -0
  47. package/dist/lib/actions/find-subscriber.d.ts.map +1 -0
  48. package/dist/lib/actions/find-subscriber.js +307 -0
  49. package/dist/lib/actions/find-subscriber.js.map +1 -0
  50. package/dist/lib/actions/find-tag.d.ts +5 -0
  51. package/dist/lib/actions/find-tag.d.ts.map +1 -0
  52. package/dist/lib/actions/find-tag.js +57 -0
  53. package/dist/lib/actions/find-tag.js.map +1 -0
  54. package/dist/lib/actions/get-campaign-report.d.ts +6 -0
  55. package/dist/lib/actions/get-campaign-report.d.ts.map +1 -0
  56. package/dist/lib/actions/get-campaign-report.js +206 -0
  57. package/dist/lib/actions/get-campaign-report.js.map +1 -0
  58. package/dist/lib/actions/remove-subscriber-from-tag.d.ts +6 -0
  59. package/dist/lib/actions/remove-subscriber-from-tag.d.ts.map +1 -0
  60. package/dist/lib/actions/remove-subscriber-from-tag.js +98 -0
  61. package/dist/lib/actions/remove-subscriber-from-tag.js.map +1 -0
  62. package/dist/lib/actions/send-campaign.d.ts +4 -0
  63. package/dist/lib/actions/send-campaign.d.ts.map +1 -0
  64. package/dist/lib/actions/send-campaign.js +47 -0
  65. package/dist/lib/actions/send-campaign.js.map +1 -0
  66. package/dist/lib/actions/unsubscribe-email.d.ts +8 -0
  67. package/dist/lib/actions/unsubscribe-email.d.ts.map +1 -0
  68. package/dist/lib/actions/unsubscribe-email.js +90 -0
  69. package/dist/lib/actions/unsubscribe-email.js.map +1 -0
  70. package/dist/lib/actions/update-subscriber-status.d.ts +6 -0
  71. package/dist/lib/actions/update-subscriber-status.d.ts.map +1 -0
  72. package/dist/lib/actions/update-subscriber-status.js +54 -0
  73. package/dist/lib/actions/update-subscriber-status.js.map +1 -0
  74. package/dist/lib/common/index.d.ts +30 -0
  75. package/dist/lib/common/index.d.ts.map +1 -0
  76. package/dist/lib/common/index.js +206 -0
  77. package/dist/lib/common/index.js.map +1 -0
  78. package/dist/lib/common/types.d.ts +362 -0
  79. package/dist/lib/common/types.d.ts.map +1 -0
  80. package/dist/lib/common/types.js +54 -0
  81. package/dist/lib/common/types.js.map +1 -0
  82. package/dist/lib/triggers/email-opened-trigger.d.ts +11 -0
  83. package/dist/lib/triggers/email-opened-trigger.d.ts.map +1 -0
  84. package/dist/lib/triggers/email-opened-trigger.js +199 -0
  85. package/dist/lib/triggers/email-opened-trigger.js.map +1 -0
  86. package/dist/lib/triggers/link-clicked-trigger.d.ts +11 -0
  87. package/dist/lib/triggers/link-clicked-trigger.d.ts.map +1 -0
  88. package/dist/lib/triggers/link-clicked-trigger.js +226 -0
  89. package/dist/lib/triggers/link-clicked-trigger.js.map +1 -0
  90. package/dist/lib/triggers/new-campaign-trigger.d.ts +11 -0
  91. package/dist/lib/triggers/new-campaign-trigger.d.ts.map +1 -0
  92. package/dist/lib/triggers/new-campaign-trigger.js +147 -0
  93. package/dist/lib/triggers/new-campaign-trigger.js.map +1 -0
  94. package/dist/lib/triggers/new-customer-trigger.d.ts +11 -0
  95. package/dist/lib/triggers/new-customer-trigger.d.ts.map +1 -0
  96. package/dist/lib/triggers/new-customer-trigger.js +214 -0
  97. package/dist/lib/triggers/new-customer-trigger.js.map +1 -0
  98. package/dist/lib/triggers/new-order-trigger.d.ts +11 -0
  99. package/dist/lib/triggers/new-order-trigger.d.ts.map +1 -0
  100. package/dist/lib/triggers/new-order-trigger.js +270 -0
  101. package/dist/lib/triggers/new-order-trigger.js.map +1 -0
  102. package/dist/lib/triggers/new-segment-tag-subscriber-trigger.d.ts +19 -0
  103. package/dist/lib/triggers/new-segment-tag-subscriber-trigger.d.ts.map +1 -0
  104. package/dist/lib/triggers/new-segment-tag-subscriber-trigger.js +264 -0
  105. package/dist/lib/triggers/new-segment-tag-subscriber-trigger.js.map +1 -0
  106. package/dist/lib/triggers/subscribe-trigger.d.ts +11 -0
  107. package/dist/lib/triggers/subscribe-trigger.d.ts.map +1 -0
  108. package/dist/lib/triggers/subscribe-trigger.js +150 -0
  109. package/dist/lib/triggers/subscribe-trigger.js.map +1 -0
  110. package/dist/lib/triggers/subscriber-updated-trigger.d.ts +11 -0
  111. package/dist/lib/triggers/subscriber-updated-trigger.d.ts.map +1 -0
  112. package/dist/lib/triggers/subscriber-updated-trigger.js +157 -0
  113. package/dist/lib/triggers/subscriber-updated-trigger.js.map +1 -0
  114. package/dist/lib/triggers/unsubscribe-trigger.d.ts +11 -0
  115. package/dist/lib/triggers/unsubscribe-trigger.d.ts.map +1 -0
  116. package/dist/lib/triggers/unsubscribe-trigger.js +196 -0
  117. package/dist/lib/triggers/unsubscribe-trigger.js.map +1 -0
  118. package/package.json +45 -3
  119. package/src/index.ts +77 -0
  120. package/src/lib/actions/add-member-to-list.ts +180 -0
  121. package/src/lib/actions/add-note-to-subscriber.ts +91 -0
  122. package/src/lib/actions/add-subscriber-to-tag.ts +66 -0
  123. package/src/lib/actions/archive-subscriber.ts +64 -0
  124. package/src/lib/actions/create-audience.ts +192 -0
  125. package/src/lib/actions/create-campaign.ts +155 -0
  126. package/src/lib/actions/create-custom-event.ts +63 -0
  127. package/src/lib/actions/create-tag.ts +51 -0
  128. package/src/lib/actions/find-campaign.ts +68 -0
  129. package/src/lib/actions/find-customer.ts +88 -0
  130. package/src/lib/actions/find-subscriber.ts +307 -0
  131. package/src/lib/actions/find-tag.ts +57 -0
  132. package/src/lib/actions/get-campaign-report.ts +204 -0
  133. package/src/lib/actions/remove-subscriber-from-tag.ts +94 -0
  134. package/src/lib/actions/send-campaign.ts +42 -0
  135. package/src/lib/actions/unsubscribe-email.ts +91 -0
  136. package/src/lib/actions/update-subscriber-status.ts +53 -0
  137. package/src/lib/common/index.ts +267 -0
  138. package/src/lib/common/types.ts +410 -0
  139. package/src/lib/triggers/email-opened-trigger.ts +216 -0
  140. package/src/lib/triggers/link-clicked-trigger.ts +244 -0
  141. package/src/lib/triggers/new-campaign-trigger.ts +149 -0
  142. package/src/lib/triggers/new-customer-trigger.ts +230 -0
  143. package/src/lib/triggers/new-order-trigger.ts +288 -0
  144. package/src/lib/triggers/new-segment-tag-subscriber-trigger.ts +286 -0
  145. package/src/lib/triggers/subscribe-trigger.ts +159 -0
  146. package/src/lib/triggers/subscriber-updated-trigger.ts +165 -0
  147. package/src/lib/triggers/unsubscribe-trigger.ts +212 -0
  148. package/README.md +0 -3
@@ -0,0 +1,11 @@
1
+ import { TriggerStrategy } from '@agnocon/pieces-framework';
2
+ export declare const mailChimpUnsubscriberTrigger: import("@agnocon/pieces-framework").ITrigger<TriggerStrategy.WEBHOOK, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>, {
3
+ list_id: import("@agnocon/pieces-framework").DropdownProperty<string, true, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>>;
4
+ }> | import("@agnocon/pieces-framework").ITrigger<TriggerStrategy.POLLING, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>, {
5
+ list_id: import("@agnocon/pieces-framework").DropdownProperty<string, true, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>>;
6
+ }> | import("@agnocon/pieces-framework").ITrigger<TriggerStrategy.MANUAL, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>, {
7
+ list_id: import("@agnocon/pieces-framework").DropdownProperty<string, true, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>>;
8
+ }> | import("@agnocon/pieces-framework").ITrigger<TriggerStrategy.APP_WEBHOOK, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>, {
9
+ list_id: import("@agnocon/pieces-framework").DropdownProperty<string, true, import("@agnocon/pieces-framework").OAuth2Property<import("@agnocon/pieces-framework").OAuth2Props>>;
10
+ }>;
11
+ //# sourceMappingURL=unsubscribe-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsubscribe-trigger.d.ts","sourceRoot":"","sources":["../../../src/lib/triggers/unsubscribe-trigger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,eAAe,EAAY,MAAM,2BAA2B,CAAC;AAgFrF,eAAO,MAAM,4BAA4B;;;;;;;;EAmIvC,CAAC"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mailChimpUnsubscriberTrigger = void 0;
4
+ const tslib_1 = require("tslib");
5
+ // Vendored from Activepieces packages/pieces/community/mailchimp/src/lib/triggers/unsubscribe-trigger.ts (MIT).
6
+ // Generated by packages/scripts/vendor-ap.mjs - do not edit by hand.
7
+ const pieces_framework_1 = require("@agnocon/pieces-framework");
8
+ const pieces_common_1 = require("@agnocon/pieces-common");
9
+ const common_1 = require("../common");
10
+ const __1 = require("../..");
11
+ const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_unsubscribe_webhook_data';
12
+ const getUnsubscribeEventSummary = (request) => {
13
+ const data = request.data || {};
14
+ return {
15
+ email: data.email || 'N/A',
16
+ subscriber_id: data.id || 'N/A',
17
+ list_id: data.list_id || 'N/A',
18
+ email_type: data.email_type || 'html',
19
+ ip_address: data.ip_opt || data.ip_signup || 'N/A',
20
+ signup_timestamp: data.timestamp_signup || 'N/A',
21
+ opt_in_timestamp: data.timestamp_opt || 'N/A',
22
+ unsubscribe_timestamp: request.fired_at || 'N/A',
23
+ has_merge_fields: !!data.merges,
24
+ merge_field_count: data.merges ? Object.keys(data.merges).length : 0,
25
+ merge_fields_summary: data.merges ? {
26
+ first_name: data.merges.FNAME || 'N/A',
27
+ last_name: data.merges.LNAME || 'N/A',
28
+ company: data.merges.COMPANY || 'N/A',
29
+ phone: data.merges.PHONE || 'N/A',
30
+ interests: data.merges.INTERESTS || 'N/A',
31
+ has_address: !!data.merges.ADDRESS,
32
+ } : null,
33
+ member_rating: data.member_rating || 0,
34
+ vip_status: data.vip ? 'VIP' : 'Standard',
35
+ language: data.language || 'en',
36
+ };
37
+ };
38
+ const calculateSubscriberLifetime = (request) => {
39
+ const data = request.data || {};
40
+ const signupTime = data.timestamp_signup ? new Date(data.timestamp_signup) : null;
41
+ const unsubscribeTime = request.fired_at ? new Date(request.fired_at) : null;
42
+ if (signupTime && unsubscribeTime) {
43
+ const diffTime = Math.abs(unsubscribeTime.getTime() - signupTime.getTime());
44
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
45
+ return `${diffDays} days`;
46
+ }
47
+ return 'Unknown';
48
+ };
49
+ const assessEngagementLevel = (request) => {
50
+ const data = request.data || {};
51
+ const rating = data.member_rating || 0;
52
+ if (rating >= 4)
53
+ return 'High';
54
+ if (rating >= 2)
55
+ return 'Medium';
56
+ return 'Low';
57
+ };
58
+ const identifyChurnFactors = (request) => {
59
+ const factors = [];
60
+ const data = request.data || {};
61
+ if (data.member_rating && data.member_rating < 3) {
62
+ factors.push('Low engagement rating');
63
+ }
64
+ if (request.unsubscribe_reason) {
65
+ factors.push(`Reason: ${request.unsubscribe_reason}`);
66
+ }
67
+ if (request.campaign_id) {
68
+ factors.push('Campaign-specific unsubscribe');
69
+ }
70
+ return factors.length > 0 ? factors : ['No specific factors identified'];
71
+ };
72
+ exports.mailChimpUnsubscriberTrigger = (0, pieces_framework_1.createTrigger)({
73
+ auth: __1.mailchimpAuth,
74
+ name: 'unsubscribe',
75
+ displayName: 'Member Unsubscribed from Audience',
76
+ description: 'Fires when a subscriber unsubscribes from your Mailchimp audience. This trigger captures unsubscribe events, opt-outs, and audience churn with comprehensive subscriber information for retention analysis.',
77
+ aiMetadata: {
78
+ description: 'Fires when a contact unsubscribes (opts out) from the selected Mailchimp audience (list). The event carries the subscriber email, merge fields, and, when available, the unsubscribe reason and originating campaign.',
79
+ },
80
+ type: pieces_framework_1.TriggerStrategy.WEBHOOK,
81
+ props: {
82
+ list_id: common_1.mailchimpCommon.mailChimpListIdDropdown,
83
+ },
84
+ sampleData: {
85
+ type: 'unsubscribe',
86
+ fired_at: '2024-01-15T10:30:00Z',
87
+ data: {
88
+ id: '8a25ff1d98',
89
+ list_id: 'a6b5da1054',
90
+ email: 'api@mailchimp.com',
91
+ email_type: 'html',
92
+ ip_opt: '192.168.1.100',
93
+ ip_signup: '192.168.1.100',
94
+ timestamp_signup: '2024-01-01T09:00:00Z',
95
+ timestamp_opt: '2024-01-01T09:00:00Z',
96
+ merges: {
97
+ EMAIL: 'api@mailchimp.com',
98
+ FNAME: 'Mailchimp',
99
+ LNAME: 'API',
100
+ COMPANY: 'Mailchimp Inc',
101
+ PHONE: '+1-555-0123',
102
+ INTERESTS: 'Group1,Group2',
103
+ ADDRESS: {
104
+ addr1: '675 Ponce de Leon Ave NE',
105
+ addr2: 'Suite 5000',
106
+ city: 'Atlanta',
107
+ state: 'GA',
108
+ zip: '30308',
109
+ country: 'US',
110
+ },
111
+ },
112
+ member_rating: 3,
113
+ vip: false,
114
+ language: 'en',
115
+ source: 'api',
116
+ tags: ['api-signup', 'churned-subscriber'],
117
+ unsubscribe_reason: 'too_many_emails',
118
+ campaign_id: 'campaign_123',
119
+ campaign_title: 'Weekly Newsletter',
120
+ },
121
+ },
122
+ onEnable(context) {
123
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
124
+ var _a;
125
+ try {
126
+ const accessToken = (0, pieces_common_1.getAccessTokenOrThrow)(context.auth);
127
+ const server = yield common_1.mailchimpCommon.getMailChimpServerPrefix(accessToken);
128
+ const enabledWebhookId = yield common_1.mailchimpCommon.enableWebhookRequest({
129
+ server,
130
+ listId: context.propsValue.list_id,
131
+ token: accessToken,
132
+ webhookUrl: context.webhookUrl,
133
+ events: {
134
+ unsubscribe: true,
135
+ profile: true,
136
+ },
137
+ });
138
+ yield ((_a = context.store) === null || _a === void 0 ? void 0 : _a.put(WEBHOOK_DATA_STORE_KEY, {
139
+ id: enabledWebhookId,
140
+ listId: context.propsValue.list_id,
141
+ }));
142
+ }
143
+ catch (error) {
144
+ throw new Error(`Failed to enable unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
145
+ }
146
+ });
147
+ },
148
+ onDisable(context) {
149
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
150
+ var _a;
151
+ try {
152
+ const webhookData = yield ((_a = context.store) === null || _a === void 0 ? void 0 : _a.get(WEBHOOK_DATA_STORE_KEY));
153
+ if (webhookData === undefined || webhookData === null) {
154
+ return;
155
+ }
156
+ const token = (0, pieces_common_1.getAccessTokenOrThrow)(context.auth);
157
+ const server = yield common_1.mailchimpCommon.getMailChimpServerPrefix(token);
158
+ yield common_1.mailchimpCommon.disableWebhookRequest({
159
+ server,
160
+ token,
161
+ listId: webhookData.listId,
162
+ webhookId: webhookData.id,
163
+ });
164
+ }
165
+ catch (error) {
166
+ console.error(`Failed to disable unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
167
+ }
168
+ });
169
+ },
170
+ run(context) {
171
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
172
+ try {
173
+ const request = context.payload.body;
174
+ if (request === undefined || request.type !== 'unsubscribe') {
175
+ return [];
176
+ }
177
+ const enhancedRequest = Object.assign(Object.assign({}, request), { trigger_type: 'member_unsubscribed', event_category: 'Unsubscribe Event', processed_at: new Date().toISOString(), unsubscribe_summary: getUnsubscribeEventSummary(request), business_context: {
178
+ audience_churn: true,
179
+ retention_concern: true,
180
+ feedback_opportunity: true,
181
+ re_engagement_potential: 'medium',
182
+ }, retention_insights: {
183
+ subscriber_lifetime: calculateSubscriberLifetime(request),
184
+ engagement_level: assessEngagementLevel(request),
185
+ churn_risk_factors: identifyChurnFactors(request),
186
+ } });
187
+ return [enhancedRequest];
188
+ }
189
+ catch (error) {
190
+ console.error(`Error processing unsubscribe webhook: ${error.message || JSON.stringify(error)}`);
191
+ return [];
192
+ }
193
+ });
194
+ },
195
+ });
196
+ //# sourceMappingURL=unsubscribe-trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsubscribe-trigger.js","sourceRoot":"","sources":["../../../src/lib/triggers/unsubscribe-trigger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@divyacon/piece-mailchimp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "DivyaCon mailchimp connector",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "src",
17
+ "LICENSE.MIT-AP"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "vendor": "node ../scripts/vendor-ap.mjs piece-mailchimp"
22
+ },
23
+ "dependencies": {
24
+ "@agnocon/core-utils": "0.2.0",
25
+ "@agnocon/piece-types": "0.3.1",
26
+ "@agnocon/pieces-common": "0.12.8",
27
+ "@agnocon/pieces-framework": "0.36.0",
28
+ "tslib": "2.6.2",
29
+ "@mailchimp/mailchimp_marketing": "3.0.80"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "20.17.6",
33
+ "typescript": "5.5.4",
34
+ "@types/mailchimp__mailchimp_marketing": "3.0.22"
35
+ },
36
+ "license": "MIT",
37
+ "agnocon": {
38
+ "originVersion": "0.5.7"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public",
42
+ "tag": "latest"
43
+ },
44
+ "keywords": [
45
+ "agnocon",
46
+ "connector"
47
+ ]
6
48
  }
package/src/index.ts ADDED
@@ -0,0 +1,77 @@
1
+ import { PieceAuth, createPiece } from '@agnocon/pieces-framework';
2
+ import { addMemberToList } from './lib/actions/add-member-to-list';
3
+ import { addNoteToSubscriber } from './lib/actions/add-note-to-subscriber';
4
+ import { removeSubscriberFromTag } from './lib/actions/remove-subscriber-from-tag';
5
+ import { updateSubscriberInList } from './lib/actions/update-subscriber-status';
6
+ import { addSubscriberToTag } from './lib/actions/add-subscriber-to-tag';
7
+ import { createCampaign } from './lib/actions/create-campaign';
8
+ import { getCampaignReport } from './lib/actions/get-campaign-report';
9
+ import { createAudience } from './lib/actions/create-audience';
10
+ import { archiveSubscriber } from './lib/actions/archive-subscriber';
11
+ import { unsubscribeEmail } from './lib/actions/unsubscribe-email';
12
+ import { findCampaign } from './lib/actions/find-campaign';
13
+ import { findCustomer } from './lib/actions/find-customer';
14
+ import { findTag } from './lib/actions/find-tag';
15
+ import { findSubscriber } from './lib/actions/find-subscriber';
16
+ import { createTag } from './lib/actions/create-tag';
17
+ import { sendCampaign } from './lib/actions/send-campaign';
18
+ import { createCustomEvent } from './lib/actions/create-custom-event';
19
+
20
+ import { PieceCategory } from '@agnocon/pieces-framework';
21
+ import { mailChimpSubscribeTrigger } from './lib/triggers/subscribe-trigger';
22
+ import { mailChimpUnsubscriberTrigger } from './lib/triggers/unsubscribe-trigger';
23
+ import { mailChimpNewCampaignTrigger } from './lib/triggers/new-campaign-trigger';
24
+ import { mailChimpLinkClickedTrigger } from './lib/triggers/link-clicked-trigger';
25
+ import { mailChimpEmailOpenedTrigger } from './lib/triggers/email-opened-trigger';
26
+ import { mailChimpSubscriberUpdatedTrigger } from './lib/triggers/subscriber-updated-trigger';
27
+ import { mailChimpNewCustomerTrigger } from './lib/triggers/new-customer-trigger';
28
+ import { mailChimpNewOrderTrigger } from './lib/triggers/new-order-trigger';
29
+ import { mailChimpNewSegmentTagSubscriberTrigger } from './lib/triggers/new-segment-tag-subscriber-trigger';
30
+
31
+ export const mailchimpAuth = PieceAuth.OAuth2({
32
+ description: '',
33
+ authUrl: 'https://login.mailchimp.com/oauth2/authorize',
34
+ tokenUrl: 'https://login.mailchimp.com/oauth2/token',
35
+ required: true,
36
+ scope: [],
37
+ });
38
+
39
+ export const mailchimp = createPiece({
40
+ displayName: 'Mailchimp',
41
+ description: 'All-in-One integrated marketing platform for managing audiences, sending campaigns, tracking engagement, and automating lifecycle communications.',
42
+ minimumSupportedRelease: '0.30.0',
43
+ logoUrl: 'https://cdn.activepieces.com/pieces/mailchimp.png',
44
+ authors: ["abdullahranginwala","TaskMagicKyle","kishanprmr","AbdulTheActivePiecer","khaledmashaly","abuaboud", "sparkybug", "onyedikachi-david"],
45
+ categories: [PieceCategory.MARKETING],
46
+ auth: mailchimpAuth,
47
+ actions: [
48
+ addMemberToList,
49
+ addNoteToSubscriber,
50
+ addSubscriberToTag,
51
+ removeSubscriberFromTag,
52
+ updateSubscriberInList,
53
+ createCampaign,
54
+ getCampaignReport,
55
+ createAudience,
56
+ archiveSubscriber,
57
+ unsubscribeEmail,
58
+ findCampaign,
59
+ findCustomer,
60
+ findTag,
61
+ findSubscriber,
62
+ createTag,
63
+ sendCampaign,
64
+ createCustomEvent,
65
+ ],
66
+ triggers: [
67
+ mailChimpSubscribeTrigger,
68
+ mailChimpUnsubscriberTrigger,
69
+ mailChimpNewCampaignTrigger,
70
+ mailChimpLinkClickedTrigger,
71
+ mailChimpEmailOpenedTrigger,
72
+ mailChimpSubscriberUpdatedTrigger,
73
+ mailChimpNewCustomerTrigger,
74
+ mailChimpNewOrderTrigger,
75
+ mailChimpNewSegmentTagSubscriberTrigger,
76
+ ],
77
+ });
@@ -0,0 +1,180 @@
1
+ import { createAction, Property } from '@agnocon/pieces-framework';
2
+ import { getAccessTokenOrThrow } from '@agnocon/pieces-common';
3
+ import { mailchimpCommon } from '../common';
4
+ import { mailchimpAuth } from '../..';
5
+ import mailchimp from '@mailchimp/mailchimp_marketing';
6
+ import { MailchimpClient } from '../common/types';
7
+ import crypto from 'crypto';
8
+
9
+ export const addMemberToList = createAction({
10
+ auth: mailchimpAuth,
11
+ name: 'add_member_to_list',
12
+ displayName: 'Add or Update Subscriber',
13
+ description: 'Add a new subscriber to an audience or update existing subscriber',
14
+ audience: 'both',
15
+ aiMetadata: { description: 'Upserts a member into a Mailchimp audience (list) keyed on the email address: creates the subscriber if absent (using the "status if new" value) or updates the existing record otherwise. Use to ensure a contact exists with given status, name, language, or VIP flag without checking first. Requires the target list and email; repeating with the same input is safe and converges to the same member state.', idempotent: true },
16
+ props: {
17
+ list_id: mailchimpCommon.mailChimpListIdDropdown,
18
+ email_address: Property.ShortText({
19
+ displayName: 'Email Address',
20
+ description: 'Email address for the subscriber',
21
+ required: true,
22
+ }),
23
+ status_if_new: Property.StaticDropdown({
24
+ displayName: 'Status if New',
25
+ description: 'Status for new subscribers',
26
+ required: true,
27
+ options: {
28
+ options: [
29
+ { label: 'Subscribed', value: 'subscribed' },
30
+ { label: 'Unsubscribed', value: 'unsubscribed' },
31
+ { label: 'Cleaned', value: 'cleaned' },
32
+ { label: 'Pending', value: 'pending' },
33
+ { label: 'Transactional', value: 'transactional' },
34
+ ],
35
+ },
36
+ }),
37
+ email_type: Property.StaticDropdown({
38
+ displayName: 'Email Type',
39
+ description: 'Type of email this member wants to receive',
40
+ required: false,
41
+ options: {
42
+ options: [
43
+ { label: 'HTML', value: 'html' },
44
+ { label: 'Text', value: 'text' },
45
+ ],
46
+ },
47
+ }),
48
+ status: Property.StaticDropdown({
49
+ displayName: 'Status',
50
+ description: 'Current status of subscriber (for updates)',
51
+ required: false,
52
+ options: {
53
+ options: [
54
+ { label: 'Subscribed', value: 'subscribed' },
55
+ { label: 'Unsubscribed', value: 'unsubscribed' },
56
+ { label: 'Cleaned', value: 'cleaned' },
57
+ { label: 'Pending', value: 'pending' },
58
+ { label: 'Transactional', value: 'transactional' },
59
+ ],
60
+ },
61
+ }),
62
+ first_name: Property.ShortText({
63
+ displayName: 'First Name',
64
+ description: 'First name of the subscriber',
65
+ required: false,
66
+ }),
67
+ last_name: Property.ShortText({
68
+ displayName: 'Last Name',
69
+ description: 'Last name of the subscriber',
70
+ required: false,
71
+ }),
72
+ language: Property.ShortText({
73
+ displayName: 'Language',
74
+ description: 'Subscriber language (e.g., "en", "es", "fr")',
75
+ required: false,
76
+ }),
77
+ vip: Property.Checkbox({
78
+ displayName: 'VIP',
79
+ description: 'VIP status for subscriber',
80
+ required: false,
81
+ defaultValue: false,
82
+ }),
83
+ skip_merge_validation: Property.Checkbox({
84
+ displayName: 'Skip Merge Validation',
85
+ description: 'Accept member data without merge field values even if required',
86
+ required: false,
87
+ defaultValue: false,
88
+ }),
89
+ },
90
+ async run(context) {
91
+ const accessToken = getAccessTokenOrThrow(context.auth);
92
+ const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
93
+
94
+ const client = mailchimp as unknown as MailchimpClient;
95
+ client.setConfig({
96
+ accessToken: accessToken,
97
+ server: server,
98
+ });
99
+
100
+ try {
101
+ const subscriberHash = crypto.createHash('md5').update(context.propsValue.email_address.toLowerCase()).digest('hex');
102
+
103
+ const memberData: any = {
104
+ email_address: context.propsValue.email_address,
105
+ status_if_new: context.propsValue.status_if_new,
106
+ };
107
+
108
+ if (context.propsValue.email_type) {
109
+ memberData.email_type = context.propsValue.email_type;
110
+ }
111
+
112
+ if (context.propsValue.status) {
113
+ memberData.status = context.propsValue.status;
114
+ }
115
+
116
+ if (context.propsValue.first_name || context.propsValue.last_name) {
117
+ memberData.merge_fields = {};
118
+ if (context.propsValue.first_name) {
119
+ memberData.merge_fields.FNAME = context.propsValue.first_name;
120
+ }
121
+ if (context.propsValue.last_name) {
122
+ memberData.merge_fields.LNAME = context.propsValue.last_name;
123
+ }
124
+ }
125
+
126
+ if (context.propsValue.language) {
127
+ memberData.language = context.propsValue.language;
128
+ }
129
+
130
+ if (context.propsValue.vip !== undefined) {
131
+ memberData.vip = context.propsValue.vip;
132
+ }
133
+
134
+ const queryParams: any = {};
135
+ if (context.propsValue.skip_merge_validation) {
136
+ queryParams.skip_merge_validation = true;
137
+ }
138
+
139
+ const member = await client.lists.setListMember(
140
+ context.propsValue.list_id!,
141
+ subscriberHash,
142
+ memberData,
143
+ queryParams
144
+ );
145
+
146
+ return {
147
+ success: true,
148
+ id: member.id,
149
+ email_address: member.email_address,
150
+ unique_email_id: member.unique_email_id,
151
+ contact_id: member.contact_id,
152
+ full_name: member.full_name,
153
+ web_id: member.web_id,
154
+ email_type: member.email_type,
155
+ status: member.status,
156
+ merge_fields: member.merge_fields,
157
+ interests: member.interests,
158
+ stats: member.stats,
159
+ ip_signup: member.ip_signup,
160
+ timestamp_signup: member.timestamp_signup,
161
+ ip_opt: member.ip_opt,
162
+ timestamp_opt: member.timestamp_opt,
163
+ member_rating: member.member_rating,
164
+ last_changed: member.last_changed,
165
+ language: member.language,
166
+ vip: member.vip,
167
+ email_client: member.email_client,
168
+ location: member.location,
169
+ marketing_permissions: member.marketing_permissions,
170
+ source: member.source,
171
+ tags_count: member.tags_count,
172
+ tags: member.tags,
173
+ list_id: member.list_id,
174
+ _links: member._links,
175
+ };
176
+ } catch (error: any) {
177
+ throw new Error(`Failed to add or update subscriber: ${error.message || JSON.stringify(error)}`);
178
+ }
179
+ },
180
+ });
@@ -0,0 +1,91 @@
1
+ import { createAction, Property } from '@agnocon/pieces-framework';
2
+ import { getAccessTokenOrThrow } from '@agnocon/pieces-common';
3
+ import { mailchimpCommon } from '../common';
4
+ import { mailchimpAuth } from '../..';
5
+
6
+ export const addNoteToSubscriber = createAction({
7
+ auth: mailchimpAuth,
8
+ name: 'add_note_to_subscriber',
9
+ displayName: 'Add Note to Subscriber',
10
+ description: 'Add a note to a subscriber in your Mailchimp audience.',
11
+ audience: 'both',
12
+ aiMetadata: { description: 'Appends an internal note to a subscriber, identified by email within a given audience (list). Use to record context or annotations on a contact. Not idempotent: each call adds a new note even if the content is identical.', idempotent: false },
13
+ props: {
14
+ list_id: mailchimpCommon.mailChimpListIdDropdown,
15
+ email: Property.ShortText({
16
+ displayName: 'Email Address',
17
+ description: 'The email address of the subscriber to add a note to',
18
+ required: true,
19
+ }),
20
+ note: Property.LongText({
21
+ displayName: 'Note Content',
22
+ description: 'The note content to add to the subscriber',
23
+ required: true,
24
+ }),
25
+ },
26
+ async run(context) {
27
+ const { list_id, email, note } = context.propsValue;
28
+ const accessToken = getAccessTokenOrThrow(context.auth);
29
+
30
+ try {
31
+ const serverPrefix = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
32
+ const subscriberHash = mailchimpCommon.getMD5EmailHash(email);
33
+
34
+ const url = `https://${serverPrefix}.api.mailchimp.com/3.0/lists/${list_id}/members/${subscriberHash}/notes`;
35
+
36
+ const response = await fetch(url, {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Authorization': `Bearer ${accessToken}`,
40
+ 'Content-Type': 'application/json',
41
+ },
42
+ body: JSON.stringify({
43
+ note: note,
44
+ }),
45
+ });
46
+
47
+ if (!response.ok) {
48
+ let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
49
+
50
+ try {
51
+ const errorText = await response.text();
52
+ if (errorText && errorText.trim()) {
53
+ const errorData = JSON.parse(errorText);
54
+ errorMessage = errorData.detail || errorData.title || errorData.message || errorText;
55
+ }
56
+ } catch (parseError) {
57
+ const errorText = await response.text();
58
+ if (errorText && errorText.trim()) {
59
+ errorMessage = errorText;
60
+ }
61
+ }
62
+
63
+ throw new Error(`Failed to add note to subscriber: ${errorMessage}`);
64
+ }
65
+
66
+ let result;
67
+ try {
68
+ const responseText = await response.text();
69
+ if (responseText && responseText.trim()) {
70
+ result = JSON.parse(responseText);
71
+ } else {
72
+ result = { success: true };
73
+ }
74
+ } catch (parseError) {
75
+ result = { success: true };
76
+ }
77
+
78
+ return {
79
+ success: true,
80
+ message: `Successfully added note to subscriber ${email}`,
81
+ note_id: result.id,
82
+ note_content: result.note,
83
+ created_at: result.created_at,
84
+ _links: result._links || [],
85
+ };
86
+ } catch (error: any) {
87
+ console.error('Error adding note to subscriber:', error);
88
+ throw new Error(`Failed to add note to subscriber: ${error.message}`);
89
+ }
90
+ },
91
+ });