@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/index.cjs
CHANGED
|
@@ -382,8 +382,11 @@ var EMAIL_CONSTANTS = {
|
|
|
382
382
|
APP_NAME: "Shogo",
|
|
383
383
|
APP_URL: "https://shogo.ai",
|
|
384
384
|
SUPPORT_EMAIL: "support@shogo.ai",
|
|
385
|
-
|
|
386
|
-
|
|
385
|
+
// Rendered from the current brand lockup (logo/shogo-logo-full{,-alt}.svg on
|
|
386
|
+
// shogo-website). Versioned filenames so the CDN's cached copy of the
|
|
387
|
+
// previous logo is never picked up by new sends.
|
|
388
|
+
LOGO_URL: "https://shogo.ai/assets/images/logo/shogo-logo-email-v2.png",
|
|
389
|
+
LOGO_DARK_URL: "https://shogo.ai/assets/images/logo/shogo-logo-dark-email-v2.png",
|
|
387
390
|
FOOTER_TEXT: "© {{currentYear}} Shogo. All rights reserved"
|
|
388
391
|
};
|
|
389
392
|
var LIGHT_STYLES = `
|
|
@@ -550,8 +553,8 @@ function wrapInLayout(content) {
|
|
|
550
553
|
<div class="email-container">
|
|
551
554
|
<div class="email-header">
|
|
552
555
|
<a href="${EMAIL_CONSTANTS.APP_URL}" style="display:inline-block;text-decoration:none;">
|
|
553
|
-
<img class="email-logo-light" src="${EMAIL_CONSTANTS.LOGO_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="
|
|
554
|
-
<img class="email-logo-dark" src="${EMAIL_CONSTANTS.LOGO_DARK_URL}" alt="${EMAIL_CONSTANTS.APP_NAME}" width="
|
|
556
|
+
<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;" />
|
|
557
|
+
<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;" />
|
|
555
558
|
</a>
|
|
556
559
|
</div>
|
|
557
560
|
<div class="email-content">
|
|
@@ -817,6 +820,33 @@ var paymentFailedTemplate = {
|
|
|
817
820
|
}
|
|
818
821
|
};
|
|
819
822
|
|
|
823
|
+
// src/templates/billing/payment-action-required.ts
|
|
824
|
+
var paymentActionRequiredTemplate = {
|
|
825
|
+
name: "payment-action-required",
|
|
826
|
+
subject: "Confirm your payment for {{workspaceName}}",
|
|
827
|
+
html: wrapInLayout(`
|
|
828
|
+
<h1 class="email-h1">Confirm Your Payment</h1>
|
|
829
|
+
<p class="email-text">
|
|
830
|
+
Your bank needs you to confirm the payment of <strong>{{currency}}{{amount}}</strong>
|
|
831
|
+
for <strong>{{workspaceName}}</strong> ({{planName}}). Nothing has been charged yet.
|
|
832
|
+
</p>
|
|
833
|
+
<p class="email-text">
|
|
834
|
+
This is a routine security check some banks require for recurring and
|
|
835
|
+
online payments. It only takes a moment.
|
|
836
|
+
</p>
|
|
837
|
+
<a href="{{confirmUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">Confirm Payment</a>
|
|
838
|
+
<hr class="email-divider">
|
|
839
|
+
<p class="email-muted">
|
|
840
|
+
If you didn't expect this charge, please reply to this email or
|
|
841
|
+
contact support.
|
|
842
|
+
</p>
|
|
843
|
+
`),
|
|
844
|
+
defaults: {
|
|
845
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
846
|
+
currency: "$"
|
|
847
|
+
}
|
|
848
|
+
};
|
|
849
|
+
|
|
820
850
|
// src/templates/billing/usage-overage-charged.ts
|
|
821
851
|
var usageOverageChargedTemplate = {
|
|
822
852
|
name: "usage-overage-charged",
|
|
@@ -902,6 +932,25 @@ var memberJoinedTemplate = {
|
|
|
902
932
|
}
|
|
903
933
|
};
|
|
904
934
|
|
|
935
|
+
// src/templates/workspace/channel-digest.ts
|
|
936
|
+
var channelDigestTemplate = {
|
|
937
|
+
name: "channel-digest",
|
|
938
|
+
subject: "{{countLabel}} waiting in {{workspaceName}}",
|
|
939
|
+
html: wrapInLayout(`
|
|
940
|
+
<h1 class="email-h1">You have {{countLabel}}</h1>
|
|
941
|
+
<p class="email-text">Here's what you missed in <strong>{{workspaceName}}</strong>:</p>
|
|
942
|
+
<p class="email-text" style="white-space: pre-line;">{{summary}}</p>
|
|
943
|
+
<a href="{{channelsUrl}}" class="email-btn-outline">Open channels</a>
|
|
944
|
+
<p class="email-text" style="font-size: 12px; color: #888;">
|
|
945
|
+
You get this daily summary because email digests are on.
|
|
946
|
+
<a href="{{settingsUrl}}">Change notification settings</a>.
|
|
947
|
+
</p>
|
|
948
|
+
`),
|
|
949
|
+
defaults: {
|
|
950
|
+
appName: EMAIL_CONSTANTS.APP_NAME
|
|
951
|
+
}
|
|
952
|
+
};
|
|
953
|
+
|
|
905
954
|
// src/templates/workspace/member-removed.ts
|
|
906
955
|
var memberRemovedTemplate = {
|
|
907
956
|
name: "member-removed",
|
|
@@ -950,6 +999,403 @@ var accountDeletedTemplate = {
|
|
|
950
999
|
}
|
|
951
1000
|
};
|
|
952
1001
|
|
|
1002
|
+
// src/templates/lifecycle/drip.ts
|
|
1003
|
+
var dripWelcomeTemplate = {
|
|
1004
|
+
name: "drip-welcome",
|
|
1005
|
+
subject: "Welcome to {{appName}} \u2014 your first agent is one message away",
|
|
1006
|
+
html: wrapInLayout(`
|
|
1007
|
+
<h1 class="email-h1">Hey {{name}},</h1>
|
|
1008
|
+
<p class="email-text">
|
|
1009
|
+
You just signed up for {{appName}} \u2014 a place where you build AI agents
|
|
1010
|
+
by chatting with them. No YAML, no config files, just describe what you
|
|
1011
|
+
want the agent to do.
|
|
1012
|
+
</p>
|
|
1013
|
+
<p class="email-text">
|
|
1014
|
+
In the next 5 minutes you can have an agent that checks your GitHub PRs,
|
|
1015
|
+
tracks your revenue, or manages your support queue \u2014 whatever you actually
|
|
1016
|
+
need. Start with a template.
|
|
1017
|
+
</p>
|
|
1018
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1019
|
+
Build your first agent \u2192
|
|
1020
|
+
</a>
|
|
1021
|
+
<hr class="email-divider">
|
|
1022
|
+
<p class="email-muted">
|
|
1023
|
+
Reply to this email any time \u2014 I read every one.
|
|
1024
|
+
</p>
|
|
1025
|
+
`),
|
|
1026
|
+
defaults: {
|
|
1027
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1028
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1029
|
+
}
|
|
1030
|
+
};
|
|
1031
|
+
var dripQuickWinTemplate = {
|
|
1032
|
+
name: "drip-quick-win",
|
|
1033
|
+
subject: "Start here: the Research Assistant takes 2 minutes",
|
|
1034
|
+
html: wrapInLayout(`
|
|
1035
|
+
<h1 class="email-h1">Your first agent in 2 minutes</h1>
|
|
1036
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1037
|
+
<p class="email-text">
|
|
1038
|
+
The fastest way to see what {{appName}} does is the Research Assistant.
|
|
1039
|
+
It's pre-configured to search the web, summarize findings, and send you
|
|
1040
|
+
a digest \u2014 no setup required beyond pointing it at a topic.
|
|
1041
|
+
</p>
|
|
1042
|
+
<p class="email-text">Three steps:</p>
|
|
1043
|
+
<p class="email-text">
|
|
1044
|
+
<strong>1.</strong> Open the template gallery<br>
|
|
1045
|
+
<strong>2.</strong> Install Research Assistant (one click)<br>
|
|
1046
|
+
<strong>3.</strong> Chat with it: <em>"Summarize the top AI news from this week"</em>
|
|
1047
|
+
</p>
|
|
1048
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1049
|
+
Install Research Assistant \u2192
|
|
1050
|
+
</a>
|
|
1051
|
+
<hr class="email-divider">
|
|
1052
|
+
<p class="email-muted">
|
|
1053
|
+
Takes 2 minutes. No integrations needed to start.
|
|
1054
|
+
</p>
|
|
1055
|
+
`),
|
|
1056
|
+
defaults: {
|
|
1057
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1058
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1059
|
+
}
|
|
1060
|
+
};
|
|
1061
|
+
var dripStuckNudgeTemplate = {
|
|
1062
|
+
name: "drip-stuck-nudge",
|
|
1063
|
+
subject: "Most people get stuck at this exact step",
|
|
1064
|
+
html: wrapInLayout(`
|
|
1065
|
+
<h1 class="email-h1">Stuck on setup?</h1>
|
|
1066
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1067
|
+
<p class="email-text">
|
|
1068
|
+
I checked and you haven't created your first agent yet. The most common
|
|
1069
|
+
friction point is figuring out what to ask \u2014 it feels open-ended.
|
|
1070
|
+
</p>
|
|
1071
|
+
<p class="email-text">
|
|
1072
|
+
Here's the simplest starting prompt that works every time:
|
|
1073
|
+
</p>
|
|
1074
|
+
<p class="email-text" style="background:#f8f8f8;border-left:3px solid #e8853d;padding:12px 16px;border-radius:4px;font-style:italic;">
|
|
1075
|
+
"I want an agent that checks my GitHub for open pull requests each morning
|
|
1076
|
+
and sends me a Slack message with a summary."
|
|
1077
|
+
</p>
|
|
1078
|
+
<p class="email-text">
|
|
1079
|
+
Paste that, swap GitHub/Slack for your tools, and you have an agent in
|
|
1080
|
+
under 60 seconds.
|
|
1081
|
+
</p>
|
|
1082
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1083
|
+
Resume setup \u2192
|
|
1084
|
+
</a>
|
|
1085
|
+
<hr class="email-divider">
|
|
1086
|
+
<p class="email-muted">
|
|
1087
|
+
Or just reply here \u2014 tell me what you're trying to automate and I'll help
|
|
1088
|
+
you set it up.
|
|
1089
|
+
</p>
|
|
1090
|
+
`),
|
|
1091
|
+
defaults: {
|
|
1092
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1093
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1094
|
+
}
|
|
1095
|
+
};
|
|
1096
|
+
var dripFirstActionTemplate = {
|
|
1097
|
+
name: "drip-first-action",
|
|
1098
|
+
subject: "Your agent is configured \u2014 now talk to it",
|
|
1099
|
+
html: wrapInLayout(`
|
|
1100
|
+
<h1 class="email-h1">{{agentName}} is ready</h1>
|
|
1101
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1102
|
+
<p class="email-text">
|
|
1103
|
+
You created <strong>{{agentName}}</strong> \u2014 nice work. The last step is
|
|
1104
|
+
sending it a message so it knows what to do first.
|
|
1105
|
+
</p>
|
|
1106
|
+
<p class="email-text">
|
|
1107
|
+
Open the chat panel and try something like:
|
|
1108
|
+
</p>
|
|
1109
|
+
<p class="email-text" style="background:#f8f8f8;border-left:3px solid #e8853d;padding:12px 16px;border-radius:4px;font-style:italic;">
|
|
1110
|
+
"Check my GitHub for any open PRs that haven't been reviewed in 2+ days."
|
|
1111
|
+
</p>
|
|
1112
|
+
<p class="email-text">
|
|
1113
|
+
The first message is always the most satisfying \u2014 watch it actually go do
|
|
1114
|
+
something.
|
|
1115
|
+
</p>
|
|
1116
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1117
|
+
Open {{agentName}} \u2192
|
|
1118
|
+
</a>
|
|
1119
|
+
`),
|
|
1120
|
+
defaults: {
|
|
1121
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1122
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1123
|
+
agentName: "your agent"
|
|
1124
|
+
}
|
|
1125
|
+
};
|
|
1126
|
+
var dripSocialProofTemplate = {
|
|
1127
|
+
name: "drip-social-proof",
|
|
1128
|
+
subject: "What a 3-person startup is doing with Shogo",
|
|
1129
|
+
html: wrapInLayout(`
|
|
1130
|
+
<h1 class="email-h1">A real example</h1>
|
|
1131
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1132
|
+
<p class="email-text">
|
|
1133
|
+
A small eng team uses three {{appName}} agents in production:
|
|
1134
|
+
</p>
|
|
1135
|
+
<p class="email-text">
|
|
1136
|
+
<strong>GitHub Ops</strong> \u2014 runs every morning, reviews all PRs opened
|
|
1137
|
+
in the last 24h, flags anything stale, and posts a summary to their
|
|
1138
|
+
#engineering Slack channel. Replaced a 15-minute standup ritual.
|
|
1139
|
+
</p>
|
|
1140
|
+
<p class="email-text">
|
|
1141
|
+
<strong>Revenue Tracker</strong> \u2014 pulls MRR from Stripe each Monday,
|
|
1142
|
+
compares it to the prior week, and sends a one-paragraph summary to the
|
|
1143
|
+
founder. Takes 8 seconds.
|
|
1144
|
+
</p>
|
|
1145
|
+
<p class="email-text">
|
|
1146
|
+
<strong>Incident Commander</strong> \u2014 watches their Sentry error feed,
|
|
1147
|
+
auto-groups similar errors, and creates Linear tickets with severity tags.
|
|
1148
|
+
Zero manual triage.
|
|
1149
|
+
</p>
|
|
1150
|
+
<p class="email-text">
|
|
1151
|
+
Every one of these started with a single chat message. None required any
|
|
1152
|
+
code.
|
|
1153
|
+
</p>
|
|
1154
|
+
<a href="{{appUrl}}/templates" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1155
|
+
See all templates \u2192
|
|
1156
|
+
</a>
|
|
1157
|
+
`),
|
|
1158
|
+
defaults: {
|
|
1159
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1160
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1161
|
+
}
|
|
1162
|
+
};
|
|
1163
|
+
var dripReEngagementTemplate = {
|
|
1164
|
+
name: "drip-re-engagement",
|
|
1165
|
+
subject: "{{agentName}} hasn't heard from you yet",
|
|
1166
|
+
html: wrapInLayout(`
|
|
1167
|
+
<h1 class="email-h1">Still there?</h1>
|
|
1168
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1169
|
+
<p class="email-text">
|
|
1170
|
+
You set up <strong>{{agentName}}</strong> a few days ago but haven't sent
|
|
1171
|
+
it a message yet. That's the one missing step before it's actually useful.
|
|
1172
|
+
</p>
|
|
1173
|
+
<p class="email-text">
|
|
1174
|
+
Takes 30 seconds \u2014 open the agent, type one request, and see what happens.
|
|
1175
|
+
If it does something useful, great. If it doesn't, reply to this email and
|
|
1176
|
+
tell me what it got wrong \u2014 that's useful feedback too.
|
|
1177
|
+
</p>
|
|
1178
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1179
|
+
Open {{agentName}} \u2192
|
|
1180
|
+
</a>
|
|
1181
|
+
<hr class="email-divider">
|
|
1182
|
+
<p class="email-muted">
|
|
1183
|
+
If {{appName}} isn't the right fit right now, no hard feelings \u2014 just reply
|
|
1184
|
+
and let me know what you were hoping it would do.
|
|
1185
|
+
</p>
|
|
1186
|
+
`),
|
|
1187
|
+
defaults: {
|
|
1188
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1189
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1190
|
+
agentName: "your agent"
|
|
1191
|
+
}
|
|
1192
|
+
};
|
|
1193
|
+
var dripPowerUpTemplate = {
|
|
1194
|
+
name: "drip-power-up",
|
|
1195
|
+
subject: "Your agent just did something useful \u2014 here's the next level",
|
|
1196
|
+
html: wrapInLayout(`
|
|
1197
|
+
<h1 class="email-h1">Nice \u2014 your agent is working</h1>
|
|
1198
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1199
|
+
<p class="email-text">
|
|
1200
|
+
Your agent just executed its first tool call. That's the real milestone \u2014
|
|
1201
|
+
it's not just chatting, it's actually doing things.
|
|
1202
|
+
</p>
|
|
1203
|
+
<p class="email-text">
|
|
1204
|
+
The next level is connecting more tools. {{appName}} has 250+ integrations
|
|
1205
|
+
\u2014 GitHub, Slack, Linear, Stripe, Sentry, Google Sheets, Notion, and more.
|
|
1206
|
+
Each one you connect makes your agent more capable.
|
|
1207
|
+
</p>
|
|
1208
|
+
<p class="email-text">
|
|
1209
|
+
Go to <strong>Settings \u2192 Integrations</strong> and connect the tools your
|
|
1210
|
+
agent should be able to use.
|
|
1211
|
+
</p>
|
|
1212
|
+
<a href="{{appUrl}}/integrations" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1213
|
+
Connect your first tool \u2192
|
|
1214
|
+
</a>
|
|
1215
|
+
`),
|
|
1216
|
+
defaults: {
|
|
1217
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1218
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1219
|
+
}
|
|
1220
|
+
};
|
|
1221
|
+
var dripHeartbeatTemplate = {
|
|
1222
|
+
name: "drip-heartbeat",
|
|
1223
|
+
subject: "Your agent can work while you sleep",
|
|
1224
|
+
html: wrapInLayout(`
|
|
1225
|
+
<h1 class="email-h1">Set it on autopilot</h1>
|
|
1226
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1227
|
+
<p class="email-text">
|
|
1228
|
+
You've been chatting with your agent \u2014 now let it run on a schedule
|
|
1229
|
+
without you having to ask.
|
|
1230
|
+
</p>
|
|
1231
|
+
<p class="email-text">
|
|
1232
|
+
The <strong>Heartbeat</strong> feature wakes your agent on a timer \u2014
|
|
1233
|
+
every hour, every morning at 8am, every Monday \u2014 whatever makes sense.
|
|
1234
|
+
When it wakes up, it checks in, looks for work, and acts.
|
|
1235
|
+
</p>
|
|
1236
|
+
<p class="email-text">
|
|
1237
|
+
Example: "Every morning at 8am, check GitHub for PRs that need review and
|
|
1238
|
+
post a summary to Slack." That's one heartbeat. Your agent does it
|
|
1239
|
+
automatically, every day, without you touching it.
|
|
1240
|
+
</p>
|
|
1241
|
+
<p class="email-text">
|
|
1242
|
+
Go to your agent's settings and enable the Heartbeat. Pick an interval
|
|
1243
|
+
and a schedule. That's it.
|
|
1244
|
+
</p>
|
|
1245
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1246
|
+
Set your first heartbeat \u2192
|
|
1247
|
+
</a>
|
|
1248
|
+
`),
|
|
1249
|
+
defaults: {
|
|
1250
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1251
|
+
appUrl: EMAIL_CONSTANTS.APP_URL
|
|
1252
|
+
}
|
|
1253
|
+
};
|
|
1254
|
+
|
|
1255
|
+
// src/templates/lifecycle/conversion.ts
|
|
1256
|
+
var conversionUsageLimitTemplate = {
|
|
1257
|
+
name: "conversion-usage-limit",
|
|
1258
|
+
subject: "You maxed out your free {{appName}} window \u2014 Pro is 10\xD7 bigger",
|
|
1259
|
+
html: wrapInLayout(`
|
|
1260
|
+
<span class="email-badge">Time to upgrade</span>
|
|
1261
|
+
<h1 class="email-h1" style="margin-top:16px;">You're outgrowing the free plan</h1>
|
|
1262
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1263
|
+
<p class="email-text">
|
|
1264
|
+
You just hit your free usage window \u2014 which means your agents are doing
|
|
1265
|
+
real work for you. The free tier is capped low on purpose. Pro takes the
|
|
1266
|
+
brakes off.
|
|
1267
|
+
</p>
|
|
1268
|
+
<p class="email-text">
|
|
1269
|
+
Here's what changes the moment you upgrade:
|
|
1270
|
+
</p>
|
|
1271
|
+
<div style="background:#f8f8f8;border-radius:8px;padding:16px 20px;margin:0 0 16px;">
|
|
1272
|
+
<div class="email-detail-row">
|
|
1273
|
+
<span class="email-detail-label">Usage window (5h)</span>
|
|
1274
|
+
<span class="email-detail-value">{{freeWindow}} \u2192 {{proWindow}} (10\xD7)</span>
|
|
1275
|
+
</div>
|
|
1276
|
+
<div class="email-detail-row">
|
|
1277
|
+
<span class="email-detail-label">Advanced AI models</span>
|
|
1278
|
+
<span class="email-detail-value">Claude Sonnet, GPT-4o & more</span>
|
|
1279
|
+
</div>
|
|
1280
|
+
<div class="email-detail-row">
|
|
1281
|
+
<span class="email-detail-label">Always-on apps</span>
|
|
1282
|
+
<span class="email-detail-value">1 per seat</span>
|
|
1283
|
+
</div>
|
|
1284
|
+
<div class="email-detail-row" style="border-bottom:none;">
|
|
1285
|
+
<span class="email-detail-label">Waiting on window resets</span>
|
|
1286
|
+
<span class="email-detail-value">Rarely \u2014 10\xD7 more headroom</span>
|
|
1287
|
+
</div>
|
|
1288
|
+
</div>
|
|
1289
|
+
<p class="email-text">
|
|
1290
|
+
Pro is <strong>$20/seat/month</strong>. If your agents save you more than
|
|
1291
|
+
an hour a week, it's already paid for itself \u2014 and you stop losing momentum
|
|
1292
|
+
every time the free window fills up.
|
|
1293
|
+
</p>
|
|
1294
|
+
<a href="{{appUrl}}/billing?plan=pro" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1295
|
+
Upgrade to Pro \u2192
|
|
1296
|
+
</a>
|
|
1297
|
+
<p class="email-muted">
|
|
1298
|
+
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>
|
|
1299
|
+
</p>
|
|
1300
|
+
<hr class="email-divider">
|
|
1301
|
+
<p class="email-muted">
|
|
1302
|
+
Not ready yet? Your free window resets automatically \u2014 no action needed.
|
|
1303
|
+
Questions about what's included? Just reply to this email.
|
|
1304
|
+
</p>
|
|
1305
|
+
`),
|
|
1306
|
+
defaults: {
|
|
1307
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1308
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1309
|
+
freeWindow: "$0.20",
|
|
1310
|
+
proWindow: "$1.96"
|
|
1311
|
+
}
|
|
1312
|
+
};
|
|
1313
|
+
var conversionPowerUserTemplate = {
|
|
1314
|
+
name: "conversion-power-user",
|
|
1315
|
+
subject: "You're in the top tier of {{appName}} free users",
|
|
1316
|
+
html: wrapInLayout(`
|
|
1317
|
+
<h1 class="email-h1">You're a power user on the free plan</h1>
|
|
1318
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1319
|
+
<p class="email-text">
|
|
1320
|
+
You've sent <strong>{{messageCount}} messages</strong> to your agents \u2014
|
|
1321
|
+
you're one of the most active users on the free plan. That's worth
|
|
1322
|
+
acknowledging.
|
|
1323
|
+
</p>
|
|
1324
|
+
<p class="email-text">
|
|
1325
|
+
You're currently limited to economy AI models and small usage windows.
|
|
1326
|
+
Pro unlocks:
|
|
1327
|
+
</p>
|
|
1328
|
+
<div style="background:#f8f8f8;border-radius:8px;padding:16px 20px;margin:0 0 16px;">
|
|
1329
|
+
<div class="email-detail-row">
|
|
1330
|
+
<span class="email-detail-label">AI models</span>
|
|
1331
|
+
<span class="email-detail-value">Claude Sonnet, GPT-4o, and more</span>
|
|
1332
|
+
</div>
|
|
1333
|
+
<div class="email-detail-row">
|
|
1334
|
+
<span class="email-detail-label">Usage windows</span>
|
|
1335
|
+
<span class="email-detail-value">10\xD7 larger</span>
|
|
1336
|
+
</div>
|
|
1337
|
+
<div class="email-detail-row">
|
|
1338
|
+
<span class="email-detail-label">Always-on apps</span>
|
|
1339
|
+
<span class="email-detail-value">1 per seat</span>
|
|
1340
|
+
</div>
|
|
1341
|
+
<div class="email-detail-row" style="border-bottom:none;">
|
|
1342
|
+
<span class="email-detail-label">Annual pricing</span>
|
|
1343
|
+
<span class="email-detail-value">$200/yr (2 months free)</span>
|
|
1344
|
+
</div>
|
|
1345
|
+
</div>
|
|
1346
|
+
<p class="email-text">
|
|
1347
|
+
Annual is the smart move if you plan to stick around \u2014 same Pro features,
|
|
1348
|
+
billed once a year.
|
|
1349
|
+
</p>
|
|
1350
|
+
<a href="{{appUrl}}/billing?plan=pro&interval=annual" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1351
|
+
Get Pro annual ($200/yr) \u2192
|
|
1352
|
+
</a>
|
|
1353
|
+
<hr class="email-divider">
|
|
1354
|
+
<p class="email-muted">
|
|
1355
|
+
Monthly is also available at $20/seat/month if you prefer.
|
|
1356
|
+
</p>
|
|
1357
|
+
`),
|
|
1358
|
+
defaults: {
|
|
1359
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1360
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1361
|
+
messageCount: "several"
|
|
1362
|
+
}
|
|
1363
|
+
};
|
|
1364
|
+
var conversionWinBackTemplate = {
|
|
1365
|
+
name: "conversion-win-back",
|
|
1366
|
+
subject: "{{agentName}} hasn't heard from you in a week",
|
|
1367
|
+
html: wrapInLayout(`
|
|
1368
|
+
<h1 class="email-h1">It's been a while</h1>
|
|
1369
|
+
<p class="email-text">Hi {{name}},</p>
|
|
1370
|
+
<p class="email-text">
|
|
1371
|
+
<strong>{{agentName}}</strong> hasn't heard from you in a week. That's
|
|
1372
|
+
fine \u2014 sometimes the timing isn't right.
|
|
1373
|
+
</p>
|
|
1374
|
+
<p class="email-text">
|
|
1375
|
+
If you left because something wasn't working, reply to this and tell me.
|
|
1376
|
+
I'd rather fix the issue than lose you.
|
|
1377
|
+
</p>
|
|
1378
|
+
<p class="email-text">
|
|
1379
|
+
If life just got busy: your agent is still there, still configured, still
|
|
1380
|
+
ready. One message and you're back up.
|
|
1381
|
+
</p>
|
|
1382
|
+
<a href="{{appUrl}}" class="email-btn" style="color:#ffffff;text-decoration:none;">
|
|
1383
|
+
Check in with {{agentName}} \u2192
|
|
1384
|
+
</a>
|
|
1385
|
+
<hr class="email-divider">
|
|
1386
|
+
<p class="email-muted">
|
|
1387
|
+
Pro tip: enable the Heartbeat on your agent so it works even when you're
|
|
1388
|
+
not thinking about it \u2014 that's how people get the most value from
|
|
1389
|
+
{{appName}}.
|
|
1390
|
+
</p>
|
|
1391
|
+
`),
|
|
1392
|
+
defaults: {
|
|
1393
|
+
appName: EMAIL_CONSTANTS.APP_NAME,
|
|
1394
|
+
appUrl: EMAIL_CONSTANTS.APP_URL,
|
|
1395
|
+
agentName: "your agent"
|
|
1396
|
+
}
|
|
1397
|
+
};
|
|
1398
|
+
|
|
953
1399
|
// src/templates/index.ts
|
|
954
1400
|
var allTemplates = [
|
|
955
1401
|
welcomeTemplate2,
|
|
@@ -961,11 +1407,26 @@ var allTemplates = [
|
|
|
961
1407
|
planUpgradedTemplate,
|
|
962
1408
|
paymentReceiptTemplate,
|
|
963
1409
|
paymentFailedTemplate,
|
|
1410
|
+
paymentActionRequiredTemplate,
|
|
964
1411
|
usageOverageChargedTemplate,
|
|
965
1412
|
usageApproachingLimitTemplate,
|
|
966
1413
|
memberJoinedTemplate,
|
|
967
1414
|
memberRemovedTemplate,
|
|
968
|
-
|
|
1415
|
+
channelDigestTemplate,
|
|
1416
|
+
accountDeletedTemplate,
|
|
1417
|
+
// Lifecycle — Drip
|
|
1418
|
+
dripWelcomeTemplate,
|
|
1419
|
+
dripQuickWinTemplate,
|
|
1420
|
+
dripStuckNudgeTemplate,
|
|
1421
|
+
dripFirstActionTemplate,
|
|
1422
|
+
dripSocialProofTemplate,
|
|
1423
|
+
dripReEngagementTemplate,
|
|
1424
|
+
dripPowerUpTemplate,
|
|
1425
|
+
dripHeartbeatTemplate,
|
|
1426
|
+
// Lifecycle — Conversion
|
|
1427
|
+
conversionUsageLimitTemplate,
|
|
1428
|
+
conversionPowerUserTemplate,
|
|
1429
|
+
conversionWinBackTemplate
|
|
969
1430
|
];
|
|
970
1431
|
function createShogoTemplateRegistry() {
|
|
971
1432
|
const registry = new EmailTemplateRegistry();
|
package/dist/index.d.cts
CHANGED
|
@@ -116,8 +116,8 @@ declare const EMAIL_CONSTANTS: {
|
|
|
116
116
|
readonly APP_NAME: "Shogo";
|
|
117
117
|
readonly APP_URL: "https://shogo.ai";
|
|
118
118
|
readonly SUPPORT_EMAIL: "support@shogo.ai";
|
|
119
|
-
readonly LOGO_URL: "https://shogo.ai/assets/images/shogo-logo-email.png";
|
|
120
|
-
readonly LOGO_DARK_URL: "https://shogo.ai/assets/images/shogo-logo-dark-email.png";
|
|
119
|
+
readonly LOGO_URL: "https://shogo.ai/assets/images/logo/shogo-logo-email-v2.png";
|
|
120
|
+
readonly LOGO_DARK_URL: "https://shogo.ai/assets/images/logo/shogo-logo-dark-email-v2.png";
|
|
121
121
|
readonly FOOTER_TEXT: "© {{currentYear}} Shogo. All rights reserved";
|
|
122
122
|
};
|
|
123
123
|
/** Dark overrides without media query — used by the preview tool to force dark mode. */
|
package/dist/index.d.ts
CHANGED
|
@@ -116,8 +116,8 @@ declare const EMAIL_CONSTANTS: {
|
|
|
116
116
|
readonly APP_NAME: "Shogo";
|
|
117
117
|
readonly APP_URL: "https://shogo.ai";
|
|
118
118
|
readonly SUPPORT_EMAIL: "support@shogo.ai";
|
|
119
|
-
readonly LOGO_URL: "https://shogo.ai/assets/images/shogo-logo-email.png";
|
|
120
|
-
readonly LOGO_DARK_URL: "https://shogo.ai/assets/images/shogo-logo-dark-email.png";
|
|
119
|
+
readonly LOGO_URL: "https://shogo.ai/assets/images/logo/shogo-logo-email-v2.png";
|
|
120
|
+
readonly LOGO_DARK_URL: "https://shogo.ai/assets/images/logo/shogo-logo-dark-email-v2.png";
|
|
121
121
|
readonly FOOTER_TEXT: "© {{currentYear}} Shogo. All rights reserved";
|
|
122
122
|
};
|
|
123
123
|
/** Dark overrides without media query — used by the preview tool to force dark mode. */
|