@funnelsgrove/emails 0.1.2 → 0.1.6
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/README.md +38 -1
- package/dist/index.d.ts +30 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,7 +57,8 @@ const sequence = await emails.createSequence({
|
|
|
57
57
|
mode: 'template',
|
|
58
58
|
template: 'welcome',
|
|
59
59
|
variables: { firstName: 'first_name' },
|
|
60
|
-
|
|
60
|
+
personalizationEnabled: true,
|
|
61
|
+
delay: { value: 1, unit: 'hours' },
|
|
61
62
|
}],
|
|
62
63
|
},
|
|
63
64
|
});
|
|
@@ -69,6 +70,28 @@ await emails.addSequenceStep(sequence.id, {
|
|
|
69
70
|
body: 'Come back when you are ready.',
|
|
70
71
|
delay: { value: 2, unit: 'days' },
|
|
71
72
|
});
|
|
73
|
+
|
|
74
|
+
await emails.publishSequence(sequence.id);
|
|
75
|
+
await emails.enableSequence(sequence.id);
|
|
76
|
+
|
|
77
|
+
// Stops new enrollments; existing active enrollments remain active.
|
|
78
|
+
await emails.disableSequence(sequence.id);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
With personalization enabled, FunnelsGrove emits an `email.personalization_requested`
|
|
82
|
+
project webhook 20 minutes before delivery. Patch only the variables that need fresh
|
|
83
|
+
data; the pinned template is validated and rendered again before it sends:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
await emails.updateVariables(event.data.deliveryId, {
|
|
87
|
+
firstName: customer.firstName,
|
|
88
|
+
recommendation: customer.recommendation,
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
fgrove email update-variables "$DELIVERY_ID" \
|
|
94
|
+
--variables '{"firstName":"Ada"}'
|
|
72
95
|
```
|
|
73
96
|
|
|
74
97
|
Sequence editing uses the same project CLI with `fgrove email sequence add-step` and local JSON files:
|
|
@@ -82,3 +105,17 @@ fgrove email sequence add-step lead-follow-up \
|
|
|
82
105
|
--body "Come back when you are ready." \
|
|
83
106
|
--delay-days 2
|
|
84
107
|
```
|
|
108
|
+
|
|
109
|
+
Cancel a user's active enrollment idempotently. A retry returns `cancelled: 0` after the enrollment is already terminal:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
await emails.cancelSequenceEnrollment(sequence.id, {
|
|
113
|
+
funnelEndUserId: '00000000-0000-4000-8000-000000000000',
|
|
114
|
+
reason: 'customer_request',
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
fgrove email sequence cancel lead-follow-up \
|
|
120
|
+
--user-id 00000000-0000-4000-8000-000000000000
|
|
121
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,16 @@ export type EmailStatus = EmailReceipt & {
|
|
|
17
17
|
sentAt: string | null;
|
|
18
18
|
failedAt: string | null;
|
|
19
19
|
};
|
|
20
|
+
export type EmailPersonalization = {
|
|
21
|
+
id: string;
|
|
22
|
+
status: string;
|
|
23
|
+
variables: Record<string, EmailVariable>;
|
|
24
|
+
subject: string;
|
|
25
|
+
html: string;
|
|
26
|
+
text: string;
|
|
27
|
+
dueAt: string;
|
|
28
|
+
updatedAt: string;
|
|
29
|
+
};
|
|
20
30
|
export type EmailTemplateVariableType = 'string' | 'number' | 'boolean';
|
|
21
31
|
export type EmailTemplateDraft = {
|
|
22
32
|
subject: string;
|
|
@@ -58,6 +68,8 @@ export type EmailSequenceTemplateStepInput = {
|
|
|
58
68
|
mode?: 'template';
|
|
59
69
|
template: string;
|
|
60
70
|
variables?: Record<string, EmailVariable>;
|
|
71
|
+
/** Request a webhook 20 minutes before this step sends. */
|
|
72
|
+
personalizationEnabled?: boolean;
|
|
61
73
|
delay: SequenceDelay;
|
|
62
74
|
};
|
|
63
75
|
export type EmailSequenceDirectStepInput = {
|
|
@@ -74,6 +86,7 @@ export type EmailSequenceTemplateStep = {
|
|
|
74
86
|
mode: 'template';
|
|
75
87
|
templateVersionId: string;
|
|
76
88
|
variables: Record<string, EmailVariable>;
|
|
89
|
+
personalizationEnabled: boolean;
|
|
77
90
|
};
|
|
78
91
|
export type EmailSequenceDirectStep = {
|
|
79
92
|
key: string;
|
|
@@ -83,18 +96,22 @@ export type EmailSequenceDirectStep = {
|
|
|
83
96
|
body: string;
|
|
84
97
|
};
|
|
85
98
|
export type EmailSequenceStep = EmailSequenceTemplateStep | EmailSequenceDirectStep;
|
|
99
|
+
export type EmailSequenceExitEventType = 'purchase_completed' | 'registration_completed';
|
|
86
100
|
export type EmailSequenceDraftInput = {
|
|
87
101
|
triggerEventType: 'email_captured' | 'purchase_completed' | 'registration_completed';
|
|
88
102
|
/** Empty means this sequence runs for every funnel in the project. */
|
|
89
103
|
funnelIds?: string[];
|
|
90
104
|
steps: EmailSequenceStepInput[];
|
|
91
|
-
exitEventTypes?:
|
|
105
|
+
exitEventTypes?: EmailSequenceExitEventType[];
|
|
106
|
+
/** Keep enabled for marketing and subscription email. Defaults to true. */
|
|
107
|
+
unsubscribeEnabled?: boolean;
|
|
92
108
|
};
|
|
93
109
|
export type EmailSequenceDraft = {
|
|
94
110
|
triggerEventType: EmailSequenceDraftInput['triggerEventType'];
|
|
95
111
|
funnelIds: string[];
|
|
96
112
|
steps: EmailSequenceStep[];
|
|
97
113
|
exitEventTypes: NonNullable<EmailSequenceDraftInput['exitEventTypes']>;
|
|
114
|
+
unsubscribeEnabled: boolean;
|
|
98
115
|
};
|
|
99
116
|
export type EmailSequence = {
|
|
100
117
|
id: string;
|
|
@@ -125,6 +142,11 @@ export type CreateSequenceInput = {
|
|
|
125
142
|
name: string;
|
|
126
143
|
draft: EmailSequenceDraftInput;
|
|
127
144
|
};
|
|
145
|
+
export type EmailSequenceCancellation = {
|
|
146
|
+
sequenceId: string;
|
|
147
|
+
funnelEndUserId: string;
|
|
148
|
+
cancelled: number;
|
|
149
|
+
};
|
|
128
150
|
export declare class EmailsApiError extends Error {
|
|
129
151
|
readonly status: number;
|
|
130
152
|
constructor(status: number, message: string);
|
|
@@ -152,6 +174,7 @@ export declare class EmailsClient {
|
|
|
152
174
|
constructor(options: EmailsClientOptions);
|
|
153
175
|
send(input: SendEmailInput): Promise<EmailReceipt>;
|
|
154
176
|
get(deliveryId: string): Promise<EmailStatus>;
|
|
177
|
+
updateVariables(deliveryId: string, variables: Record<string, EmailVariable>): Promise<EmailPersonalization>;
|
|
155
178
|
private request;
|
|
156
179
|
listTemplates(): Promise<EmailTemplate[]>;
|
|
157
180
|
getTemplate(templateId: string): Promise<EmailTemplateDetail>;
|
|
@@ -189,5 +212,11 @@ export declare class EmailsClient {
|
|
|
189
212
|
sequence: EmailSequence;
|
|
190
213
|
version: EmailSequenceVersion;
|
|
191
214
|
}>;
|
|
215
|
+
enableSequence(sequenceId: string): Promise<EmailSequence>;
|
|
216
|
+
disableSequence(sequenceId: string): Promise<EmailSequence>;
|
|
217
|
+
cancelSequenceEnrollment(sequenceId: string, input: {
|
|
218
|
+
funnelEndUserId: string;
|
|
219
|
+
reason?: string;
|
|
220
|
+
}): Promise<EmailSequenceCancellation>;
|
|
192
221
|
}
|
|
193
222
|
export declare const createEmailsClient: (options: EmailsClientOptions) => EmailsClient;
|
package/dist/index.js
CHANGED
|
@@ -60,6 +60,9 @@ export class EmailsClient {
|
|
|
60
60
|
throw new EmailsApiError(response.status, errorMessage(body));
|
|
61
61
|
return body;
|
|
62
62
|
}
|
|
63
|
+
async updateVariables(deliveryId, variables) {
|
|
64
|
+
return this.request(`/sdk/private/emails/${encodeURIComponent(deliveryId)}/variables`, { method: 'PATCH', body: JSON.stringify({ variables }) });
|
|
65
|
+
}
|
|
63
66
|
async request(path, init = {}) {
|
|
64
67
|
const response = await this.fetchFn(`${this.apiUrl}${path}`, {
|
|
65
68
|
...init,
|
|
@@ -131,6 +134,18 @@ export class EmailsClient {
|
|
|
131
134
|
async publishSequence(sequenceId) {
|
|
132
135
|
return this.request(`/sdk/private/sequences/${encodeURIComponent(sequenceId)}/publish`, { method: 'POST' });
|
|
133
136
|
}
|
|
137
|
+
async enableSequence(sequenceId) {
|
|
138
|
+
return this.request(`/sdk/private/sequences/${encodeURIComponent(sequenceId)}/enable`, { method: 'POST' });
|
|
139
|
+
}
|
|
140
|
+
async disableSequence(sequenceId) {
|
|
141
|
+
return this.request(`/sdk/private/sequences/${encodeURIComponent(sequenceId)}/disable`, { method: 'POST' });
|
|
142
|
+
}
|
|
143
|
+
async cancelSequenceEnrollment(sequenceId, input) {
|
|
144
|
+
return this.request(`/sdk/private/sequences/${encodeURIComponent(sequenceId)}/enrollments/${encodeURIComponent(input.funnelEndUserId)}/cancel`, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
body: JSON.stringify(input.reason === undefined ? {} : { reason: input.reason }),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
134
149
|
}
|
|
135
150
|
export const createEmailsClient = (options) => new EmailsClient(options);
|
|
136
151
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|