ab-ecosystem-cpass 1.0.7 → 1.0.9
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 +13 -2
- package/dist/client.d.ts +24 -0
- package/dist/client.js +28 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/audience/canned-replies.d.ts +95 -0
- package/dist/resources/audience/canned-replies.js +112 -0
- package/dist/resources/audience/canned-replies.js.map +1 -0
- package/dist/resources/audience/notifications.d.ts +14 -0
- package/dist/resources/audience/notifications.js +14 -0
- package/dist/resources/audience/notifications.js.map +1 -1
- package/dist/resources/campaign-messages.d.ts +25 -22
- package/dist/resources/campaign-messages.js +34 -27
- package/dist/resources/campaign-messages.js.map +1 -1
- package/dist/resources/campaigns.d.ts +33 -3
- package/dist/resources/campaigns.js +36 -2
- package/dist/resources/campaigns.js.map +1 -1
- package/dist/resources/data-stores.d.ts +469 -0
- package/dist/resources/data-stores.js +530 -0
- package/dist/resources/data-stores.js.map +1 -0
- package/dist/resources/paths.d.ts +6 -0
- package/dist/resources/paths.js +7 -1
- package/dist/resources/paths.js.map +1 -1
- package/dist/types/campaign.d.ts +39 -7
- package/dist/types/canned-reply.d.ts +124 -0
- package/dist/types/canned-reply.js +6 -0
- package/dist/types/canned-reply.js.map +1 -0
- package/dist/types/datastore.d.ts +260 -0
- package/dist/types/datastore.js +21 -0
- package/dist/types/datastore.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/docs/audience/canned-replies.md +302 -0
- package/docs/audience/notifications.md +110 -0
- package/docs/campaign/campaign-messages.md +31 -22
- package/docs/campaign/campaigns.md +97 -10
- package/docs/data-store.md +495 -0
- package/package.json +1 -1
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CampaignMessages = void 0;
|
|
4
|
-
const
|
|
4
|
+
const paths_1 = require("./paths");
|
|
5
|
+
/** `/v1/campaigns/:id/report` -- the report is the campaign's own sub-resource. */
|
|
6
|
+
const report = (campaign) => `/v1/campaigns/${(0, paths_1.seg)(campaign)}/report`;
|
|
5
7
|
/**
|
|
6
8
|
* Campaign reporting: what actually happened to each message.
|
|
7
9
|
*
|
|
8
10
|
* ```ts
|
|
9
|
-
* const stats = await crm.campaignMessages.stats(
|
|
11
|
+
* const stats = await crm.campaignMessages.stats(campaign);
|
|
10
12
|
* // { total: 12480, sent: 12410, delivered: 11980, read: 7420, replied: 310, failed: 70 }
|
|
11
13
|
*
|
|
12
|
-
* const { data } = await crm.campaignMessages.list(
|
|
14
|
+
* const { data } = await crm.campaignMessages.list(campaign, { status: 'failed' });
|
|
13
15
|
* data[0].error; // why that one did not go
|
|
14
16
|
* ```
|
|
15
17
|
*
|
|
18
|
+
* Every method takes the campaign id first. A report has no meaning without one,
|
|
19
|
+
* so it is addressed as the campaign's own sub-resource --
|
|
20
|
+
* `/v1/campaigns/:id/report` -- rather than as a collection of rows that a
|
|
21
|
+
* campaign filters. The options object holds only what *narrows* a report that
|
|
22
|
+
* already exists: a message index, a status, a page.
|
|
23
|
+
*
|
|
16
24
|
* ## Where these numbers come from
|
|
17
25
|
*
|
|
18
26
|
* One row per attempted send, written by the campaign manager as it hands each
|
|
@@ -47,18 +55,17 @@ class CampaignMessages {
|
|
|
47
55
|
/**
|
|
48
56
|
* The campaign's funnel counts.
|
|
49
57
|
*
|
|
50
|
-
* `GET /v1/
|
|
58
|
+
* `GET /v1/campaigns/:id/report` · `campaigns:read` · **200**
|
|
51
59
|
*
|
|
52
60
|
* ### Query
|
|
53
61
|
*
|
|
54
|
-
* | Field | Type |
|
|
55
|
-
* | --- | --- | --- |
|
|
56
|
-
* | `
|
|
57
|
-
* | `message` | number | no | One message of a multi-message campaign, zero-based. |
|
|
62
|
+
* | Field | Type | Notes |
|
|
63
|
+
* | --- | --- | --- |
|
|
64
|
+
* | `message` | number | One message of a multi-message campaign, zero-based. Omit for the whole campaign. |
|
|
58
65
|
*
|
|
59
66
|
* ```ts
|
|
60
|
-
* const overall = await crm.campaignMessages.stats(
|
|
61
|
-
* const second = await crm.campaignMessages.stats(
|
|
67
|
+
* const overall = await crm.campaignMessages.stats(campaign);
|
|
68
|
+
* const second = await crm.campaignMessages.stats(campaign, { message: 1 });
|
|
62
69
|
* ```
|
|
63
70
|
*
|
|
64
71
|
* No date window: a campaign is one send, so its whole life is the only
|
|
@@ -68,19 +75,18 @@ class CampaignMessages {
|
|
|
68
75
|
* `404 not_found` if the campaign is not the caller's -- the same answer as a
|
|
69
76
|
* campaign that does not exist, so the error cannot be used to probe ids.
|
|
70
77
|
*/
|
|
71
|
-
stats(query) {
|
|
72
|
-
return this.http.request('GET',
|
|
78
|
+
stats(campaign, query = {}) {
|
|
79
|
+
return this.http.request('GET', report(campaign), { query });
|
|
73
80
|
}
|
|
74
81
|
/**
|
|
75
82
|
* The rows behind the funnel. This is the report table.
|
|
76
83
|
*
|
|
77
|
-
* `GET /v1/
|
|
84
|
+
* `GET /v1/campaigns/:id/report/messages` · `campaigns:read` · **200**
|
|
78
85
|
*
|
|
79
86
|
* ### Query
|
|
80
87
|
*
|
|
81
88
|
* | Field | Type | Default | Notes |
|
|
82
89
|
* | --- | --- | --- | --- |
|
|
83
|
-
* | `campaign` | string | — | Required. |
|
|
84
90
|
* | `message` | number | — | Zero-based index of one campaign message. |
|
|
85
91
|
* | `status` | `sent \| delivered \| read \| replied \| failed` | — | Cumulative; see below. Omit for every row. |
|
|
86
92
|
* | `exact` | boolean | `false` | Only rows sitting at `status` right now. |
|
|
@@ -96,22 +102,22 @@ class CampaignMessages {
|
|
|
96
102
|
*
|
|
97
103
|
* ```ts
|
|
98
104
|
* // the two queries a report screen actually makes
|
|
99
|
-
* const failures = await crm.campaignMessages.list(
|
|
100
|
-
* const unread = await crm.campaignMessages.list(
|
|
105
|
+
* const failures = await crm.campaignMessages.list(campaign, { status: 'failed', rows: 100 });
|
|
106
|
+
* const unread = await crm.campaignMessages.list(campaign, { status: 'delivered', exact: true });
|
|
101
107
|
* ```
|
|
102
108
|
*
|
|
103
109
|
* `reply_type` and `replied_within_hours` are **refused** with
|
|
104
|
-
* `
|
|
110
|
+
* `422 validation_failed` unless `status` is `replied`, rather than quietly
|
|
105
111
|
* matching nothing.
|
|
106
112
|
*/
|
|
107
|
-
list(query) {
|
|
108
|
-
return this.http.request('GET',
|
|
113
|
+
list(campaign, query = {}) {
|
|
114
|
+
return this.http.request('GET', `${report(campaign)}/messages`, { query });
|
|
109
115
|
}
|
|
110
116
|
/**
|
|
111
117
|
* Every matching row, paged through for you. What an export is.
|
|
112
118
|
*
|
|
113
119
|
* ```ts
|
|
114
|
-
* for await (const row of crm.campaignMessages.iterate(
|
|
120
|
+
* for await (const row of crm.campaignMessages.iterate(campaign)) {
|
|
115
121
|
* csv.write([row.identifier, row.name, row.status, row.error ?? '']);
|
|
116
122
|
* }
|
|
117
123
|
* ```
|
|
@@ -126,11 +132,11 @@ class CampaignMessages {
|
|
|
126
132
|
* moving data can repeat or skip a row -- for a stable snapshot, export after
|
|
127
133
|
* the campaign completes.
|
|
128
134
|
*/
|
|
129
|
-
async *iterate(query) {
|
|
135
|
+
async *iterate(campaign, query = {}) {
|
|
130
136
|
const rows = query.rows ?? 100;
|
|
131
137
|
let page = query.page ?? 1;
|
|
132
138
|
for (;;) {
|
|
133
|
-
const result = await this.list({ ...query, page, rows });
|
|
139
|
+
const result = await this.list(campaign, { ...query, page, rows });
|
|
134
140
|
for (const record of result.data)
|
|
135
141
|
yield record;
|
|
136
142
|
if (result.data.length === 0 || page >= result.pagination.pages)
|
|
@@ -141,18 +147,17 @@ class CampaignMessages {
|
|
|
141
147
|
/**
|
|
142
148
|
* What people replied, grouped by the reply itself.
|
|
143
149
|
*
|
|
144
|
-
* `GET /v1/
|
|
150
|
+
* `GET /v1/campaigns/:id/report/replies` · `campaigns:read` · **200**
|
|
145
151
|
*
|
|
146
152
|
* ### Query
|
|
147
153
|
*
|
|
148
154
|
* | Field | Type | Default | Notes |
|
|
149
155
|
* | --- | --- | --- | --- |
|
|
150
|
-
* | `campaign` | string | — | Required. |
|
|
151
156
|
* | `message` | number | — | Zero-based index of one campaign message. |
|
|
152
157
|
* | `limit` | number | `50` | Distinct replies to return, 1–200. |
|
|
153
158
|
*
|
|
154
159
|
* ```ts
|
|
155
|
-
* const { groups, replied, distinct } = await crm.campaignMessages.replies(
|
|
160
|
+
* const { groups, replied, distinct } = await crm.campaignMessages.replies(campaign);
|
|
156
161
|
* groups; // [{ reply: 'Yes', replyType: 'button', count: 182 }, …]
|
|
157
162
|
* ```
|
|
158
163
|
*
|
|
@@ -164,8 +169,10 @@ class CampaignMessages {
|
|
|
164
169
|
* complete. A campaign that asked an open question has as many groups as it
|
|
165
170
|
* has repliers, so a truncated answer there is normal rather than a problem.
|
|
166
171
|
*/
|
|
167
|
-
replies(query) {
|
|
168
|
-
return this.http.request('GET', `${
|
|
172
|
+
replies(campaign, query = {}) {
|
|
173
|
+
return this.http.request('GET', `${report(campaign)}/replies`, {
|
|
174
|
+
query,
|
|
175
|
+
});
|
|
169
176
|
}
|
|
170
177
|
}
|
|
171
178
|
exports.CampaignMessages = CampaignMessages;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaign-messages.js","sourceRoot":"","sources":["../../src/resources/campaign-messages.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"campaign-messages.js","sourceRoot":"","sources":["../../src/resources/campaign-messages.ts"],"names":[],"mappings":";;;AAUA,mCAA8B;AAE9B,mFAAmF;AACnF,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,iBAAiB,IAAA,WAAG,EAAC,QAAQ,CAAC,SAAS,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAa,gBAAgB;IACE;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,QAAgB,EAAE,QAAmC,EAAE;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAuB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,IAAI,CACF,QAAgB,EAChB,QAAmC,EAAE;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CACtB,KAAK,EACL,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAC9B,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,CAAC,OAAO,CACZ,QAAgB,EAChB,QAAmC,EAAE;QAErC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;QAC/B,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAE3B,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI;gBAAE,MAAM,MAAM,CAAC;YAE/C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK;gBAAE,OAAO;YACxE,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,QAAgB,EAAE,QAA8B,EAAE;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAyB,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE;YACrF,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AA1ID,4CA0IC"}
|
|
@@ -2,7 +2,7 @@ import type { HttpClient } from '../http';
|
|
|
2
2
|
import { InboxMedia } from './audience/inbox-media';
|
|
3
3
|
import { type CampaignReceiver, type ReceiverEncoding } from '../internal/receiver-file';
|
|
4
4
|
import { type BulkAudienceInput, type ResolvedAudience } from './campaign-audience';
|
|
5
|
-
import type { Campaign, CampaignNumbersFilter, CreateCampaignInput, ListCampaignsQuery, UpdateCampaignInput } from '../types/campaign';
|
|
5
|
+
import type { Campaign, CampaignNumbersFilter, CreateCampaignInput, ListCampaignsQuery, TriggerCampaignInput, UpdateCampaignInput } from '../types/campaign';
|
|
6
6
|
import type { Page } from '../types/common';
|
|
7
7
|
/** Everything `createBulk` needs: a normal campaign, with an audience instead of `filters`. */
|
|
8
8
|
export interface CreateBulkCampaignInput extends Omit<CreateCampaignInput, 'filters' | 'type'> {
|
|
@@ -102,6 +102,17 @@ export declare class Campaigns {
|
|
|
102
102
|
/**
|
|
103
103
|
* Creates a campaign from a payload you have already assembled.
|
|
104
104
|
*
|
|
105
|
+
* **Creating does not send.** The campaign comes back `pending` with no
|
|
106
|
+
* `scheduledAt`: a draft you can keep editing, invisible to the sender until
|
|
107
|
+
* {@link trigger} arms it.
|
|
108
|
+
*
|
|
109
|
+
* ```ts
|
|
110
|
+
* const campaign = await crm.campaigns.create({ name: 'Diwali offer', messages });
|
|
111
|
+
* // ...show it for review...
|
|
112
|
+
* await crm.campaigns.trigger(campaign.id); // send now
|
|
113
|
+
* await crm.campaigns.trigger(campaign.id, { scheduledAt }); // or then
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
105
116
|
* For a bulk recipient list, prefer {@link createBulk} -- it does the
|
|
106
117
|
* encrypting and uploading that a file-backed audience requires, which is not
|
|
107
118
|
* something a caller should have to reproduce.
|
|
@@ -129,9 +140,10 @@ export declare class Campaigns {
|
|
|
129
140
|
* name: 'Renewal reminder',
|
|
130
141
|
* audience: { csv: await file.text(), recipientColumn: 'phone' },
|
|
131
142
|
* messages: [{ channel: { id: channelId }, message: template }],
|
|
132
|
-
* trigger: 'schedule',
|
|
133
|
-
* scheduledAt: '2026-11-01T04:30:00.000Z',
|
|
134
143
|
* });
|
|
144
|
+
*
|
|
145
|
+
* // Neither of the above has been sent yet. Arm it when you are ready:
|
|
146
|
+
* await crm.campaigns.trigger(campaign.id, { scheduledAt: '2026-11-01T04:30:00.000Z' });
|
|
135
147
|
* ```
|
|
136
148
|
*
|
|
137
149
|
* ## What it does, in order
|
|
@@ -233,6 +245,24 @@ export declare class Campaigns {
|
|
|
233
245
|
*/
|
|
234
246
|
encoding?: ReceiverEncoding): Promise<CampaignNumbersFilter>;
|
|
235
247
|
update(id: string, input: UpdateCampaignInput): Promise<Campaign>;
|
|
248
|
+
/**
|
|
249
|
+
* Arms a campaign -- the only call that makes one actually go out.
|
|
250
|
+
*
|
|
251
|
+
* ```ts
|
|
252
|
+
* await crm.campaigns.trigger(id); // now
|
|
253
|
+
* await crm.campaigns.trigger(id, { scheduledAt: isoInstant }); // then
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* "Now" means a minute from now by default, which is the window `cancel()`
|
|
257
|
+
* works in. The server stamps `triggerInfo` -- the caller, their address, the
|
|
258
|
+
* moment -- as part of this call, so every send has one authorising act behind
|
|
259
|
+
* it; nothing you pass can set it.
|
|
260
|
+
*
|
|
261
|
+
* Only a `pending` campaign can be armed; anything else answers `409`.
|
|
262
|
+
* Triggering one that is armed but not yet picked up simply re-arms it.
|
|
263
|
+
*/
|
|
264
|
+
trigger(id: string, input?: TriggerCampaignInput): Promise<Campaign>;
|
|
265
|
+
/** {@link trigger} with a required time, under the name the panel uses. */
|
|
236
266
|
schedule(id: string, scheduledAt: string): Promise<Campaign>;
|
|
237
267
|
cancel(id: string): Promise<Campaign>;
|
|
238
268
|
delete(id: string): Promise<void>;
|
|
@@ -35,6 +35,17 @@ class Campaigns {
|
|
|
35
35
|
/**
|
|
36
36
|
* Creates a campaign from a payload you have already assembled.
|
|
37
37
|
*
|
|
38
|
+
* **Creating does not send.** The campaign comes back `pending` with no
|
|
39
|
+
* `scheduledAt`: a draft you can keep editing, invisible to the sender until
|
|
40
|
+
* {@link trigger} arms it.
|
|
41
|
+
*
|
|
42
|
+
* ```ts
|
|
43
|
+
* const campaign = await crm.campaigns.create({ name: 'Diwali offer', messages });
|
|
44
|
+
* // ...show it for review...
|
|
45
|
+
* await crm.campaigns.trigger(campaign.id); // send now
|
|
46
|
+
* await crm.campaigns.trigger(campaign.id, { scheduledAt }); // or then
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
38
49
|
* For a bulk recipient list, prefer {@link createBulk} -- it does the
|
|
39
50
|
* encrypting and uploading that a file-backed audience requires, which is not
|
|
40
51
|
* something a caller should have to reproduce.
|
|
@@ -64,9 +75,10 @@ class Campaigns {
|
|
|
64
75
|
* name: 'Renewal reminder',
|
|
65
76
|
* audience: { csv: await file.text(), recipientColumn: 'phone' },
|
|
66
77
|
* messages: [{ channel: { id: channelId }, message: template }],
|
|
67
|
-
* trigger: 'schedule',
|
|
68
|
-
* scheduledAt: '2026-11-01T04:30:00.000Z',
|
|
69
78
|
* });
|
|
79
|
+
*
|
|
80
|
+
* // Neither of the above has been sent yet. Arm it when you are ready:
|
|
81
|
+
* await crm.campaigns.trigger(campaign.id, { scheduledAt: '2026-11-01T04:30:00.000Z' });
|
|
70
82
|
* ```
|
|
71
83
|
*
|
|
72
84
|
* ## What it does, in order
|
|
@@ -260,6 +272,28 @@ class Campaigns {
|
|
|
260
272
|
update(id, input) {
|
|
261
273
|
return this.http.request('PATCH', `/v1/campaigns/${encodeURIComponent(id)}`, { body: input });
|
|
262
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Arms a campaign -- the only call that makes one actually go out.
|
|
277
|
+
*
|
|
278
|
+
* ```ts
|
|
279
|
+
* await crm.campaigns.trigger(id); // now
|
|
280
|
+
* await crm.campaigns.trigger(id, { scheduledAt: isoInstant }); // then
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* "Now" means a minute from now by default, which is the window `cancel()`
|
|
284
|
+
* works in. The server stamps `triggerInfo` -- the caller, their address, the
|
|
285
|
+
* moment -- as part of this call, so every send has one authorising act behind
|
|
286
|
+
* it; nothing you pass can set it.
|
|
287
|
+
*
|
|
288
|
+
* Only a `pending` campaign can be armed; anything else answers `409`.
|
|
289
|
+
* Triggering one that is armed but not yet picked up simply re-arms it.
|
|
290
|
+
*/
|
|
291
|
+
trigger(id, input = {}) {
|
|
292
|
+
return this.http.request('POST', `/v1/campaigns/${encodeURIComponent(id)}/trigger`, {
|
|
293
|
+
body: input,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/** {@link trigger} with a required time, under the name the panel uses. */
|
|
263
297
|
schedule(id, scheduledAt) {
|
|
264
298
|
return this.http.request('POST', `/v1/campaigns/${encodeURIComponent(id)}/schedule`, {
|
|
265
299
|
body: { scheduledAt },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/resources/campaigns.ts"],"names":[],"mappings":";;;AACA,sCAAwC;AACxC,wDAA4E;AAC5E,6DAA4G;AAC5G,2DAK6B;
|
|
1
|
+
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/resources/campaigns.ts"],"names":[],"mappings":"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"}
|