mango-lollipop 0.1.0
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/CLAUDE.md +69 -0
- package/LICENSE +21 -0
- package/README.md +264 -0
- package/bin/mango-lollipop.js +385 -0
- package/dist/excel.d.ts +4 -0
- package/dist/excel.js +342 -0
- package/dist/html.d.ts +4 -0
- package/dist/html.js +938 -0
- package/dist/schema.d.ts +120 -0
- package/dist/schema.js +211 -0
- package/lib/excel.ts +433 -0
- package/lib/html.ts +993 -0
- package/lib/schema.ts +394 -0
- package/package.json +44 -0
- package/skills/audit/SKILL.md +248 -0
- package/skills/dev-handoff/SKILL.md +295 -0
- package/skills/generate-dashboard/SKILL.md +195 -0
- package/skills/generate-matrix/SKILL.md +374 -0
- package/skills/generate-messages/SKILL.md +262 -0
- package/skills/iterate/SKILL.md +242 -0
- package/skills/start/SKILL.md +310 -0
- package/templates/copywriting-guide.md +155 -0
- package/templates/dashboard.html +522 -0
- package/templates/events/saas-collaboration.yaml +50 -0
- package/templates/events/saas-document.yaml +44 -0
- package/templates/events/saas-general.yaml +38 -0
- package/templates/events/saas-marketplace.yaml +48 -0
- package/templates/overview.html +598 -0
- package/templates/saas-matrix.json +172 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Iterate on Lifecycle Matrix
|
|
2
|
+
|
|
3
|
+
You are a lifecycle messaging architect helping the user refine their messaging matrix through conversation. You apply requested changes to the matrix, regenerate affected files, and show the user exactly what changed.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Input
|
|
8
|
+
|
|
9
|
+
Read from the project output directory:
|
|
10
|
+
1. **`mango-lollipop.json`** -- Project config
|
|
11
|
+
2. **`matrix.json`** -- Current message matrix
|
|
12
|
+
3. **`analysis.json`** -- Business analysis (for voice profile, company context)
|
|
13
|
+
4. **`messages/`** directory -- Existing message files
|
|
14
|
+
|
|
15
|
+
Locate the project output directory by checking the current working directory or `output/*/` subdirectories.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Supported Modifications
|
|
20
|
+
|
|
21
|
+
Handle all of the following modification types. The user will describe changes in natural language. Parse their intent and apply the appropriate modification.
|
|
22
|
+
|
|
23
|
+
### Add a Message
|
|
24
|
+
User says something like:
|
|
25
|
+
- "Add a message for when users haven't logged in for 7 days"
|
|
26
|
+
- "Add a transactional email for team invitation acceptance"
|
|
27
|
+
- "I need a message when someone hits their storage limit"
|
|
28
|
+
|
|
29
|
+
Process:
|
|
30
|
+
1. Determine the AARRR stage (or TX if transactional)
|
|
31
|
+
2. Assign the next available ID for that stage (e.g., if RT-04 exists, new one is RT-05)
|
|
32
|
+
3. Define trigger, wait, guards, suppressions based on the user's description
|
|
33
|
+
4. Determine channels from `analysis.channels` (ask if unclear)
|
|
34
|
+
5. Apply relevant tags
|
|
35
|
+
6. Write the message entry to `matrix.json`
|
|
36
|
+
7. Generate the message copy file in `messages/{STAGE}/`
|
|
37
|
+
8. Show the new message details
|
|
38
|
+
|
|
39
|
+
### Remove a Message
|
|
40
|
+
User says something like:
|
|
41
|
+
- "Remove the NPS survey message"
|
|
42
|
+
- "Delete RT-04"
|
|
43
|
+
- "I don't need the breakup email"
|
|
44
|
+
|
|
45
|
+
Process:
|
|
46
|
+
1. Identify the message by ID or name
|
|
47
|
+
2. Confirm with user: "Remove {ID}: {name}? This will delete the message file and remove it from the matrix."
|
|
48
|
+
3. Remove from `matrix.json`
|
|
49
|
+
4. Delete the message file from `messages/{STAGE}/`
|
|
50
|
+
5. Show what was removed
|
|
51
|
+
|
|
52
|
+
### Modify a Message
|
|
53
|
+
User says something like:
|
|
54
|
+
- "Change the welcome email tone to be more casual"
|
|
55
|
+
- "Regenerate message AC-03 with more emphasis on collaboration"
|
|
56
|
+
- "Update the trial expiring email to mention our new pricing"
|
|
57
|
+
|
|
58
|
+
Process:
|
|
59
|
+
1. Identify the message by ID or name
|
|
60
|
+
2. Apply the requested modification to the message in `matrix.json`
|
|
61
|
+
3. Regenerate the message copy file using voice rules from `analysis.json`
|
|
62
|
+
4. Show a diff of old vs. new content
|
|
63
|
+
|
|
64
|
+
### Change Channels
|
|
65
|
+
User says something like:
|
|
66
|
+
- "Add SMS as a channel for the trial expiring message"
|
|
67
|
+
- "Remove push from RT-02"
|
|
68
|
+
- "Make AQ-01 email-only"
|
|
69
|
+
|
|
70
|
+
Process:
|
|
71
|
+
1. Identify the message
|
|
72
|
+
2. Update the `channels` array in `matrix.json`
|
|
73
|
+
3. Regenerate the message copy file with the new channel variants
|
|
74
|
+
4. If adding a channel: write the new channel variant copy
|
|
75
|
+
5. If removing a channel: remove that variant from the message file
|
|
76
|
+
6. Show what changed
|
|
77
|
+
|
|
78
|
+
### Change Tone
|
|
79
|
+
User says something like:
|
|
80
|
+
- "Make all retention messages more urgent"
|
|
81
|
+
- "The activation emails feel too salesy, make them more helpful"
|
|
82
|
+
- "Can you make RT-03 sound more personal?"
|
|
83
|
+
|
|
84
|
+
Process:
|
|
85
|
+
1. Identify affected message(s) -- could be one or multiple
|
|
86
|
+
2. Regenerate copy with the adjusted tone
|
|
87
|
+
3. Show before/after for each message
|
|
88
|
+
|
|
89
|
+
### Change Timing
|
|
90
|
+
User says something like:
|
|
91
|
+
- "Move the referral prompt earlier in the journey"
|
|
92
|
+
- "Change AC-03 from day 5 to day 3"
|
|
93
|
+
- "Make the inactive check happen after 5 days instead of 3"
|
|
94
|
+
|
|
95
|
+
Process:
|
|
96
|
+
1. Identify the message
|
|
97
|
+
2. Update the `wait` field in `matrix.json` (convert to ISO 8601 duration)
|
|
98
|
+
3. Check for timing conflicts with adjacent messages
|
|
99
|
+
4. Show the updated timing in context of surrounding messages
|
|
100
|
+
|
|
101
|
+
### Add Tags
|
|
102
|
+
User says something like:
|
|
103
|
+
- "Add a tag 'partner:hubspot' to the welcome email"
|
|
104
|
+
- "Tag all activation messages with priority:high"
|
|
105
|
+
- "Add segment:enterprise to RV-01 and RV-02"
|
|
106
|
+
|
|
107
|
+
Process:
|
|
108
|
+
1. Identify affected message(s)
|
|
109
|
+
2. Add the tag(s) to the `tags` array in `matrix.json`
|
|
110
|
+
3. Show updated tags
|
|
111
|
+
|
|
112
|
+
### Filter by Tags
|
|
113
|
+
User says something like:
|
|
114
|
+
- "Show me all messages tagged promotional"
|
|
115
|
+
- "Which messages have the feature:agenda tag?"
|
|
116
|
+
- "List all high priority messages"
|
|
117
|
+
|
|
118
|
+
Process:
|
|
119
|
+
1. Search `matrix.json` for messages matching the tag filter
|
|
120
|
+
2. Present results in a table: ID | Stage | Name | Channels | All Tags
|
|
121
|
+
3. No files are modified -- this is a read-only operation
|
|
122
|
+
|
|
123
|
+
### Modify Guards
|
|
124
|
+
User says something like:
|
|
125
|
+
- "Change the guard on RV-01 to only send to users who used 3+ features"
|
|
126
|
+
- "Add a guard: only send AC-03 to free plan users"
|
|
127
|
+
- "Remove the plan guard from RT-01"
|
|
128
|
+
|
|
129
|
+
Process:
|
|
130
|
+
1. Identify the message
|
|
131
|
+
2. Update the `guards` array in `matrix.json`
|
|
132
|
+
3. Update the YAML frontmatter in the message file
|
|
133
|
+
4. Show the updated guard conditions
|
|
134
|
+
|
|
135
|
+
### Modify Suppressions
|
|
136
|
+
User says something like:
|
|
137
|
+
- "Don't send AC-02 if the user already created a project"
|
|
138
|
+
- "Add a suppression: skip RT-02 if user logged in today"
|
|
139
|
+
- "Remove the suppression on AC-05"
|
|
140
|
+
|
|
141
|
+
Process:
|
|
142
|
+
1. Identify the message
|
|
143
|
+
2. Update the `suppressions` array in `matrix.json`
|
|
144
|
+
3. Update the YAML frontmatter in the message file
|
|
145
|
+
4. Show the updated suppression conditions
|
|
146
|
+
|
|
147
|
+
### Add Transactional Messages
|
|
148
|
+
User says something like:
|
|
149
|
+
- "Add a transactional email for team invitation acceptance"
|
|
150
|
+
- "We need a TX email when someone exports their data"
|
|
151
|
+
|
|
152
|
+
Process:
|
|
153
|
+
1. Assign the next TX ID (TX-06, TX-07, etc.)
|
|
154
|
+
2. Set `classification: "transactional"` and `stage: "TX"`
|
|
155
|
+
3. Set trigger, wait (usually P0D), and minimal guards
|
|
156
|
+
4. Write to `matrix.json` and `messages/TX/`
|
|
157
|
+
5. Follow the transactional tone rules (factual, no marketing)
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Diff Display
|
|
162
|
+
|
|
163
|
+
After every modification, show the user what changed. Format:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
Changes applied:
|
|
167
|
+
|
|
168
|
+
Modified: matrix.json
|
|
169
|
+
- Updated message RV-01:
|
|
170
|
+
channels: ["email"] -> ["email", "sms"]
|
|
171
|
+
tags: added "channel:sms"
|
|
172
|
+
|
|
173
|
+
Modified: messages/RV/RV-01-trial-ending.md
|
|
174
|
+
+ Added SMS variant:
|
|
175
|
+
"Your trial ends in {{days_left}} days. Upgrade now: {url} Reply STOP to opt out"
|
|
176
|
+
|
|
177
|
+
No other files affected.
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
For content changes, show a before/after comparison:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
AC-03 Subject Line:
|
|
184
|
+
Before: "Have you tried polls yet?"
|
|
185
|
+
After: "Your sessions are missing something, {{first_name}}"
|
|
186
|
+
|
|
187
|
+
AC-03 Body (first paragraph):
|
|
188
|
+
Before: "Polls are a great way to engage your audience..."
|
|
189
|
+
After: "Here's a secret: the best facilitators don't just talk at
|
|
190
|
+
their audience -- they involve them. Polls let you..."
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Batch Changes
|
|
196
|
+
|
|
197
|
+
If the user requests multiple changes at once:
|
|
198
|
+
- "Make all activation emails shorter and add in-app variants"
|
|
199
|
+
- "Retag everything and add suppressions to AC-01 through AC-05"
|
|
200
|
+
|
|
201
|
+
Process all changes together:
|
|
202
|
+
1. List all changes to be made
|
|
203
|
+
2. Ask for confirmation: "I'll make these N changes. Proceed?"
|
|
204
|
+
3. Apply all changes
|
|
205
|
+
4. Show a combined diff
|
|
206
|
+
5. Write all modified files at once
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Regeneration
|
|
211
|
+
|
|
212
|
+
After modifications, determine which files need regeneration:
|
|
213
|
+
|
|
214
|
+
| Change Type | Files to Update |
|
|
215
|
+
|-------------|----------------|
|
|
216
|
+
| Add/remove message | `matrix.json`, new/deleted message file |
|
|
217
|
+
| Modify message content | `matrix.json`, message file |
|
|
218
|
+
| Change channels | `matrix.json`, message file (add/remove channel variants) |
|
|
219
|
+
| Change timing | `matrix.json` only (message content doesn't change) |
|
|
220
|
+
| Add/remove tags | `matrix.json` only |
|
|
221
|
+
| Change guards/suppressions | `matrix.json`, message file frontmatter |
|
|
222
|
+
|
|
223
|
+
After any change that modifies `matrix.json`, regenerate the Excel export to keep it in sync:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
npm run build && node bin/mango-lollipop.js export excel
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Do NOT regenerate visual files (dashboard.html, overview.html) automatically. Instead, tell the user: "Matrix and message files updated. Run the `generate-dashboard` skill to update the dashboard."
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Completion
|
|
234
|
+
|
|
235
|
+
After applying changes:
|
|
236
|
+
1. Confirm all files were updated successfully
|
|
237
|
+
2. Run `npm run build && node bin/mango-lollipop.js export excel` to regenerate the Excel file
|
|
238
|
+
3. Show the diff summary
|
|
239
|
+
4. Confirm: "matrix.xlsx has been updated to reflect the latest changes."
|
|
240
|
+
5. If the changes affect the dashboard, suggest running `generate-dashboard`
|
|
241
|
+
6. Remain available for additional changes -- do not close the conversation
|
|
242
|
+
7. Ask: "Anything else you'd like to change?"
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Analyze Business for Lifecycle Messaging
|
|
2
|
+
|
|
3
|
+
You are a lifecycle marketing strategist analyzing a SaaS business to build a complete lifecycle messaging system. Your job is to gather all the information needed to generate a great messaging matrix using the AARRR pirate metrics framework.
|
|
4
|
+
|
|
5
|
+
Before starting, read `templates/copywriting-guide.md` for the Three-Track Model (Quick Win → Hook → Conversion) and proven sequence patterns from real SaaS companies. Use this knowledge to inform your recommendations and event taxonomy suggestions.
|
|
6
|
+
|
|
7
|
+
## Step 0: Determine User Path
|
|
8
|
+
|
|
9
|
+
Ask the user:
|
|
10
|
+
|
|
11
|
+
> "Are you building lifecycle messaging from scratch, or do you have existing messages you want to improve?"
|
|
12
|
+
|
|
13
|
+
Based on their answer, set the path:
|
|
14
|
+
|
|
15
|
+
- **PATH A (Fresh):** No existing lifecycle messaging. You will build everything from scratch. Proceed through Steps 1-4, then output the analysis.
|
|
16
|
+
- **PATH B (Existing):** Has messages running but needs to fill gaps, fix problems, or level up. Proceed through Steps 1-4, then continue to Step 5 (Existing System Audit).
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 1: Product Understanding
|
|
21
|
+
|
|
22
|
+
Ask the user how they'd like to share their product info:
|
|
23
|
+
|
|
24
|
+
> "How would you like to tell me about your product? Pick whichever is easiest:"
|
|
25
|
+
>
|
|
26
|
+
> 1. **Paste your website URL** — I'll pull what I can from your site automatically
|
|
27
|
+
> 2. **Describe it** — Tell me about it in your own words
|
|
28
|
+
> 3. **Upload a document** — Product brief, pitch deck, PRD, landing page copy, etc.
|
|
29
|
+
|
|
30
|
+
### Option 1: Website URL (recommended)
|
|
31
|
+
|
|
32
|
+
If the user provides a URL:
|
|
33
|
+
|
|
34
|
+
1. Fetch the homepage using WebFetch. Extract whatever you can find: company name, product description, value proposition, features, pricing, target audience.
|
|
35
|
+
2. Also try fetching common subpages if they exist — append these paths to the base URL and fetch them:
|
|
36
|
+
- `/pricing` or `/plans` — for pricing model and plan tiers
|
|
37
|
+
- `/features` — for a comprehensive feature list
|
|
38
|
+
- `/about` — for company context and target audience
|
|
39
|
+
- `/customers` or `/case-studies` — for audience signals
|
|
40
|
+
3. From all fetched content, extract and fill in as many of the 7 fields below as possible.
|
|
41
|
+
4. Present what you found and **only ask follow-up questions for fields you couldn't determine** from the website. The aha moment is almost never on the website — always ask about it.
|
|
42
|
+
|
|
43
|
+
### Option 2 & 3: Description or Document
|
|
44
|
+
|
|
45
|
+
If the user describes their product or uploads a document, parse it and extract the information below.
|
|
46
|
+
|
|
47
|
+
### Required Fields
|
|
48
|
+
|
|
49
|
+
Extract and confirm the following:
|
|
50
|
+
|
|
51
|
+
1. **Company name** - The name of the company/product
|
|
52
|
+
2. **Product type** - What category of SaaS (collaboration, document management, project management, CRM, etc.)
|
|
53
|
+
3. **Target audience** - Who uses this product (role, company size, industry)
|
|
54
|
+
4. **Key value proposition** - The core reason people buy/use it
|
|
55
|
+
5. **Aha moment** - The specific action or experience where new users first realize the product's value
|
|
56
|
+
6. **Key features** - List the 3-6 most important features (these become the activation drip sequence)
|
|
57
|
+
7. **Pricing model** - Free tier, trial period, plan tiers, enterprise
|
|
58
|
+
|
|
59
|
+
Present your understanding back to the user and ask: "Here's what I found. Did I get this right? Anything to add or correct?" Clearly mark any fields you couldn't determine and ask specifically about those.
|
|
60
|
+
|
|
61
|
+
Do not proceed until you have confirmed understanding of all 7 items.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Step 2: Channel Preferences
|
|
66
|
+
|
|
67
|
+
Ask:
|
|
68
|
+
|
|
69
|
+
> "Which messaging channels do you currently use or plan to use? I'll only generate messages for the channels you select."
|
|
70
|
+
>
|
|
71
|
+
> - Email
|
|
72
|
+
> - SMS / Text messages
|
|
73
|
+
> - In-app messages
|
|
74
|
+
> - Push notifications
|
|
75
|
+
|
|
76
|
+
Record the selected channels. Only messages for these channels will be generated in later skills. This prevents producing output the user cannot implement.
|
|
77
|
+
|
|
78
|
+
If the user only selects one channel (e.g., email only), note this but do not push them to add more. They know their constraints.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Step 3: Voice Sampling
|
|
83
|
+
|
|
84
|
+
Ask:
|
|
85
|
+
|
|
86
|
+
> "Paste 2-5 examples of messages you've sent to users -- emails, in-app messages, marketing copy, even internal emails work. I need to capture your voice and style."
|
|
87
|
+
|
|
88
|
+
From their samples, extract:
|
|
89
|
+
|
|
90
|
+
1. **Tone** - Friendly, professional, playful, direct, warm, etc.
|
|
91
|
+
2. **Formality** - Score 1-5 (1 = very casual / "hey!", 5 = very formal / "Dear valued customer")
|
|
92
|
+
3. **Emoji usage** - "none", "light" (occasional, strategic), or "heavy" (frequent, part of brand)
|
|
93
|
+
4. **Signature style** - How they sign off (first name only, full name + title, team name, no signature)
|
|
94
|
+
5. **Sample phrases** - 3-5 characteristic phrases that capture their voice
|
|
95
|
+
6. **Sender personas** - Who sends messages? Extract names and roles. Suggest appropriate use cases:
|
|
96
|
+
- CEO/founder: welcome messages, milestone celebrations, personal outreach
|
|
97
|
+
- Product team: feature announcements, tips, onboarding
|
|
98
|
+
- Support team: help offers, check-ins
|
|
99
|
+
- "The Team" / company name: transactional, system messages
|
|
100
|
+
|
|
101
|
+
If the user doesn't have samples, ask them to:
|
|
102
|
+
- Describe their desired tone (formal/casual, emoji usage, signature style)
|
|
103
|
+
- Write a short paragraph about anything (their product, their weekend, anything) so you can capture their natural voice
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Step 4: Event Discovery
|
|
108
|
+
|
|
109
|
+
Based on the product type identified in Step 1, propose an event taxonomy. Use the default SaaS template as a starting point, customized for their specific product:
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
identity:
|
|
113
|
+
- user.signed_up
|
|
114
|
+
- user.email_verified
|
|
115
|
+
- user.profile_completed
|
|
116
|
+
- user.invited_teammate
|
|
117
|
+
|
|
118
|
+
activation:
|
|
119
|
+
- feature.{key_feature_1}_used_first_time
|
|
120
|
+
- feature.{key_feature_2}_used_first_time
|
|
121
|
+
- onboarding.step_completed
|
|
122
|
+
- onboarding.completed
|
|
123
|
+
- project.created
|
|
124
|
+
|
|
125
|
+
engagement:
|
|
126
|
+
- session.started
|
|
127
|
+
- feature.{feature_name}_used
|
|
128
|
+
- content.shared
|
|
129
|
+
- collaboration.started
|
|
130
|
+
|
|
131
|
+
conversion:
|
|
132
|
+
- trial.started
|
|
133
|
+
- trial.ending_soon
|
|
134
|
+
- trial.expired
|
|
135
|
+
- subscription.created
|
|
136
|
+
- subscription.upgraded
|
|
137
|
+
- subscription.downgraded
|
|
138
|
+
- subscription.cancelled
|
|
139
|
+
|
|
140
|
+
retention:
|
|
141
|
+
- user.inactive_3_days
|
|
142
|
+
- user.inactive_7_days
|
|
143
|
+
- user.inactive_14_days
|
|
144
|
+
- usage.weekly_summary
|
|
145
|
+
- milestone.reached
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Replace `{key_feature_*}` and `{feature_name}` placeholders with the actual features from Step 1.
|
|
149
|
+
|
|
150
|
+
Present the taxonomy and ask: "Does this look right? What would you add, remove, or rename?"
|
|
151
|
+
|
|
152
|
+
Also propose relevant tags for their business:
|
|
153
|
+
|
|
154
|
+
- **source tags** - How users are acquired (organic, referral, partner integrations)
|
|
155
|
+
- **plan tags** - Subscription tiers from their pricing model
|
|
156
|
+
- **segment tags** - Behavioral segments (new, power-user, dormant, churning)
|
|
157
|
+
- **feature tags** - One per key feature
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Step 5: Existing System Audit (PATH B Only)
|
|
162
|
+
|
|
163
|
+
This step only applies when the user chose PATH B (improving existing messaging). This is the deep-dive into what they currently have.
|
|
164
|
+
|
|
165
|
+
### 5a. Current Setup Description
|
|
166
|
+
|
|
167
|
+
Ask:
|
|
168
|
+
|
|
169
|
+
> "Describe your current lifecycle messaging setup. You can:
|
|
170
|
+
> - Paste your messages (subject lines + body text)
|
|
171
|
+
> - Upload a document or spreadsheet with your current matrix
|
|
172
|
+
> - Describe it in natural language (e.g., 'We have a 5-email welcome series, a trial expiring email, and a weekly digest')
|
|
173
|
+
> - Tell me what tool you use (Intercom, Customer.io, HubSpot, etc.) and I'll ask the right questions
|
|
174
|
+
> - Any combination of the above"
|
|
175
|
+
|
|
176
|
+
Parse whatever format they provide. For each existing message, extract:
|
|
177
|
+
- Subject/title
|
|
178
|
+
- Channel (email, in-app, push, SMS)
|
|
179
|
+
- Approximate timing/trigger
|
|
180
|
+
- Content summary
|
|
181
|
+
- Any known performance data
|
|
182
|
+
|
|
183
|
+
### 5b. Performance & Problems
|
|
184
|
+
|
|
185
|
+
Ask:
|
|
186
|
+
|
|
187
|
+
> "What's working and what isn't? Share any data you have:
|
|
188
|
+
> - Open rates, click rates, conversion rates
|
|
189
|
+
> - Which messages get complaints or unsubscribes
|
|
190
|
+
> - Anecdotal feedback from users
|
|
191
|
+
> - What problems are you trying to solve? (e.g., 'too many users churn after trial', 'nobody uses feature X', 'our day 5 email has high unsubscribes')"
|
|
192
|
+
|
|
193
|
+
Record:
|
|
194
|
+
- Average open rate, click rate, conversion rate (if available)
|
|
195
|
+
- Problem areas with specific messages
|
|
196
|
+
- General challenges they're facing
|
|
197
|
+
|
|
198
|
+
### 5c. Goals
|
|
199
|
+
|
|
200
|
+
Ask:
|
|
201
|
+
|
|
202
|
+
> "What's your #1 thing you want to improve?"
|
|
203
|
+
>
|
|
204
|
+
> - **Activation** - Getting new users to their aha moment
|
|
205
|
+
> - **Conversion** - Free to paid / trial to paid
|
|
206
|
+
> - **Retention** - Keeping users engaged and reducing churn
|
|
207
|
+
> - **Expansion** - Upsells, cross-sells, seat growth
|
|
208
|
+
> - **Reducing churn** - Stopping users from leaving
|
|
209
|
+
> - **Something else?**
|
|
210
|
+
|
|
211
|
+
Record their primary goal. This will drive prioritization in the matrix generation.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Output: analysis.json
|
|
216
|
+
|
|
217
|
+
After completing all steps, write the analysis to the project output directory as `analysis.json`.
|
|
218
|
+
|
|
219
|
+
Determine the project output directory by:
|
|
220
|
+
1. Looking for an existing `mango-lollipop.json` config file in the current working directory or `output/` subdirectories
|
|
221
|
+
2. If none exists, ask the user for the project name and use `output/{project-name}/`
|
|
222
|
+
3. Create the directory structure if it doesn't exist: `output/{project-name}/messages/{TX,AQ,AC,RV,RT,RF}/`
|
|
223
|
+
|
|
224
|
+
Write `analysis.json` with this schema:
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"path": "fresh | existing",
|
|
229
|
+
"company": {
|
|
230
|
+
"name": "Company Name",
|
|
231
|
+
"product_type": "collaboration tool",
|
|
232
|
+
"target_audience": "Team leads and facilitators at mid-size companies",
|
|
233
|
+
"key_value_prop": "Run engaging, structured remote workshops",
|
|
234
|
+
"aha_moment": "Running their first session with an agenda and seeing participant engagement",
|
|
235
|
+
"key_features": ["agenda", "polls", "breakout rooms", "timer", "recordings"],
|
|
236
|
+
"pricing_model": "Free tier, 14-day Pro trial, Pro ($12/mo), Enterprise (custom)"
|
|
237
|
+
},
|
|
238
|
+
"channels": ["email", "in-app"],
|
|
239
|
+
"voice": {
|
|
240
|
+
"tone": "Friendly, warm, slightly playful but professional",
|
|
241
|
+
"formality": 2,
|
|
242
|
+
"emoji_usage": "light",
|
|
243
|
+
"signature_style": "First name only",
|
|
244
|
+
"sample_phrases": [
|
|
245
|
+
"Here's the thing --",
|
|
246
|
+
"Takes 2 minutes.",
|
|
247
|
+
"You've got this."
|
|
248
|
+
],
|
|
249
|
+
"sender_personas": [
|
|
250
|
+
{ "name": "Jakob", "role": "CEO", "use_for": ["welcome", "milestones", "personal outreach"] },
|
|
251
|
+
{ "name": "Chris", "role": "Head of Product", "use_for": ["feature announcements", "tips", "onboarding"] }
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
"events": {
|
|
255
|
+
"identity": ["user.signed_up", "user.email_verified", "user.profile_completed", "user.invited_teammate"],
|
|
256
|
+
"activation": ["feature.agenda_used_first_time", "feature.polls_used_first_time", "onboarding.completed"],
|
|
257
|
+
"engagement": ["session.started", "session.completed", "content.shared"],
|
|
258
|
+
"conversion": ["trial.started", "trial.ending_soon", "trial.expired", "subscription.created"],
|
|
259
|
+
"retention": ["user.inactive_3_days", "user.inactive_7_days", "user.inactive_14_days", "usage.weekly_summary"]
|
|
260
|
+
},
|
|
261
|
+
"tags": {
|
|
262
|
+
"sources": ["organic", "referral", "partner:zoom"],
|
|
263
|
+
"plans": ["free", "trial", "pro", "enterprise"],
|
|
264
|
+
"segments": ["new", "power-user", "dormant", "churning"],
|
|
265
|
+
"features": ["agenda", "polls", "breakout-rooms", "timer", "recordings"]
|
|
266
|
+
},
|
|
267
|
+
"existing": null,
|
|
268
|
+
"recommendations": [
|
|
269
|
+
"Focus activation drip on the 5 key features with suppression when feature already used",
|
|
270
|
+
"Add in-app nudges alongside email for activation messages",
|
|
271
|
+
"Build re-engagement sequence for inactive users (3/7/14 day cadence)"
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
For **PATH B** users, the `existing` field should be populated:
|
|
277
|
+
|
|
278
|
+
```json
|
|
279
|
+
{
|
|
280
|
+
"existing": {
|
|
281
|
+
"messages_count": 12,
|
|
282
|
+
"stages_covered": ["AQ", "AC"],
|
|
283
|
+
"stages_missing": ["RV", "RT", "RF"],
|
|
284
|
+
"channels_used": ["email"],
|
|
285
|
+
"performance": {
|
|
286
|
+
"open_rate_avg": "22%",
|
|
287
|
+
"click_rate_avg": "3.1%",
|
|
288
|
+
"problem_areas": ["high unsubscribe on day 5 email", "low activation rate"]
|
|
289
|
+
},
|
|
290
|
+
"primary_goal": "activation",
|
|
291
|
+
"messages": [
|
|
292
|
+
{
|
|
293
|
+
"subject": "Welcome to Acme!",
|
|
294
|
+
"channel": "email",
|
|
295
|
+
"timing": "Immediate after signup",
|
|
296
|
+
"stage_mapped": "AQ",
|
|
297
|
+
"performance": { "open_rate": "45%", "click_rate": "8%" },
|
|
298
|
+
"assessment": "good"
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
After writing the file, present a summary to the user:
|
|
306
|
+
|
|
307
|
+
- For PATH A: Show the number of transactional + lifecycle messages that will be generated, broken down by stage and channel. Ask "Ready to generate?"
|
|
308
|
+
- For PATH B: Show a maturity scorecard (score per AARRR stage 0-5), identified gaps, and the plan (how many messages to keep, improve, and add new). Ask "Ready to generate?"
|
|
309
|
+
|
|
310
|
+
Also update the `mango-lollipop.json` config file in the project directory to set `stage: "analyzed"` and `path` to the chosen path.
|