@elizaos/plugin-finances 2.0.3-beta.6 → 2.0.3-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/finances.d.ts +38 -0
- package/dist/actions/finances.d.ts.map +1 -0
- package/dist/actions/finances.js +368 -0
- package/dist/actions/finances.js.map +1 -0
- package/dist/components/finances/FinancesSpatialView.d.ts +80 -0
- package/dist/components/finances/FinancesSpatialView.d.ts.map +1 -0
- package/dist/components/finances/FinancesSpatialView.js +157 -0
- package/dist/components/finances/FinancesSpatialView.js.map +1 -0
- package/dist/components/finances/FinancesView.d.ts +97 -0
- package/dist/components/finances/FinancesView.d.ts.map +1 -0
- package/dist/components/finances/FinancesView.js +231 -0
- package/dist/components/finances/FinancesView.js.map +1 -0
- package/dist/components/finances/finances-view-bundle.d.ts +10 -0
- package/dist/components/finances/finances-view-bundle.d.ts.map +1 -0
- package/dist/components/finances/finances-view-bundle.js +5 -0
- package/dist/components/finances/finances-view-bundle.js.map +1 -0
- package/dist/db/finances-repository.d.ts +51 -0
- package/dist/db/finances-repository.d.ts.map +1 -0
- package/dist/db/finances-repository.js +521 -0
- package/dist/db/finances-repository.js.map +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +6 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +2615 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +133 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sql.d.ts +65 -0
- package/dist/db/sql.d.ts.map +1 -0
- package/dist/db/sql.js +182 -0
- package/dist/db/sql.js.map +1 -0
- package/dist/finance-normalize.d.ts +24 -0
- package/dist/finance-normalize.d.ts.map +1 -0
- package/dist/finance-normalize.js +66 -0
- package/dist/finance-normalize.js.map +1 -0
- package/dist/finances-service.d.ts +179 -0
- package/dist/finances-service.d.ts.map +1 -0
- package/dist/finances-service.js +1122 -0
- package/dist/finances-service.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/payment-csv-import.d.ts +23 -0
- package/dist/payment-csv-import.d.ts.map +1 -0
- package/dist/payment-csv-import.js +271 -0
- package/dist/payment-csv-import.js.map +1 -0
- package/dist/payment-recurrence.d.ts +14 -0
- package/dist/payment-recurrence.d.ts.map +1 -0
- package/dist/payment-recurrence.js +190 -0
- package/dist/payment-recurrence.js.map +1 -0
- package/dist/payment-types.d.ts +158 -0
- package/dist/payment-types.d.ts.map +1 -0
- package/dist/payment-types.js +1 -0
- package/dist/payment-types.js.map +1 -0
- package/dist/plugin.d.ts +15 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +31 -0
- package/dist/plugin.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +21 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +9 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +5 -0
- package/dist/register.js.map +1 -0
- package/dist/services/browser-bridge-seam.d.ts +40 -0
- package/dist/services/browser-bridge-seam.d.ts.map +1 -0
- package/dist/services/browser-bridge-seam.js +39 -0
- package/dist/services/browser-bridge-seam.js.map +1 -0
- package/dist/services/gmail-seam.d.ts +40 -0
- package/dist/services/gmail-seam.d.ts.map +1 -0
- package/dist/services/gmail-seam.js +208 -0
- package/dist/services/gmail-seam.js.map +1 -0
- package/dist/services/migration.d.ts +65 -0
- package/dist/services/migration.d.ts.map +1 -0
- package/dist/services/migration.js +116 -0
- package/dist/services/migration.js.map +1 -0
- package/dist/services/subscriptions-service.d.ts +76 -0
- package/dist/services/subscriptions-service.d.ts.map +1 -0
- package/dist/services/subscriptions-service.js +1002 -0
- package/dist/services/subscriptions-service.js.map +1 -0
- package/dist/subscriptions-playbooks.d.ts +79 -0
- package/dist/subscriptions-playbooks.d.ts.map +1 -0
- package/dist/subscriptions-playbooks.js +871 -0
- package/dist/subscriptions-playbooks.js.map +1 -0
- package/dist/subscriptions-types.d.ts +80 -0
- package/dist/subscriptions-types.d.ts.map +1 -0
- package/dist/subscriptions-types.js +1 -0
- package/dist/subscriptions-types.js.map +1 -0
- package/dist/token-encryption.d.ts +42 -0
- package/dist/token-encryption.d.ts.map +1 -0
- package/dist/token-encryption.js +96 -0
- package/dist/token-encryption.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/views/bundle.js +411 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +11 -11
|
@@ -0,0 +1,871 @@
|
|
|
1
|
+
const FIXTURE_BASE_URL_ENV = "ELIZA_SUBSCRIPTION_FIXTURE_BASE_URL";
|
|
2
|
+
const PLAYBOOK_UNSUPPORTED_FLOW_ERROR = "PLAYBOOK_UNSUPPORTED_FLOW";
|
|
3
|
+
function configuredFixtureBaseUrl() {
|
|
4
|
+
const value = process.env[FIXTURE_BASE_URL_ENV]?.trim();
|
|
5
|
+
if (!value) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
return value.replace(/\/+$/, "");
|
|
9
|
+
}
|
|
10
|
+
function withFixtureOverride(path, fallback) {
|
|
11
|
+
const base = configuredFixtureBaseUrl();
|
|
12
|
+
return base ? `${base}${path}` : fallback;
|
|
13
|
+
}
|
|
14
|
+
const GENERIC_LOGIN_MARKERS = [
|
|
15
|
+
"sign in",
|
|
16
|
+
"log in",
|
|
17
|
+
"login",
|
|
18
|
+
"password",
|
|
19
|
+
"email address"
|
|
20
|
+
];
|
|
21
|
+
const GENERIC_MFA_MARKERS = [
|
|
22
|
+
"verification code",
|
|
23
|
+
"two-factor",
|
|
24
|
+
"2-step verification",
|
|
25
|
+
"enter code"
|
|
26
|
+
];
|
|
27
|
+
const GENERIC_CANCELLATION_MARKERS = [
|
|
28
|
+
"canceled",
|
|
29
|
+
"cancelled",
|
|
30
|
+
"subscription ended",
|
|
31
|
+
"membership ended",
|
|
32
|
+
"membership canceled",
|
|
33
|
+
"subscription canceled",
|
|
34
|
+
"cancellation confirmed",
|
|
35
|
+
"you won't be charged",
|
|
36
|
+
"your plan ends"
|
|
37
|
+
];
|
|
38
|
+
const EXECUTABLE_PLAYBOOK_CAPABILITY = {
|
|
39
|
+
kind: "executable_playbook",
|
|
40
|
+
label: "Executable cancellation playbook",
|
|
41
|
+
executionSurface: "browser_steps",
|
|
42
|
+
manualFallback: false
|
|
43
|
+
};
|
|
44
|
+
const MANAGEMENT_URL_MANUAL_FALLBACK_CAPABILITY = {
|
|
45
|
+
kind: "management_url_manual_fallback",
|
|
46
|
+
label: "Management URL manual fallback",
|
|
47
|
+
executionSurface: "management_url",
|
|
48
|
+
manualFallback: true,
|
|
49
|
+
reason: "no_verified_click_flow"
|
|
50
|
+
};
|
|
51
|
+
function cancellationCapabilityForSteps(steps) {
|
|
52
|
+
return steps && steps.length > 0 ? { ...EXECUTABLE_PLAYBOOK_CAPABILITY } : { ...MANAGEMENT_URL_MANUAL_FALLBACK_CAPABILITY };
|
|
53
|
+
}
|
|
54
|
+
function definePlaybook(partial) {
|
|
55
|
+
const managementUrl = partial.managementUrl;
|
|
56
|
+
return {
|
|
57
|
+
key: partial.key,
|
|
58
|
+
serviceName: partial.serviceName,
|
|
59
|
+
aliases: partial.aliases,
|
|
60
|
+
executorPreference: partial.executorPreference ?? "user_browser",
|
|
61
|
+
cancellationCapability: cancellationCapabilityForSteps(partial.steps),
|
|
62
|
+
managementUrl,
|
|
63
|
+
managementPath: partial.managementPath,
|
|
64
|
+
auditDomains: partial.auditDomains,
|
|
65
|
+
auditSubjectKeywords: partial.auditSubjectKeywords,
|
|
66
|
+
loginMarkers: partial.loginMarkers ?? [...GENERIC_LOGIN_MARKERS],
|
|
67
|
+
mfaMarkers: partial.mfaMarkers ?? [...GENERIC_MFA_MARKERS],
|
|
68
|
+
phoneOnlyMarkers: partial.phoneOnlyMarkers ?? [],
|
|
69
|
+
chatOnlyMarkers: partial.chatOnlyMarkers ?? [],
|
|
70
|
+
cancellationMarkers: partial.cancellationMarkers ?? GENERIC_CANCELLATION_MARKERS,
|
|
71
|
+
// No default steps: opening the management URL + a screenshot is NOT a
|
|
72
|
+
// cancellation. Services without an explicit click-flow are handled by
|
|
73
|
+
// the caller as PLAYBOOK_NOT_IMPLEMENTED so we don't silently report
|
|
74
|
+
// fake success. See service-mixin-subscriptions.ts.
|
|
75
|
+
steps: partial.steps,
|
|
76
|
+
companionSelectors: partial.companionSelectors
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const LIFEOPS_SUBSCRIPTION_PLAYBOOKS = [
|
|
80
|
+
{
|
|
81
|
+
key: "google_play",
|
|
82
|
+
serviceName: "Google Play",
|
|
83
|
+
aliases: ["google play", "play store", "play subscriptions"],
|
|
84
|
+
executorPreference: "agent_browser",
|
|
85
|
+
cancellationCapability: { ...EXECUTABLE_PLAYBOOK_CAPABILITY },
|
|
86
|
+
managementUrl: withFixtureOverride(
|
|
87
|
+
"/stores/google-play",
|
|
88
|
+
"https://play.google.com/store/account/subscriptions"
|
|
89
|
+
),
|
|
90
|
+
managementPath: "/stores/google-play",
|
|
91
|
+
auditDomains: ["google.com", "googleplay.com"],
|
|
92
|
+
auditSubjectKeywords: [
|
|
93
|
+
"google play",
|
|
94
|
+
"subscription",
|
|
95
|
+
"renewal",
|
|
96
|
+
"receipt"
|
|
97
|
+
],
|
|
98
|
+
loginMarkers: [...GENERIC_LOGIN_MARKERS],
|
|
99
|
+
mfaMarkers: [...GENERIC_MFA_MARKERS],
|
|
100
|
+
phoneOnlyMarkers: ["phone support"],
|
|
101
|
+
chatOnlyMarkers: ["chat support"],
|
|
102
|
+
cancellationMarkers: ["subscription canceled", "canceled on"],
|
|
103
|
+
steps: [
|
|
104
|
+
{
|
|
105
|
+
kind: "open",
|
|
106
|
+
url: withFixtureOverride(
|
|
107
|
+
"/stores/google-play",
|
|
108
|
+
"https://play.google.com/store/account/subscriptions"
|
|
109
|
+
)
|
|
110
|
+
},
|
|
111
|
+
{ kind: "wait_text", text: "Subscriptions" },
|
|
112
|
+
{ kind: "click_text", text: "Cancel subscription" },
|
|
113
|
+
{ kind: "wait_text", text: "Confirm cancellation" },
|
|
114
|
+
{ kind: "click_text", text: "Confirm cancellation", destructive: true },
|
|
115
|
+
{ kind: "wait_text", text: "subscription canceled" },
|
|
116
|
+
{ kind: "screenshot", label: "google-play-cancelled" }
|
|
117
|
+
],
|
|
118
|
+
companionSelectors: {
|
|
119
|
+
cancel: "[data-lifeops-action='cancel-subscription']",
|
|
120
|
+
confirm: "[data-lifeops-action='confirm-cancellation']"
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: "apple_subscriptions",
|
|
125
|
+
serviceName: "Apple subscriptions",
|
|
126
|
+
aliases: [
|
|
127
|
+
"apple subscriptions",
|
|
128
|
+
"app store",
|
|
129
|
+
"itunes subscription",
|
|
130
|
+
"apple services"
|
|
131
|
+
],
|
|
132
|
+
executorPreference: "agent_browser",
|
|
133
|
+
cancellationCapability: { ...EXECUTABLE_PLAYBOOK_CAPABILITY },
|
|
134
|
+
managementUrl: withFixtureOverride(
|
|
135
|
+
"/stores/apple-subscriptions",
|
|
136
|
+
"https://account.apple.com/account/manage/section/subscriptions"
|
|
137
|
+
),
|
|
138
|
+
managementPath: "/stores/apple-subscriptions",
|
|
139
|
+
auditDomains: ["apple.com", "itunes.com"],
|
|
140
|
+
auditSubjectKeywords: [
|
|
141
|
+
"app store",
|
|
142
|
+
"apple subscription",
|
|
143
|
+
"renewal receipt"
|
|
144
|
+
],
|
|
145
|
+
loginMarkers: [...GENERIC_LOGIN_MARKERS, "apple id"],
|
|
146
|
+
mfaMarkers: [...GENERIC_MFA_MARKERS, "trusted device"],
|
|
147
|
+
phoneOnlyMarkers: ["contact apple support by phone"],
|
|
148
|
+
chatOnlyMarkers: ["chat with apple support"],
|
|
149
|
+
cancellationMarkers: ["subscription canceled", "expires on"],
|
|
150
|
+
steps: [
|
|
151
|
+
{
|
|
152
|
+
kind: "open",
|
|
153
|
+
url: withFixtureOverride(
|
|
154
|
+
"/stores/apple-subscriptions",
|
|
155
|
+
"https://account.apple.com/account/manage/section/subscriptions"
|
|
156
|
+
)
|
|
157
|
+
},
|
|
158
|
+
{ kind: "wait_text", text: "Subscriptions" },
|
|
159
|
+
{ kind: "click_text", text: "Cancel subscription" },
|
|
160
|
+
{ kind: "wait_text", text: "Confirm cancellation" },
|
|
161
|
+
{ kind: "click_text", text: "Confirm cancellation", destructive: true },
|
|
162
|
+
{ kind: "wait_text", text: "subscription canceled" },
|
|
163
|
+
{ kind: "screenshot", label: "apple-subscriptions-cancelled" }
|
|
164
|
+
],
|
|
165
|
+
companionSelectors: {
|
|
166
|
+
cancel: "[data-lifeops-action='cancel-subscription']",
|
|
167
|
+
confirm: "[data-lifeops-action='confirm-cancellation']"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
key: "fixture_streaming",
|
|
172
|
+
serviceName: "Fixture Streaming",
|
|
173
|
+
aliases: ["fixture streaming", "streaming fixture", "test streaming"],
|
|
174
|
+
executorPreference: "agent_browser",
|
|
175
|
+
cancellationCapability: { ...EXECUTABLE_PLAYBOOK_CAPABILITY },
|
|
176
|
+
managementUrl: withFixtureOverride(
|
|
177
|
+
"/services/fixture-streaming",
|
|
178
|
+
"https://example.com/account/subscription"
|
|
179
|
+
),
|
|
180
|
+
managementPath: "/services/fixture-streaming",
|
|
181
|
+
auditDomains: ["fixture-streaming.example"],
|
|
182
|
+
auditSubjectKeywords: ["fixture streaming", "monthly plan", "receipt"],
|
|
183
|
+
loginMarkers: [...GENERIC_LOGIN_MARKERS],
|
|
184
|
+
mfaMarkers: [...GENERIC_MFA_MARKERS],
|
|
185
|
+
phoneOnlyMarkers: ["call us to cancel"],
|
|
186
|
+
chatOnlyMarkers: ["chat with support to cancel"],
|
|
187
|
+
cancellationMarkers: ["subscription canceled"],
|
|
188
|
+
steps: [
|
|
189
|
+
{
|
|
190
|
+
kind: "open",
|
|
191
|
+
url: withFixtureOverride(
|
|
192
|
+
"/services/fixture-streaming",
|
|
193
|
+
"https://example.com/account/subscription"
|
|
194
|
+
)
|
|
195
|
+
},
|
|
196
|
+
{ kind: "wait_text", text: "Fixture Streaming" },
|
|
197
|
+
{ kind: "click_text", text: "Cancel subscription" },
|
|
198
|
+
{ kind: "wait_text", text: "Confirm cancellation" },
|
|
199
|
+
{ kind: "click_text", text: "Confirm cancellation", destructive: true },
|
|
200
|
+
{ kind: "wait_text", text: "subscription canceled" },
|
|
201
|
+
{ kind: "screenshot", label: "fixture-streaming-cancelled" }
|
|
202
|
+
],
|
|
203
|
+
companionSelectors: {
|
|
204
|
+
cancel: "[data-lifeops-action='cancel-subscription']",
|
|
205
|
+
confirm: "[data-lifeops-action='confirm-cancellation']"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
key: "fixture_login_required",
|
|
210
|
+
serviceName: "Fixture Access Wall",
|
|
211
|
+
aliases: [
|
|
212
|
+
"fixture access wall",
|
|
213
|
+
"test access wall",
|
|
214
|
+
"fixture sign in handoff",
|
|
215
|
+
"fixture sign-in handoff",
|
|
216
|
+
"test sign in handoff",
|
|
217
|
+
"test sign-in handoff"
|
|
218
|
+
],
|
|
219
|
+
executorPreference: "agent_browser",
|
|
220
|
+
cancellationCapability: { ...EXECUTABLE_PLAYBOOK_CAPABILITY },
|
|
221
|
+
managementUrl: withFixtureOverride(
|
|
222
|
+
"/services/login-required",
|
|
223
|
+
"https://example.com/account/subscription"
|
|
224
|
+
),
|
|
225
|
+
managementPath: "/services/login-required",
|
|
226
|
+
auditDomains: ["login-required.example"],
|
|
227
|
+
auditSubjectKeywords: ["login required", "membership receipt"],
|
|
228
|
+
loginMarkers: [...GENERIC_LOGIN_MARKERS],
|
|
229
|
+
mfaMarkers: [...GENERIC_MFA_MARKERS],
|
|
230
|
+
phoneOnlyMarkers: [],
|
|
231
|
+
chatOnlyMarkers: [],
|
|
232
|
+
cancellationMarkers: ["subscription canceled"],
|
|
233
|
+
steps: [
|
|
234
|
+
{
|
|
235
|
+
kind: "open",
|
|
236
|
+
url: withFixtureOverride(
|
|
237
|
+
"/services/login-required",
|
|
238
|
+
"https://example.com/account/subscription"
|
|
239
|
+
)
|
|
240
|
+
},
|
|
241
|
+
{ kind: "wait_text", text: "Sign in to continue" }
|
|
242
|
+
],
|
|
243
|
+
companionSelectors: {}
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
key: "fixture_phone_only",
|
|
247
|
+
serviceName: "Fixture Phone Only",
|
|
248
|
+
aliases: ["fixture phone only", "test phone only"],
|
|
249
|
+
executorPreference: "agent_browser",
|
|
250
|
+
cancellationCapability: { ...EXECUTABLE_PLAYBOOK_CAPABILITY },
|
|
251
|
+
managementUrl: withFixtureOverride(
|
|
252
|
+
"/services/phone-only",
|
|
253
|
+
"https://example.com/account/subscription"
|
|
254
|
+
),
|
|
255
|
+
managementPath: "/services/phone-only",
|
|
256
|
+
auditDomains: ["phone-only.example"],
|
|
257
|
+
auditSubjectKeywords: ["phone only", "billing receipt"],
|
|
258
|
+
loginMarkers: [],
|
|
259
|
+
mfaMarkers: [],
|
|
260
|
+
phoneOnlyMarkers: ["call us to cancel"],
|
|
261
|
+
chatOnlyMarkers: [],
|
|
262
|
+
cancellationMarkers: [],
|
|
263
|
+
steps: [
|
|
264
|
+
{
|
|
265
|
+
kind: "open",
|
|
266
|
+
url: withFixtureOverride(
|
|
267
|
+
"/services/phone-only",
|
|
268
|
+
"https://example.com/account/subscription"
|
|
269
|
+
)
|
|
270
|
+
},
|
|
271
|
+
{ kind: "wait_text", text: "Call us to cancel" }
|
|
272
|
+
],
|
|
273
|
+
companionSelectors: {}
|
|
274
|
+
},
|
|
275
|
+
// ---- Streaming video ---------------------------------------------------
|
|
276
|
+
definePlaybook({
|
|
277
|
+
key: "netflix",
|
|
278
|
+
serviceName: "Netflix",
|
|
279
|
+
aliases: ["netflix"],
|
|
280
|
+
managementUrl: "https://www.netflix.com/cancelplan",
|
|
281
|
+
auditDomains: ["netflix.com"],
|
|
282
|
+
auditSubjectKeywords: ["netflix", "your monthly charge", "membership"]
|
|
283
|
+
}),
|
|
284
|
+
definePlaybook({
|
|
285
|
+
key: "hulu",
|
|
286
|
+
serviceName: "Hulu",
|
|
287
|
+
aliases: ["hulu"],
|
|
288
|
+
managementUrl: "https://secure.hulu.com/account/cancel",
|
|
289
|
+
auditDomains: ["hulu.com"],
|
|
290
|
+
auditSubjectKeywords: ["hulu", "your hulu receipt"]
|
|
291
|
+
}),
|
|
292
|
+
definePlaybook({
|
|
293
|
+
key: "disney_plus",
|
|
294
|
+
serviceName: "Disney+",
|
|
295
|
+
aliases: ["disney plus", "disneyplus", "disney+"],
|
|
296
|
+
managementUrl: "https://www.disneyplus.com/account/subscription",
|
|
297
|
+
auditDomains: ["disneyplus.com", "mail.disneyplus.com"],
|
|
298
|
+
auditSubjectKeywords: [
|
|
299
|
+
"disney+",
|
|
300
|
+
"disney plus",
|
|
301
|
+
"your disney+ subscription"
|
|
302
|
+
]
|
|
303
|
+
}),
|
|
304
|
+
definePlaybook({
|
|
305
|
+
key: "max_hbo",
|
|
306
|
+
serviceName: "Max (HBO)",
|
|
307
|
+
aliases: ["max", "hbo max", "hbomax"],
|
|
308
|
+
managementUrl: "https://auth.max.com/my-account",
|
|
309
|
+
auditDomains: ["max.com", "hbomax.com", "mail.max.com"],
|
|
310
|
+
auditSubjectKeywords: ["max", "hbo max", "your max subscription"]
|
|
311
|
+
}),
|
|
312
|
+
definePlaybook({
|
|
313
|
+
key: "peacock",
|
|
314
|
+
serviceName: "Peacock",
|
|
315
|
+
aliases: ["peacock", "peacock tv"],
|
|
316
|
+
managementUrl: "https://www.peacocktv.com/account/plans",
|
|
317
|
+
auditDomains: ["peacocktv.com", "nbcuni.com"],
|
|
318
|
+
auditSubjectKeywords: ["peacock", "your peacock plan"]
|
|
319
|
+
}),
|
|
320
|
+
definePlaybook({
|
|
321
|
+
key: "paramount_plus",
|
|
322
|
+
serviceName: "Paramount+",
|
|
323
|
+
aliases: ["paramount plus", "paramount+"],
|
|
324
|
+
managementUrl: "https://www.paramountplus.com/account/subscription",
|
|
325
|
+
auditDomains: ["paramountplus.com", "cbs.com"],
|
|
326
|
+
auditSubjectKeywords: ["paramount+", "paramount plus"]
|
|
327
|
+
}),
|
|
328
|
+
definePlaybook({
|
|
329
|
+
key: "apple_tv_plus",
|
|
330
|
+
serviceName: "Apple TV+",
|
|
331
|
+
aliases: ["apple tv+", "apple tv plus", "tv+"],
|
|
332
|
+
managementUrl: "https://tv.apple.com/account",
|
|
333
|
+
auditDomains: ["apple.com", "itunes.com"],
|
|
334
|
+
auditSubjectKeywords: ["apple tv+", "apple tv plus"]
|
|
335
|
+
}),
|
|
336
|
+
definePlaybook({
|
|
337
|
+
key: "amazon_prime_video",
|
|
338
|
+
serviceName: "Amazon Prime Video",
|
|
339
|
+
aliases: ["amazon prime video", "prime video"],
|
|
340
|
+
managementUrl: "https://www.amazon.com/gp/video/settings",
|
|
341
|
+
auditDomains: ["amazon.com", "primevideo.com"],
|
|
342
|
+
auditSubjectKeywords: ["prime video", "amazon video"]
|
|
343
|
+
}),
|
|
344
|
+
definePlaybook({
|
|
345
|
+
key: "amazon_prime",
|
|
346
|
+
serviceName: "Amazon Prime",
|
|
347
|
+
aliases: ["amazon prime", "prime membership"],
|
|
348
|
+
managementUrl: "https://www.amazon.com/gp/help/customer/contact-us/?nodeId=G34EUPKVMYFW8N2U",
|
|
349
|
+
auditDomains: ["amazon.com"],
|
|
350
|
+
auditSubjectKeywords: ["your amazon prime", "prime membership"]
|
|
351
|
+
}),
|
|
352
|
+
definePlaybook({
|
|
353
|
+
key: "youtube_premium",
|
|
354
|
+
serviceName: "YouTube Premium",
|
|
355
|
+
aliases: ["youtube premium", "yt premium", "youtube music premium"],
|
|
356
|
+
managementUrl: "https://www.youtube.com/paid_memberships",
|
|
357
|
+
auditDomains: ["youtube.com", "google.com"],
|
|
358
|
+
auditSubjectKeywords: ["youtube premium", "youtube music"]
|
|
359
|
+
}),
|
|
360
|
+
definePlaybook({
|
|
361
|
+
key: "crunchyroll",
|
|
362
|
+
serviceName: "Crunchyroll",
|
|
363
|
+
aliases: ["crunchyroll"],
|
|
364
|
+
managementUrl: "https://www.crunchyroll.com/account/membership",
|
|
365
|
+
auditDomains: ["crunchyroll.com"],
|
|
366
|
+
auditSubjectKeywords: ["crunchyroll", "premium subscription"]
|
|
367
|
+
}),
|
|
368
|
+
definePlaybook({
|
|
369
|
+
key: "espn_plus",
|
|
370
|
+
serviceName: "ESPN+",
|
|
371
|
+
aliases: ["espn+", "espn plus"],
|
|
372
|
+
managementUrl: "https://www.espn.com/watch/account",
|
|
373
|
+
auditDomains: ["espn.com"],
|
|
374
|
+
auditSubjectKeywords: ["espn+", "espn plus"]
|
|
375
|
+
}),
|
|
376
|
+
// ---- Music -------------------------------------------------------------
|
|
377
|
+
definePlaybook({
|
|
378
|
+
key: "spotify",
|
|
379
|
+
serviceName: "Spotify",
|
|
380
|
+
aliases: ["spotify", "spotify premium"],
|
|
381
|
+
managementUrl: "https://www.spotify.com/account/subscription/",
|
|
382
|
+
auditDomains: ["spotify.com"],
|
|
383
|
+
auditSubjectKeywords: ["spotify", "premium receipt"]
|
|
384
|
+
}),
|
|
385
|
+
definePlaybook({
|
|
386
|
+
key: "apple_music",
|
|
387
|
+
serviceName: "Apple Music",
|
|
388
|
+
aliases: ["apple music"],
|
|
389
|
+
managementUrl: "https://music.apple.com/account/settings",
|
|
390
|
+
auditDomains: ["apple.com", "itunes.com"],
|
|
391
|
+
auditSubjectKeywords: ["apple music"]
|
|
392
|
+
}),
|
|
393
|
+
definePlaybook({
|
|
394
|
+
key: "tidal",
|
|
395
|
+
serviceName: "Tidal",
|
|
396
|
+
aliases: ["tidal"],
|
|
397
|
+
managementUrl: "https://listen.tidal.com/account/subscription",
|
|
398
|
+
auditDomains: ["tidal.com"],
|
|
399
|
+
auditSubjectKeywords: ["tidal", "your tidal subscription"]
|
|
400
|
+
}),
|
|
401
|
+
definePlaybook({
|
|
402
|
+
key: "pandora",
|
|
403
|
+
serviceName: "Pandora",
|
|
404
|
+
aliases: ["pandora", "pandora premium", "pandora plus"],
|
|
405
|
+
managementUrl: "https://www.pandora.com/account/subscription",
|
|
406
|
+
auditDomains: ["pandora.com"],
|
|
407
|
+
auditSubjectKeywords: ["pandora", "pandora premium", "pandora plus"]
|
|
408
|
+
}),
|
|
409
|
+
definePlaybook({
|
|
410
|
+
key: "siriusxm",
|
|
411
|
+
serviceName: "SiriusXM",
|
|
412
|
+
aliases: ["siriusxm", "sirius xm", "sirius"],
|
|
413
|
+
managementUrl: "https://www.siriusxm.com/account/managesubscriptions",
|
|
414
|
+
auditDomains: ["siriusxm.com"],
|
|
415
|
+
auditSubjectKeywords: ["siriusxm", "your sirius"],
|
|
416
|
+
phoneOnlyMarkers: ["call to cancel", "1-866-635-5027"]
|
|
417
|
+
}),
|
|
418
|
+
// ---- News / media ------------------------------------------------------
|
|
419
|
+
definePlaybook({
|
|
420
|
+
key: "nytimes",
|
|
421
|
+
serviceName: "The New York Times",
|
|
422
|
+
aliases: ["nyt", "new york times", "nytimes"],
|
|
423
|
+
managementUrl: "https://www.nytimes.com/subscription/manage/downgrade",
|
|
424
|
+
auditDomains: ["nytimes.com"],
|
|
425
|
+
auditSubjectKeywords: ["new york times", "nyt subscription"],
|
|
426
|
+
chatOnlyMarkers: ["chat with us"]
|
|
427
|
+
}),
|
|
428
|
+
definePlaybook({
|
|
429
|
+
key: "wsj",
|
|
430
|
+
serviceName: "Wall Street Journal",
|
|
431
|
+
aliases: ["wsj", "wall street journal"],
|
|
432
|
+
managementUrl: "https://customercenter.wsj.com/view/subscriptions.html",
|
|
433
|
+
auditDomains: ["wsj.com", "dowjones.com"],
|
|
434
|
+
auditSubjectKeywords: ["wsj", "wall street journal"]
|
|
435
|
+
}),
|
|
436
|
+
definePlaybook({
|
|
437
|
+
key: "washington_post",
|
|
438
|
+
serviceName: "The Washington Post",
|
|
439
|
+
aliases: ["wapo", "washington post", "washingtonpost"],
|
|
440
|
+
managementUrl: "https://subscribe.washingtonpost.com/profile/subscription",
|
|
441
|
+
auditDomains: ["washingtonpost.com"],
|
|
442
|
+
auditSubjectKeywords: ["washington post", "wapo subscription"]
|
|
443
|
+
}),
|
|
444
|
+
definePlaybook({
|
|
445
|
+
key: "the_atlantic",
|
|
446
|
+
serviceName: "The Atlantic",
|
|
447
|
+
aliases: ["the atlantic", "atlantic subscription"],
|
|
448
|
+
managementUrl: "https://accounts.theatlantic.com/account/subscription/",
|
|
449
|
+
auditDomains: ["theatlantic.com"],
|
|
450
|
+
auditSubjectKeywords: ["the atlantic", "atlantic subscription"]
|
|
451
|
+
}),
|
|
452
|
+
definePlaybook({
|
|
453
|
+
key: "medium",
|
|
454
|
+
serviceName: "Medium",
|
|
455
|
+
aliases: ["medium", "medium membership"],
|
|
456
|
+
managementUrl: "https://medium.com/me/membership",
|
|
457
|
+
auditDomains: ["medium.com"],
|
|
458
|
+
auditSubjectKeywords: ["medium membership", "medium receipt"]
|
|
459
|
+
}),
|
|
460
|
+
definePlaybook({
|
|
461
|
+
key: "substack",
|
|
462
|
+
serviceName: "Substack",
|
|
463
|
+
aliases: ["substack"],
|
|
464
|
+
managementUrl: "https://substack.com/account",
|
|
465
|
+
auditDomains: ["substack.com"],
|
|
466
|
+
auditSubjectKeywords: ["substack", "your substack subscription"]
|
|
467
|
+
}),
|
|
468
|
+
definePlaybook({
|
|
469
|
+
key: "bloomberg",
|
|
470
|
+
serviceName: "Bloomberg",
|
|
471
|
+
aliases: ["bloomberg", "bloomberg subscription"],
|
|
472
|
+
managementUrl: "https://www.bloomberg.com/account/subscriptions",
|
|
473
|
+
auditDomains: ["bloomberg.com"],
|
|
474
|
+
auditSubjectKeywords: ["bloomberg", "bloomberg subscription"]
|
|
475
|
+
}),
|
|
476
|
+
// ---- Software / Cloud --------------------------------------------------
|
|
477
|
+
definePlaybook({
|
|
478
|
+
key: "icloud",
|
|
479
|
+
serviceName: "iCloud+",
|
|
480
|
+
aliases: ["icloud", "icloud+", "icloud plus"],
|
|
481
|
+
managementUrl: "https://www.icloud.com/settings/storage",
|
|
482
|
+
auditDomains: ["apple.com", "icloud.com"],
|
|
483
|
+
auditSubjectKeywords: ["icloud", "your icloud storage"]
|
|
484
|
+
}),
|
|
485
|
+
definePlaybook({
|
|
486
|
+
key: "google_one",
|
|
487
|
+
serviceName: "Google One",
|
|
488
|
+
aliases: ["google one", "googleone"],
|
|
489
|
+
managementUrl: "https://one.google.com/storage/management",
|
|
490
|
+
auditDomains: ["google.com"],
|
|
491
|
+
auditSubjectKeywords: ["google one", "storage plan"]
|
|
492
|
+
}),
|
|
493
|
+
definePlaybook({
|
|
494
|
+
key: "dropbox",
|
|
495
|
+
serviceName: "Dropbox",
|
|
496
|
+
aliases: ["dropbox", "dropbox plus"],
|
|
497
|
+
managementUrl: "https://www.dropbox.com/account/plan",
|
|
498
|
+
auditDomains: ["dropbox.com"],
|
|
499
|
+
auditSubjectKeywords: ["dropbox", "your dropbox plan"]
|
|
500
|
+
}),
|
|
501
|
+
definePlaybook({
|
|
502
|
+
key: "microsoft_365",
|
|
503
|
+
serviceName: "Microsoft 365",
|
|
504
|
+
aliases: ["microsoft 365", "office 365", "m365"],
|
|
505
|
+
managementUrl: "https://account.microsoft.com/services/",
|
|
506
|
+
auditDomains: ["microsoft.com"],
|
|
507
|
+
auditSubjectKeywords: ["microsoft 365", "office 365"]
|
|
508
|
+
}),
|
|
509
|
+
definePlaybook({
|
|
510
|
+
key: "adobe_creative_cloud",
|
|
511
|
+
serviceName: "Adobe Creative Cloud",
|
|
512
|
+
aliases: [
|
|
513
|
+
"adobe",
|
|
514
|
+
"adobe creative cloud",
|
|
515
|
+
"creative cloud",
|
|
516
|
+
"photoshop subscription"
|
|
517
|
+
],
|
|
518
|
+
managementUrl: "https://account.adobe.com/plans",
|
|
519
|
+
auditDomains: ["adobe.com"],
|
|
520
|
+
auditSubjectKeywords: ["adobe", "creative cloud"],
|
|
521
|
+
chatOnlyMarkers: ["chat with agent"]
|
|
522
|
+
}),
|
|
523
|
+
definePlaybook({
|
|
524
|
+
key: "canva",
|
|
525
|
+
serviceName: "Canva",
|
|
526
|
+
aliases: ["canva", "canva pro"],
|
|
527
|
+
managementUrl: "https://www.canva.com/account/subscription/",
|
|
528
|
+
auditDomains: ["canva.com"],
|
|
529
|
+
auditSubjectKeywords: ["canva", "your canva pro"]
|
|
530
|
+
}),
|
|
531
|
+
definePlaybook({
|
|
532
|
+
key: "notion",
|
|
533
|
+
serviceName: "Notion",
|
|
534
|
+
aliases: ["notion", "notion plus", "notion personal pro"],
|
|
535
|
+
managementUrl: "https://www.notion.so/my-plan",
|
|
536
|
+
auditDomains: ["notion.so"],
|
|
537
|
+
auditSubjectKeywords: ["notion", "your notion plan"]
|
|
538
|
+
}),
|
|
539
|
+
definePlaybook({
|
|
540
|
+
key: "evernote",
|
|
541
|
+
serviceName: "Evernote",
|
|
542
|
+
aliases: ["evernote", "evernote premium"],
|
|
543
|
+
managementUrl: "https://www.evernote.com/AccountSummary.action",
|
|
544
|
+
auditDomains: ["evernote.com"],
|
|
545
|
+
auditSubjectKeywords: ["evernote"]
|
|
546
|
+
}),
|
|
547
|
+
definePlaybook({
|
|
548
|
+
key: "onepassword",
|
|
549
|
+
serviceName: "1Password",
|
|
550
|
+
aliases: ["1password", "one password"],
|
|
551
|
+
managementUrl: "https://my.1password.com/billing",
|
|
552
|
+
auditDomains: ["1password.com"],
|
|
553
|
+
auditSubjectKeywords: ["1password", "your 1password membership"]
|
|
554
|
+
}),
|
|
555
|
+
// ---- Gaming ------------------------------------------------------------
|
|
556
|
+
definePlaybook({
|
|
557
|
+
key: "xbox_game_pass",
|
|
558
|
+
serviceName: "Xbox Game Pass",
|
|
559
|
+
aliases: ["xbox game pass", "game pass", "xbox live"],
|
|
560
|
+
managementUrl: "https://account.microsoft.com/services/",
|
|
561
|
+
auditDomains: ["microsoft.com", "xbox.com"],
|
|
562
|
+
auditSubjectKeywords: ["xbox", "game pass"]
|
|
563
|
+
}),
|
|
564
|
+
definePlaybook({
|
|
565
|
+
key: "playstation_plus",
|
|
566
|
+
serviceName: "PlayStation Plus",
|
|
567
|
+
aliases: ["ps plus", "playstation plus", "ps+"],
|
|
568
|
+
managementUrl: "https://www.playstation.com/en-us/support/subscriptions/playstation-plus-cancel/",
|
|
569
|
+
auditDomains: ["playstation.com", "sony.com"],
|
|
570
|
+
auditSubjectKeywords: ["playstation plus", "ps plus"]
|
|
571
|
+
}),
|
|
572
|
+
definePlaybook({
|
|
573
|
+
key: "nintendo_switch_online",
|
|
574
|
+
serviceName: "Nintendo Switch Online",
|
|
575
|
+
aliases: ["nintendo switch online", "nso", "nintendo online"],
|
|
576
|
+
managementUrl: "https://accounts.nintendo.com/subscription/management",
|
|
577
|
+
auditDomains: ["nintendo.com"],
|
|
578
|
+
auditSubjectKeywords: ["nintendo switch online", "nso"]
|
|
579
|
+
}),
|
|
580
|
+
definePlaybook({
|
|
581
|
+
key: "ea_play",
|
|
582
|
+
serviceName: "EA Play",
|
|
583
|
+
aliases: ["ea play", "ea access", "origin access"],
|
|
584
|
+
managementUrl: "https://www.ea.com/ea-play/manage-subscription",
|
|
585
|
+
auditDomains: ["ea.com"],
|
|
586
|
+
auditSubjectKeywords: ["ea play", "ea access"]
|
|
587
|
+
}),
|
|
588
|
+
// ---- AI / developer ----------------------------------------------------
|
|
589
|
+
definePlaybook({
|
|
590
|
+
key: "chatgpt_plus",
|
|
591
|
+
serviceName: "ChatGPT Plus",
|
|
592
|
+
aliases: [
|
|
593
|
+
"chatgpt plus",
|
|
594
|
+
"chatgpt",
|
|
595
|
+
"openai plus",
|
|
596
|
+
"chatgpt subscription"
|
|
597
|
+
],
|
|
598
|
+
managementUrl: "https://chatgpt.com/#settings/Subscription",
|
|
599
|
+
auditDomains: ["openai.com", "chatgpt.com"],
|
|
600
|
+
auditSubjectKeywords: ["chatgpt plus", "openai receipt", "your chatgpt"]
|
|
601
|
+
}),
|
|
602
|
+
definePlaybook({
|
|
603
|
+
key: "claude_pro",
|
|
604
|
+
serviceName: "Claude Pro",
|
|
605
|
+
aliases: ["claude pro", "anthropic", "claude subscription"],
|
|
606
|
+
managementUrl: "https://claude.ai/settings/billing",
|
|
607
|
+
auditDomains: ["anthropic.com", "claude.ai"],
|
|
608
|
+
auditSubjectKeywords: ["claude pro", "anthropic receipt"]
|
|
609
|
+
}),
|
|
610
|
+
definePlaybook({
|
|
611
|
+
key: "github_copilot",
|
|
612
|
+
serviceName: "GitHub Copilot",
|
|
613
|
+
aliases: ["github copilot", "copilot", "github"],
|
|
614
|
+
managementUrl: "https://github.com/settings/copilot",
|
|
615
|
+
auditDomains: ["github.com"],
|
|
616
|
+
auditSubjectKeywords: ["github copilot", "your copilot"]
|
|
617
|
+
}),
|
|
618
|
+
definePlaybook({
|
|
619
|
+
key: "perplexity_pro",
|
|
620
|
+
serviceName: "Perplexity Pro",
|
|
621
|
+
aliases: ["perplexity", "perplexity pro"],
|
|
622
|
+
managementUrl: "https://www.perplexity.ai/settings/account",
|
|
623
|
+
auditDomains: ["perplexity.ai"],
|
|
624
|
+
auditSubjectKeywords: ["perplexity", "your perplexity pro"]
|
|
625
|
+
}),
|
|
626
|
+
// ---- Fitness / health --------------------------------------------------
|
|
627
|
+
definePlaybook({
|
|
628
|
+
key: "peloton",
|
|
629
|
+
serviceName: "Peloton",
|
|
630
|
+
aliases: ["peloton", "peloton app", "peloton membership"],
|
|
631
|
+
managementUrl: "https://members.onepeloton.com/preferences/account/subscription",
|
|
632
|
+
auditDomains: ["onepeloton.com"],
|
|
633
|
+
auditSubjectKeywords: ["peloton", "membership receipt"]
|
|
634
|
+
}),
|
|
635
|
+
definePlaybook({
|
|
636
|
+
key: "apple_fitness_plus",
|
|
637
|
+
serviceName: "Apple Fitness+",
|
|
638
|
+
aliases: ["apple fitness+", "apple fitness plus", "fitness+"],
|
|
639
|
+
managementUrl: "https://fitness.apple.com/account",
|
|
640
|
+
auditDomains: ["apple.com", "itunes.com"],
|
|
641
|
+
auditSubjectKeywords: ["apple fitness+", "fitness plus"]
|
|
642
|
+
}),
|
|
643
|
+
definePlaybook({
|
|
644
|
+
key: "strava_premium",
|
|
645
|
+
serviceName: "Strava Premium",
|
|
646
|
+
aliases: ["strava", "strava premium", "strava subscription"],
|
|
647
|
+
managementUrl: "https://www.strava.com/settings/billing",
|
|
648
|
+
auditDomains: ["strava.com"],
|
|
649
|
+
auditSubjectKeywords: ["strava", "your strava subscription"]
|
|
650
|
+
}),
|
|
651
|
+
definePlaybook({
|
|
652
|
+
key: "myfitnesspal_premium",
|
|
653
|
+
serviceName: "MyFitnessPal Premium",
|
|
654
|
+
aliases: ["myfitnesspal", "mfp premium", "mfp"],
|
|
655
|
+
managementUrl: "https://www.myfitnesspal.com/account/premium",
|
|
656
|
+
auditDomains: ["myfitnesspal.com"],
|
|
657
|
+
auditSubjectKeywords: ["myfitnesspal", "mfp premium"]
|
|
658
|
+
}),
|
|
659
|
+
definePlaybook({
|
|
660
|
+
key: "calm",
|
|
661
|
+
serviceName: "Calm",
|
|
662
|
+
aliases: ["calm app", "calm subscription"],
|
|
663
|
+
managementUrl: "https://app.www.calm.com/settings/subscription",
|
|
664
|
+
auditDomains: ["calm.com"],
|
|
665
|
+
auditSubjectKeywords: ["calm", "your calm subscription"]
|
|
666
|
+
}),
|
|
667
|
+
definePlaybook({
|
|
668
|
+
key: "headspace",
|
|
669
|
+
serviceName: "Headspace",
|
|
670
|
+
aliases: ["headspace"],
|
|
671
|
+
managementUrl: "https://www.headspace.com/subscription/details",
|
|
672
|
+
auditDomains: ["headspace.com"],
|
|
673
|
+
auditSubjectKeywords: ["headspace", "your headspace"]
|
|
674
|
+
}),
|
|
675
|
+
definePlaybook({
|
|
676
|
+
key: "noom",
|
|
677
|
+
serviceName: "Noom",
|
|
678
|
+
aliases: ["noom"],
|
|
679
|
+
managementUrl: "https://www.noom.com/myaccount",
|
|
680
|
+
auditDomains: ["noom.com"],
|
|
681
|
+
auditSubjectKeywords: ["noom"],
|
|
682
|
+
chatOnlyMarkers: ["noom coach", "message to cancel"]
|
|
683
|
+
}),
|
|
684
|
+
// ---- Meal / food -------------------------------------------------------
|
|
685
|
+
definePlaybook({
|
|
686
|
+
key: "hellofresh",
|
|
687
|
+
serviceName: "HelloFresh",
|
|
688
|
+
aliases: ["hellofresh", "hello fresh"],
|
|
689
|
+
managementUrl: "https://www.hellofresh.com/account-settings/subscription",
|
|
690
|
+
auditDomains: ["hellofresh.com"],
|
|
691
|
+
auditSubjectKeywords: ["hellofresh", "your hellofresh order"]
|
|
692
|
+
}),
|
|
693
|
+
definePlaybook({
|
|
694
|
+
key: "blue_apron",
|
|
695
|
+
serviceName: "Blue Apron",
|
|
696
|
+
aliases: ["blue apron"],
|
|
697
|
+
managementUrl: "https://www.blueapron.com/users/edit",
|
|
698
|
+
auditDomains: ["blueapron.com"],
|
|
699
|
+
auditSubjectKeywords: ["blue apron"]
|
|
700
|
+
}),
|
|
701
|
+
definePlaybook({
|
|
702
|
+
key: "factor",
|
|
703
|
+
serviceName: "Factor",
|
|
704
|
+
aliases: ["factor", "factor 75"],
|
|
705
|
+
managementUrl: "https://www.factor75.com/account/subscription",
|
|
706
|
+
auditDomains: ["factor75.com", "factormeals.com"],
|
|
707
|
+
auditSubjectKeywords: ["factor", "your factor order"]
|
|
708
|
+
}),
|
|
709
|
+
definePlaybook({
|
|
710
|
+
key: "doordash_dashpass",
|
|
711
|
+
serviceName: "DoorDash DashPass",
|
|
712
|
+
aliases: ["doordash", "dashpass"],
|
|
713
|
+
managementUrl: "https://www.doordash.com/dashpass/manage",
|
|
714
|
+
auditDomains: ["doordash.com"],
|
|
715
|
+
auditSubjectKeywords: ["doordash", "dashpass"]
|
|
716
|
+
}),
|
|
717
|
+
definePlaybook({
|
|
718
|
+
key: "uber_one",
|
|
719
|
+
serviceName: "Uber One",
|
|
720
|
+
aliases: ["uber one", "uber eats pass"],
|
|
721
|
+
managementUrl: "https://www.uber.com/go/uber-one-manage",
|
|
722
|
+
auditDomains: ["uber.com"],
|
|
723
|
+
auditSubjectKeywords: ["uber one", "uber eats pass"]
|
|
724
|
+
}),
|
|
725
|
+
definePlaybook({
|
|
726
|
+
key: "instacart_plus",
|
|
727
|
+
serviceName: "Instacart+",
|
|
728
|
+
aliases: ["instacart", "instacart plus", "instacart+"],
|
|
729
|
+
managementUrl: "https://www.instacart.com/store/account/instacart-plus",
|
|
730
|
+
auditDomains: ["instacart.com"],
|
|
731
|
+
auditSubjectKeywords: ["instacart+", "instacart plus"]
|
|
732
|
+
}),
|
|
733
|
+
definePlaybook({
|
|
734
|
+
key: "grubhub_plus",
|
|
735
|
+
serviceName: "Grubhub+",
|
|
736
|
+
aliases: ["grubhub", "grubhub+", "grubhub plus"],
|
|
737
|
+
managementUrl: "https://www.grubhub.com/grubhub-plus-membership",
|
|
738
|
+
auditDomains: ["grubhub.com"],
|
|
739
|
+
auditSubjectKeywords: ["grubhub+", "grubhub plus"]
|
|
740
|
+
}),
|
|
741
|
+
// ---- Other consumer ----------------------------------------------------
|
|
742
|
+
definePlaybook({
|
|
743
|
+
key: "audible",
|
|
744
|
+
serviceName: "Audible",
|
|
745
|
+
aliases: [
|
|
746
|
+
"audible",
|
|
747
|
+
"audible membership",
|
|
748
|
+
"audible plus",
|
|
749
|
+
"audible premium plus"
|
|
750
|
+
],
|
|
751
|
+
managementUrl: "https://www.audible.com/account/membership-details",
|
|
752
|
+
auditDomains: ["audible.com", "amazon.com"],
|
|
753
|
+
auditSubjectKeywords: ["audible", "audible membership"]
|
|
754
|
+
}),
|
|
755
|
+
definePlaybook({
|
|
756
|
+
key: "kindle_unlimited",
|
|
757
|
+
serviceName: "Kindle Unlimited",
|
|
758
|
+
aliases: ["kindle unlimited", "ku"],
|
|
759
|
+
managementUrl: "https://www.amazon.com/kindleunlimited/manage",
|
|
760
|
+
auditDomains: ["amazon.com"],
|
|
761
|
+
auditSubjectKeywords: ["kindle unlimited"]
|
|
762
|
+
}),
|
|
763
|
+
definePlaybook({
|
|
764
|
+
key: "linkedin_premium",
|
|
765
|
+
serviceName: "LinkedIn Premium",
|
|
766
|
+
aliases: ["linkedin premium", "linkedin"],
|
|
767
|
+
managementUrl: "https://www.linkedin.com/premium/manage/",
|
|
768
|
+
auditDomains: ["linkedin.com"],
|
|
769
|
+
auditSubjectKeywords: ["linkedin premium", "your linkedin premium"]
|
|
770
|
+
}),
|
|
771
|
+
definePlaybook({
|
|
772
|
+
key: "duolingo_plus",
|
|
773
|
+
serviceName: "Duolingo Super",
|
|
774
|
+
aliases: ["duolingo", "duolingo plus", "duolingo super"],
|
|
775
|
+
managementUrl: "https://www.duolingo.com/settings/super",
|
|
776
|
+
auditDomains: ["duolingo.com"],
|
|
777
|
+
auditSubjectKeywords: ["duolingo"]
|
|
778
|
+
}),
|
|
779
|
+
definePlaybook({
|
|
780
|
+
key: "grammarly_premium",
|
|
781
|
+
serviceName: "Grammarly Premium",
|
|
782
|
+
aliases: ["grammarly", "grammarly premium"],
|
|
783
|
+
managementUrl: "https://account.grammarly.com/subscription",
|
|
784
|
+
auditDomains: ["grammarly.com"],
|
|
785
|
+
auditSubjectKeywords: ["grammarly", "your grammarly subscription"]
|
|
786
|
+
}),
|
|
787
|
+
definePlaybook({
|
|
788
|
+
key: "tinder",
|
|
789
|
+
serviceName: "Tinder",
|
|
790
|
+
aliases: ["tinder", "tinder gold", "tinder plus"],
|
|
791
|
+
managementUrl: "https://tinder.com/app/settings",
|
|
792
|
+
auditDomains: ["tinder.com"],
|
|
793
|
+
auditSubjectKeywords: ["tinder", "tinder gold", "tinder plus"]
|
|
794
|
+
}),
|
|
795
|
+
definePlaybook({
|
|
796
|
+
key: "bumble",
|
|
797
|
+
serviceName: "Bumble",
|
|
798
|
+
aliases: ["bumble", "bumble premium", "bumble boost"],
|
|
799
|
+
managementUrl: "https://bumble.com/app/settings",
|
|
800
|
+
auditDomains: ["bumble.com"],
|
|
801
|
+
auditSubjectKeywords: ["bumble"]
|
|
802
|
+
}),
|
|
803
|
+
definePlaybook({
|
|
804
|
+
key: "hinge",
|
|
805
|
+
serviceName: "Hinge",
|
|
806
|
+
aliases: ["hinge", "hinge preferred"],
|
|
807
|
+
managementUrl: "https://hinge.co/subscription",
|
|
808
|
+
auditDomains: ["hinge.co"],
|
|
809
|
+
auditSubjectKeywords: ["hinge"]
|
|
810
|
+
}),
|
|
811
|
+
definePlaybook({
|
|
812
|
+
key: "masterclass",
|
|
813
|
+
serviceName: "MasterClass",
|
|
814
|
+
aliases: ["masterclass"],
|
|
815
|
+
managementUrl: "https://www.masterclass.com/account",
|
|
816
|
+
auditDomains: ["masterclass.com"],
|
|
817
|
+
auditSubjectKeywords: ["masterclass"]
|
|
818
|
+
}),
|
|
819
|
+
definePlaybook({
|
|
820
|
+
key: "skillshare",
|
|
821
|
+
serviceName: "Skillshare",
|
|
822
|
+
aliases: ["skillshare"],
|
|
823
|
+
managementUrl: "https://www.skillshare.com/settings/payments",
|
|
824
|
+
auditDomains: ["skillshare.com"],
|
|
825
|
+
auditSubjectKeywords: ["skillshare"]
|
|
826
|
+
}),
|
|
827
|
+
definePlaybook({
|
|
828
|
+
key: "coursera_plus",
|
|
829
|
+
serviceName: "Coursera Plus",
|
|
830
|
+
aliases: ["coursera", "coursera plus"],
|
|
831
|
+
managementUrl: "https://www.coursera.org/account-settings",
|
|
832
|
+
auditDomains: ["coursera.org"],
|
|
833
|
+
auditSubjectKeywords: ["coursera plus", "your coursera"]
|
|
834
|
+
})
|
|
835
|
+
];
|
|
836
|
+
function normalizeName(value) {
|
|
837
|
+
return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
838
|
+
}
|
|
839
|
+
function listLifeOpsSubscriptionPlaybooks() {
|
|
840
|
+
return LIFEOPS_SUBSCRIPTION_PLAYBOOKS;
|
|
841
|
+
}
|
|
842
|
+
function findLifeOpsSubscriptionPlaybook(serviceNameOrSlug) {
|
|
843
|
+
if (!serviceNameOrSlug) {
|
|
844
|
+
return null;
|
|
845
|
+
}
|
|
846
|
+
const normalized = normalizeName(serviceNameOrSlug);
|
|
847
|
+
for (const playbook of LIFEOPS_SUBSCRIPTION_PLAYBOOKS) {
|
|
848
|
+
if (normalizeName(playbook.key) === normalized) {
|
|
849
|
+
return playbook;
|
|
850
|
+
}
|
|
851
|
+
if (normalizeName(playbook.serviceName) === normalized) {
|
|
852
|
+
return playbook;
|
|
853
|
+
}
|
|
854
|
+
if (playbook.aliases.some((alias) => normalizeName(alias) === normalized)) {
|
|
855
|
+
return playbook;
|
|
856
|
+
}
|
|
857
|
+
if (normalized.includes(normalizeName(playbook.key)) || normalized.includes(normalizeName(playbook.serviceName)) || playbook.aliases.some(
|
|
858
|
+
(alias) => normalized.includes(normalizeName(alias))
|
|
859
|
+
)) {
|
|
860
|
+
return playbook;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return null;
|
|
864
|
+
}
|
|
865
|
+
export {
|
|
866
|
+
LIFEOPS_SUBSCRIPTION_PLAYBOOKS,
|
|
867
|
+
PLAYBOOK_UNSUPPORTED_FLOW_ERROR,
|
|
868
|
+
findLifeOpsSubscriptionPlaybook,
|
|
869
|
+
listLifeOpsSubscriptionPlaybooks
|
|
870
|
+
};
|
|
871
|
+
//# sourceMappingURL=subscriptions-playbooks.js.map
|