@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.
- package/LICENSE.MIT-AP +24 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/actions/add-member-to-list.d.ts +13 -0
- package/dist/lib/actions/add-member-to-list.d.ts.map +1 -0
- package/dist/lib/actions/add-member-to-list.js +172 -0
- package/dist/lib/actions/add-member-to-list.js.map +1 -0
- package/dist/lib/actions/add-note-to-subscriber.d.ts +6 -0
- package/dist/lib/actions/add-note-to-subscriber.d.ts.map +1 -0
- package/dist/lib/actions/add-note-to-subscriber.js +95 -0
- package/dist/lib/actions/add-note-to-subscriber.js.map +1 -0
- package/dist/lib/actions/add-subscriber-to-tag.d.ts +6 -0
- package/dist/lib/actions/add-subscriber-to-tag.d.ts.map +1 -0
- package/dist/lib/actions/add-subscriber-to-tag.js +65 -0
- package/dist/lib/actions/add-subscriber-to-tag.js.map +1 -0
- package/dist/lib/actions/archive-subscriber.d.ts +5 -0
- package/dist/lib/actions/archive-subscriber.d.ts.map +1 -0
- package/dist/lib/actions/archive-subscriber.js +66 -0
- package/dist/lib/actions/archive-subscriber.js.map +1 -0
- package/dist/lib/actions/create-audience.d.ts +23 -0
- package/dist/lib/actions/create-audience.d.ts.map +1 -0
- package/dist/lib/actions/create-audience.js +196 -0
- package/dist/lib/actions/create-audience.js.map +1 -0
- package/dist/lib/actions/create-campaign.d.ts +15 -0
- package/dist/lib/actions/create-campaign.d.ts.map +1 -0
- package/dist/lib/actions/create-campaign.js +157 -0
- package/dist/lib/actions/create-campaign.js.map +1 -0
- package/dist/lib/actions/create-custom-event.d.ts +7 -0
- package/dist/lib/actions/create-custom-event.d.ts.map +1 -0
- package/dist/lib/actions/create-custom-event.js +65 -0
- package/dist/lib/actions/create-custom-event.js.map +1 -0
- package/dist/lib/actions/create-tag.d.ts +5 -0
- package/dist/lib/actions/create-tag.d.ts.map +1 -0
- package/dist/lib/actions/create-tag.js +56 -0
- package/dist/lib/actions/create-tag.js.map +1 -0
- package/dist/lib/actions/find-campaign.d.ts +6 -0
- package/dist/lib/actions/find-campaign.d.ts.map +1 -0
- package/dist/lib/actions/find-campaign.js +70 -0
- package/dist/lib/actions/find-campaign.js.map +1 -0
- package/dist/lib/actions/find-customer.d.ts +9 -0
- package/dist/lib/actions/find-customer.d.ts.map +1 -0
- package/dist/lib/actions/find-customer.js +87 -0
- package/dist/lib/actions/find-customer.js.map +1 -0
- package/dist/lib/actions/find-subscriber.d.ts +7 -0
- package/dist/lib/actions/find-subscriber.d.ts.map +1 -0
- package/dist/lib/actions/find-subscriber.js +307 -0
- package/dist/lib/actions/find-subscriber.js.map +1 -0
- package/dist/lib/actions/find-tag.d.ts +5 -0
- package/dist/lib/actions/find-tag.d.ts.map +1 -0
- package/dist/lib/actions/find-tag.js +57 -0
- package/dist/lib/actions/find-tag.js.map +1 -0
- package/dist/lib/actions/get-campaign-report.d.ts +6 -0
- package/dist/lib/actions/get-campaign-report.d.ts.map +1 -0
- package/dist/lib/actions/get-campaign-report.js +206 -0
- package/dist/lib/actions/get-campaign-report.js.map +1 -0
- package/dist/lib/actions/remove-subscriber-from-tag.d.ts +6 -0
- package/dist/lib/actions/remove-subscriber-from-tag.d.ts.map +1 -0
- package/dist/lib/actions/remove-subscriber-from-tag.js +98 -0
- package/dist/lib/actions/remove-subscriber-from-tag.js.map +1 -0
- package/dist/lib/actions/send-campaign.d.ts +4 -0
- package/dist/lib/actions/send-campaign.d.ts.map +1 -0
- package/dist/lib/actions/send-campaign.js +47 -0
- package/dist/lib/actions/send-campaign.js.map +1 -0
- package/dist/lib/actions/unsubscribe-email.d.ts +8 -0
- package/dist/lib/actions/unsubscribe-email.d.ts.map +1 -0
- package/dist/lib/actions/unsubscribe-email.js +90 -0
- package/dist/lib/actions/unsubscribe-email.js.map +1 -0
- package/dist/lib/actions/update-subscriber-status.d.ts +6 -0
- package/dist/lib/actions/update-subscriber-status.d.ts.map +1 -0
- package/dist/lib/actions/update-subscriber-status.js +54 -0
- package/dist/lib/actions/update-subscriber-status.js.map +1 -0
- package/dist/lib/common/index.d.ts +30 -0
- package/dist/lib/common/index.d.ts.map +1 -0
- package/dist/lib/common/index.js +206 -0
- package/dist/lib/common/index.js.map +1 -0
- package/dist/lib/common/types.d.ts +362 -0
- package/dist/lib/common/types.d.ts.map +1 -0
- package/dist/lib/common/types.js +54 -0
- package/dist/lib/common/types.js.map +1 -0
- package/dist/lib/triggers/email-opened-trigger.d.ts +11 -0
- package/dist/lib/triggers/email-opened-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/email-opened-trigger.js +199 -0
- package/dist/lib/triggers/email-opened-trigger.js.map +1 -0
- package/dist/lib/triggers/link-clicked-trigger.d.ts +11 -0
- package/dist/lib/triggers/link-clicked-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/link-clicked-trigger.js +226 -0
- package/dist/lib/triggers/link-clicked-trigger.js.map +1 -0
- package/dist/lib/triggers/new-campaign-trigger.d.ts +11 -0
- package/dist/lib/triggers/new-campaign-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/new-campaign-trigger.js +147 -0
- package/dist/lib/triggers/new-campaign-trigger.js.map +1 -0
- package/dist/lib/triggers/new-customer-trigger.d.ts +11 -0
- package/dist/lib/triggers/new-customer-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/new-customer-trigger.js +214 -0
- package/dist/lib/triggers/new-customer-trigger.js.map +1 -0
- package/dist/lib/triggers/new-order-trigger.d.ts +11 -0
- package/dist/lib/triggers/new-order-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/new-order-trigger.js +270 -0
- package/dist/lib/triggers/new-order-trigger.js.map +1 -0
- package/dist/lib/triggers/new-segment-tag-subscriber-trigger.d.ts +19 -0
- package/dist/lib/triggers/new-segment-tag-subscriber-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/new-segment-tag-subscriber-trigger.js +264 -0
- package/dist/lib/triggers/new-segment-tag-subscriber-trigger.js.map +1 -0
- package/dist/lib/triggers/subscribe-trigger.d.ts +11 -0
- package/dist/lib/triggers/subscribe-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/subscribe-trigger.js +150 -0
- package/dist/lib/triggers/subscribe-trigger.js.map +1 -0
- package/dist/lib/triggers/subscriber-updated-trigger.d.ts +11 -0
- package/dist/lib/triggers/subscriber-updated-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/subscriber-updated-trigger.js +157 -0
- package/dist/lib/triggers/subscriber-updated-trigger.js.map +1 -0
- package/dist/lib/triggers/unsubscribe-trigger.d.ts +11 -0
- package/dist/lib/triggers/unsubscribe-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/unsubscribe-trigger.js +196 -0
- package/dist/lib/triggers/unsubscribe-trigger.js.map +1 -0
- package/package.json +45 -3
- package/src/index.ts +77 -0
- package/src/lib/actions/add-member-to-list.ts +180 -0
- package/src/lib/actions/add-note-to-subscriber.ts +91 -0
- package/src/lib/actions/add-subscriber-to-tag.ts +66 -0
- package/src/lib/actions/archive-subscriber.ts +64 -0
- package/src/lib/actions/create-audience.ts +192 -0
- package/src/lib/actions/create-campaign.ts +155 -0
- package/src/lib/actions/create-custom-event.ts +63 -0
- package/src/lib/actions/create-tag.ts +51 -0
- package/src/lib/actions/find-campaign.ts +68 -0
- package/src/lib/actions/find-customer.ts +88 -0
- package/src/lib/actions/find-subscriber.ts +307 -0
- package/src/lib/actions/find-tag.ts +57 -0
- package/src/lib/actions/get-campaign-report.ts +204 -0
- package/src/lib/actions/remove-subscriber-from-tag.ts +94 -0
- package/src/lib/actions/send-campaign.ts +42 -0
- package/src/lib/actions/unsubscribe-email.ts +91 -0
- package/src/lib/actions/update-subscriber-status.ts +53 -0
- package/src/lib/common/index.ts +267 -0
- package/src/lib/common/types.ts +410 -0
- package/src/lib/triggers/email-opened-trigger.ts +216 -0
- package/src/lib/triggers/link-clicked-trigger.ts +244 -0
- package/src/lib/triggers/new-campaign-trigger.ts +149 -0
- package/src/lib/triggers/new-customer-trigger.ts +230 -0
- package/src/lib/triggers/new-order-trigger.ts +288 -0
- package/src/lib/triggers/new-segment-tag-subscriber-trigger.ts +286 -0
- package/src/lib/triggers/subscribe-trigger.ts +159 -0
- package/src/lib/triggers/subscriber-updated-trigger.ts +165 -0
- package/src/lib/triggers/unsubscribe-trigger.ts +212 -0
- package/README.md +0 -3
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
export enum MailChimpWebhookType {
|
|
2
|
+
/**
|
|
3
|
+
* triggers when a list subscriber is added.
|
|
4
|
+
*/
|
|
5
|
+
SUBSCRIBE = 'subscribe',
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* triggers when a list member unsubscribes.
|
|
9
|
+
*/
|
|
10
|
+
UNSUBSCRIBE = 'unsubscribe',
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* triggers when a subscriber's profile is updated.
|
|
14
|
+
*/
|
|
15
|
+
PROFILE = 'profile',
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* triggers when a subscriber's email address is cleaned from the list.
|
|
19
|
+
*/
|
|
20
|
+
CLEANED = 'cleaned',
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* triggers when a subscriber's email address is changed.
|
|
24
|
+
*/
|
|
25
|
+
UP_EMAIL = 'upemail',
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* triggers when a campaign is sent or cancelled.
|
|
29
|
+
*/
|
|
30
|
+
CAMPAIGN = 'campaign',
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* triggers when a subscriber's email address is changed.
|
|
34
|
+
*/
|
|
35
|
+
PENDING = 'pending',
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* transactional
|
|
39
|
+
*/
|
|
40
|
+
TRANSACTIONAL = 'transactional',
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* triggers when a subscriber clicks a link in a campaign.
|
|
44
|
+
*/
|
|
45
|
+
CLICK = 'click',
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* triggers when a subscriber opens an email in a campaign.
|
|
49
|
+
*/
|
|
50
|
+
OPEN = 'open',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export enum MailChimpEmailType {
|
|
54
|
+
HTML = 'html',
|
|
55
|
+
TEXT = 'text',
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type MailChimpWebhookRequest<Type extends MailChimpWebhookType, Data> = {
|
|
59
|
+
type: Type;
|
|
60
|
+
fired_at: string;
|
|
61
|
+
data: Data;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export type MailChimpSubscribeWebhookData = {
|
|
65
|
+
id: string;
|
|
66
|
+
list_id: string;
|
|
67
|
+
email: string;
|
|
68
|
+
email_type: MailChimpEmailType;
|
|
69
|
+
ip_opt: string;
|
|
70
|
+
ip_signup: string;
|
|
71
|
+
merges: Record<string, string>;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export type MailChimpSubscribeWebhookRequest = MailChimpWebhookRequest<
|
|
75
|
+
MailChimpWebhookType.SUBSCRIBE,
|
|
76
|
+
MailChimpSubscribeWebhookData
|
|
77
|
+
>;
|
|
78
|
+
|
|
79
|
+
export type MailChimpClickWebhookData = {
|
|
80
|
+
id: string;
|
|
81
|
+
list_id: string;
|
|
82
|
+
campaign_id: string;
|
|
83
|
+
email: string;
|
|
84
|
+
url: string;
|
|
85
|
+
ip: string;
|
|
86
|
+
user_agent: string;
|
|
87
|
+
timestamp?: string;
|
|
88
|
+
link_id?: string;
|
|
89
|
+
click_count?: number;
|
|
90
|
+
is_first_click?: boolean;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export type MailChimpClickWebhookRequest = MailChimpWebhookRequest<
|
|
94
|
+
MailChimpWebhookType.CLICK,
|
|
95
|
+
MailChimpClickWebhookData
|
|
96
|
+
>;
|
|
97
|
+
|
|
98
|
+
export type MailChimpOpenWebhookData = {
|
|
99
|
+
id: string;
|
|
100
|
+
list_id: string;
|
|
101
|
+
campaign_id: string;
|
|
102
|
+
email: string;
|
|
103
|
+
ip: string;
|
|
104
|
+
user_agent: string;
|
|
105
|
+
timestamp: string;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export type MailChimpOpenWebhookRequest = MailChimpWebhookRequest<
|
|
109
|
+
MailChimpWebhookType.OPEN,
|
|
110
|
+
MailChimpOpenWebhookData
|
|
111
|
+
>;
|
|
112
|
+
|
|
113
|
+
export type MailChimpCampaignWebhookData = {
|
|
114
|
+
id: string;
|
|
115
|
+
list_id: string;
|
|
116
|
+
campaign_id: string;
|
|
117
|
+
campaign_title: string;
|
|
118
|
+
campaign_subject: string;
|
|
119
|
+
campaign_send_time: string;
|
|
120
|
+
campaign_status: string;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export type MailChimpCampaignWebhookRequest = MailChimpWebhookRequest<
|
|
124
|
+
MailChimpWebhookType.CAMPAIGN,
|
|
125
|
+
MailChimpCampaignWebhookData
|
|
126
|
+
>;
|
|
127
|
+
|
|
128
|
+
// Extended Mailchimp API types since the official @types/mailchimp__mailchimp_marketing package is incomplete
|
|
129
|
+
|
|
130
|
+
export interface MailchimpClient {
|
|
131
|
+
setConfig(config: MailchimpConfig): void;
|
|
132
|
+
campaigns: MailchimpCampaignsApi;
|
|
133
|
+
lists: MailchimpListsApi;
|
|
134
|
+
reports: MailchimpReportsApi;
|
|
135
|
+
searchCampaigns: MailchimpSearchCampaignsApi;
|
|
136
|
+
ecommerce: MailchimpEcommerceApi;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface MailchimpSearchCampaignsApi {
|
|
140
|
+
search(params: any): Promise<any>;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface MailchimpEcommerceApi {
|
|
144
|
+
getAllStoreCustomers(storeId: string, opts?: any): Promise<any>;
|
|
145
|
+
stores(opts?: any): Promise<any>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export interface MailchimpConfig {
|
|
149
|
+
accessToken: string;
|
|
150
|
+
server: string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface MailchimpCampaignsApi {
|
|
154
|
+
create(data: CampaignCreateData): Promise<Campaign>;
|
|
155
|
+
get(campaignId: string, opts?: CampaignGetOptions): Promise<Campaign>;
|
|
156
|
+
update(campaignId: string, data: Partial<CampaignCreateData>): Promise<Campaign>;
|
|
157
|
+
remove(campaignId: string): Promise<void>;
|
|
158
|
+
send(campaignId: string): Promise<void>;
|
|
159
|
+
setContent(campaignId: string, content: CampaignContentData): Promise<any>;
|
|
160
|
+
list(opts?: any): Promise<any>;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface MailchimpListsApi {
|
|
164
|
+
createList(data: any): Promise<any>;
|
|
165
|
+
deleteListMember(listId: string, subscriberHash: string): Promise<void>;
|
|
166
|
+
addListMember(listId: string, data: any): Promise<any>;
|
|
167
|
+
updateListMember(listId: string, subscriberHash: string, data: any): Promise<any>;
|
|
168
|
+
setListMember(listId: string, subscriberHash: string, data: any, opts?: any): Promise<any>;
|
|
169
|
+
batchListMembers(listId: string, data: any, opts?: any): Promise<any>;
|
|
170
|
+
getAllLists(options?: any): Promise<any>;
|
|
171
|
+
tagSearch(listId: string, opts?: any): Promise<any>;
|
|
172
|
+
updateListMemberTags(listId: string, subscriberHash: string, data: any): Promise<any>;
|
|
173
|
+
createSegment(listId: string, data: CreateSegmentData): Promise<Segment>;
|
|
174
|
+
createListMemberEvent(listId: string, subscriberHash: string, data: CreateListMemberEventData): Promise<void>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface CreateSegmentData {
|
|
178
|
+
name: string;
|
|
179
|
+
static_segment?: string[];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export interface Segment {
|
|
183
|
+
id: number;
|
|
184
|
+
name: string;
|
|
185
|
+
list_id: string;
|
|
186
|
+
type: string;
|
|
187
|
+
created_at: string;
|
|
188
|
+
updated_at: string;
|
|
189
|
+
member_count: number;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface CreateListMemberEventData {
|
|
193
|
+
name: string;
|
|
194
|
+
properties?: Record<string, unknown>;
|
|
195
|
+
occurred_at?: string;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface MailchimpReportsApi {
|
|
199
|
+
getCampaignReport(campaignId: string, opts?: CampaignReportOptions): Promise<CampaignReport>;
|
|
200
|
+
getAllCampaignReports(opts?: any): Promise<any>;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export interface CampaignCreateData {
|
|
204
|
+
type: string;
|
|
205
|
+
recipients: {
|
|
206
|
+
list_id: string;
|
|
207
|
+
};
|
|
208
|
+
settings: {
|
|
209
|
+
subject_line: string;
|
|
210
|
+
title: string;
|
|
211
|
+
from_name: string;
|
|
212
|
+
from_email: string;
|
|
213
|
+
reply_to: string;
|
|
214
|
+
to_name?: string;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export interface CampaignContentData {
|
|
219
|
+
html?: string;
|
|
220
|
+
plain_text?: string;
|
|
221
|
+
url?: string;
|
|
222
|
+
template?: {
|
|
223
|
+
id: string;
|
|
224
|
+
sections?: Record<string, any>;
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export interface CampaignGetOptions {
|
|
229
|
+
fields?: string;
|
|
230
|
+
exclude_fields?: string;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export interface CampaignReportOptions {
|
|
234
|
+
fields?: string;
|
|
235
|
+
exclude_fields?: string;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface CampaignReport {
|
|
239
|
+
id: string;
|
|
240
|
+
campaign_title: string;
|
|
241
|
+
type: string;
|
|
242
|
+
list_id: string;
|
|
243
|
+
list_is_active: boolean;
|
|
244
|
+
list_name: string;
|
|
245
|
+
subject_line: string;
|
|
246
|
+
preview_text?: string;
|
|
247
|
+
emails_sent: number;
|
|
248
|
+
abuse_reports: number;
|
|
249
|
+
unsubscribed: number;
|
|
250
|
+
send_time?: string;
|
|
251
|
+
rss_last_send?: string;
|
|
252
|
+
bounces?: {
|
|
253
|
+
hard_bounces: number;
|
|
254
|
+
soft_bounces: number;
|
|
255
|
+
syntax_errors: number;
|
|
256
|
+
};
|
|
257
|
+
forwards?: {
|
|
258
|
+
forwards_count: number;
|
|
259
|
+
forwards_opens: number;
|
|
260
|
+
};
|
|
261
|
+
opens?: {
|
|
262
|
+
opens_total: number;
|
|
263
|
+
unique_opens: number;
|
|
264
|
+
open_rate: number;
|
|
265
|
+
last_open?: string;
|
|
266
|
+
proxy_excluded_opens?: number;
|
|
267
|
+
proxy_excluded_unique_opens?: number;
|
|
268
|
+
proxy_excluded_open_rate?: number;
|
|
269
|
+
};
|
|
270
|
+
clicks?: {
|
|
271
|
+
clicks_total: number;
|
|
272
|
+
unique_clicks: number;
|
|
273
|
+
unique_subscriber_clicks: number;
|
|
274
|
+
click_rate: number;
|
|
275
|
+
last_click?: string;
|
|
276
|
+
};
|
|
277
|
+
facebook_likes?: {
|
|
278
|
+
recipient_likes: number;
|
|
279
|
+
unique_likes: number;
|
|
280
|
+
facebook_likes: number;
|
|
281
|
+
};
|
|
282
|
+
industry_stats?: {
|
|
283
|
+
type: string;
|
|
284
|
+
open_rate: number;
|
|
285
|
+
click_rate: number;
|
|
286
|
+
bounce_rate: number;
|
|
287
|
+
unopen_rate: number;
|
|
288
|
+
unsub_rate: number;
|
|
289
|
+
abuse_rate: number;
|
|
290
|
+
};
|
|
291
|
+
list_stats?: {
|
|
292
|
+
sub_rate: number;
|
|
293
|
+
unsub_rate: number;
|
|
294
|
+
open_rate: number;
|
|
295
|
+
proxy_excluded_open_rate: number;
|
|
296
|
+
click_rate: number;
|
|
297
|
+
};
|
|
298
|
+
ab_split?: {
|
|
299
|
+
a?: {
|
|
300
|
+
bounces: number;
|
|
301
|
+
abuse_reports: number;
|
|
302
|
+
unsubs: number;
|
|
303
|
+
recipient_clicks: number;
|
|
304
|
+
forwards: number;
|
|
305
|
+
forwards_opens: number;
|
|
306
|
+
opens: number;
|
|
307
|
+
last_open?: string;
|
|
308
|
+
unique_opens: number;
|
|
309
|
+
};
|
|
310
|
+
b?: {
|
|
311
|
+
bounces: number;
|
|
312
|
+
abuse_reports: number;
|
|
313
|
+
unsubs: number;
|
|
314
|
+
recipient_clicks: number;
|
|
315
|
+
forwards: number;
|
|
316
|
+
forwards_opens: number;
|
|
317
|
+
opens: number;
|
|
318
|
+
last_open?: string;
|
|
319
|
+
unique_opens: number;
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
timewarp?: Array<{
|
|
323
|
+
gmt_offset: number;
|
|
324
|
+
opens: number;
|
|
325
|
+
last_open?: string;
|
|
326
|
+
unique_opens: number;
|
|
327
|
+
clicks: number;
|
|
328
|
+
last_click?: string;
|
|
329
|
+
unique_clicks: number;
|
|
330
|
+
bounces: number;
|
|
331
|
+
}>;
|
|
332
|
+
timeseries?: Array<{
|
|
333
|
+
timestamp: string;
|
|
334
|
+
emails_sent: number;
|
|
335
|
+
unique_opens: number;
|
|
336
|
+
proxy_excluded_unique_opens: number;
|
|
337
|
+
recipients_clicks: number;
|
|
338
|
+
}>;
|
|
339
|
+
share_report?: {
|
|
340
|
+
share_url: string;
|
|
341
|
+
share_password: string;
|
|
342
|
+
};
|
|
343
|
+
ecommerce?: {
|
|
344
|
+
total_orders: number;
|
|
345
|
+
total_spent: number;
|
|
346
|
+
total_revenue: number;
|
|
347
|
+
currency_code: string;
|
|
348
|
+
};
|
|
349
|
+
delivery_status?: {
|
|
350
|
+
enabled: boolean;
|
|
351
|
+
can_cancel: boolean;
|
|
352
|
+
status: string;
|
|
353
|
+
emails_sent: number;
|
|
354
|
+
emails_canceled: number;
|
|
355
|
+
};
|
|
356
|
+
_links?: Array<{
|
|
357
|
+
rel: string;
|
|
358
|
+
href: string;
|
|
359
|
+
method: string;
|
|
360
|
+
}>;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export interface Campaign {
|
|
364
|
+
id: string;
|
|
365
|
+
web_id: number;
|
|
366
|
+
parent_campaign_id?: string;
|
|
367
|
+
type: string;
|
|
368
|
+
create_time: string;
|
|
369
|
+
archive_url: string;
|
|
370
|
+
long_archive_url?: string;
|
|
371
|
+
status: string;
|
|
372
|
+
emails_sent: number;
|
|
373
|
+
send_time?: string;
|
|
374
|
+
content_type: string;
|
|
375
|
+
needs_block_refresh?: boolean;
|
|
376
|
+
resendable?: boolean;
|
|
377
|
+
recipients: {
|
|
378
|
+
list_id: string;
|
|
379
|
+
list_is_active: boolean;
|
|
380
|
+
list_name: string;
|
|
381
|
+
segment_text: string;
|
|
382
|
+
recipient_count: number;
|
|
383
|
+
};
|
|
384
|
+
settings: {
|
|
385
|
+
subject_line: string;
|
|
386
|
+
title: string;
|
|
387
|
+
from_name: string;
|
|
388
|
+
reply_to: string;
|
|
389
|
+
to_name: string;
|
|
390
|
+
content_type: string;
|
|
391
|
+
content_url?: string;
|
|
392
|
+
template_id?: number;
|
|
393
|
+
};
|
|
394
|
+
variate_settings?: any;
|
|
395
|
+
tracking?: any;
|
|
396
|
+
rss_opts?: any;
|
|
397
|
+
ab_split_opts?: any;
|
|
398
|
+
social_card?: any;
|
|
399
|
+
report_summary?: any;
|
|
400
|
+
delivery_status?: any;
|
|
401
|
+
resend_shortcut_eligibility?: any;
|
|
402
|
+
resend_shortcut_usage?: any;
|
|
403
|
+
_links: Array<{
|
|
404
|
+
rel: string;
|
|
405
|
+
href: string;
|
|
406
|
+
method: string;
|
|
407
|
+
targetSchema?: string;
|
|
408
|
+
schema?: string;
|
|
409
|
+
}>;
|
|
410
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { createTrigger, TriggerStrategy, Property } from '@agnocon/pieces-framework';
|
|
2
|
+
import { getAccessTokenOrThrow } from '@agnocon/pieces-common';
|
|
3
|
+
import { mailchimpCommon } from '../common';
|
|
4
|
+
import { MailChimpOpenWebhookRequest } from '../common/types';
|
|
5
|
+
import { mailchimpAuth } from '../..';
|
|
6
|
+
|
|
7
|
+
const WEBHOOK_DATA_STORE_KEY = 'mail_chimp_email_opened_webhook_data';
|
|
8
|
+
|
|
9
|
+
type WebhookData = {
|
|
10
|
+
id: string;
|
|
11
|
+
listId: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const getEmailOpenEventSummary = (request: any): any => {
|
|
15
|
+
const data = request.data || {};
|
|
16
|
+
return {
|
|
17
|
+
email: data.email || 'N/A',
|
|
18
|
+
subscriber_id: data.id || 'N/A',
|
|
19
|
+
list_id: data.list_id || 'N/A',
|
|
20
|
+
campaign_id: data.campaign_id || 'N/A',
|
|
21
|
+
ip_address: data.ip || 'N/A',
|
|
22
|
+
user_agent: data.user_agent || 'N/A',
|
|
23
|
+
timestamp: data.timestamp || request.fired_at || 'N/A',
|
|
24
|
+
location_data: extractLocationData(data),
|
|
25
|
+
device_info: extractDeviceInfo(data.user_agent),
|
|
26
|
+
engagement_metrics: calculateEngagementMetrics(data),
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const extractLocationData = (data: any): any => {
|
|
31
|
+
return {
|
|
32
|
+
ip_address: data.ip || 'N/A',
|
|
33
|
+
country: data.country || 'N/A',
|
|
34
|
+
region: data.region || 'N/A',
|
|
35
|
+
city: data.city || 'N/A',
|
|
36
|
+
timezone: data.timezone || 'N/A',
|
|
37
|
+
latitude: data.latitude || 'N/A',
|
|
38
|
+
longitude: data.longitude || 'N/A',
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const extractDeviceInfo = (userAgent: string): any => {
|
|
43
|
+
if (!userAgent) return { device_type: 'Unknown', browser: 'Unknown', os: 'Unknown' };
|
|
44
|
+
|
|
45
|
+
const isMobile = /Mobile|Android|iPhone|iPad|Windows Phone/i.test(userAgent);
|
|
46
|
+
const isTablet = /iPad|Android(?=.*\bMobile\b)(?=.*\bSafari\b)/i.test(userAgent);
|
|
47
|
+
|
|
48
|
+
let deviceType = 'Desktop';
|
|
49
|
+
if (isTablet) deviceType = 'Tablet';
|
|
50
|
+
else if (isMobile) deviceType = 'Mobile';
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
device_type: deviceType,
|
|
54
|
+
user_agent: userAgent,
|
|
55
|
+
is_mobile: isMobile,
|
|
56
|
+
is_tablet: isTablet,
|
|
57
|
+
is_desktop: !isMobile && !isTablet,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const calculateEngagementMetrics = (data: any): any => {
|
|
62
|
+
return {
|
|
63
|
+
open_count: data.open_count || 1,
|
|
64
|
+
is_first_open: data.is_first_open || false,
|
|
65
|
+
open_rate: data.open_rate || 0,
|
|
66
|
+
engagement_score: data.member_rating || 0,
|
|
67
|
+
vip_status: data.vip || false,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const assessEngagementLevel = (data: any): string => {
|
|
72
|
+
const rating = data.member_rating || 0;
|
|
73
|
+
const isVip = data.vip || false;
|
|
74
|
+
const openCount = data.open_count || 1;
|
|
75
|
+
|
|
76
|
+
if (isVip || rating >= 4) return 'High';
|
|
77
|
+
if (rating >= 2 || openCount > 1) return 'Medium';
|
|
78
|
+
return 'Low';
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const identifyAutomationOpportunities = (data: any): string[] => {
|
|
82
|
+
const opportunities = [];
|
|
83
|
+
|
|
84
|
+
if (data.is_first_open) {
|
|
85
|
+
opportunities.push('First-time opener - welcome series opportunity');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (data.member_rating && data.member_rating >= 4) {
|
|
89
|
+
opportunities.push('High engagement - upsell opportunity');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (data.vip) {
|
|
93
|
+
opportunities.push('VIP subscriber - exclusive content opportunity');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return opportunities.length > 0 ? opportunities : ['Standard engagement tracking'];
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const mailChimpEmailOpenedTrigger = createTrigger({
|
|
100
|
+
auth: mailchimpAuth,
|
|
101
|
+
name: 'email_opened',
|
|
102
|
+
displayName: 'Email Opened',
|
|
103
|
+
description: 'Fires when a recipient opens a an email in a specific campaign',
|
|
104
|
+
aiMetadata: {
|
|
105
|
+
description: 'Fires when a recipient in the selected audience (list) opens a campaign email. The event carries the subscriber email, campaign id, and client/location metadata.',
|
|
106
|
+
},
|
|
107
|
+
type: TriggerStrategy.WEBHOOK,
|
|
108
|
+
props: {
|
|
109
|
+
list_id: mailchimpCommon.mailChimpListIdDropdown,
|
|
110
|
+
},
|
|
111
|
+
sampleData: {
|
|
112
|
+
type: 'open',
|
|
113
|
+
fired_at: '2024-01-15T10:30:00Z',
|
|
114
|
+
data: {
|
|
115
|
+
id: '8a25ff1d98',
|
|
116
|
+
list_id: 'a6b5da1054',
|
|
117
|
+
campaign_id: 'campaign_123',
|
|
118
|
+
email: 'user@example.com',
|
|
119
|
+
ip: '192.168.1.100',
|
|
120
|
+
user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
121
|
+
timestamp: '2024-01-15T10:30:00Z',
|
|
122
|
+
open_count: 1,
|
|
123
|
+
is_first_open: true,
|
|
124
|
+
open_rate: 0.85,
|
|
125
|
+
member_rating: 4,
|
|
126
|
+
vip: false,
|
|
127
|
+
country: 'US',
|
|
128
|
+
region: 'CA',
|
|
129
|
+
city: 'San Francisco',
|
|
130
|
+
timezone: 'America/Los_Angeles',
|
|
131
|
+
latitude: 37.7749,
|
|
132
|
+
longitude: -122.4194,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
async onEnable(context): Promise<void> {
|
|
137
|
+
try {
|
|
138
|
+
const accessToken = getAccessTokenOrThrow(context.auth);
|
|
139
|
+
const server = await mailchimpCommon.getMailChimpServerPrefix(accessToken);
|
|
140
|
+
|
|
141
|
+
const enabledWebhookId = await mailchimpCommon.enableWebhookRequest({
|
|
142
|
+
server,
|
|
143
|
+
listId: context.propsValue.list_id as string,
|
|
144
|
+
token: accessToken,
|
|
145
|
+
webhookUrl: context.webhookUrl!,
|
|
146
|
+
events: {
|
|
147
|
+
open: true,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
await context.store?.put<WebhookData>(WEBHOOK_DATA_STORE_KEY, {
|
|
152
|
+
id: enabledWebhookId,
|
|
153
|
+
listId: context.propsValue.list_id as string,
|
|
154
|
+
});
|
|
155
|
+
} catch (error: any) {
|
|
156
|
+
throw new Error(`Failed to enable email opened webhook: ${error.message || JSON.stringify(error)}`);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
async onDisable(context): Promise<void> {
|
|
161
|
+
try {
|
|
162
|
+
const webhookData = await context.store?.get<WebhookData>(WEBHOOK_DATA_STORE_KEY);
|
|
163
|
+
|
|
164
|
+
if (webhookData === undefined || webhookData === null) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const token = getAccessTokenOrThrow(context.auth);
|
|
169
|
+
const server = await mailchimpCommon.getMailChimpServerPrefix(token);
|
|
170
|
+
|
|
171
|
+
await mailchimpCommon.disableWebhookRequest({
|
|
172
|
+
server,
|
|
173
|
+
token,
|
|
174
|
+
listId: webhookData.listId,
|
|
175
|
+
webhookId: webhookData.id,
|
|
176
|
+
});
|
|
177
|
+
} catch (error: any) {
|
|
178
|
+
console.error(`Failed to disable email opened webhook: ${error.message || JSON.stringify(error)}`);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
async run(context): Promise<unknown[]> {
|
|
183
|
+
try {
|
|
184
|
+
const request = context.payload.body as MailChimpOpenWebhookRequest;
|
|
185
|
+
|
|
186
|
+
if (!request || request.type !== 'open') {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const enhancedRequest = {
|
|
191
|
+
...request,
|
|
192
|
+
trigger_type: 'email_opened',
|
|
193
|
+
event_category: 'Email Engagement',
|
|
194
|
+
processed_at: new Date().toISOString(),
|
|
195
|
+
open_summary: getEmailOpenEventSummary(request),
|
|
196
|
+
business_context: {
|
|
197
|
+
email_engagement: true,
|
|
198
|
+
performance_tracking: true,
|
|
199
|
+
subscriber_behavior: true,
|
|
200
|
+
automation_trigger: true,
|
|
201
|
+
},
|
|
202
|
+
engagement_insights: {
|
|
203
|
+
device_type: extractDeviceInfo(request.data?.user_agent).device_type,
|
|
204
|
+
location: extractLocationData(request.data),
|
|
205
|
+
engagement_level: assessEngagementLevel(request.data),
|
|
206
|
+
automation_potential: identifyAutomationOpportunities(request.data),
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
return [enhancedRequest];
|
|
211
|
+
} catch (error: any) {
|
|
212
|
+
console.error(`Error processing email opened webhook: ${error.message || JSON.stringify(error)}`);
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
});
|