@shogo-ai/email 1.9.13 → 2.4.1
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/{chunk-AHEPUREO.js → chunk-NKFT5JLE.js} +467 -6
- package/dist/index.cjs +466 -5
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/server.cjs +466 -5
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/dist/server.cjs
CHANGED
|
@@ -457,8 +457,11 @@ var EMAIL_CONSTANTS = {
|
|
|
457
457
|
APP_NAME: "Shogo",
|
|
458
458
|
APP_URL: "https://shogo.ai",
|
|
459
459
|
SUPPORT_EMAIL: "support@shogo.ai",
|
|
460
|
-
|
|
461
|
-
|
|
460
|
+
// Rendered from the current brand lockup (logo/shogo-logo-full{,-alt}.svg on
|
|
461
|
+
// shogo-website). Versioned filenames so the CDN's cached copy of the
|
|
462
|
+
// previous logo is never picked up by new sends.
|
|
463
|
+
LOGO_URL: "https://shogo.ai/assets/images/logo/shogo-logo-email-v2.png",
|
|
464
|
+
LOGO_DARK_URL: "https://shogo.ai/assets/images/logo/shogo-logo-dark-email-v2.png",
|
|
462
465
|
FOOTER_TEXT: "© {{currentYear}} Shogo. All rights reserved"
|
|
463
466
|
};
|
|
464
467
|
var LIGHT_STYLES = `
|
|
@@ -625,8 +628,8 @@ function wrapInLayout(content) {
|
|
|
625
628
|
<div class="email-container">
|
|
626
629
|
<div class="email-header">
|
|
627
630
|
<a href="${EMAIL_CONSTANTS.APP_URL}" style="display:inline-block;text-decoration:none;">
|
|
628
|
-
<img class="email-logo-light" src="${EMAIL_CONSTANTS.LOGO_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="
|
|
629
|
-
<img class="email-logo-dark" src="${EMAIL_CONSTANTS.LOGO_DARK_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="
|
|
631
|
+
<img class="email-logo-light" src="${EMAIL_CONSTANTS.LOGO_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="168" height="40" style="display:block;height:40px;width:auto;" />
|
|
632
|
+
<img class="email-logo-dark" src="${EMAIL_CONSTANTS.LOGO_DARK_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="168" height="40" style="display:none;height:40px;width:auto;" />
|
|
630
633
|
</a>
|
|
631
634
|
</div>
|
|
632
635
|
<div class="email-content">
|
|
@@ -892,6 +895,33 @@ var paymentFailedTemplate = {
|
|
|
892
895
|
}
|
|
893
896
|
};
|
|
894
897
|
|
|
898
|
+
// src/templates/billing/payment-action-required.ts
|
|
899
|
+
var paymentActionRequiredTemplate = {
|
|
900
|
+
name: "payment-action-required",
|
|
901
|
+
subject: "Confirm your payment for {{workspaceName}}",
|
|
902
|
+
html: wrapInLayout(`
|
|
903
|
+
<h1 class="email-h1">Confirm Your Payment</h1>
|
|
904
|
+
<p class="email-text">
|
|
905
|
+
Your bank needs you to confirm the payment of <strong>{{currency}}{{amount}}</strong>
|
|
906
|
+
for <strong>{{workspaceName}}</strong> ({{planName}}). Nothing has been charged yet.
|
|
907
|
+
</p>
|
|
908
|
+
<p class="email-text">
|
|
909
|
+
This is a routine security check some banks require for recurring and
|
|
910
|
+
online payments. It only takes a moment.
|
|
911
|
+
</p>
|
|
912
|
+
<a href="{{confirmUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">Confirm Payment</a>
|
|
913
|
+
<hr class="email-divider">
|
|
914
|
+
<p class="email-muted">
|
|
915
|
+
If you didn't expect this charge, please reply to this email or
|
|
916
|
+
contact support.
|
|
917
|
+
</p>
|
|
918
|
+
`),
|
|
919
|
+
defaults: {
|
|
920
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
921
|
+
currency: "$"
|
|
922
|
+
}
|
|
923
|
+
};
|
|
924
|
+
|
|
895
925
|
// src/templates/billing/usage-overage-charged.ts
|
|
896
926
|
var usageOverageChargedTemplate = {
|
|
897
927
|
name: "usage-overage-charged",
|
|
@@ -977,6 +1007,25 @@ var memberJoinedTemplate = {
|
|
|
977
1007
|
}
|
|
978
1008
|
};
|
|
979
1009
|
|
|
1010
|
+
// src/templates/workspace/channel-digest.ts
|
|
1011
|
+
var channelDigestTemplate = {
|
|
1012
|
+
name: "channel-digest",
|
|
1013
|
+
subject: "{{countLabel}} waiting in {{workspaceName}}",
|
|
1014
|
+
html: wrapInLayout(`
|
|
1015
|
+
<h1 class="email-h1">You have {{countLabel}}</h1>
|
|
1016
|
+
<p class="email-text">Here's what you missed in <strong>{{workspaceName}}</strong>:</p>
|
|
1017
|
+
<p class="email-text" style="white-space: pre-line;">{{summary}}</p>
|
|
1018
|
+
<a href="{{channelsUrl}}" class="email-btn-outline">Open channels</a>
|
|
1019
|
+
<p class="email-text" style="font-size: 12px; color: #888;">
|
|
1020
|
+
You get this daily summary because email digests are on.
|
|
1021
|
+
<a href="{{settingsUrl}}">Change notification settings</a>.
|
|
1022
|
+
</p>
|
|
1023
|
+
`),
|
|
1024
|
+
defaults: {
|
|
1025
|
+
appName: EMAIL_CONSTANTS.APP_NAME
|
|
1026
|
+
}
|
|
1027
|
+
};
|
|
1028
|
+
|
|
980
1029
|
// src/templates/workspace/member-removed.ts
|
|
981
1030
|
var memberRemovedTemplate = {
|
|
982
1031
|
name: "member-removed",
|
|
@@ -1025,6 +1074,403 @@ var accountDeletedTemplate = {
|
|
|
1025
1074
|
}
|
|
1026
1075
|
};
|
|
1027
1076
|
|
|
1077
|
+
// src/templates/lifecycle/drip.ts
|
|
1078
|
+
var dripWelcomeTemplate = {
|
|
1079
|
+
name: "drip-welcome",
|
|
1080
|
+
subject: "Welcome to {{appName}} \u2014 your first agent is one message away",
|
|
1081
|
+
html: wrapInLayout(`
|
|
1082
|
+
<h1 class="email-h1">Hey {{name}},</h1>
|
|
1083
|
+
<p class="email-text">
|
|
1084
|
+
You just signed up for {{appName}} \u2014 a place where you build AI agents
|
|
1085
|
+
by chatting with them. No YAML, no config files, just describe what you
|
|
1086
|
+
want the agent to do.
|
|
1087
|
+
</p>
|
|
1088
|
+
<p class="email-text">
|
|
1089
|
+
In the next 5 minutes you can have an agent that checks your GitHub PRs,
|
|
1090
|
+
tracks your revenue, or manages your support queue \u2014 whatever you actually
|
|
1091
|
+
need. Start with a template.
|
|
1092
|
+
</p>
|
|
1093
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1094
|
+
Build your first agent \u2192
|
|
1095
|
+
</a>
|
|
1096
|
+
<hr class="email-divider">
|
|
1097
|
+
<p class="email-muted">
|
|
1098
|
+
Reply to this email any time \u2014 I read every one.
|
|
1099
|
+
</p>
|
|
1100
|
+
`),
|
|
1101
|
+
defaults: {
|
|
1102
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1103
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
var dripQuickWinTemplate = {
|
|
1107
|
+
name: "drip-quick-win",
|
|
1108
|
+
subject: "Start here: the Research Assistant takes 2 minutes",
|
|
1109
|
+
html: wrapInLayout(`
|
|
1110
|
+
<h1 class="email-h1">Your first agent in 2 minutes</h1>
|
|
1111
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1112
|
+
<p class="email-text">
|
|
1113
|
+
The fastest way to see what {{appName}} does is the Research Assistant.
|
|
1114
|
+
It's pre-configured to search the web, summarize findings, and send you
|
|
1115
|
+
a digest \u2014 no setup required beyond pointing it at a topic.
|
|
1116
|
+
</p>
|
|
1117
|
+
<p class="email-text">Three steps:</p>
|
|
1118
|
+
<p class="email-text">
|
|
1119
|
+
<strong>1.</strong> Open the template gallery<br>
|
|
1120
|
+
<strong>2.</strong> Install Research Assistant (one click)<br>
|
|
1121
|
+
<strong>3.</strong> Chat with it: <em>"Summarize the top AI news from this week"</em>
|
|
1122
|
+
</p>
|
|
1123
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1124
|
+
Install Research Assistant \u2192
|
|
1125
|
+
</a>
|
|
1126
|
+
<hr class="email-divider">
|
|
1127
|
+
<p class="email-muted">
|
|
1128
|
+
Takes 2 minutes. No integrations needed to start.
|
|
1129
|
+
</p>
|
|
1130
|
+
`),
|
|
1131
|
+
defaults: {
|
|
1132
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1133
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1134
|
+
}
|
|
1135
|
+
};
|
|
1136
|
+
var dripStuckNudgeTemplate = {
|
|
1137
|
+
name: "drip-stuck-nudge",
|
|
1138
|
+
subject: "Most people get stuck at this exact step",
|
|
1139
|
+
html: wrapInLayout(`
|
|
1140
|
+
<h1 class="email-h1">Stuck on setup?</h1>
|
|
1141
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1142
|
+
<p class="email-text">
|
|
1143
|
+
I checked and you haven't created your first agent yet. The most common
|
|
1144
|
+
friction point is figuring out what to ask \u2014 it feels open-ended.
|
|
1145
|
+
</p>
|
|
1146
|
+
<p class="email-text">
|
|
1147
|
+
Here's the simplest starting prompt that works every time:
|
|
1148
|
+
</p>
|
|
1149
|
+
<p class="email-text" style="background:#f8f8f8;border-left:3px solid #e8853d;padding:12px 16px;border-radius:4px;font-style:italic;">
|
|
1150
|
+
"I want an agent that checks my GitHub for open pull requests each morning
|
|
1151
|
+
and sends me a Slack message with a summary."
|
|
1152
|
+
</p>
|
|
1153
|
+
<p class="email-text">
|
|
1154
|
+
Paste that, swap GitHub/Slack for your tools, and you have an agent in
|
|
1155
|
+
under 60 seconds.
|
|
1156
|
+
</p>
|
|
1157
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1158
|
+
Resume setup \u2192
|
|
1159
|
+
</a>
|
|
1160
|
+
<hr class="email-divider">
|
|
1161
|
+
<p class="email-muted">
|
|
1162
|
+
Or just reply here \u2014 tell me what you're trying to automate and I'll help
|
|
1163
|
+
you set it up.
|
|
1164
|
+
</p>
|
|
1165
|
+
`),
|
|
1166
|
+
defaults: {
|
|
1167
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1168
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1169
|
+
}
|
|
1170
|
+
};
|
|
1171
|
+
var dripFirstActionTemplate = {
|
|
1172
|
+
name: "drip-first-action",
|
|
1173
|
+
subject: "Your agent is configured \u2014 now talk to it",
|
|
1174
|
+
html: wrapInLayout(`
|
|
1175
|
+
<h1 class="email-h1">{{agentName}} is ready</h1>
|
|
1176
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1177
|
+
<p class="email-text">
|
|
1178
|
+
You created <strong>{{agentName}}</strong> \u2014 nice work. The last step is
|
|
1179
|
+
sending it a message so it knows what to do first.
|
|
1180
|
+
</p>
|
|
1181
|
+
<p class="email-text">
|
|
1182
|
+
Open the chat panel and try something like:
|
|
1183
|
+
</p>
|
|
1184
|
+
<p class="email-text" style="background:#f8f8f8;border-left:3px solid #e8853d;padding:12px 16px;border-radius:4px;font-style:italic;">
|
|
1185
|
+
"Check my GitHub for any open PRs that haven't been reviewed in 2+ days."
|
|
1186
|
+
</p>
|
|
1187
|
+
<p class="email-text">
|
|
1188
|
+
The first message is always the most satisfying \u2014 watch it actually go do
|
|
1189
|
+
something.
|
|
1190
|
+
</p>
|
|
1191
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1192
|
+
Open {{agentName}} \u2192
|
|
1193
|
+
</a>
|
|
1194
|
+
`),
|
|
1195
|
+
defaults: {
|
|
1196
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1197
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1198
|
+
agentName: "your agent"
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1201
|
+
var dripSocialProofTemplate = {
|
|
1202
|
+
name: "drip-social-proof",
|
|
1203
|
+
subject: "What a 3-person startup is doing with Shogo",
|
|
1204
|
+
html: wrapInLayout(`
|
|
1205
|
+
<h1 class="email-h1">A real example</h1>
|
|
1206
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1207
|
+
<p class="email-text">
|
|
1208
|
+
A small eng team uses three {{appName}} agents in production:
|
|
1209
|
+
</p>
|
|
1210
|
+
<p class="email-text">
|
|
1211
|
+
<strong>GitHub Ops</strong> \u2014 runs every morning, reviews all PRs opened
|
|
1212
|
+
in the last 24h, flags anything stale, and posts a summary to their
|
|
1213
|
+
#engineering Slack channel. Replaced a 15-minute standup ritual.
|
|
1214
|
+
</p>
|
|
1215
|
+
<p class="email-text">
|
|
1216
|
+
<strong>Revenue Tracker</strong> \u2014 pulls MRR from Stripe each Monday,
|
|
1217
|
+
compares it to the prior week, and sends a one-paragraph summary to the
|
|
1218
|
+
founder. Takes 8 seconds.
|
|
1219
|
+
</p>
|
|
1220
|
+
<p class="email-text">
|
|
1221
|
+
<strong>Incident Commander</strong> \u2014 watches their Sentry error feed,
|
|
1222
|
+
auto-groups similar errors, and creates Linear tickets with severity tags.
|
|
1223
|
+
Zero manual triage.
|
|
1224
|
+
</p>
|
|
1225
|
+
<p class="email-text">
|
|
1226
|
+
Every one of these started with a single chat message. None required any
|
|
1227
|
+
code.
|
|
1228
|
+
</p>
|
|
1229
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1230
|
+
See all templates \u2192
|
|
1231
|
+
</a>
|
|
1232
|
+
`),
|
|
1233
|
+
defaults: {
|
|
1234
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1235
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1236
|
+
}
|
|
1237
|
+
};
|
|
1238
|
+
var dripReEngagementTemplate = {
|
|
1239
|
+
name: "drip-re-engagement",
|
|
1240
|
+
subject: "{{agentName}} hasn't heard from you yet",
|
|
1241
|
+
html: wrapInLayout(`
|
|
1242
|
+
<h1 class="email-h1">Still there?</h1>
|
|
1243
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1244
|
+
<p class="email-text">
|
|
1245
|
+
You set up <strong>{{agentName}}</strong> a few days ago but haven't sent
|
|
1246
|
+
it a message yet. That's the one missing step before it's actually useful.
|
|
1247
|
+
</p>
|
|
1248
|
+
<p class="email-text">
|
|
1249
|
+
Takes 30 seconds \u2014 open the agent, type one request, and see what happens.
|
|
1250
|
+
If it does something useful, great. If it doesn't, reply to this email and
|
|
1251
|
+
tell me what it got wrong \u2014 that's useful feedback too.
|
|
1252
|
+
</p>
|
|
1253
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1254
|
+
Open {{agentName}} \u2192
|
|
1255
|
+
</a>
|
|
1256
|
+
<hr class="email-divider">
|
|
1257
|
+
<p class="email-muted">
|
|
1258
|
+
If {{appName}} isn't the right fit right now, no hard feelings \u2014 just reply
|
|
1259
|
+
and let me know what you were hoping it would do.
|
|
1260
|
+
</p>
|
|
1261
|
+
`),
|
|
1262
|
+
defaults: {
|
|
1263
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1264
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1265
|
+
agentName: "your agent"
|
|
1266
|
+
}
|
|
1267
|
+
};
|
|
1268
|
+
var dripPowerUpTemplate = {
|
|
1269
|
+
name: "drip-power-up",
|
|
1270
|
+
subject: "Your agent just did something useful \u2014 here's the next level",
|
|
1271
|
+
html: wrapInLayout(`
|
|
1272
|
+
<h1 class="email-h1">Nice \u2014 your agent is working</h1>
|
|
1273
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1274
|
+
<p class="email-text">
|
|
1275
|
+
Your agent just executed its first tool call. That's the real milestone \u2014
|
|
1276
|
+
it's not just chatting, it's actually doing things.
|
|
1277
|
+
</p>
|
|
1278
|
+
<p class="email-text">
|
|
1279
|
+
The next level is connecting more tools. {{appName}} has 250+ integrations
|
|
1280
|
+
\u2014 GitHub, Slack, Linear, Stripe, Sentry, Google Sheets, Notion, and more.
|
|
1281
|
+
Each one you connect makes your agent more capable.
|
|
1282
|
+
</p>
|
|
1283
|
+
<p class="email-text">
|
|
1284
|
+
Go to <strong>Settings \u2192 Integrations</strong> and connect the tools your
|
|
1285
|
+
agent should be able to use.
|
|
1286
|
+
</p>
|
|
1287
|
+
<a href="{{appUrl}}/integrations" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1288
|
+
Connect your first tool \u2192
|
|
1289
|
+
</a>
|
|
1290
|
+
`),
|
|
1291
|
+
defaults: {
|
|
1292
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1293
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
var dripHeartbeatTemplate = {
|
|
1297
|
+
name: "drip-heartbeat",
|
|
1298
|
+
subject: "Your agent can work while you sleep",
|
|
1299
|
+
html: wrapInLayout(`
|
|
1300
|
+
<h1 class="email-h1">Set it on autopilot</h1>
|
|
1301
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1302
|
+
<p class="email-text">
|
|
1303
|
+
You've been chatting with your agent \u2014 now let it run on a schedule
|
|
1304
|
+
without you having to ask.
|
|
1305
|
+
</p>
|
|
1306
|
+
<p class="email-text">
|
|
1307
|
+
The <strong>Heartbeat</strong> feature wakes your agent on a timer \u2014
|
|
1308
|
+
every hour, every morning at 8am, every Monday \u2014 whatever makes sense.
|
|
1309
|
+
When it wakes up, it checks in, looks for work, and acts.
|
|
1310
|
+
</p>
|
|
1311
|
+
<p class="email-text">
|
|
1312
|
+
Example: "Every morning at 8am, check GitHub for PRs that need review and
|
|
1313
|
+
post a summary to Slack." That's one heartbeat. Your agent does it
|
|
1314
|
+
automatically, every day, without you touching it.
|
|
1315
|
+
</p>
|
|
1316
|
+
<p class="email-text">
|
|
1317
|
+
Go to your agent's settings and enable the Heartbeat. Pick an interval
|
|
1318
|
+
and a schedule. That's it.
|
|
1319
|
+
</p>
|
|
1320
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1321
|
+
Set your first heartbeat \u2192
|
|
1322
|
+
</a>
|
|
1323
|
+
`),
|
|
1324
|
+
defaults: {
|
|
1325
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1326
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1327
|
+
}
|
|
1328
|
+
};
|
|
1329
|
+
|
|
1330
|
+
// src/templates/lifecycle/conversion.ts
|
|
1331
|
+
var conversionUsageLimitTemplate = {
|
|
1332
|
+
name: "conversion-usage-limit",
|
|
1333
|
+
subject: "You maxed out your free {{appName}} window \u2014 Pro is 10\xD7 bigger",
|
|
1334
|
+
html: wrapInLayout(`
|
|
1335
|
+
<span class="email-badge">Time to upgrade</span>
|
|
1336
|
+
<h1 class="email-h1" style="margin-top:16px;">You're outgrowing the free plan</h1>
|
|
1337
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1338
|
+
<p class="email-text">
|
|
1339
|
+
You just hit your free usage window \u2014 which means your agents are doing
|
|
1340
|
+
real work for you. The free tier is capped low on purpose. Pro takes the
|
|
1341
|
+
brakes off.
|
|
1342
|
+
</p>
|
|
1343
|
+
<p class="email-text">
|
|
1344
|
+
Here's what changes the moment you upgrade:
|
|
1345
|
+
</p>
|
|
1346
|
+
<div style="background:#f8f8f8;border-radius:8px;padding:16px 20px;margin:0 0 16px;">
|
|
1347
|
+
<div class="email-detail-row">
|
|
1348
|
+
<span class="email-detail-label">Usage window (5h)</span>
|
|
1349
|
+
<span class="email-detail-value">{{freeWindow}} \u2192 {{proWindow}} (10\xD7)</span>
|
|
1350
|
+
</div>
|
|
1351
|
+
<div class="email-detail-row">
|
|
1352
|
+
<span class="email-detail-label">Advanced AI models</span>
|
|
1353
|
+
<span class="email-detail-value">Claude Sonnet, GPT-4o & more</span>
|
|
1354
|
+
</div>
|
|
1355
|
+
<div class="email-detail-row">
|
|
1356
|
+
<span class="email-detail-label">Always-on apps</span>
|
|
1357
|
+
<span class="email-detail-value">1 per seat</span>
|
|
1358
|
+
</div>
|
|
1359
|
+
<div class="email-detail-row" style="border-bottom:none;">
|
|
1360
|
+
<span class="email-detail-label">Waiting on window resets</span>
|
|
1361
|
+
<span class="email-detail-value">Rarely \u2014 10\xD7 more headroom</span>
|
|
1362
|
+
</div>
|
|
1363
|
+
</div>
|
|
1364
|
+
<p class="email-text">
|
|
1365
|
+
Pro is <strong>$20/seat/month</strong>. If your agents save you more than
|
|
1366
|
+
an hour a week, it's already paid for itself \u2014 and you stop losing momentum
|
|
1367
|
+
every time the free window fills up.
|
|
1368
|
+
</p>
|
|
1369
|
+
<a href="{{appUrl}}/billing?plan=pro" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1370
|
+
Upgrade to Pro \u2192
|
|
1371
|
+
</a>
|
|
1372
|
+
<p class="email-muted">
|
|
1373
|
+
Prefer to save 2 months? <a href="{{appUrl}}/billing?plan=pro&interval=annual" style="color:#e8853d;text-decoration:none;font-weight:600;">Get Pro annual for $200/yr \u2192</a>
|
|
1374
|
+
</p>
|
|
1375
|
+
<hr class="email-divider">
|
|
1376
|
+
<p class="email-muted">
|
|
1377
|
+
Not ready yet? Your free window resets automatically \u2014 no action needed.
|
|
1378
|
+
Questions about what's included? Just reply to this email.
|
|
1379
|
+
</p>
|
|
1380
|
+
`),
|
|
1381
|
+
defaults: {
|
|
1382
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1383
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1384
|
+
freeWindow: "$0.20",
|
|
1385
|
+
proWindow: "$1.96"
|
|
1386
|
+
}
|
|
1387
|
+
};
|
|
1388
|
+
var conversionPowerUserTemplate = {
|
|
1389
|
+
name: "conversion-power-user",
|
|
1390
|
+
subject: "You're in the top tier of {{appName}} free users",
|
|
1391
|
+
html: wrapInLayout(`
|
|
1392
|
+
<h1 class="email-h1">You're a power user on the free plan</h1>
|
|
1393
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1394
|
+
<p class="email-text">
|
|
1395
|
+
You've sent <strong>{{messageCount}} messages</strong> to your agents \u2014
|
|
1396
|
+
you're one of the most active users on the free plan. That's worth
|
|
1397
|
+
acknowledging.
|
|
1398
|
+
</p>
|
|
1399
|
+
<p class="email-text">
|
|
1400
|
+
You're currently limited to economy AI models and small usage windows.
|
|
1401
|
+
Pro unlocks:
|
|
1402
|
+
</p>
|
|
1403
|
+
<div style="background:#f8f8f8;border-radius:8px;padding:16px 20px;margin:0 0 16px;">
|
|
1404
|
+
<div class="email-detail-row">
|
|
1405
|
+
<span class="email-detail-label">AI models</span>
|
|
1406
|
+
<span class="email-detail-value">Claude Sonnet, GPT-4o, and more</span>
|
|
1407
|
+
</div>
|
|
1408
|
+
<div class="email-detail-row">
|
|
1409
|
+
<span class="email-detail-label">Usage windows</span>
|
|
1410
|
+
<span class="email-detail-value">10\xD7 larger</span>
|
|
1411
|
+
</div>
|
|
1412
|
+
<div class="email-detail-row">
|
|
1413
|
+
<span class="email-detail-label">Always-on apps</span>
|
|
1414
|
+
<span class="email-detail-value">1 per seat</span>
|
|
1415
|
+
</div>
|
|
1416
|
+
<div class="email-detail-row" style="border-bottom:none;">
|
|
1417
|
+
<span class="email-detail-label">Annual pricing</span>
|
|
1418
|
+
<span class="email-detail-value">$200/yr (2 months free)</span>
|
|
1419
|
+
</div>
|
|
1420
|
+
</div>
|
|
1421
|
+
<p class="email-text">
|
|
1422
|
+
Annual is the smart move if you plan to stick around \u2014 same Pro features,
|
|
1423
|
+
billed once a year.
|
|
1424
|
+
</p>
|
|
1425
|
+
<a href="{{appUrl}}/billing?plan=pro&interval=annual" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1426
|
+
Get Pro annual ($200/yr) \u2192
|
|
1427
|
+
</a>
|
|
1428
|
+
<hr class="email-divider">
|
|
1429
|
+
<p class="email-muted">
|
|
1430
|
+
Monthly is also available at $20/seat/month if you prefer.
|
|
1431
|
+
</p>
|
|
1432
|
+
`),
|
|
1433
|
+
defaults: {
|
|
1434
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1435
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1436
|
+
messageCount: "several"
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1439
|
+
var conversionWinBackTemplate = {
|
|
1440
|
+
name: "conversion-win-back",
|
|
1441
|
+
subject: "{{agentName}} hasn't heard from you in a week",
|
|
1442
|
+
html: wrapInLayout(`
|
|
1443
|
+
<h1 class="email-h1">It's been a while</h1>
|
|
1444
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1445
|
+
<p class="email-text">
|
|
1446
|
+
<strong>{{agentName}}</strong> hasn't heard from you in a week. That's
|
|
1447
|
+
fine \u2014 sometimes the timing isn't right.
|
|
1448
|
+
</p>
|
|
1449
|
+
<p class="email-text">
|
|
1450
|
+
If you left because something wasn't working, reply to this and tell me.
|
|
1451
|
+
I'd rather fix the issue than lose you.
|
|
1452
|
+
</p>
|
|
1453
|
+
<p class="email-text">
|
|
1454
|
+
If life just got busy: your agent is still there, still configured, still
|
|
1455
|
+
ready. One message and you're back up.
|
|
1456
|
+
</p>
|
|
1457
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1458
|
+
Check in with {{agentName}} \u2192
|
|
1459
|
+
</a>
|
|
1460
|
+
<hr class="email-divider">
|
|
1461
|
+
<p class="email-muted">
|
|
1462
|
+
Pro tip: enable the Heartbeat on your agent so it works even when you're
|
|
1463
|
+
not thinking about it \u2014 that's how people get the most value from
|
|
1464
|
+
{{appName}}.
|
|
1465
|
+
</p>
|
|
1466
|
+
`),
|
|
1467
|
+
defaults: {
|
|
1468
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1469
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1470
|
+
agentName: "your agent"
|
|
1471
|
+
}
|
|
1472
|
+
};
|
|
1473
|
+
|
|
1028
1474
|
// src/templates/index.ts
|
|
1029
1475
|
var allTemplates = [
|
|
1030
1476
|
welcomeTemplate,
|
|
@@ -1036,11 +1482,26 @@ var allTemplates = [
|
|
|
1036
1482
|
planUpgradedTemplate,
|
|
1037
1483
|
paymentReceiptTemplate,
|
|
1038
1484
|
paymentFailedTemplate,
|
|
1485
|
+
paymentActionRequiredTemplate,
|
|
1039
1486
|
usageOverageChargedTemplate,
|
|
1040
1487
|
usageApproachingLimitTemplate,
|
|
1041
1488
|
memberJoinedTemplate,
|
|
1042
1489
|
memberRemovedTemplate,
|
|
1043
|
-
|
|
1490
|
+
channelDigestTemplate,
|
|
1491
|
+
accountDeletedTemplate,
|
|
1492
|
+
// Lifecycle — Drip
|
|
1493
|
+
dripWelcomeTemplate,
|
|
1494
|
+
dripQuickWinTemplate,
|
|
1495
|
+
dripStuckNudgeTemplate,
|
|
1496
|
+
dripFirstActionTemplate,
|
|
1497
|
+
dripSocialProofTemplate,
|
|
1498
|
+
dripReEngagementTemplate,
|
|
1499
|
+
dripPowerUpTemplate,
|
|
1500
|
+
dripHeartbeatTemplate,
|
|
1501
|
+
// Lifecycle — Conversion
|
|
1502
|
+
conversionUsageLimitTemplate,
|
|
1503
|
+
conversionPowerUserTemplate,
|
|
1504
|
+
conversionWinBackTemplate
|
|
1044
1505
|
];
|
|
1045
1506
|
function createShogoTemplateRegistry() {
|
|
1046
1507
|
const registry = new EmailTemplateRegistry();
|
package/dist/server.js
CHANGED
package/package.json
CHANGED