@elitedcs/ghl-mcp 3.70.0 → 3.72.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +8 -5
  3. package/dist/capture-helper.js +10 -1
  4. package/dist/index.js +7479 -1552
  5. package/guide/guide.html +2 -1
  6. package/package.json +2 -2
  7. package/skills/blueprint/SKILL.md +2 -0
  8. package/skills/blueprint/examples/medspa-approval-view.md +58 -53
  9. package/skills/blueprint/examples/medspa-brief.json +70 -8
  10. package/skills/blueprint/examples/medspa-build-plan.json +1435 -123
  11. package/skills/blueprint/examples/medspa-dry-run-report.md +2 -0
  12. package/skills/blueprint/examples/sample-approval-view.md +20 -61
  13. package/skills/blueprint/examples/sample-brief.json +95 -7
  14. package/skills/blueprint/examples/sample-build-plan.json +1448 -119
  15. package/skills/blueprint/examples/validate-plan.cjs +195 -13
  16. package/skills/blueprint/presets/clinic-launch-a2p.preset.json +1 -0
  17. package/skills/blueprint/presets/clinic.md +60 -0
  18. package/skills/blueprint/presets/clinic.preset.json +1737 -0
  19. package/skills/blueprint/presets/coach.md +58 -0
  20. package/skills/blueprint/presets/coach.preset.json +1723 -0
  21. package/skills/blueprint/presets/ecommerce.md +54 -0
  22. package/skills/blueprint/presets/ecommerce.preset.json +1287 -0
  23. package/skills/blueprint/presets/generic-client.md +49 -27
  24. package/skills/blueprint/presets/generic-client.preset.json +1552 -122
  25. package/skills/blueprint/presets/local-service.md +58 -0
  26. package/skills/blueprint/presets/local-service.preset.json +1733 -0
  27. package/skills/blueprint/presets/med-spa.md +47 -48
  28. package/skills/blueprint/presets/med-spa.preset.json +1557 -111
  29. package/skills/blueprint/references/brief-schema.md +48 -1
  30. package/skills/blueprint/references/build-plan-schema.md +66 -5
  31. package/skills/blueprint/references/copy-guide.md +167 -0
  32. package/skills/blueprint/references/intake-question-set.md +64 -3
  33. package/skills/blueprint/references/preset-format.md +97 -51
  34. package/templates/action-schemas.json +12 -0
@@ -3,251 +3,1549 @@
3
3
  "planId": "plan_medspa_demo",
4
4
  "briefId": "sub_medspa_demo",
5
5
  "preset": "med_spa",
6
- "summary": "Generated by the GHL Command Blueprint plan-gen skill from preset med_spa v1.0.0 (brief source: intake_form). Builds Glow Aesthetics a med-spa lead-to-member system: a 7-stage Patient Journey pipeline, lead-source/service-interest/appointment custom fields, source + lifecycle + interest tags, a round-robin consult calendar, an A2P-compliant intake form + lead funnel, a full email/SMS follow-up library, and five workflows (speed-to-lead, nurture, reply-route, confirmed-appointment onboarding with an appointment-relative reminder, and a no-show win-back that branches on whether an opportunity exists). SMS-bearing workflows are held DRAFT behind the A2P handoff; the booking link is filled by the calendar-connect handoff. internal_notification targets the operator's real GHL user id (resolved live via get_users at plan-gen time; shown here as a placeholder). Nothing is built until you approve.",
6
+ "summary": "Generated by the GHL Command Blueprint plan-gen skill from preset med_spa v2.0.0 (brief source: intake_form). Builds Glow Aesthetics a Tier 1 v2 account: 2 plan user(s) from the staff answers, a pipeline from the client's own stages, custom fields, a source / lifecycle / interest tag system, custom values every message reads from, a booking calendar assigned to real staff, an A2P-compliant intake form + funnel, 15 email + 17 SMS send-ready templates in the client's voice, and 8 workflows: Speed to Lead (5 touches in 24 hours, a call task and an alert to a real person, an opportunity card, then the nurture-start hand-off as its last action), Missed Call Text-Back (call_status trigger), Lead Nurture (11 touches across 31 days of waits, stops on reply, hands off to Win-back), Replied - Stop & Route, Win-back (5 touches across 31 days), and the three appointment workflows (confirm & move, reminders at 24 h and 2 h, no-show rescue). SMS-bearing workflows are held DRAFT behind the A2P handoff. Nothing is built until you approve.",
7
+ "users": [
8
+ {
9
+ "ref": "user.dana_reyes",
10
+ "firstName": "Dana",
11
+ "lastName": "Reyes",
12
+ "email": "dana@example.com",
13
+ "role": "admin",
14
+ "phone": "555-010-0100"
15
+ },
16
+ {
17
+ "ref": "user.priya_nair",
18
+ "firstName": "Priya",
19
+ "lastName": "Nair",
20
+ "email": "priya@example.com",
21
+ "role": "user"
22
+ }
23
+ ],
7
24
  "pipelines": [
8
25
  {
9
26
  "ref": "pipeline.patient_journey",
10
- "name": "Glow Aesthetics Patient Journey",
27
+ "name": "Glow Aesthetics Patient Journey || Patient Journey",
11
28
  "stages": [
12
- { "ref": "stage.new_lead", "name": "New Lead", "position": 0 },
13
- { "ref": "stage.contacted", "name": "Contacted", "position": 1 },
14
- { "ref": "stage.consult_booked", "name": "Consult Booked", "position": 2 },
15
- { "ref": "stage.showed", "name": "Showed", "position": 3 },
16
- { "ref": "stage.treated", "name": "Treated", "position": 4 },
17
- { "ref": "stage.member", "name": "Member / Rebooked", "position": 5 },
18
- { "ref": "stage.lost", "name": "Lost", "position": 6 }
29
+ {
30
+ "ref": "stage.new_lead",
31
+ "name": "New Lead",
32
+ "position": 0
33
+ },
34
+ {
35
+ "ref": "stage.contacted",
36
+ "name": "Contacted",
37
+ "position": 1
38
+ },
39
+ {
40
+ "ref": "stage.consult_booked",
41
+ "name": "Consult Booked",
42
+ "position": 2
43
+ },
44
+ {
45
+ "ref": "stage.showed",
46
+ "name": "Showed",
47
+ "position": 3
48
+ },
49
+ {
50
+ "ref": "stage.treated",
51
+ "name": "Treated",
52
+ "position": 4
53
+ },
54
+ {
55
+ "ref": "stage.member_rebooked",
56
+ "name": "Member / Rebooked",
57
+ "position": 5
58
+ },
59
+ {
60
+ "ref": "stage.lost",
61
+ "name": "Lost",
62
+ "position": 6
63
+ }
19
64
  ]
20
65
  }
21
66
  ],
22
67
  "customFields": [
23
- { "ref": "field.lead_source", "name": "Lead Source", "dataType": "SINGLE_OPTIONS", "model": "contact", "options": ["Website", "Instagram", "Facebook", "Google", "Referral", "Walk-in", "Other"] },
24
- { "ref": "field.service_interest", "name": "Service Interest", "dataType": "MULTIPLE_OPTIONS", "model": "contact", "options": ["Injectables / Tox", "Dermal Filler", "Facials / Skin", "Membership", "Weight / Body"] },
25
- { "ref": "field.appointment_date", "name": "Appointment Date", "dataType": "DATE", "model": "contact" },
26
- { "ref": "field.consult_deposit_paid", "name": "Consult Deposit Paid", "dataType": "CHECKBOX", "model": "contact", "options": ["Deposit paid"] },
27
- { "ref": "field.lifetime_value", "name": "Estimated Lifetime Value", "dataType": "MONETORY", "model": "contact" }
68
+ {
69
+ "ref": "field.lead_source",
70
+ "name": "Lead Source",
71
+ "dataType": "SINGLE_OPTIONS",
72
+ "model": "contact",
73
+ "options": [
74
+ "Website",
75
+ "Instagram",
76
+ "Facebook",
77
+ "Google",
78
+ "Referral",
79
+ "Phone",
80
+ "Walk-in",
81
+ "Other"
82
+ ]
83
+ },
84
+ {
85
+ "ref": "field.service_interest",
86
+ "name": "Service Interest",
87
+ "dataType": "MULTIPLE_OPTIONS",
88
+ "model": "contact",
89
+ "options": [
90
+ "Injectables / Tox",
91
+ "Dermal Filler",
92
+ "Facials / Skin",
93
+ "Membership",
94
+ "Weight / Body"
95
+ ]
96
+ },
97
+ {
98
+ "ref": "field.top_concern",
99
+ "name": "Top Concern",
100
+ "dataType": "TEXT",
101
+ "model": "contact"
102
+ },
103
+ {
104
+ "ref": "field.appointment_date",
105
+ "name": "Appointment Date",
106
+ "dataType": "DATE",
107
+ "model": "contact"
108
+ },
109
+ {
110
+ "ref": "field.consult_deposit_paid",
111
+ "name": "Consult Deposit Paid",
112
+ "dataType": "CHECKBOX",
113
+ "model": "contact",
114
+ "options": [
115
+ "Deposit paid"
116
+ ]
117
+ },
118
+ {
119
+ "ref": "field.lifetime_value",
120
+ "name": "Estimated Lifetime Value",
121
+ "dataType": "MONETORY",
122
+ "model": "contact"
123
+ }
28
124
  ],
29
125
  "tags": [
30
- { "ref": "tag.source_website", "name": "source-website" },
31
- { "ref": "tag.source_instagram", "name": "source-instagram" },
32
- { "ref": "tag.source_facebook", "name": "source-facebook" },
33
- { "ref": "tag.source_google", "name": "source-google" },
34
- { "ref": "tag.source_referral", "name": "source-referral" },
35
- { "ref": "tag.lc_new_lead", "name": "lifecycle-new-lead" },
36
- { "ref": "tag.lc_contacted", "name": "lifecycle-contacted" },
37
- { "ref": "tag.lc_consult_booked", "name": "lifecycle-consult-booked" },
38
- { "ref": "tag.lc_showed", "name": "lifecycle-showed" },
39
- { "ref": "tag.lc_treated", "name": "lifecycle-treated" },
40
- { "ref": "tag.lc_member", "name": "lifecycle-member" },
41
- { "ref": "tag.lc_lapsed", "name": "lifecycle-lapsed" },
42
- { "ref": "tag.lc_lost", "name": "lifecycle-lost" },
43
- { "ref": "tag.interest_injectables", "name": "interest-injectables" },
44
- { "ref": "tag.interest_filler", "name": "interest-filler" },
45
- { "ref": "tag.interest_facials", "name": "interest-facials" },
46
- { "ref": "tag.interest_membership", "name": "interest-membership" }
126
+ {
127
+ "ref": "tag.source_website",
128
+ "name": "source-website"
129
+ },
130
+ {
131
+ "ref": "tag.source_instagram",
132
+ "name": "source-instagram"
133
+ },
134
+ {
135
+ "ref": "tag.source_facebook",
136
+ "name": "source-facebook"
137
+ },
138
+ {
139
+ "ref": "tag.source_google",
140
+ "name": "source-google"
141
+ },
142
+ {
143
+ "ref": "tag.source_referral",
144
+ "name": "source-referral"
145
+ },
146
+ {
147
+ "ref": "tag.source_phone",
148
+ "name": "source-phone"
149
+ },
150
+ {
151
+ "ref": "tag.source_other",
152
+ "name": "source-other"
153
+ },
154
+ {
155
+ "ref": "tag.lc_new_lead",
156
+ "name": "lifecycle-new-lead"
157
+ },
158
+ {
159
+ "ref": "tag.lc_contacted",
160
+ "name": "lifecycle-contacted"
161
+ },
162
+ {
163
+ "ref": "tag.lc_nurturing",
164
+ "name": "lifecycle-nurturing"
165
+ },
166
+ {
167
+ "ref": "tag.lc_booked",
168
+ "name": "lifecycle-booked"
169
+ },
170
+ {
171
+ "ref": "tag.lc_showed",
172
+ "name": "lifecycle-showed"
173
+ },
174
+ {
175
+ "ref": "tag.lc_treated",
176
+ "name": "lifecycle-treated"
177
+ },
178
+ {
179
+ "ref": "tag.lc_member",
180
+ "name": "lifecycle-member"
181
+ },
182
+ {
183
+ "ref": "tag.lc_lapsed",
184
+ "name": "lifecycle-lapsed"
185
+ },
186
+ {
187
+ "ref": "tag.lc_lost",
188
+ "name": "lifecycle-lost"
189
+ },
190
+ {
191
+ "ref": "tag.nurture_start",
192
+ "name": "nurture-start"
193
+ },
194
+ {
195
+ "ref": "tag.winback_start",
196
+ "name": "winback-start"
197
+ },
198
+ {
199
+ "ref": "tag.missed_call",
200
+ "name": "missed-call"
201
+ },
202
+ {
203
+ "ref": "tag.no_show",
204
+ "name": "no-show"
205
+ },
206
+ {
207
+ "ref": "tag.interest_injectables",
208
+ "name": "interest-injectables"
209
+ },
210
+ {
211
+ "ref": "tag.interest_filler",
212
+ "name": "interest-filler"
213
+ },
214
+ {
215
+ "ref": "tag.interest_facials",
216
+ "name": "interest-facials"
217
+ },
218
+ {
219
+ "ref": "tag.interest_membership",
220
+ "name": "interest-membership"
221
+ }
47
222
  ],
48
223
  "customValues": [
49
- { "ref": "cv.booking_link", "name": "Booking Link", "value": "", "filledBy": "handoff.calendar_oauth" }
224
+ {
225
+ "ref": "cv.business_name",
226
+ "name": "business_name",
227
+ "value": "Glow Aesthetics"
228
+ },
229
+ {
230
+ "ref": "cv.business_phone",
231
+ "name": "business_phone",
232
+ "value": "",
233
+ "filledBy": "handoff.business_details"
234
+ },
235
+ {
236
+ "ref": "cv.owner_first_name",
237
+ "name": "owner_first_name",
238
+ "value": "Dana",
239
+ "filledBy": "handoff.business_details"
240
+ },
241
+ {
242
+ "ref": "cv.booking_link",
243
+ "name": "booking_link",
244
+ "value": "",
245
+ "filledBy": "handoff.calendar_oauth"
246
+ }
50
247
  ],
51
248
  "calendars": [
52
249
  {
53
250
  "ref": "calendar.consult",
54
- "name": "Glow Aesthetics Consultation",
251
+ "name": "Consultation",
55
252
  "calendarType": "round_robin",
253
+ "slotDuration": 30,
254
+ "slotDurationUnit": "mins",
255
+ "teamMemberRefs": [
256
+ "user.dana_reyes"
257
+ ],
56
258
  "openHours": [
57
- { "daysOfTheWeek": [1, 2, 3, 4, 5], "hours": [{ "openHour": 9, "openMinute": 0, "closeHour": 17, "closeMinute": 0 }] }
259
+ {
260
+ "daysOfTheWeek": [
261
+ 1,
262
+ 2,
263
+ 3,
264
+ 4,
265
+ 5
266
+ ],
267
+ "hours": [
268
+ {
269
+ "openHour": 9,
270
+ "openMinute": 0,
271
+ "closeHour": 17,
272
+ "closeMinute": 0
273
+ }
274
+ ]
275
+ }
58
276
  ],
59
277
  "availabilityType": 0,
278
+ "slotDuration": 30,
279
+ "slotBuffer": 10,
60
280
  "requiresStaff": true
61
281
  }
62
282
  ],
63
283
  "forms": [
64
284
  {
65
285
  "ref": "form.intake",
66
- "name": "Glow Aesthetics New Client Inquiry",
286
+ "name": "Glow Aesthetics New Client Inquiry || New Client Inquiry",
67
287
  "fields": [
68
- { "type": "standard", "key": "first_name", "required": true },
69
- { "type": "standard", "key": "last_name", "required": false },
70
- { "type": "standard", "key": "email", "required": true },
71
- { "type": "standard", "key": "phone", "required": true },
72
- { "type": "custom", "fieldRef": "field.service_interest", "required": false }
288
+ {
289
+ "type": "standard",
290
+ "key": "first_name",
291
+ "required": true
292
+ },
293
+ {
294
+ "type": "standard",
295
+ "key": "last_name",
296
+ "required": false
297
+ },
298
+ {
299
+ "type": "standard",
300
+ "key": "email",
301
+ "required": true
302
+ },
303
+ {
304
+ "type": "standard",
305
+ "key": "phone",
306
+ "required": true
307
+ },
308
+ {
309
+ "type": "custom",
310
+ "fieldRef": "field.service_interest",
311
+ "required": false
312
+ }
73
313
  ]
74
314
  }
75
315
  ],
76
316
  "funnels": [
77
317
  {
78
318
  "ref": "funnel.main",
79
- "name": "Glow Aesthetics Lead Funnel",
319
+ "name": "Glow Aesthetics Lead Funnel || Lead Funnel",
80
320
  "target": "ghl",
81
321
  "pages": [
82
322
  {
83
323
  "ref": "page.optin",
84
- "name": "Free Skin Assessment",
324
+ "name": "Free skin assessment || Free Skin Assessment",
85
325
  "role": "optin",
86
- "outline": "HERO: H1 'Your Free Skin Assessment at Glow Aesthetics' + one-line subhead (refreshed, natural results for women in North Scottsdale); primary CTA 'Book my free assessment' to form.intake; logo + hero image (alt text). QUOTABLE SUMMARY (GEO): 2-4 plain sentences an answer engine can lift: what the free skin assessment is, who it serves (women 30-55 in North Scottsdale), and the next step. VALUE: 3-5 outcome-led benefits (natural-looking injectables, filler, medical facials, a plan to your goals). SOCIAL PROOF: real testimonials/credentials only, else omit. CAPTURE FORM (A2P-compliant, MANDATORY): name + email + phone (clearly labeled) + a NOT-pre-checked SMS consent checkbox with the four disclosures (opt-out, HELP, msg&data rates, frequency); visible business legal name + mailing address; Privacy Policy and Terms links at the point of capture; Privacy Policy states SMS/phone data is not shared or sold. FAQ: 4-8 real Q/A with FAQPage JSON-LD. FOOTER: NAP + legal links. HEAD: one H1, <title> under 60 chars, meta description under 155, canonical, LocalBusiness + Service + FAQPage JSON-LD. Fill from templates/funnel-page-content-template.md.",
87
326
  "formRef": "form.intake"
88
327
  },
89
328
  {
90
329
  "ref": "page.thankyou",
91
330
  "name": "Thank You",
92
331
  "role": "confirmation",
93
- "outline": "Confirmation message ('Your assessment request is in'); set the next-step expectation; embed the booking widget via cv.booking_link / calendar.consult so they can self-schedule now. Keep NAP + Privacy/Terms links in the footer. No new opt-in needed. Fill from templates/funnel-page-content-template.md (confirmation role).",
94
332
  "calendarRef": "calendar.consult"
95
333
  }
96
334
  ]
97
335
  }
98
336
  ],
337
+ "templates": {
338
+ "emails": [
339
+ {
340
+ "ref": "email_template.stl_email_1",
341
+ "name": "Speed to Lead - Instant Email",
342
+ "subject": "Got your request, {{contact.first_name}}",
343
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your free skin assessment request just landed with {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}, and I read every one of these myself.</p><p style=\"margin:0 0 14px;\">Here's what happens next: within a few minutes you'll get a text from this number. Reply with the one thing you'd most like to change, and I'll tell you honestly whether it's a good fit before you spend a dollar.</p><p style=\"margin:0 0 14px;\">If you'd rather skip the back and forth, pick a time that suits you:</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Hold my assessment time</a></p><p style=\"margin:0 0 14px;\">It's 30 minutes, it's free, and nobody will try to sell you something you don't need. That's the whole promise.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
344
+ },
345
+ {
346
+ "ref": "email_template.stl_email_2",
347
+ "name": "Speed to Lead - 3 Hour Email",
348
+ "subject": "The one question we ask every new client",
349
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Before anyone at {{custom_values.business_name}} recommends a treatment, we ask one question: what do you want people to notice, and what do you want them not to notice?</p><p style=\"margin:0 0 14px;\">Most people give the same answer. They want to look rested, not different. That answer decides everything about how we work: smaller amounts, the right areas, and a plan you can pause any time.</p><p style=\"margin:0 0 14px;\">Your assessment is where we map that plan. Bring your questions. Bring your skepticism.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">Or reply to this email with what's on your mind. I answer personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
350
+ },
351
+ {
352
+ "ref": "email_template.n_email_1",
353
+ "name": "Nurture 1 - Refreshed vs Overdone",
354
+ "subject": "Refreshed vs overdone: the real difference",
355
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The number one worry we hear is \"I don't want to look done.\" Fair. Everyone has seen the results that went too far.</p><p style=\"margin:0 0 14px;\">Here is what separates the two, and it isn't luck: the amount, the placement, and the restraint to stop. A good injector treats less than you'd expect on the first visit and adjusts two weeks later once your face has settled. The overdone look comes from doing too much, too fast, in the wrong places.</p><p style=\"margin:0 0 14px;\">That's why our first visit is an assessment, not a sale. We look at your whole face, explain the options in plain language, and tell you what we would not do.</p><p style=\"margin:0 0 14px;\">When you're ready, your assessment is here: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">book a time</a>. No obligation to treat that day.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
356
+ },
357
+ {
358
+ "ref": "email_template.n_email_2",
359
+ "name": "Nurture 2 - What Happens at the First Visit",
360
+ "subject": "What actually happens at your first visit",
361
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">People put off the first visit because they don't know what's inside the door. So here it is, minute by minute:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Minutes 0-10: you talk, we listen. What bothers you, what you've tried, what you're nervous about.</li><li style=\"margin:0 0 6px;\">Minutes 10-20: we look at your skin in good light and explain what's causing what.</li><li style=\"margin:0 0 6px;\">Minutes 20-30: you get a written plan with options at different price points. You take it home. No pressure to decide in the chair.</li></ul><p style=\"margin:0 0 14px;\">The objection we hear most is price. That's exactly why the plan has options: start with the one change that makes the biggest difference and add from there, or don't.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
362
+ },
363
+ {
364
+ "ref": "email_template.n_email_3",
365
+ "name": "Nurture 3 - Why We Treat Less",
366
+ "subject": "Why we treat less than you expect",
367
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The best compliment you can get after treatment is \"you look well rested.\" Not \"what did you have done?\"</p><p style=\"margin:0 0 14px;\">That result comes from a rule we don't break: treat conservatively first, then adjust at your two-week check. It's slower than doing everything in one visit. It's also why our clients don't get the frozen or overfilled look, and why they come back.</p><p style=\"margin:0 0 14px;\">If you want to see how that plays out on your face specifically, that's what the assessment is for.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">See my options</a></p><p style=\"margin:0 0 14px;\">Have a question first? Reply to this email. I'll answer it myself.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
368
+ },
369
+ {
370
+ "ref": "email_template.n_email_4",
371
+ "name": "Nurture 4 - About the Price",
372
+ "subject": "About the price",
373
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">Injectables, dermal filler, and medical facials for first-time and returning clients, plus a membership for regulars. are priced by what we actually use, not a flat package you may not need. Because we treat conservatively, most first visits cost less than people expect. Your written plan shows the price of each option before anything happens, and there is never a surprise on the way out.</p><p style=\"margin:0 0 14px;\">If it helps, we'll also show you how to spread your plan over a few months so it fits your budget instead of the other way round.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Get my written plan</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
374
+ },
375
+ {
376
+ "ref": "email_template.n_email_5",
377
+ "name": "Nurture 5 - What Waiting Costs",
378
+ "subject": "What waiting actually costs",
379
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">There's a myth that it's smart to wait until lines get deeper before doing anything. The opposite is true.</p><p style=\"margin:0 0 14px;\">Shallow lines respond to small amounts and look natural. Deep, set-in lines take more product, more visits and more money to soften, and the result is less subtle. Skin is the same: the earlier you start protecting collagen, the less you need to replace later.</p><p style=\"margin:0 0 14px;\">None of that means you have to do anything today. It does mean an assessment now gives you the cheapest set of options you'll ever have.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
380
+ },
381
+ {
382
+ "ref": "email_template.n_email_6",
383
+ "name": "Nurture 6 - Everything in One Place",
384
+ "subject": "Everything you need to decide, in one place",
385
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">If you're still weighing it up, here is everything in one place:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What: your free skin assessment, with a written plan you keep.</li><li style=\"margin:0 0 6px;\">Where: {{custom_values.business_name}}, Scottsdale, AZ.</li><li style=\"margin:0 0 6px;\">Cost of the visit: nothing. Cost of treatment: shown per option, in writing, before anything happens.</li><li style=\"margin:0 0 6px;\">Our rule: treat less first, adjust in two weeks, never overdo it.</li><li style=\"margin:0 0 6px;\">Book, cancel or move your time any time: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">your booking link</a>.</li></ul><p style=\"margin:0 0 14px;\">If the answer is \"not now\", that's fine. Reply with the word later and I'll stop the emails and check in next season.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
386
+ },
387
+ {
388
+ "ref": "email_template.w_email_1",
389
+ "name": "Win-back 1 - One Question",
390
+ "subject": "One question, {{contact.first_name}}",
391
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">A while back you asked {{custom_values.business_name}} about a free skin assessment, and then life got busy. That's normal.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, price, nerves, or something we said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something we can fix, I'll fix it. If it's not the right time, I'll leave you alone until it is.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
392
+ },
393
+ {
394
+ "ref": "email_template.w_email_2",
395
+ "name": "Win-back 2 - What Changed",
396
+ "subject": "What's changed since you last looked",
397
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Since you first reached out, a couple of things have changed at {{custom_values.business_name}}: new openings on the calendar, and a written plan that now includes a monthly option for people who want to spread the cost.</p><p style=\"margin:0 0 14px;\">What hasn't changed: the assessment is still free, still 30 minutes, and still ends with a plan you take home instead of a decision in the chair.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">See the calendar</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
398
+ },
399
+ {
400
+ "ref": "email_template.w_email_3",
401
+ "name": "Win-back 3 - The Door Stays Open",
402
+ "subject": "The door stays open",
403
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">This is the last automatic email you'll get from me. I'd rather you hear from a person when the time is right than from a sequence.</p><p style=\"margin:0 0 14px;\">So here's the deal: your free assessment doesn't expire. When you're ready, the link below works, and so does replying to this email.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book when you're ready</a></p><p style=\"margin:0 0 14px;\">Thank you for considering us. Take care of that skin in the meantime: sunscreen every morning, no exceptions.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
404
+ },
405
+ {
406
+ "ref": "email_template.appt_confirm_email",
407
+ "name": "Consult Confirmed",
408
+ "subject": "Confirmed, {{contact.first_name}}: your consult details",
409
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your consult at {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><p style=\"margin:0 0 14px;\">What to bring: nothing but your questions. Come with a clean face if you can (no makeup needed) and plan for about 30 minutes.</p><p style=\"margin:0 0 14px;\">What you'll leave with: a written plan with options and prices. No obligation to treat that day.</p><p style=\"margin:0 0 14px;\">Need to move it? Use your booking link: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">reschedule</a>, or reply to this email.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
410
+ },
411
+ {
412
+ "ref": "email_template.appt_prep_email",
413
+ "name": "Consult Prep (day before)",
414
+ "subject": "Tomorrow: 3 things that make your consult better",
415
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">See you tomorrow at {{appointment.start_time}}. Three small things that make the visit more useful:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Skip makeup if you can. We read skin better bare.</li><li style=\"margin:0 0 6px;\">Bring a photo of yourself from a few years ago. It shows us what \"refreshed\" means to you.</li><li style=\"margin:0 0 6px;\">Write down the one thing you'd change first. We'll start there.</li></ul><p style=\"margin:0 0 14px;\">Running late or need to move it? Reply to this email or call {{custom_values.business_phone}}.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
416
+ },
417
+ {
418
+ "ref": "email_template.ns_email_1",
419
+ "name": "No-Show 1 - We Missed You",
420
+ "subject": "We missed you, {{contact.first_name}} (no guilt)",
421
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">We had you down for a consult today and it didn't work out. Life happens; nobody here is bothered.</p><p style=\"margin:0 0 14px;\">Your free assessment is still yours. Pick a new time whenever it suits, and if something about the visit put you off, reply and tell me. I'd rather know.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Rebook my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
422
+ },
423
+ {
424
+ "ref": "email_template.ns_email_2",
425
+ "name": "No-Show 2 - Still Want This?",
426
+ "subject": "Still want to do this?",
427
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Quick and honest: if the timing is wrong, say so and I'll check back in a few months. If it's still something you want, the calendar is open and the visit is still free.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick a new time</a></p><p style=\"margin:0 0 14px;\">Either way, thanks for considering {{custom_values.business_name}}.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
428
+ }
429
+ ],
430
+ "sms": [
431
+ {
432
+ "ref": "sms_template.stl_sms_1",
433
+ "name": "Speed to Lead - Instant Text",
434
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Your free skin assessment request is in. What's the one thing you'd most like to change? Reply STOP to opt out."
435
+ },
436
+ {
437
+ "ref": "sms_template.stl_sms_2",
438
+ "name": "Speed to Lead - 20 Minute Text",
439
+ "body": "{{contact.first_name}}, I can hold a 30-min assessment time for you this week. Mornings or afternoons? Or grab one here: {{custom_values.booking_link}}"
440
+ },
441
+ {
442
+ "ref": "sms_template.stl_sms_3",
443
+ "name": "Speed to Lead - Next Day Text",
444
+ "body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} again. Not chasing, I just don't want your question to fall through the cracks. Still want to find a time, or is it a \"not now\"?"
445
+ },
446
+ {
447
+ "ref": "sms_template.mc_sms_1",
448
+ "name": "Missed Call - Instant Text-Back",
449
+ "body": "Hi, it's {{custom_values.business_name}}. Sorry we missed your call. How can we help? Reply here and a real person will answer. Reply STOP to opt out."
450
+ },
451
+ {
452
+ "ref": "sms_template.mc_sms_2",
453
+ "name": "Missed Call - 1 Hour Text",
454
+ "body": "Still need us? Reply with a good time to call you back, or book directly: {{custom_values.booking_link}}. {{custom_values.business_name}}, {{custom_values.business_phone}}"
455
+ },
456
+ {
457
+ "ref": "sms_template.n_sms_1",
458
+ "name": "Nurture Text 1 - One Word",
459
+ "body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough. Reply STOP to opt out."
460
+ },
461
+ {
462
+ "ref": "sms_template.n_sms_2",
463
+ "name": "Nurture Text 2 - Free Tip",
464
+ "body": "Tip from {{custom_values.business_name}}: sunscreen every morning does more for fine lines than any single treatment, and it makes every treatment last longer. Want the short list of what else works? Reply YES."
465
+ },
466
+ {
467
+ "ref": "sms_template.n_sms_3",
468
+ "name": "Nurture Text 3 - Midpoint",
469
+ "body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about your skin plan? I have a couple of openings this week. Want one, or should I check back next month?"
470
+ },
471
+ {
472
+ "ref": "sms_template.n_sms_4",
473
+ "name": "Nurture Text 4 - Any Question",
474
+ "body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you ever get your question answered? If not, ask it here and I'll reply personally."
475
+ },
476
+ {
477
+ "ref": "sms_template.n_sms_5",
478
+ "name": "Nurture Text 5 - Last Direct Ask",
479
+ "body": "{{contact.first_name}}, last one from me at {{custom_values.business_name}}. If you want your skin plan this month, reply YES and I'll send two times. If not, no hard feelings. Reply STOP to opt out."
480
+ },
481
+ {
482
+ "ref": "sms_template.w_sms_1",
483
+ "name": "Win-back Text 1",
484
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now? Reply STOP to opt out."
485
+ },
486
+ {
487
+ "ref": "sms_template.w_sms_2",
488
+ "name": "Win-back Text 2",
489
+ "body": "{{contact.first_name}}, two openings came up this week at {{custom_values.business_name}}. Want one for your free assessment? Reply YES and I'll hold it."
490
+ },
491
+ {
492
+ "ref": "sms_template.appt_confirm_sms",
493
+ "name": "Consult Confirmed Text",
494
+ "body": "{{contact.first_name}}, you're confirmed at {{custom_values.business_name}} for {{appointment.start_time}}. Need to change it? Reply here. Reply STOP to opt out."
495
+ },
496
+ {
497
+ "ref": "sms_template.appt_24h_sms",
498
+ "name": "Consult Reminder - 24 Hours",
499
+ "body": "Reminder: your consult at {{custom_values.business_name}} is tomorrow at {{appointment.start_time}}. Reply C to confirm or R to reschedule."
500
+ },
501
+ {
502
+ "ref": "sms_template.appt_2h_sms",
503
+ "name": "Consult Reminder - 2 Hours",
504
+ "body": "See you in about 2 hours, {{contact.first_name}}. {{custom_values.business_name}}, {{appointment.start_time}}. Reply here if you're running late."
505
+ },
506
+ {
507
+ "ref": "sms_template.ns_sms_1",
508
+ "name": "No-Show Text 1",
509
+ "body": "Hi {{contact.first_name}}, we missed you today at {{custom_values.business_name}}. No problem at all. Want me to find you a new time this week? Reply YES. Reply STOP to opt out."
510
+ },
511
+ {
512
+ "ref": "sms_template.ns_sms_2",
513
+ "name": "No-Show Text 2",
514
+ "body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. I kept a couple of consult times open for you this week. Want one? Reply with a day that works."
515
+ }
516
+ ]
517
+ },
99
518
  "emails": [
100
519
  {
101
- "ref": "email.welcome_1",
102
- "name": "Welcome / First Touch",
103
- "subject": "Your free skin assessment with Glow Aesthetics",
104
- "body": "Hi {{contact.first_name}},\n\nThank you for requesting your free skin assessment with Glow Aesthetics. We help women in North Scottsdale look refreshed and natural with injectables, dermal filler, and medical facials.\n\nYour next step is simple: book your complimentary consult and we will map a plan to your goals, with no pressure. Pick a time that works for you here:\n\n{{custom_values.booking_link}}\n\nIf now is not the right time, just reply to this email and we will help.\n\nWarmly,\nThe Glow Aesthetics Team",
105
- "mergeTags": ["contact.first_name"]
520
+ "ref": "email.stl_email_1",
521
+ "name": "Speed to Lead - Instant Email",
522
+ "subject": "Got your request, {{contact.first_name}}",
523
+ "templateRef": "email_template.stl_email_1",
524
+ "mergeTags": [
525
+ "contact.first_name",
526
+ "custom_values.business_name",
527
+ "custom_values.owner_first_name",
528
+ "custom_values.booking_link",
529
+ "custom_values.business_phone"
530
+ ],
531
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your free skin assessment request just landed with {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}, and I read every one of these myself.</p><p style=\"margin:0 0 14px;\">Here's what happens next: within a few minutes you'll get a text from this number. Reply with the one thing you'd most like to change, and I'll tell you honestly whether it's a good fit before you spend a dollar.</p><p style=\"margin:0 0 14px;\">If you'd rather skip the back and forth, pick a time that suits you:</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Hold my assessment time</a></p><p style=\"margin:0 0 14px;\">It's 30 minutes, it's free, and nobody will try to sell you something you don't need. That's the whole promise.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
532
+ },
533
+ {
534
+ "ref": "email.stl_email_2",
535
+ "name": "Speed to Lead - 3 Hour Email",
536
+ "subject": "The one question we ask every new client",
537
+ "templateRef": "email_template.stl_email_2",
538
+ "mergeTags": [
539
+ "contact.first_name",
540
+ "custom_values.business_name",
541
+ "custom_values.booking_link",
542
+ "custom_values.owner_first_name",
543
+ "custom_values.business_phone"
544
+ ],
545
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Before anyone at {{custom_values.business_name}} recommends a treatment, we ask one question: what do you want people to notice, and what do you want them not to notice?</p><p style=\"margin:0 0 14px;\">Most people give the same answer. They want to look rested, not different. That answer decides everything about how we work: smaller amounts, the right areas, and a plan you can pause any time.</p><p style=\"margin:0 0 14px;\">Your assessment is where we map that plan. Bring your questions. Bring your skepticism.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">Or reply to this email with what's on your mind. I answer personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
546
+ },
547
+ {
548
+ "ref": "email.n_email_1",
549
+ "name": "Nurture 1 - Refreshed vs Overdone",
550
+ "subject": "Refreshed vs overdone: the real difference",
551
+ "templateRef": "email_template.n_email_1",
552
+ "mergeTags": [
553
+ "contact.first_name",
554
+ "custom_values.booking_link",
555
+ "custom_values.owner_first_name",
556
+ "custom_values.business_name",
557
+ "custom_values.business_phone"
558
+ ],
559
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The number one worry we hear is \"I don't want to look done.\" Fair. Everyone has seen the results that went too far.</p><p style=\"margin:0 0 14px;\">Here is what separates the two, and it isn't luck: the amount, the placement, and the restraint to stop. A good injector treats less than you'd expect on the first visit and adjusts two weeks later once your face has settled. The overdone look comes from doing too much, too fast, in the wrong places.</p><p style=\"margin:0 0 14px;\">That's why our first visit is an assessment, not a sale. We look at your whole face, explain the options in plain language, and tell you what we would not do.</p><p style=\"margin:0 0 14px;\">When you're ready, your assessment is here: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">book a time</a>. No obligation to treat that day.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
560
+ },
561
+ {
562
+ "ref": "email.n_email_2",
563
+ "name": "Nurture 2 - What Happens at the First Visit",
564
+ "subject": "What actually happens at your first visit",
565
+ "templateRef": "email_template.n_email_2",
566
+ "mergeTags": [
567
+ "contact.first_name",
568
+ "custom_values.booking_link",
569
+ "custom_values.owner_first_name",
570
+ "custom_values.business_name",
571
+ "custom_values.business_phone"
572
+ ],
573
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">People put off the first visit because they don't know what's inside the door. So here it is, minute by minute:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Minutes 0-10: you talk, we listen. What bothers you, what you've tried, what you're nervous about.</li><li style=\"margin:0 0 6px;\">Minutes 10-20: we look at your skin in good light and explain what's causing what.</li><li style=\"margin:0 0 6px;\">Minutes 20-30: you get a written plan with options at different price points. You take it home. No pressure to decide in the chair.</li></ul><p style=\"margin:0 0 14px;\">The objection we hear most is price. That's exactly why the plan has options: start with the one change that makes the biggest difference and add from there, or don't.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
574
+ },
575
+ {
576
+ "ref": "email.n_email_3",
577
+ "name": "Nurture 3 - Why We Treat Less",
578
+ "subject": "Why we treat less than you expect",
579
+ "templateRef": "email_template.n_email_3",
580
+ "mergeTags": [
581
+ "contact.first_name",
582
+ "custom_values.booking_link",
583
+ "custom_values.owner_first_name",
584
+ "custom_values.business_name",
585
+ "custom_values.business_phone"
586
+ ],
587
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The best compliment you can get after treatment is \"you look well rested.\" Not \"what did you have done?\"</p><p style=\"margin:0 0 14px;\">That result comes from a rule we don't break: treat conservatively first, then adjust at your two-week check. It's slower than doing everything in one visit. It's also why our clients don't get the frozen or overfilled look, and why they come back.</p><p style=\"margin:0 0 14px;\">If you want to see how that plays out on your face specifically, that's what the assessment is for.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">See my options</a></p><p style=\"margin:0 0 14px;\">Have a question first? Reply to this email. I'll answer it myself.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
588
+ },
589
+ {
590
+ "ref": "email.n_email_4",
591
+ "name": "Nurture 4 - About the Price",
592
+ "subject": "About the price",
593
+ "templateRef": "email_template.n_email_4",
594
+ "mergeTags": [
595
+ "contact.first_name",
596
+ "custom_values.booking_link",
597
+ "custom_values.owner_first_name",
598
+ "custom_values.business_name",
599
+ "custom_values.business_phone"
600
+ ],
601
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">Injectables, dermal filler, and medical facials for first-time and returning clients, plus a membership for regulars. are priced by what we actually use, not a flat package you may not need. Because we treat conservatively, most first visits cost less than people expect. Your written plan shows the price of each option before anything happens, and there is never a surprise on the way out.</p><p style=\"margin:0 0 14px;\">If it helps, we'll also show you how to spread your plan over a few months so it fits your budget instead of the other way round.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Get my written plan</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
602
+ },
603
+ {
604
+ "ref": "email.n_email_5",
605
+ "name": "Nurture 5 - What Waiting Costs",
606
+ "subject": "What waiting actually costs",
607
+ "templateRef": "email_template.n_email_5",
608
+ "mergeTags": [
609
+ "contact.first_name",
610
+ "custom_values.booking_link",
611
+ "custom_values.owner_first_name",
612
+ "custom_values.business_name",
613
+ "custom_values.business_phone"
614
+ ],
615
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">There's a myth that it's smart to wait until lines get deeper before doing anything. The opposite is true.</p><p style=\"margin:0 0 14px;\">Shallow lines respond to small amounts and look natural. Deep, set-in lines take more product, more visits and more money to soften, and the result is less subtle. Skin is the same: the earlier you start protecting collagen, the less you need to replace later.</p><p style=\"margin:0 0 14px;\">None of that means you have to do anything today. It does mean an assessment now gives you the cheapest set of options you'll ever have.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
616
+ },
617
+ {
618
+ "ref": "email.n_email_6",
619
+ "name": "Nurture 6 - Everything in One Place",
620
+ "subject": "Everything you need to decide, in one place",
621
+ "templateRef": "email_template.n_email_6",
622
+ "mergeTags": [
623
+ "contact.first_name",
624
+ "custom_values.business_name",
625
+ "custom_values.booking_link",
626
+ "custom_values.owner_first_name",
627
+ "custom_values.business_phone"
628
+ ],
629
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">If you're still weighing it up, here is everything in one place:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What: your free skin assessment, with a written plan you keep.</li><li style=\"margin:0 0 6px;\">Where: {{custom_values.business_name}}, Scottsdale, AZ.</li><li style=\"margin:0 0 6px;\">Cost of the visit: nothing. Cost of treatment: shown per option, in writing, before anything happens.</li><li style=\"margin:0 0 6px;\">Our rule: treat less first, adjust in two weeks, never overdo it.</li><li style=\"margin:0 0 6px;\">Book, cancel or move your time any time: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">your booking link</a>.</li></ul><p style=\"margin:0 0 14px;\">If the answer is \"not now\", that's fine. Reply with the word later and I'll stop the emails and check in next season.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
630
+ },
631
+ {
632
+ "ref": "email.w_email_1",
633
+ "name": "Win-back 1 - One Question",
634
+ "subject": "One question, {{contact.first_name}}",
635
+ "templateRef": "email_template.w_email_1",
636
+ "mergeTags": [
637
+ "contact.first_name",
638
+ "custom_values.business_name",
639
+ "custom_values.owner_first_name",
640
+ "custom_values.business_phone"
641
+ ],
642
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">A while back you asked {{custom_values.business_name}} about a free skin assessment, and then life got busy. That's normal.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, price, nerves, or something we said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something we can fix, I'll fix it. If it's not the right time, I'll leave you alone until it is.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
643
+ },
644
+ {
645
+ "ref": "email.w_email_2",
646
+ "name": "Win-back 2 - What Changed",
647
+ "subject": "What's changed since you last looked",
648
+ "templateRef": "email_template.w_email_2",
649
+ "mergeTags": [
650
+ "contact.first_name",
651
+ "custom_values.business_name",
652
+ "custom_values.booking_link",
653
+ "custom_values.owner_first_name",
654
+ "custom_values.business_phone"
655
+ ],
656
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Since you first reached out, a couple of things have changed at {{custom_values.business_name}}: new openings on the calendar, and a written plan that now includes a monthly option for people who want to spread the cost.</p><p style=\"margin:0 0 14px;\">What hasn't changed: the assessment is still free, still 30 minutes, and still ends with a plan you take home instead of a decision in the chair.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">See the calendar</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
106
657
  },
107
658
  {
108
- "ref": "email.nurture_1",
109
- "name": "Nurture / Education",
110
- "subject": "The difference between refreshed and overdone",
111
- "body": "Hi {{contact.first_name}},\n\nThe most common worry we hear is simple: nobody wants to look done. The good news is that natural results are a matter of technique and restraint, not luck.\n\nAt your free assessment we look at your face as a whole, explain your options in plain language, and only recommend what actually moves your goals. You leave with a plan, whether or not you treat that day.\n\nWhen you are ready, your assessment is here:\n\n{{custom_values.booking_link}}\n\nWarmly,\nThe Glow Aesthetics Team",
112
- "mergeTags": ["contact.first_name"]
659
+ "ref": "email.w_email_3",
660
+ "name": "Win-back 3 - The Door Stays Open",
661
+ "subject": "The door stays open",
662
+ "templateRef": "email_template.w_email_3",
663
+ "mergeTags": [
664
+ "contact.first_name",
665
+ "custom_values.booking_link",
666
+ "custom_values.owner_first_name",
667
+ "custom_values.business_name",
668
+ "custom_values.business_phone"
669
+ ],
670
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">This is the last automatic email you'll get from me. I'd rather you hear from a person when the time is right than from a sequence.</p><p style=\"margin:0 0 14px;\">So here's the deal: your free assessment doesn't expire. When you're ready, the link below works, and so does replying to this email.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book when you're ready</a></p><p style=\"margin:0 0 14px;\">Thank you for considering us. Take care of that skin in the meantime: sunscreen every morning, no exceptions.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
113
671
  },
114
672
  {
115
- "ref": "email.consult_reminder",
116
- "name": "Pre-Consult Reminder",
117
- "subject": "Your Glow Aesthetics consult is coming up",
118
- "body": "Hi {{contact.first_name}},\n\nLooking forward to seeing you for your consult. A few quick notes so we make the most of your time:\n\n- Come with a clean face if you can, no makeup is needed.\n- Bring any questions about injectables, filler, or facials.\n- Plan for about 30 minutes.\n\nNeed to change your time? Reply to this email or use your booking link:\n\n{{custom_values.booking_link}}\n\nSee you soon,\nThe Glow Aesthetics Team",
119
- "mergeTags": ["contact.first_name"]
673
+ "ref": "email.appt_confirm_email",
674
+ "name": "Consult Confirmed",
675
+ "subject": "Confirmed, {{contact.first_name}}: your consult details",
676
+ "templateRef": "email_template.appt_confirm_email",
677
+ "mergeTags": [
678
+ "contact.first_name",
679
+ "custom_values.business_name",
680
+ "appointment.start_time",
681
+ "custom_values.booking_link",
682
+ "custom_values.owner_first_name",
683
+ "custom_values.business_phone"
684
+ ],
685
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your consult at {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><p style=\"margin:0 0 14px;\">What to bring: nothing but your questions. Come with a clean face if you can (no makeup needed) and plan for about 30 minutes.</p><p style=\"margin:0 0 14px;\">What you'll leave with: a written plan with options and prices. No obligation to treat that day.</p><p style=\"margin:0 0 14px;\">Need to move it? Use your booking link: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">reschedule</a>, or reply to this email.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
120
686
  },
121
687
  {
122
- "ref": "email.no_show",
123
- "name": "No-Show Re-offer",
124
- "subject": "We missed you, let us get you rebooked",
125
- "body": "Hi {{contact.first_name}},\n\nWe had you down for a consult and you did not make it, which is completely okay. Life happens.\n\nYour free assessment is still open. Grab a new time whenever it suits you:\n\n{{custom_values.booking_link}}\n\nIf there is anything we can answer first, just reply.\n\nWarmly,\nThe Glow Aesthetics Team",
126
- "mergeTags": ["contact.first_name"]
688
+ "ref": "email.appt_prep_email",
689
+ "name": "Consult Prep (day before)",
690
+ "subject": "Tomorrow: 3 things that make your consult better",
691
+ "templateRef": "email_template.appt_prep_email",
692
+ "mergeTags": [
693
+ "contact.first_name",
694
+ "appointment.start_time",
695
+ "custom_values.business_phone",
696
+ "custom_values.owner_first_name",
697
+ "custom_values.business_name"
698
+ ],
699
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">See you tomorrow at {{appointment.start_time}}. Three small things that make the visit more useful:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Skip makeup if you can. We read skin better bare.</li><li style=\"margin:0 0 6px;\">Bring a photo of yourself from a few years ago. It shows us what \"refreshed\" means to you.</li><li style=\"margin:0 0 6px;\">Write down the one thing you'd change first. We'll start there.</li></ul><p style=\"margin:0 0 14px;\">Running late or need to move it? Reply to this email or call {{custom_values.business_phone}}.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
127
700
  },
128
701
  {
129
- "ref": "email.winback",
130
- "name": "Win-back",
131
- "subject": "It has been a while, {{contact.first_name}}",
132
- "body": "Hi {{contact.first_name}},\n\nIt has been a little while since we connected about your skin goals. If looking refreshed for the season is on your mind, now is a good time.\n\nYour complimentary assessment is still available, and our calendar fills up fast this time of year:\n\n{{custom_values.booking_link}}\n\nWarmly,\nThe Glow Aesthetics Team",
133
- "mergeTags": ["contact.first_name"]
702
+ "ref": "email.ns_email_1",
703
+ "name": "No-Show 1 - We Missed You",
704
+ "subject": "We missed you, {{contact.first_name}} (no guilt)",
705
+ "templateRef": "email_template.ns_email_1",
706
+ "mergeTags": [
707
+ "contact.first_name",
708
+ "custom_values.booking_link",
709
+ "custom_values.owner_first_name",
710
+ "custom_values.business_name",
711
+ "custom_values.business_phone"
712
+ ],
713
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">We had you down for a consult today and it didn't work out. Life happens; nobody here is bothered.</p><p style=\"margin:0 0 14px;\">Your free assessment is still yours. Pick a new time whenever it suits, and if something about the visit put you off, reply and tell me. I'd rather know.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Rebook my assessment</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
714
+ },
715
+ {
716
+ "ref": "email.ns_email_2",
717
+ "name": "No-Show 2 - Still Want This?",
718
+ "subject": "Still want to do this?",
719
+ "templateRef": "email_template.ns_email_2",
720
+ "mergeTags": [
721
+ "contact.first_name",
722
+ "custom_values.booking_link",
723
+ "custom_values.business_name",
724
+ "custom_values.owner_first_name",
725
+ "custom_values.business_phone"
726
+ ],
727
+ "body": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Quick and honest: if the timing is wrong, say so and I'll check back in a few months. If it's still something you want, the calendar is open and the visit is still free.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick a new time</a></p><p style=\"margin:0 0 14px;\">Either way, thanks for considering {{custom_values.business_name}}.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
134
728
  }
135
729
  ],
136
730
  "sms": [
137
731
  {
138
- "ref": "sms.speed_to_lead",
139
- "name": "Speed-to-lead text",
140
- "body": "Hi {{contact.first_name}}, it's Glow Aesthetics. Thanks for requesting your free skin assessment. Want me to hold a consult time for you? Reply STOP to opt out.",
141
- "mergeTags": ["contact.first_name"]
732
+ "ref": "sms.stl_sms_1",
733
+ "name": "Speed to Lead - Instant Text",
734
+ "templateRef": "sms_template.stl_sms_1",
735
+ "mergeTags": [
736
+ "contact.first_name",
737
+ "custom_values.owner_first_name",
738
+ "custom_values.business_name"
739
+ ],
740
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Your free skin assessment request is in. What's the one thing you'd most like to change? Reply STOP to opt out."
741
+ },
742
+ {
743
+ "ref": "sms.stl_sms_2",
744
+ "name": "Speed to Lead - 20 Minute Text",
745
+ "templateRef": "sms_template.stl_sms_2",
746
+ "mergeTags": [
747
+ "contact.first_name",
748
+ "custom_values.booking_link"
749
+ ],
750
+ "body": "{{contact.first_name}}, I can hold a 30-min assessment time for you this week. Mornings or afternoons? Or grab one here: {{custom_values.booking_link}}"
751
+ },
752
+ {
753
+ "ref": "sms.stl_sms_3",
754
+ "name": "Speed to Lead - Next Day Text",
755
+ "templateRef": "sms_template.stl_sms_3",
756
+ "mergeTags": [
757
+ "contact.first_name",
758
+ "custom_values.owner_first_name"
759
+ ],
760
+ "body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} again. Not chasing, I just don't want your question to fall through the cracks. Still want to find a time, or is it a \"not now\"?"
761
+ },
762
+ {
763
+ "ref": "sms.mc_sms_1",
764
+ "name": "Missed Call - Instant Text-Back",
765
+ "templateRef": "sms_template.mc_sms_1",
766
+ "mergeTags": [
767
+ "custom_values.business_name"
768
+ ],
769
+ "body": "Hi, it's {{custom_values.business_name}}. Sorry we missed your call. How can we help? Reply here and a real person will answer. Reply STOP to opt out."
770
+ },
771
+ {
772
+ "ref": "sms.mc_sms_2",
773
+ "name": "Missed Call - 1 Hour Text",
774
+ "templateRef": "sms_template.mc_sms_2",
775
+ "mergeTags": [
776
+ "custom_values.booking_link",
777
+ "custom_values.business_name",
778
+ "custom_values.business_phone"
779
+ ],
780
+ "body": "Still need us? Reply with a good time to call you back, or book directly: {{custom_values.booking_link}}. {{custom_values.business_name}}, {{custom_values.business_phone}}"
781
+ },
782
+ {
783
+ "ref": "sms.n_sms_1",
784
+ "name": "Nurture Text 1 - One Word",
785
+ "templateRef": "sms_template.n_sms_1",
786
+ "mergeTags": [
787
+ "contact.first_name",
788
+ "custom_values.owner_first_name",
789
+ "custom_values.business_name"
790
+ ],
791
+ "body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough. Reply STOP to opt out."
792
+ },
793
+ {
794
+ "ref": "sms.n_sms_2",
795
+ "name": "Nurture Text 2 - Free Tip",
796
+ "templateRef": "sms_template.n_sms_2",
797
+ "mergeTags": [
798
+ "custom_values.business_name"
799
+ ],
800
+ "body": "Tip from {{custom_values.business_name}}: sunscreen every morning does more for fine lines than any single treatment, and it makes every treatment last longer. Want the short list of what else works? Reply YES."
801
+ },
802
+ {
803
+ "ref": "sms.n_sms_3",
804
+ "name": "Nurture Text 3 - Midpoint",
805
+ "templateRef": "sms_template.n_sms_3",
806
+ "mergeTags": [
807
+ "contact.first_name",
808
+ "custom_values.owner_first_name"
809
+ ],
810
+ "body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about your skin plan? I have a couple of openings this week. Want one, or should I check back next month?"
811
+ },
812
+ {
813
+ "ref": "sms.n_sms_4",
814
+ "name": "Nurture Text 4 - Any Question",
815
+ "templateRef": "sms_template.n_sms_4",
816
+ "mergeTags": [
817
+ "contact.first_name",
818
+ "custom_values.owner_first_name"
819
+ ],
820
+ "body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you ever get your question answered? If not, ask it here and I'll reply personally."
821
+ },
822
+ {
823
+ "ref": "sms.n_sms_5",
824
+ "name": "Nurture Text 5 - Last Direct Ask",
825
+ "templateRef": "sms_template.n_sms_5",
826
+ "mergeTags": [
827
+ "contact.first_name",
828
+ "custom_values.business_name"
829
+ ],
830
+ "body": "{{contact.first_name}}, last one from me at {{custom_values.business_name}}. If you want your skin plan this month, reply YES and I'll send two times. If not, no hard feelings. Reply STOP to opt out."
831
+ },
832
+ {
833
+ "ref": "sms.w_sms_1",
834
+ "name": "Win-back Text 1",
835
+ "templateRef": "sms_template.w_sms_1",
836
+ "mergeTags": [
837
+ "contact.first_name",
838
+ "custom_values.owner_first_name",
839
+ "custom_values.business_name"
840
+ ],
841
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now? Reply STOP to opt out."
842
+ },
843
+ {
844
+ "ref": "sms.w_sms_2",
845
+ "name": "Win-back Text 2",
846
+ "templateRef": "sms_template.w_sms_2",
847
+ "mergeTags": [
848
+ "contact.first_name",
849
+ "custom_values.business_name"
850
+ ],
851
+ "body": "{{contact.first_name}}, two openings came up this week at {{custom_values.business_name}}. Want one for your free assessment? Reply YES and I'll hold it."
852
+ },
853
+ {
854
+ "ref": "sms.appt_confirm_sms",
855
+ "name": "Consult Confirmed Text",
856
+ "templateRef": "sms_template.appt_confirm_sms",
857
+ "mergeTags": [
858
+ "contact.first_name",
859
+ "custom_values.business_name",
860
+ "appointment.start_time"
861
+ ],
862
+ "body": "{{contact.first_name}}, you're confirmed at {{custom_values.business_name}} for {{appointment.start_time}}. Need to change it? Reply here. Reply STOP to opt out."
863
+ },
864
+ {
865
+ "ref": "sms.appt_24h_sms",
866
+ "name": "Consult Reminder - 24 Hours",
867
+ "templateRef": "sms_template.appt_24h_sms",
868
+ "mergeTags": [
869
+ "custom_values.business_name",
870
+ "appointment.start_time"
871
+ ],
872
+ "body": "Reminder: your consult at {{custom_values.business_name}} is tomorrow at {{appointment.start_time}}. Reply C to confirm or R to reschedule."
873
+ },
874
+ {
875
+ "ref": "sms.appt_2h_sms",
876
+ "name": "Consult Reminder - 2 Hours",
877
+ "templateRef": "sms_template.appt_2h_sms",
878
+ "mergeTags": [
879
+ "contact.first_name",
880
+ "custom_values.business_name",
881
+ "appointment.start_time"
882
+ ],
883
+ "body": "See you in about 2 hours, {{contact.first_name}}. {{custom_values.business_name}}, {{appointment.start_time}}. Reply here if you're running late."
142
884
  },
143
885
  {
144
- "ref": "sms.consult_reminder",
145
- "name": "Consult reminder text",
146
- "body": "Hi {{contact.first_name}}, a quick reminder about your Glow Aesthetics consult tomorrow. Reply here if you need to change the time. Reply STOP to opt out.",
147
- "mergeTags": ["contact.first_name"]
886
+ "ref": "sms.ns_sms_1",
887
+ "name": "No-Show Text 1",
888
+ "templateRef": "sms_template.ns_sms_1",
889
+ "mergeTags": [
890
+ "contact.first_name",
891
+ "custom_values.business_name"
892
+ ],
893
+ "body": "Hi {{contact.first_name}}, we missed you today at {{custom_values.business_name}}. No problem at all. Want me to find you a new time this week? Reply YES. Reply STOP to opt out."
148
894
  },
149
895
  {
150
- "ref": "sms.no_show",
151
- "name": "No-show rebook text",
152
- "body": "Hi {{contact.first_name}}, we missed you at Glow Aesthetics today. Your free assessment is still open, want a new time? Reply STOP to opt out.",
153
- "mergeTags": ["contact.first_name"]
896
+ "ref": "sms.ns_sms_2",
897
+ "name": "No-Show Text 2",
898
+ "templateRef": "sms_template.ns_sms_2",
899
+ "mergeTags": [
900
+ "contact.first_name",
901
+ "custom_values.owner_first_name"
902
+ ],
903
+ "body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. I kept a couple of consult times open for you this week. Want one? Reply with a day that works."
154
904
  }
155
905
  ],
156
906
  "workflows": [
157
907
  {
158
908
  "ref": "workflow.speed_to_lead",
159
909
  "name": "Speed to Lead",
160
- "trigger": { "type": "form_submission", "formRef": "form.intake" },
910
+ "trigger": {
911
+ "type": "form_submission",
912
+ "formRef": "form.intake"
913
+ },
914
+ "stopOnResponse": true,
915
+ "actions": [
916
+ {
917
+ "type": "add_contact_tag",
918
+ "tagRef": "tag.lc_new_lead"
919
+ },
920
+ {
921
+ "type": "create_opportunity",
922
+ "pipelineRef": "pipeline.patient_journey",
923
+ "stageRef": "stage.new_lead",
924
+ "name": "{{contact.name}} - New Lead"
925
+ },
926
+ {
927
+ "type": "assign_user",
928
+ "userRef": "user.dana_reyes"
929
+ },
930
+ {
931
+ "type": "send_sms",
932
+ "smsRef": "sms.stl_sms_1"
933
+ },
934
+ {
935
+ "type": "send_email",
936
+ "emailRef": "email.stl_email_1"
937
+ },
938
+ {
939
+ "type": "internal_notification",
940
+ "userRef": "user.dana_reyes",
941
+ "title": "New lead: {{contact.first_name}} {{contact.last_name}}",
942
+ "body": "{{contact.first_name}} just came in from the inquiry form. Phone {{contact.phone}}. Call within 5 minutes; the first text and email already went out."
943
+ },
944
+ {
945
+ "type": "task_notification",
946
+ "userRef": "user.dana_reyes",
947
+ "title": "Call {{contact.first_name}} now (new lead)",
948
+ "body": "Speed-to-lead call. {{contact.first_name}} {{contact.last_name}}, {{contact.phone}}, {{contact.email}}. Goal: one question about what they need, then hold a time. Log the outcome in the contact notes.",
949
+ "dueDate": "1"
950
+ },
951
+ {
952
+ "type": "wait",
953
+ "value": 20,
954
+ "unit": "minutes"
955
+ },
956
+ {
957
+ "type": "send_sms",
958
+ "smsRef": "sms.stl_sms_2"
959
+ },
960
+ {
961
+ "type": "wait",
962
+ "value": 3,
963
+ "unit": "hours"
964
+ },
965
+ {
966
+ "type": "send_email",
967
+ "emailRef": "email.stl_email_2"
968
+ },
969
+ {
970
+ "type": "wait",
971
+ "value": 1,
972
+ "unit": "days"
973
+ },
974
+ {
975
+ "type": "send_sms",
976
+ "smsRef": "sms.stl_sms_3"
977
+ },
978
+ {
979
+ "type": "add_notes",
980
+ "body": "Speed to Lead finished with no reply (5 touches over 24 hours). Handed off to Lead Nurture (30 days) by the nurture-start tag."
981
+ },
982
+ {
983
+ "type": "add_contact_tag",
984
+ "tagRef": "tag.nurture_start"
985
+ }
986
+ ]
987
+ },
988
+ {
989
+ "ref": "workflow.missed_call",
990
+ "name": "Missed Call Text-Back",
991
+ "trigger": {
992
+ "type": "call_status",
993
+ "callStatuses": [
994
+ "no-answer",
995
+ "busy",
996
+ "voicemail"
997
+ ],
998
+ "callDirection": "inbound"
999
+ },
161
1000
  "stopOnResponse": true,
162
1001
  "actions": [
163
- { "type": "add_contact_tag", "tagRef": "tag.lc_new_lead" },
164
- { "type": "create_opportunity", "pipelineRef": "pipeline.patient_journey", "stageRef": "stage.new_lead", "name": "{{contact.name}} - New Lead" },
165
- { "type": "send_email", "emailRef": "email.welcome_1" },
166
- { "type": "internal_notification", "to": "REPLACEwithGetUsersId", "title": "New lead", "body": "New inquiry from {{contact.first_name}} {{contact.last_name}}" },
167
- { "type": "wait", "value": 5, "unit": "minutes" },
168
- { "type": "send_sms", "smsRef": "sms.speed_to_lead" }
1002
+ {
1003
+ "type": "send_sms",
1004
+ "smsRef": "sms.mc_sms_1"
1005
+ },
1006
+ {
1007
+ "type": "add_contact_tag",
1008
+ "tagRef": "tag.missed_call"
1009
+ },
1010
+ {
1011
+ "type": "add_contact_tag",
1012
+ "tagRef": "tag.source_phone"
1013
+ },
1014
+ {
1015
+ "type": "internal_notification",
1016
+ "userRef": "user.dana_reyes",
1017
+ "title": "Missed call: {{contact.first_name}} {{contact.phone}}",
1018
+ "body": "An inbound call from {{contact.phone}} was not answered. A text-back already went out. Call back as soon as you can."
1019
+ },
1020
+ {
1021
+ "type": "task_notification",
1022
+ "userRef": "user.dana_reyes",
1023
+ "title": "Call back {{contact.first_name}} (missed call)",
1024
+ "body": "Missed inbound call from {{contact.phone}}. The text-back asked what they need; check the conversation first, then call.",
1025
+ "dueDate": "1"
1026
+ },
1027
+ {
1028
+ "type": "wait",
1029
+ "value": 1,
1030
+ "unit": "hours"
1031
+ },
1032
+ {
1033
+ "type": "send_sms",
1034
+ "smsRef": "sms.mc_sms_2"
1035
+ }
169
1036
  ]
170
1037
  },
171
1038
  {
172
1039
  "ref": "workflow.lead_nurture",
173
- "name": "Lead Nurture",
174
- "trigger": { "type": "contact_tag", "tagRef": "tag.lc_new_lead" },
1040
+ "name": "Lead Nurture (30 days)",
1041
+ "trigger": {
1042
+ "type": "contact_tag",
1043
+ "tagRef": "tag.nurture_start"
1044
+ },
175
1045
  "stopOnResponse": true,
176
1046
  "actions": [
177
- { "type": "wait", "value": 1, "unit": "days" },
178
- { "type": "send_email", "emailRef": "email.nurture_1" },
179
- { "type": "wait", "value": 3, "unit": "days" },
180
- { "type": "add_contact_tag", "tagRef": "tag.lc_lapsed" }
1047
+ {
1048
+ "type": "remove_contact_tag",
1049
+ "tagRef": "tag.nurture_start"
1050
+ },
1051
+ {
1052
+ "type": "add_contact_tag",
1053
+ "tagRef": "tag.lc_nurturing"
1054
+ },
1055
+ {
1056
+ "type": "wait",
1057
+ "value": 1,
1058
+ "unit": "days"
1059
+ },
1060
+ {
1061
+ "type": "send_email",
1062
+ "emailRef": "email.n_email_1"
1063
+ },
1064
+ {
1065
+ "type": "wait",
1066
+ "value": 2,
1067
+ "unit": "days"
1068
+ },
1069
+ {
1070
+ "type": "send_sms",
1071
+ "smsRef": "sms.n_sms_1"
1072
+ },
1073
+ {
1074
+ "type": "wait",
1075
+ "value": 2,
1076
+ "unit": "days"
1077
+ },
1078
+ {
1079
+ "type": "send_email",
1080
+ "emailRef": "email.n_email_2"
1081
+ },
1082
+ {
1083
+ "type": "wait",
1084
+ "value": 3,
1085
+ "unit": "days"
1086
+ },
1087
+ {
1088
+ "type": "send_sms",
1089
+ "smsRef": "sms.n_sms_2"
1090
+ },
1091
+ {
1092
+ "type": "wait",
1093
+ "value": 2,
1094
+ "unit": "days"
1095
+ },
1096
+ {
1097
+ "type": "send_email",
1098
+ "emailRef": "email.n_email_3"
1099
+ },
1100
+ {
1101
+ "type": "wait",
1102
+ "value": 4,
1103
+ "unit": "days"
1104
+ },
1105
+ {
1106
+ "type": "send_email",
1107
+ "emailRef": "email.n_email_4"
1108
+ },
1109
+ {
1110
+ "type": "wait",
1111
+ "value": 1,
1112
+ "unit": "days"
1113
+ },
1114
+ {
1115
+ "type": "send_sms",
1116
+ "smsRef": "sms.n_sms_3"
1117
+ },
1118
+ {
1119
+ "type": "wait",
1120
+ "value": 5,
1121
+ "unit": "days"
1122
+ },
1123
+ {
1124
+ "type": "send_email",
1125
+ "emailRef": "email.n_email_5"
1126
+ },
1127
+ {
1128
+ "type": "wait",
1129
+ "value": 3,
1130
+ "unit": "days"
1131
+ },
1132
+ {
1133
+ "type": "send_sms",
1134
+ "smsRef": "sms.n_sms_4"
1135
+ },
1136
+ {
1137
+ "type": "wait",
1138
+ "value": 4,
1139
+ "unit": "days"
1140
+ },
1141
+ {
1142
+ "type": "send_email",
1143
+ "emailRef": "email.n_email_6"
1144
+ },
1145
+ {
1146
+ "type": "wait",
1147
+ "value": 3,
1148
+ "unit": "days"
1149
+ },
1150
+ {
1151
+ "type": "send_sms",
1152
+ "smsRef": "sms.n_sms_5"
1153
+ },
1154
+ {
1155
+ "type": "wait",
1156
+ "value": 1,
1157
+ "unit": "days"
1158
+ },
1159
+ {
1160
+ "type": "add_notes",
1161
+ "body": "Lead Nurture (30 days) finished with no reply: 11 touches over 31 days. Tagged lapsed; Win-back starts from the winback-start tag."
1162
+ },
1163
+ {
1164
+ "type": "add_contact_tag",
1165
+ "tagRef": "tag.lc_lapsed"
1166
+ },
1167
+ {
1168
+ "type": "add_contact_tag",
1169
+ "tagRef": "tag.winback_start"
1170
+ }
181
1171
  ]
182
1172
  },
183
1173
  {
184
1174
  "ref": "workflow.reply_route",
185
- "name": "Replied - Stop and Route",
186
- "trigger": { "type": "customer_reply" },
1175
+ "name": "Replied - Stop & Route",
1176
+ "trigger": {
1177
+ "type": "customer_reply"
1178
+ },
1179
+ "stopOnResponse": false,
1180
+ "actions": [
1181
+ {
1182
+ "type": "remove_from_workflow",
1183
+ "workflowRef": "workflow.speed_to_lead"
1184
+ },
1185
+ {
1186
+ "type": "remove_from_workflow",
1187
+ "workflowRef": "workflow.missed_call"
1188
+ },
1189
+ {
1190
+ "type": "remove_from_workflow",
1191
+ "workflowRef": "workflow.lead_nurture"
1192
+ },
1193
+ {
1194
+ "type": "remove_from_workflow",
1195
+ "workflowRef": "workflow.win_back"
1196
+ },
1197
+ {
1198
+ "type": "remove_from_workflow",
1199
+ "workflowRef": "workflow.no_show"
1200
+ },
1201
+ {
1202
+ "type": "add_notes",
1203
+ "body": "Contact replied. Removed from Speed to Lead, Missed Call Text-Back, Lead Nurture, Win-back and No-Show Rescue. A human owns the conversation from here."
1204
+ },
1205
+ {
1206
+ "type": "add_contact_tag",
1207
+ "tagRef": "tag.lc_contacted"
1208
+ },
1209
+ {
1210
+ "type": "internal_notification",
1211
+ "userRef": "user.dana_reyes",
1212
+ "title": "{{contact.first_name}} replied",
1213
+ "body": "{{contact.first_name}} {{contact.last_name}} replied. All automated sequences stopped. Answer within 15 minutes: {{contact.phone}}"
1214
+ },
1215
+ {
1216
+ "type": "task_notification",
1217
+ "userRef": "user.dana_reyes",
1218
+ "title": "Reply to {{contact.first_name}} (15-minute target)",
1219
+ "body": "They replied to a message. Read the conversation, answer the question they asked, and offer one concrete time.",
1220
+ "dueDate": "1"
1221
+ }
1222
+ ]
1223
+ },
1224
+ {
1225
+ "ref": "workflow.win_back",
1226
+ "name": "Win-back (30 days)",
1227
+ "trigger": {
1228
+ "type": "contact_tag",
1229
+ "tagRef": "tag.winback_start"
1230
+ },
1231
+ "stopOnResponse": true,
1232
+ "actions": [
1233
+ {
1234
+ "type": "remove_contact_tag",
1235
+ "tagRef": "tag.winback_start"
1236
+ },
1237
+ {
1238
+ "type": "send_email",
1239
+ "emailRef": "email.w_email_1"
1240
+ },
1241
+ {
1242
+ "type": "wait",
1243
+ "value": 7,
1244
+ "unit": "days"
1245
+ },
1246
+ {
1247
+ "type": "send_sms",
1248
+ "smsRef": "sms.w_sms_1"
1249
+ },
1250
+ {
1251
+ "type": "wait",
1252
+ "value": 7,
1253
+ "unit": "days"
1254
+ },
1255
+ {
1256
+ "type": "send_email",
1257
+ "emailRef": "email.w_email_2"
1258
+ },
1259
+ {
1260
+ "type": "wait",
1261
+ "value": 8,
1262
+ "unit": "days"
1263
+ },
1264
+ {
1265
+ "type": "send_sms",
1266
+ "smsRef": "sms.w_sms_2"
1267
+ },
1268
+ {
1269
+ "type": "wait",
1270
+ "value": 8,
1271
+ "unit": "days"
1272
+ },
1273
+ {
1274
+ "type": "send_email",
1275
+ "emailRef": "email.w_email_3"
1276
+ },
1277
+ {
1278
+ "type": "wait",
1279
+ "value": 1,
1280
+ "unit": "days"
1281
+ },
1282
+ {
1283
+ "type": "add_notes",
1284
+ "body": "Win-back finished with no reply: 5 touches over 31 days. Tagged lost. The contact stays in the database for future campaigns; nothing else sends automatically."
1285
+ },
1286
+ {
1287
+ "type": "add_contact_tag",
1288
+ "tagRef": "tag.lc_lost"
1289
+ }
1290
+ ]
1291
+ },
1292
+ {
1293
+ "ref": "workflow.appointment_booked",
1294
+ "name": "Consult Booked - Confirm & Move",
1295
+ "trigger": {
1296
+ "type": "appointment",
1297
+ "appointmentStatus": "confirmed",
1298
+ "calendarRef": "calendar.consult"
1299
+ },
187
1300
  "stopOnResponse": false,
188
1301
  "actions": [
189
- { "type": "remove_from_workflow", "workflowRef": "workflow.lead_nurture" },
190
- { "type": "add_contact_tag", "tagRef": "tag.lc_contacted" },
191
- { "type": "internal_notification", "to": "REPLACEwithGetUsersId", "title": "Lead replied", "body": "{{contact.first_name}} replied, follow up" }
1302
+ {
1303
+ "type": "remove_from_workflow",
1304
+ "workflowRef": "workflow.speed_to_lead"
1305
+ },
1306
+ {
1307
+ "type": "remove_from_workflow",
1308
+ "workflowRef": "workflow.lead_nurture"
1309
+ },
1310
+ {
1311
+ "type": "remove_from_workflow",
1312
+ "workflowRef": "workflow.win_back"
1313
+ },
1314
+ {
1315
+ "type": "add_contact_tag",
1316
+ "tagRef": "tag.lc_booked"
1317
+ },
1318
+ {
1319
+ "type": "internal_notification",
1320
+ "userRef": "user.dana_reyes",
1321
+ "title": "Consult booked: {{contact.first_name}}",
1322
+ "body": "{{contact.first_name}} {{contact.last_name}} booked a consult for {{appointment.start_time}}. Confirmation sent."
1323
+ },
1324
+ {
1325
+ "type": "send_email",
1326
+ "emailRef": "email.appt_confirm_email"
1327
+ },
1328
+ {
1329
+ "type": "send_sms",
1330
+ "smsRef": "sms.appt_confirm_sms"
1331
+ },
1332
+ {
1333
+ "type": "find_opportunity",
1334
+ "pipelineRef": "pipeline.patient_journey",
1335
+ "found": [
1336
+ {
1337
+ "type": "update_opportunity",
1338
+ "pipelineRef": "pipeline.patient_journey",
1339
+ "stageRef": "stage.consult_booked"
1340
+ }
1341
+ ],
1342
+ "notFound": [
1343
+ {
1344
+ "type": "create_opportunity",
1345
+ "pipelineRef": "pipeline.patient_journey",
1346
+ "stageRef": "stage.consult_booked",
1347
+ "name": "{{contact.name}} - Consult Booked"
1348
+ }
1349
+ ]
1350
+ }
192
1351
  ]
193
1352
  },
194
1353
  {
195
- "ref": "workflow.onboarding",
196
- "name": "New Patient Onboarding",
197
- "trigger": { "type": "appointment", "appointmentStatus": "confirmed", "calendarRef": "calendar.consult" },
1354
+ "ref": "workflow.appointment_reminders",
1355
+ "name": "Consult Reminders",
1356
+ "trigger": {
1357
+ "type": "appointment",
1358
+ "appointmentStatus": "confirmed",
1359
+ "calendarRef": "calendar.consult"
1360
+ },
198
1361
  "stopOnResponse": false,
199
1362
  "actions": [
200
- { "type": "remove_from_workflow", "workflowRef": "workflow.lead_nurture" },
201
- { "type": "add_contact_tag", "tagRef": "tag.lc_consult_booked" },
202
- { "type": "update_opportunity", "pipelineRef": "pipeline.patient_journey", "stageRef": "stage.consult_booked" },
203
- { "type": "send_email", "emailRef": "email.consult_reminder" },
204
- { "type": "wait_appointment", "value": 1, "unit": "days" },
205
- { "type": "send_sms", "smsRef": "sms.consult_reminder" }
1363
+ {
1364
+ "type": "wait_appointment",
1365
+ "value": 1,
1366
+ "unit": "days"
1367
+ },
1368
+ {
1369
+ "type": "send_sms",
1370
+ "smsRef": "sms.appt_24h_sms"
1371
+ },
1372
+ {
1373
+ "type": "send_email",
1374
+ "emailRef": "email.appt_prep_email"
1375
+ },
1376
+ {
1377
+ "type": "wait_appointment",
1378
+ "value": 2,
1379
+ "unit": "hours"
1380
+ },
1381
+ {
1382
+ "type": "send_sms",
1383
+ "smsRef": "sms.appt_2h_sms"
1384
+ }
206
1385
  ]
207
1386
  },
208
1387
  {
209
1388
  "ref": "workflow.no_show",
210
- "name": "No-Show Win-back",
211
- "trigger": { "type": "appointment", "appointmentStatus": "noshow", "calendarRef": "calendar.consult" },
1389
+ "name": "No-Show Rescue",
1390
+ "trigger": {
1391
+ "type": "appointment",
1392
+ "appointmentStatus": "noshow",
1393
+ "calendarRef": "calendar.consult"
1394
+ },
212
1395
  "stopOnResponse": true,
213
1396
  "actions": [
214
- { "type": "add_contact_tag", "tagRef": "tag.lc_lapsed" },
215
- { "type": "internal_notification", "to": "REPLACEwithGetUsersId", "title": "No-show", "body": "{{contact.first_name}} missed their consult" },
216
- { "type": "send_email", "emailRef": "email.no_show" },
1397
+ {
1398
+ "type": "add_contact_tag",
1399
+ "tagRef": "tag.no_show"
1400
+ },
1401
+ {
1402
+ "type": "internal_notification",
1403
+ "userRef": "user.dana_reyes",
1404
+ "title": "No-show: {{contact.first_name}}",
1405
+ "body": "{{contact.first_name}} {{contact.last_name}} missed their consult. A rebook text and email went out. Call-back task created."
1406
+ },
1407
+ {
1408
+ "type": "task_notification",
1409
+ "userRef": "user.dana_reyes",
1410
+ "title": "Call {{contact.first_name}} (no-show)",
1411
+ "body": "Missed consult. Call, no guilt, offer two new times.",
1412
+ "dueDate": "1"
1413
+ },
1414
+ {
1415
+ "type": "send_sms",
1416
+ "smsRef": "sms.ns_sms_1"
1417
+ },
1418
+ {
1419
+ "type": "send_email",
1420
+ "emailRef": "email.ns_email_1"
1421
+ },
1422
+ {
1423
+ "type": "wait",
1424
+ "value": 1,
1425
+ "unit": "days"
1426
+ },
1427
+ {
1428
+ "type": "send_sms",
1429
+ "smsRef": "sms.ns_sms_2"
1430
+ },
1431
+ {
1432
+ "type": "wait",
1433
+ "value": 3,
1434
+ "unit": "days"
1435
+ },
1436
+ {
1437
+ "type": "send_email",
1438
+ "emailRef": "email.ns_email_2"
1439
+ },
1440
+ {
1441
+ "type": "wait",
1442
+ "value": 3,
1443
+ "unit": "days"
1444
+ },
1445
+ {
1446
+ "type": "add_notes",
1447
+ "body": "No-Show Rescue finished with no reply (4 touches over 7 days). Tagged lapsed; Win-back starts from the winback-start tag."
1448
+ },
1449
+ {
1450
+ "type": "add_contact_tag",
1451
+ "tagRef": "tag.lc_lapsed"
1452
+ },
1453
+ {
1454
+ "type": "add_contact_tag",
1455
+ "tagRef": "tag.winback_start"
1456
+ },
217
1457
  {
218
1458
  "type": "find_opportunity",
219
1459
  "pipelineRef": "pipeline.patient_journey",
220
1460
  "found": [
221
- { "type": "update_opportunity", "pipelineRef": "pipeline.patient_journey", "stageRef": "stage.contacted" },
222
- { "type": "send_sms", "smsRef": "sms.no_show" }
1461
+ {
1462
+ "type": "update_opportunity",
1463
+ "pipelineRef": "pipeline.patient_journey",
1464
+ "stageRef": "stage.contacted"
1465
+ }
223
1466
  ],
224
- "notFound": [
225
- { "type": "send_email", "emailRef": "email.winback" }
226
- ]
1467
+ "notFound": []
227
1468
  }
228
1469
  ]
229
1470
  }
230
1471
  ],
231
1472
  "handoffs": [
1473
+ {
1474
+ "ref": "handoff.phone_number",
1475
+ "owner": "OPERATOR-UI",
1476
+ "title": "Get a phone number in GoHighLevel (so texts and missed-call text-back can work)",
1477
+ "trigger": "channels.sms == true && channels.hasPhoneNumber != yes",
1478
+ "instruction": "Settings > Phone Numbers > Add Number: buy a local number for the business, then paste it into the business_phone custom value. Every text step and the missed-call text-back are built and wait for this; A2P registration (next) needs the number too.",
1479
+ "produces": "cv.business_phone",
1480
+ "successCheck": "A number shows under Phone Numbers and business_phone matches it",
1481
+ "blocks": [
1482
+ "workflow.speed_to_lead",
1483
+ "workflow.missed_call",
1484
+ "workflow.lead_nurture",
1485
+ "workflow.win_back",
1486
+ "workflow.appointment_booked",
1487
+ "workflow.appointment_reminders",
1488
+ "workflow.no_show"
1489
+ ]
1490
+ },
1491
+ {
1492
+ "ref": "handoff.business_details",
1493
+ "owner": "OPERATOR-UI",
1494
+ "title": "Confirm your business phone and the name messages are signed with",
1495
+ "trigger": "always (30 seconds)",
1496
+ "instruction": "Settings > Custom Values: set business_phone to the number customers should call or text back, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
1497
+ "produces": "cv.owner_first_name",
1498
+ "successCheck": "business_phone and owner_first_name show real values, not blanks",
1499
+ "blocks": [
1500
+ "cv.owner_first_name"
1501
+ ]
1502
+ },
232
1503
  {
233
1504
  "ref": "handoff.calendar_oauth",
234
1505
  "owner": "OPERATOR-UI",
235
1506
  "title": "Connect your calendar (Google / Outlook)",
236
1507
  "trigger": "goal.bookingNeeded == true && channels.calendarConnected == false",
237
- "instruction": "In the sub-account, open the Glow Aesthetics Consultation calendar > Connections and authorize your Google or Outlook account. This login can only be approved by you. Then copy the booking link into the Booking Link custom value.",
1508
+ "instruction": "Open the Consultation calendar > Connections and authorize your Google or Outlook account. This login can only be approved by you. Then copy the booking link into the booking_link custom value.",
238
1509
  "produces": "cv.booking_link",
239
1510
  "successCheck": "Calendar shows a connected external account and the booking link resolves",
240
- "blocks": ["cv.booking_link"]
1511
+ "blocks": [
1512
+ "cv.booking_link"
1513
+ ]
241
1514
  },
242
1515
  {
243
1516
  "ref": "handoff.a2p",
244
1517
  "owner": "OPERATOR-EXT",
245
1518
  "title": "Register A2P 10DLC (so texts can send)",
246
1519
  "trigger": "channels.sms == true",
247
- "instruction": "Submit your A2P brand and campaign through the GHL Trust Center / your carrier. The SMS steps are built but stay DRAFT and will not send until this is approved. Save your full submission package before submitting.",
1520
+ "instruction": "Submit your A2P brand and campaign through the GHL Trust Center / your carrier. Every text step is built but the SMS-bearing workflows stay DRAFT and will not send until this is approved (7-14 day review). Save your full submission package before submitting.",
248
1521
  "produces": null,
249
1522
  "successCheck": "A2P campaign status shows submitted or approved",
250
- "blocks": ["workflow.speed_to_lead", "workflow.onboarding", "workflow.no_show", "sms.speed_to_lead", "sms.consult_reminder", "sms.no_show"]
1523
+ "blocks": [
1524
+ "workflow.speed_to_lead",
1525
+ "workflow.missed_call",
1526
+ "workflow.lead_nurture",
1527
+ "workflow.win_back",
1528
+ "workflow.appointment_booked",
1529
+ "workflow.appointment_reminders",
1530
+ "workflow.no_show",
1531
+ "sms.stl_sms_1",
1532
+ "sms.stl_sms_2",
1533
+ "sms.stl_sms_3",
1534
+ "sms.mc_sms_1",
1535
+ "sms.mc_sms_2",
1536
+ "sms.n_sms_1",
1537
+ "sms.n_sms_2",
1538
+ "sms.n_sms_3",
1539
+ "sms.n_sms_4",
1540
+ "sms.n_sms_5",
1541
+ "sms.w_sms_1",
1542
+ "sms.w_sms_2",
1543
+ "sms.appt_confirm_sms",
1544
+ "sms.appt_24h_sms",
1545
+ "sms.appt_2h_sms",
1546
+ "sms.ns_sms_1",
1547
+ "sms.ns_sms_2"
1548
+ ]
251
1549
  },
252
1550
  {
253
1551
  "ref": "handoff.stripe",
@@ -260,6 +1558,20 @@
260
1558
  "blocks": []
261
1559
  }
262
1560
  ],
263
- "buildOrder": ["tag.*", "field.*", "cv.*", "pipeline.*", "calendar.*", "form.*", "funnel.*", "email.*", "sms.*", "workflow.*"],
1561
+ "buildOrder": [
1562
+ "user.*",
1563
+ "tag.*",
1564
+ "field.*",
1565
+ "cv.*",
1566
+ "pipeline.*",
1567
+ "calendar.*",
1568
+ "form.*",
1569
+ "funnel.*",
1570
+ "email.*",
1571
+ "sms.*",
1572
+ "email_template.*",
1573
+ "sms_template.*",
1574
+ "workflow.*"
1575
+ ],
264
1576
  "idMap": {}
265
1577
  }