@elitedcs/ghl-mcp 3.71.0 → 3.72.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -2
- package/README.md +4 -4
- package/dist/capture-helper.js +10 -1
- package/dist/index.js +8052 -2156
- package/guide/guide.html +2 -1
- package/package.json +5 -8
- package/skills/blueprint/SKILL.md +2 -0
- package/skills/blueprint/examples/medspa-approval-view.md +58 -53
- package/skills/blueprint/examples/medspa-brief.json +70 -8
- package/skills/blueprint/examples/medspa-build-plan.json +1435 -123
- package/skills/blueprint/examples/medspa-dry-run-report.md +3 -1
- package/skills/blueprint/examples/sample-approval-view.md +20 -61
- package/skills/blueprint/examples/sample-brief.json +95 -7
- package/skills/blueprint/examples/sample-build-plan.json +1448 -119
- package/skills/blueprint/examples/validate-plan.cjs +195 -13
- package/skills/blueprint/presets/clinic.md +60 -0
- package/skills/blueprint/presets/clinic.preset.json +1737 -0
- package/skills/blueprint/presets/coach.md +58 -0
- package/skills/blueprint/presets/coach.preset.json +1723 -0
- package/skills/blueprint/presets/ecommerce.md +54 -0
- package/skills/blueprint/presets/ecommerce.preset.json +1287 -0
- package/skills/blueprint/presets/generic-client.md +49 -27
- package/skills/blueprint/presets/generic-client.preset.json +1552 -122
- package/skills/blueprint/presets/local-service.md +58 -0
- package/skills/blueprint/presets/local-service.preset.json +1733 -0
- package/skills/blueprint/presets/med-spa.md +47 -48
- package/skills/blueprint/presets/med-spa.preset.json +1557 -111
- package/skills/blueprint/references/agency-os-detection.md +1 -1
- package/skills/blueprint/references/brief-schema.md +48 -1
- package/skills/blueprint/references/build-plan-schema.md +66 -5
- package/skills/blueprint/references/copy-guide.md +167 -0
- package/skills/blueprint/references/intake-question-set.md +64 -3
- package/skills/blueprint/references/preset-format.md +97 -51
- package/templates/action-schemas.json +12 -0
- package/templates/clinic-medspa.json +1 -1
- package/skills/blueprint/presets/clinic-launch-a2p.md +0 -39
- package/skills/blueprint/presets/clinic-launch-a2p.preset.json +0 -337
|
@@ -0,0 +1,1723 @@
|
|
|
1
|
+
{
|
|
2
|
+
"presetId": "coach",
|
|
3
|
+
"presetVersion": "2.0.0",
|
|
4
|
+
"schemaVersion": "0.1",
|
|
5
|
+
"title": "Coach / Consultant",
|
|
6
|
+
"description": "A coach / consultant client-acquisition system at v2 depth (1:1, group, course or hybrid programs sold from a discovery call or an application). Client Journey pipeline, program-interest / challenge / timeline fields, source + lifecycle + interest tags, a round-robin Discovery Call calendar, an A2P-compliant application form + funnel, 15 email + 17 SMS send-ready templates built on belief shifts rather than hype, and 8 workflows: Speed to Lead (15 actions, 5 touches in 24 h, then a hand-off), Missed Call Text-Back, Lead Nurture (31 days, 11 touches), Replied - Stop & Route, Win-back (31 days, 5 touches), Call Booked - Confirm & Move, Call Reminders, No-Show Rescue. No income or result claims unless the brief supplies real ones.",
|
|
7
|
+
"default": false,
|
|
8
|
+
"selectors": {
|
|
9
|
+
"businessTypes": [
|
|
10
|
+
"Coach / consultant",
|
|
11
|
+
"Coach",
|
|
12
|
+
"Consultant",
|
|
13
|
+
"Coaching",
|
|
14
|
+
"Consulting",
|
|
15
|
+
"Course creator"
|
|
16
|
+
],
|
|
17
|
+
"aliases": [
|
|
18
|
+
"coach",
|
|
19
|
+
"consultant",
|
|
20
|
+
"coaching",
|
|
21
|
+
"consulting",
|
|
22
|
+
"course"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"source": "Built from the intake industry pack \"coach\" (delivery_format, call_booking_flow) and the discovery-call sales pattern; v2 depth per the owner review of 2026-08-26.",
|
|
26
|
+
"conventions": {
|
|
27
|
+
"triggerTokens": "Use ONLY the executor's native trigger types so triggers auto-build: contact_tag (tagRef), form_submission (formRef), appointment (appointmentStatus: confirmed|noshow|...; calendarRef optional), customer_reply, pipeline_stage_updated (pipelineRef+stageRef), call_status (callStatuses + callDirection; the missed-call text-back), inbound_webhook, payment_received. Never tag_added / form_submitted / appointment_status / appointment_booked / contact_replied.",
|
|
28
|
+
"handoffTag": "Sequences hand off with add_contact_tag + a contact_tag trigger (nurture-start, winback-start), NOT add_to_workflow. Both halves of the tag hand-off are live-proven action shapes (the add-tag node and the tag trigger are captured from working GHL UI-built workflows in templates/action-schemas.json); add_to_workflow has no captured native shape in action-schemas.json and has not been proven at runtime, so a preset may not use it. Each sequence removes its own trigger tag as its first action so a later hand-off can fire it again.",
|
|
29
|
+
"nurtureSpan": "Lead Nurture waits sum to 31 days (owner rule: nothing under 30 days). Win-back waits sum to 31 days. Speed to Lead must end with the nurture-start hand-off tag. The validator rejects a /nurture/i workflow under 30 days of waits and a /speed/i workflow without a hand-off.",
|
|
30
|
+
"staff": "Every internal_notification, task_notification and assign_user carries userRef. In the skeleton the ref is the ROLE PLACEHOLDER user.owner; the fill step maps it per step from brief.team (notifyName for notifications, callsName for tasks and assignment, each calendar's staffNames for teamMemberRefs; \"the owner\" = the first admin). No staff in the brief → userRef: \"user.__pending__\" on every such step, the step is KEPT, the build reports it as waiting, and handoff.add_staff holds that workflow DRAFT. Never write a literal user id (the legacy `to` / `assignedTo`).",
|
|
31
|
+
"publishDefault": "Workflows build DRAFT. The skill PROMPTS the operator (publish now or leave DRAFT for review?) and only passes publishWorkflows:true on an explicit yes. Workflows gated by an unmet handoff never auto-publish.",
|
|
32
|
+
"a2pGating": "handoff.a2p.blocks MUST list each SMS-bearing WORKFLOW ref (not just sms.* assets); only an explicit workflow.* ref keeps a workflow DRAFT.",
|
|
33
|
+
"copy": "All copy lives in templates.* (email_template.* / sms_template.*) and is COMPLETE. The build stage rewrites every template from the real brief per references/copy-guide.md (five tests: Jab, Value equation, Says-who, Lock-screen, Thumb), in the tone of brief.voice.threeWords, with brief.voice.signatureLine verbatim in the instant email and text, keeps merge fields and the single CTA, and writes the result to the template AND the matching email/sms asset body. An email/sms asset with only copyDirection and no body reports needsContent and will not build.",
|
|
34
|
+
"fortyCap": "Max 40 actions per workflow (a find_opportunity branch counts head + 2 transitions + children). The longest workflow here is Lead Nurture at 28 actions, so no split is needed; if a rewrite adds touches past 40, split into \"(days 1-14)\" and \"(days 15-30)\" with a hand-off tag between them."
|
|
35
|
+
},
|
|
36
|
+
"skeleton": {
|
|
37
|
+
"users": {
|
|
38
|
+
"fillFrom": "team.staff",
|
|
39
|
+
"transform": "userList",
|
|
40
|
+
"default": [],
|
|
41
|
+
"_note": "One plan user per brief.team.staff[] entry: ref user.<slug of name>, firstName/lastName split from name, email verbatim, role admin for the owner / whoever runs the account, else user, phone from mobile. In this skeleton \"user.owner\" is a ROLE PLACEHOLDER, never a real user: the fill step resolves it per step — internal_notification → the user named by brief.team.notifyName; task_notification and assign_user → brief.team.callsName; calendars[].teamMemberRefs → that calendar's staffNames; \"the owner\" / \"me\" → the first admin. If the brief lists nobody, every userRef becomes the sentinel \"user.__pending__\" and the step is KEPT (the build reports it as waiting for a staff member; handoff.add_staff holds that workflow DRAFT)."
|
|
42
|
+
},
|
|
43
|
+
"pipelines": [
|
|
44
|
+
{
|
|
45
|
+
"ref": "pipeline.client_journey",
|
|
46
|
+
"name": "{{business.name}} Client Journey || Client Journey",
|
|
47
|
+
"stages": {
|
|
48
|
+
"fillFrom": "goal.salesStages",
|
|
49
|
+
"transform": "stageList",
|
|
50
|
+
"default": [
|
|
51
|
+
{
|
|
52
|
+
"ref": "stage.new_lead",
|
|
53
|
+
"name": "New Lead"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"ref": "stage.contacted",
|
|
57
|
+
"name": "Contacted"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"ref": "stage.call_booked",
|
|
61
|
+
"name": "Call Booked",
|
|
62
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"ref": "stage.call_held",
|
|
66
|
+
"name": "Call Held",
|
|
67
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"ref": "stage.offer_made",
|
|
71
|
+
"name": "Offer Made"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"ref": "stage.enrolled",
|
|
75
|
+
"name": "Enrolled"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"ref": "stage.alumni",
|
|
79
|
+
"name": "Alumni / Referral"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"ref": "stage.lost",
|
|
83
|
+
"name": "Lost"
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"customFields": [
|
|
90
|
+
{
|
|
91
|
+
"ref": "field.lead_source",
|
|
92
|
+
"name": "Lead Source",
|
|
93
|
+
"dataType": "SINGLE_OPTIONS",
|
|
94
|
+
"model": "contact",
|
|
95
|
+
"options": [
|
|
96
|
+
"Website",
|
|
97
|
+
"Instagram",
|
|
98
|
+
"LinkedIn",
|
|
99
|
+
"YouTube",
|
|
100
|
+
"Podcast",
|
|
101
|
+
"Referral",
|
|
102
|
+
"Phone",
|
|
103
|
+
"Other"
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"ref": "field.program_interest",
|
|
108
|
+
"name": "Program Interest",
|
|
109
|
+
"dataType": "SINGLE_OPTIONS",
|
|
110
|
+
"model": "contact",
|
|
111
|
+
"options": [
|
|
112
|
+
"1:1",
|
|
113
|
+
"Group",
|
|
114
|
+
"Course / self-paced",
|
|
115
|
+
"Not sure yet"
|
|
116
|
+
],
|
|
117
|
+
"_optionsNote": "The skill replaces these with the actual program names from offer.summary / offer.pricePoints and mirrors them with interest-* tags."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"ref": "field.biggest_challenge",
|
|
121
|
+
"name": "Biggest Challenge Right Now",
|
|
122
|
+
"dataType": "LARGE_TEXT",
|
|
123
|
+
"model": "contact"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"ref": "field.timeline",
|
|
127
|
+
"name": "Timeline",
|
|
128
|
+
"dataType": "SINGLE_OPTIONS",
|
|
129
|
+
"model": "contact",
|
|
130
|
+
"options": [
|
|
131
|
+
"Ready now",
|
|
132
|
+
"Next 1-3 months",
|
|
133
|
+
"Just exploring"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"ref": "field.call_date",
|
|
138
|
+
"name": "Discovery Call Date",
|
|
139
|
+
"dataType": "DATE",
|
|
140
|
+
"model": "contact",
|
|
141
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"ref": "field.ltv",
|
|
145
|
+
"name": "Estimated Lifetime Value",
|
|
146
|
+
"dataType": "MONETORY",
|
|
147
|
+
"model": "contact"
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"tags": [
|
|
151
|
+
{
|
|
152
|
+
"ref": "tag.source_website",
|
|
153
|
+
"name": "source-website"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"ref": "tag.source_instagram",
|
|
157
|
+
"name": "source-instagram"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"ref": "tag.source_facebook",
|
|
161
|
+
"name": "source-facebook"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"ref": "tag.source_google",
|
|
165
|
+
"name": "source-google"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"ref": "tag.source_referral",
|
|
169
|
+
"name": "source-referral"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"ref": "tag.source_phone",
|
|
173
|
+
"name": "source-phone"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"ref": "tag.source_other",
|
|
177
|
+
"name": "source-other"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"ref": "tag.lc_new_lead",
|
|
181
|
+
"name": "lifecycle-new-lead"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"ref": "tag.lc_contacted",
|
|
185
|
+
"name": "lifecycle-contacted"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"ref": "tag.lc_nurturing",
|
|
189
|
+
"name": "lifecycle-nurturing"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"ref": "tag.lc_booked",
|
|
193
|
+
"name": "lifecycle-booked",
|
|
194
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"ref": "tag.lc_call_held",
|
|
198
|
+
"name": "lifecycle-call-held",
|
|
199
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"ref": "tag.lc_offer_made",
|
|
203
|
+
"name": "lifecycle-offer-made"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"ref": "tag.lc_enrolled",
|
|
207
|
+
"name": "lifecycle-enrolled"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"ref": "tag.lc_alumni",
|
|
211
|
+
"name": "lifecycle-alumni"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"ref": "tag.lc_lapsed",
|
|
215
|
+
"name": "lifecycle-lapsed"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"ref": "tag.lc_lost",
|
|
219
|
+
"name": "lifecycle-lost"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"ref": "tag.nurture_start",
|
|
223
|
+
"name": "nurture-start"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"ref": "tag.winback_start",
|
|
227
|
+
"name": "winback-start"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"ref": "tag.missed_call",
|
|
231
|
+
"name": "missed-call",
|
|
232
|
+
"conditionalOn": "channels.sms == true"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"ref": "tag.no_show",
|
|
236
|
+
"name": "no-show",
|
|
237
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"ref": "tag.interest_1on1",
|
|
241
|
+
"name": "interest-1on1"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"ref": "tag.interest_group",
|
|
245
|
+
"name": "interest-group"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"ref": "tag.interest_course",
|
|
249
|
+
"name": "interest-course"
|
|
250
|
+
}
|
|
251
|
+
],
|
|
252
|
+
"_tagNote": "Interest tags mirror the Program Interest options; the skill renames them to the real program names from the offer at fill time.",
|
|
253
|
+
"customValues": [
|
|
254
|
+
{
|
|
255
|
+
"ref": "cv.business_name",
|
|
256
|
+
"name": "business_name",
|
|
257
|
+
"value": "{{business.name}}"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"ref": "cv.business_phone",
|
|
261
|
+
"name": "business_phone",
|
|
262
|
+
"value": "",
|
|
263
|
+
"filledBy": "handoff.business_details",
|
|
264
|
+
"_fill": "the GHL number once one exists (handoff.phone_number), else blank until the operator fills it"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"ref": "cv.owner_first_name",
|
|
268
|
+
"name": "owner_first_name",
|
|
269
|
+
"value": "",
|
|
270
|
+
"filledBy": "handoff.business_details",
|
|
271
|
+
"_fill": "first name of the user resolved for team.notifyName (the person every message is signed by)"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"ref": "cv.booking_link",
|
|
275
|
+
"name": "booking_link",
|
|
276
|
+
"value": "",
|
|
277
|
+
"filledBy": "handoff.calendar_oauth",
|
|
278
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
279
|
+
}
|
|
280
|
+
],
|
|
281
|
+
"calendars": [
|
|
282
|
+
{
|
|
283
|
+
"ref": "calendar.discovery",
|
|
284
|
+
"conditionalOn": "goal.bookingNeeded == true",
|
|
285
|
+
"name": "{{business.name}} Discovery Call || Discovery Call",
|
|
286
|
+
"calendarType": "round_robin",
|
|
287
|
+
"_slotDuration": "Carry the appointment length from the brief (brief.calendars[].durationMinutes, or the words in the calendar answer: \"15 minutes\" \u2192 15) onto slotDuration (minutes, slotDurationUnit \"mins\"). This preset value applies ONLY when the brief gives no length; without any slotDuration GoHighLevel builds 30-minute slots (finding 25).",
|
|
288
|
+
"slotDuration": 30,
|
|
289
|
+
"slotDurationUnit": "mins",
|
|
290
|
+
"teamMemberRefs": [
|
|
291
|
+
"user.owner"
|
|
292
|
+
],
|
|
293
|
+
"openHours": [
|
|
294
|
+
{
|
|
295
|
+
"daysOfTheWeek": [
|
|
296
|
+
1,
|
|
297
|
+
2,
|
|
298
|
+
3,
|
|
299
|
+
4,
|
|
300
|
+
5
|
|
301
|
+
],
|
|
302
|
+
"hours": [
|
|
303
|
+
{
|
|
304
|
+
"openHour": 10,
|
|
305
|
+
"openMinute": 0,
|
|
306
|
+
"closeHour": 16,
|
|
307
|
+
"closeMinute": 0
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
"availabilityType": 0,
|
|
313
|
+
"slotDuration": 30,
|
|
314
|
+
"slotBuffer": 15,
|
|
315
|
+
"requiresStaff": true,
|
|
316
|
+
"notes": "Default Mon-Fri 10-4, 30-minute calls with 15 minutes between; operator edits after build. teamMemberRefs points at whoever takes discovery calls in the plan users list."
|
|
317
|
+
}
|
|
318
|
+
],
|
|
319
|
+
"_calendarsNote": "One plan calendar per brief.calendars[] entry. The first booking calendar in the brief maps onto this ref (its name, type one_on_one→event / round_robin→round_robin / class→class_booking, and teamMemberRefs from staffNames replace the defaults); every further entry is appended as calendar.<slug> with its own teamMemberRefs. The appointment workflows attach to this first calendar. No calendars in the brief and goal.bookingNeeded true → keep this default and note the assumption.",
|
|
320
|
+
"forms": [
|
|
321
|
+
{
|
|
322
|
+
"ref": "form.intake",
|
|
323
|
+
"name": "{{business.name}} Application || Application",
|
|
324
|
+
"fields": [
|
|
325
|
+
{
|
|
326
|
+
"type": "standard",
|
|
327
|
+
"key": "first_name",
|
|
328
|
+
"required": true
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"type": "standard",
|
|
332
|
+
"key": "last_name",
|
|
333
|
+
"required": true
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"type": "standard",
|
|
337
|
+
"key": "email",
|
|
338
|
+
"required": true
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"type": "standard",
|
|
342
|
+
"key": "phone",
|
|
343
|
+
"required": true
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"type": "custom",
|
|
347
|
+
"fieldRef": "field.program_interest",
|
|
348
|
+
"required": false
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"type": "custom",
|
|
352
|
+
"fieldRef": "field.biggest_challenge",
|
|
353
|
+
"required": true
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"type": "custom",
|
|
357
|
+
"fieldRef": "field.timeline",
|
|
358
|
+
"required": true
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
],
|
|
363
|
+
"funnels": [
|
|
364
|
+
{
|
|
365
|
+
"ref": "funnel.main",
|
|
366
|
+
"name": "{{business.name}} Application Funnel || Application Funnel",
|
|
367
|
+
"target": "ghl",
|
|
368
|
+
"pages": [
|
|
369
|
+
{
|
|
370
|
+
"ref": "page.optin",
|
|
371
|
+
"name": "{{offer.leadMagnet}} || Apply for a Discovery Call",
|
|
372
|
+
"role": "optin",
|
|
373
|
+
"formRef": "form.intake",
|
|
374
|
+
"copyDirection": "OPTIN page per templates/funnel-page-content-template.md: Hero (H1 = the promise in the client's words, no income claims) + who this is for / not for + GEO quotable summary + how the program works (delivery_format) + what the call is and is not + the A2P-compliant application form with a NOT-pre-checked SMS consent checkbox, legal name + address, Privacy/Terms links + a 4-8 Q FAQ with FAQPage JSON-LD. Real client results only if the brief supplies them with consent."
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"ref": "page.thankyou",
|
|
378
|
+
"name": "Thank You",
|
|
379
|
+
"role": "confirmation",
|
|
380
|
+
"calendarRef": "calendar.discovery",
|
|
381
|
+
"conditionalOn": "goal.bookingNeeded == true",
|
|
382
|
+
"copyDirection": "CONFIRMATION page: \"Application received\", what happens next (a text in a minute), and the call booking widget via cv.booking_link so they self-schedule now."
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
],
|
|
387
|
+
"templates": {
|
|
388
|
+
"emails": [
|
|
389
|
+
{
|
|
390
|
+
"ref": "email_template.stl_email_1",
|
|
391
|
+
"name": "Speed to Lead - Instant Email",
|
|
392
|
+
"subject": "Got your application, {{contact.first_name}}",
|
|
393
|
+
"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 application to {{custom_values.business_name}} just landed. I'm {{custom_values.owner_first_name}}, and I read every one myself, including the part where you described what you're up against right now.</p><p style=\"margin:0 0 14px;\">Here's what happens next: in the next few minutes you'll get a text from this number. Reply with one line, the thing you'd most like to be different 90 days from now, and I'll tell you honestly whether {{offer.summary || the program}} is the right fit for that.</p><p style=\"margin:0 0 14px;\">If you'd rather just talk it through, grab a call:</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 discovery call</a></p><p style=\"margin:0 0 14px;\">The call is 30 minutes. It's a diagnosis, not a pitch: you leave knowing what's actually in the way and what it would take to move it, whether or not you work with me.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"ref": "email_template.stl_email_2",
|
|
397
|
+
"name": "Speed to Lead - 3 Hour Email",
|
|
398
|
+
"subject": "What the call is (and what it isn't)",
|
|
399
|
+
"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 hesitate to book a \"discovery call\" because they've been on the other kind: forty minutes of pitch and a countdown timer. That's not this.</p><p style=\"margin:0 0 14px;\">On the call I ask three things: where you are, where you want to be, and what's stopped you so far. Then I tell you what I see, including if I think you don't need me. That happens more than you'd think.</p><p style=\"margin:0 0 14px;\">You'll leave with a clearer picture than you came with. That's the whole promise.</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 call time</a></p><p style=\"margin:0 0 14px;\">Or reply to this email with your answer to the third question. I read every reply.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"ref": "email_template.n_email_1",
|
|
403
|
+
"name": "Nurture 1 - You Don't Need More Information",
|
|
404
|
+
"subject": "You don't need more information",
|
|
405
|
+
"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;\">Here's something I've noticed about almost everyone who applies to work with me: they already know most of what they need to know.</p><p style=\"margin:0 0 14px;\">They've read the books, watched the videos, saved the posts. What they don't have is a decision, and a structure that makes the decision stick when the week gets busy. That's not a knowledge gap. Information won't close it; another course won't either.</p><p style=\"margin:0 0 14px;\">That's why the first call isn't a lesson. It's where we figure out what you actually need to decide, and what structure would hold it in place.</p><p style=\"margin:0 0 14px;\">When you're ready: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">book the call</a>. No obligation to go further.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"ref": "email_template.n_email_2",
|
|
409
|
+
"name": "Nurture 2 - How the Program Works",
|
|
410
|
+
"subject": "How working together actually goes",
|
|
411
|
+
"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 imagine coaching as either a pep talk or a homework pile. Here's what {{offer.summary || the program}} at {{custom_values.business_name}} actually looks like:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">A clear plan in the first week: where you're going, what the milestones are, what we'll measure.</li><li style=\"margin:0 0 6px;\">A steady rhythm after that: sessions on the calendar, a place to ask questions between them, and someone who notices when you go quiet.</li><li style=\"margin:0 0 6px;\">Adjustments as we go. The plan bends to your life; your life doesn't bend to the plan.</li></ul><p style=\"margin:0 0 14px;\">The objection I hear most is {{audience.objections[0] || \"I don't have the time\"}}. Fair. That's why we design the rhythm around the time you actually have, and cut what doesn't earn its place.</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 discovery call</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"ref": "email_template.n_email_3",
|
|
415
|
+
"name": "Nurture 3 - Why It Didn't Stick Before",
|
|
416
|
+
"subject": "Why it didn't stick last time",
|
|
417
|
+
"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've tried to change {{audience.painPoints[0] || the thing you want to change}} before and it didn't stick, I'd bet it wasn't a willpower problem.</p><p style=\"margin:0 0 14px;\">It's almost always a structure problem: no fixed check-in, no one who notices the third missed week, no plan for the month when everything goes sideways. Willpower runs out on schedule. Structure doesn't.</p><p style=\"margin:0 0 14px;\">That's the part I'm actually good at. Not motivation; you have enough of that or you wouldn't have applied. The scaffolding that keeps it going when motivation is low.</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 discovery call</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>"
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"ref": "email_template.n_email_4",
|
|
421
|
+
"name": "Nurture 4 - About the Time",
|
|
422
|
+
"subject": "About the time it takes",
|
|
423
|
+
"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 objection most people don't say out loud: \"I don't have time for this.\"</p><p style=\"margin:0 0 14px;\">Honest answer: it takes some. Sessions, a bit of work between them, and the thinking you'd have to do anyway if you're serious about {{audience.painPoints[0] || the thing you want to change}}. What it doesn't take is a second job. We build the rhythm around your calendar, and part of the first month is cutting things that aren't earning their place, which usually gives back more time than the program takes.</p><p style=\"margin:0 0 14px;\">If you want to see what the rhythm would look like for your week specifically, that's a ten-minute conversation.</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 discovery call</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"ref": "email_template.n_email_5",
|
|
427
|
+
"name": "Nurture 5 - The Cost of Staying Put",
|
|
428
|
+
"subject": "What staying where you are costs",
|
|
429
|
+
"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 money question is a real one, so here's the frame I use myself.</p><p style=\"margin:0 0 14px;\">Don't compare the price of {{offer.summary || the program}} to zero. Compare it to what another year of {{audience.painPoints[0] || the thing you want to change}} staying exactly as it is will cost you: in money, in energy, in the thing you keep putting off. Sometimes staying put is cheaper. Often it just looks cheaper because nobody sends you an invoice for it.</p><p style=\"margin:0 0 14px;\">I'll tell you straight on the call if I think the math doesn't work for you. I'd rather lose a sale than have a client who shouldn't be one.</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;\">Do the math on a call</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"ref": "email_template.n_email_6",
|
|
433
|
+
"name": "Nurture 6 - Everything in One Place",
|
|
434
|
+
"subject": "Everything you need to decide, in one place",
|
|
435
|
+
"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;\">The call: 30 minutes, online, a diagnosis of what's in the way. No pitch, no timer.</li><li style=\"margin:0 0 6px;\">The program: {{offer.summary || the program}}. A plan in week one, a steady rhythm after, adjusted to your life.</li><li style=\"margin:0 0 6px;\">The cost: discussed on the call once we both know it's a fit. No surprises, and a payment plan if that helps.</li><li style=\"margin:0 0 6px;\">My rule: I'll tell you if you don't need me.</li><li style=\"margin:0 0 6px;\">Book, cancel or move your call 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 quarter.</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 discovery call</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"ref": "email_template.w_email_1",
|
|
439
|
+
"name": "Win-back 1 - One Question",
|
|
440
|
+
"subject": "One question, {{contact.first_name}}",
|
|
441
|
+
"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 applied to {{custom_values.business_name}}, and then things went quiet. That's normal; deciding to change something is harder than wanting to.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, money, doubt it would work, or something I said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something I can address, I will. 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>"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"ref": "email_template.w_email_2",
|
|
445
|
+
"name": "Win-back 2 - What Changed",
|
|
446
|
+
"subject": "What's changed since you applied",
|
|
447
|
+
"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 applied, a couple of things have changed at {{custom_values.business_name}}: new call availability, and a smaller first step for people who want to start before committing to the full program.</p><p style=\"margin:0 0 14px;\">What hasn't changed: the call is still a diagnosis, not a pitch, and I'll still tell you if you don't need me.</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>"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"ref": "email_template.w_email_3",
|
|
451
|
+
"name": "Win-back 3 - The Door Stays Open",
|
|
452
|
+
"subject": "The door stays open",
|
|
453
|
+
"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;\">Your call 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;\">Whatever you decide about {{audience.painPoints[0] || the thing you want to change}}: pick one small thing this week and put it on the calendar. Structure beats motivation.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"ref": "email_template.appt_confirm_email",
|
|
457
|
+
"name": "Call Confirmed",
|
|
458
|
+
"subject": "Confirmed, {{contact.first_name}}: your call details",
|
|
459
|
+
"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 discovery call with {{custom_values.business_name}} is confirmed for {{appointment.start_time}}. The video link is in your calendar invite.</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Find a quiet 30 minutes where you can talk freely.</li><li style=\"margin:0 0 6px;\">Have your one-line answer ready: what would you most like to be different 90 days from now?</li><li style=\"margin:0 0 6px;\">Bring the question you're most nervous to ask. We'll start there.</li></ul><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>"
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
"ref": "email_template.appt_prep_email",
|
|
463
|
+
"name": "Call Prep (day before)",
|
|
464
|
+
"subject": "Tomorrow: 3 things that make the call worth it",
|
|
465
|
+
"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 call more useful:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Write down what you've already tried and what happened. It saves us ten minutes.</li><li style=\"margin:0 0 6px;\">Decide what \"worth it\" would mean 90 days from now. One sentence is enough.</li><li style=\"margin:0 0 6px;\">Be somewhere you can be honest. The call only works if you are.</li></ul><p style=\"margin:0 0 14px;\">Running late or need to move it? Reply to this email or text {{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>"
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"ref": "email_template.ns_email_1",
|
|
469
|
+
"name": "No-Show 1 - We Missed You",
|
|
470
|
+
"subject": "Missed you, {{contact.first_name}} (no guilt)",
|
|
471
|
+
"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 a call on the calendar today and it didn't happen. Life happens; nobody here is bothered.</p><p style=\"margin:0 0 14px;\">Your call is still yours. Pick a new time whenever it suits, and if something about it 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 call</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"ref": "email_template.ns_email_2",
|
|
475
|
+
"name": "No-Show 2 - Still Want This?",
|
|
476
|
+
"subject": "Still want to do this?",
|
|
477
|
+
"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 call is the same as before.</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>"
|
|
478
|
+
}
|
|
479
|
+
],
|
|
480
|
+
"sms": [
|
|
481
|
+
{
|
|
482
|
+
"ref": "sms_template.stl_sms_1",
|
|
483
|
+
"name": "Speed to Lead - Instant Text",
|
|
484
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Just read your application. In one line: what would you most like to be different 90 days from now? Reply STOP to opt out."
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"ref": "sms_template.stl_sms_2",
|
|
488
|
+
"name": "Speed to Lead - 20 Minute Text",
|
|
489
|
+
"body": "{{contact.first_name}}, I can hold a 30-min call for you this week. Mornings or afternoons? Or grab a time here: {{custom_values.booking_link}}"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"ref": "sms_template.stl_sms_3",
|
|
493
|
+
"name": "Speed to Lead - Next Day Text",
|
|
494
|
+
"body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} again. Not chasing, I just don't want your application to sit. Still want to find a call time, or is it a \"not now\"?"
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"ref": "sms_template.mc_sms_1",
|
|
498
|
+
"name": "Missed Call - Instant Text-Back",
|
|
499
|
+
"body": "Hi, it's {{custom_values.business_name}}. Sorry I missed your call. What can I help with? Reply here and I'll get back to you personally. Reply STOP to opt out."
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
"ref": "sms_template.mc_sms_2",
|
|
503
|
+
"name": "Missed Call - 1 Hour Text",
|
|
504
|
+
"body": "Still want to talk? Reply with a good time to call you back, or book a call directly: {{custom_values.booking_link}}. {{custom_values.business_name}}, {{custom_values.business_phone}}"
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"ref": "sms_template.n_sms_1",
|
|
508
|
+
"name": "Nurture Text 1 - One Word",
|
|
509
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: what's the bigger gap right now, clarity on what to do, or structure to actually do it? One word is enough. Reply STOP to opt out."
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
"ref": "sms_template.n_sms_2",
|
|
513
|
+
"name": "Nurture Text 2 - Free Tip",
|
|
514
|
+
"body": "Tip from {{custom_values.business_name}}: pick the one action that would move {{audience.painPoints[0] || the thing you want to change}} this week and put it on your calendar as a meeting with yourself. Structure beats motivation. Want the 3-step version? Reply YES."
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
"ref": "sms_template.n_sms_3",
|
|
518
|
+
"name": "Nurture Text 3 - Midpoint",
|
|
519
|
+
"body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about {{offer.summary || the program}}? I have a couple of call slots this week. Want one, or should I check back next month?"
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
"ref": "sms_template.n_sms_4",
|
|
523
|
+
"name": "Nurture Text 4 - Any Question",
|
|
524
|
+
"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."
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"ref": "sms_template.n_sms_5",
|
|
528
|
+
"name": "Nurture Text 5 - Last Direct Ask",
|
|
529
|
+
"body": "{{contact.first_name}}, last one from me at {{custom_values.business_name}}. If you want to talk this month, reply YES and I'll send two call times. If not, no hard feelings. Reply STOP to opt out."
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
"ref": "sms_template.w_sms_1",
|
|
533
|
+
"name": "Win-back Text 1",
|
|
534
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is {{audience.painPoints[0] || the thing you want to change}} still on your list this quarter, or should I close your application for now? Reply STOP to opt out."
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"ref": "sms_template.w_sms_2",
|
|
538
|
+
"name": "Win-back Text 2",
|
|
539
|
+
"body": "{{contact.first_name}}, two call slots opened up this week at {{custom_values.business_name}}. Want one? Reply YES and I'll hold it."
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
"ref": "sms_template.appt_confirm_sms",
|
|
543
|
+
"name": "Call Confirmed Text",
|
|
544
|
+
"body": "{{contact.first_name}}, your call with {{custom_values.business_name}} is confirmed for {{appointment.start_time}}. Video link is in your calendar invite. Need to change it? Reply here. Reply STOP to opt out."
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"ref": "sms_template.appt_24h_sms",
|
|
548
|
+
"name": "Call Reminder - 24 Hours",
|
|
549
|
+
"body": "Reminder: your call with {{custom_values.business_name}} is tomorrow at {{appointment.start_time}}. Reply C to confirm or R to reschedule."
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"ref": "sms_template.appt_2h_sms",
|
|
553
|
+
"name": "Call Reminder - 2 Hours",
|
|
554
|
+
"body": "Talk in about 2 hours, {{contact.first_name}}. {{custom_values.business_name}}, {{appointment.start_time}}, link in your invite. Reply here if you're running late."
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"ref": "sms_template.ns_sms_1",
|
|
558
|
+
"name": "No-Show Text 1",
|
|
559
|
+
"body": "Hi {{contact.first_name}}, we missed each other on today's call. No problem at all. Want me to find you a new time this week? Reply YES. Reply STOP to opt out."
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
"ref": "sms_template.ns_sms_2",
|
|
563
|
+
"name": "No-Show Text 2",
|
|
564
|
+
"body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. I kept a couple of call slots open for you this week. Want one? Reply with a day that works."
|
|
565
|
+
}
|
|
566
|
+
]
|
|
567
|
+
},
|
|
568
|
+
"_templatesNote": "Every message is a send-ready template (emails: subject + html; sms: body) written to references/copy-guide.md from this preset's placeholder brief fields. The build stage REWRITES each one from the real brief (offer, audience pain points and objections, price points, lead magnet, follow-up style, voice.threeWords for tone, voice.signatureLine verbatim in the first email and text) keeping the cadence, the single CTA and the merge fields, then writes the result to BOTH the template and the matching email/sms asset body. Never ship an outline-only body. {{contact.*}}, {{custom_values.*}} and {{appointment.*}} are GHL merge fields and pass through the fill untouched; {{offer.*}} / {{audience.*}} / {{business.*}} are preset tokens filled from the brief.",
|
|
569
|
+
"emails": [
|
|
570
|
+
{
|
|
571
|
+
"ref": "email.stl_email_1",
|
|
572
|
+
"name": "Speed to Lead - Instant Email",
|
|
573
|
+
"subject": "Got your application, {{contact.first_name}}",
|
|
574
|
+
"templateRef": "email_template.stl_email_1",
|
|
575
|
+
"copyDirection": "Instant. Who I am, I read the application, what happens next (a text), the one-question ask, the call CTA, what the call is not (a pitch). Tone: brief.voice.threeWords. If brief.voice.signatureLine exists, insert it verbatim as its own paragraph right after the greeting.",
|
|
576
|
+
"mergeTags": [
|
|
577
|
+
"contact.first_name",
|
|
578
|
+
"custom_values.business_name",
|
|
579
|
+
"custom_values.owner_first_name",
|
|
580
|
+
"custom_values.booking_link",
|
|
581
|
+
"custom_values.business_phone"
|
|
582
|
+
]
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"ref": "email.stl_email_2",
|
|
586
|
+
"name": "Speed to Lead - 3 Hour Email",
|
|
587
|
+
"subject": "What the call is (and what it isn't)",
|
|
588
|
+
"templateRef": "email_template.stl_email_2",
|
|
589
|
+
"copyDirection": "Second touch, 3 hours in. The three questions asked on every call, why they matter, what the call is not, CTA, reply invitation.",
|
|
590
|
+
"mergeTags": [
|
|
591
|
+
"contact.first_name",
|
|
592
|
+
"custom_values.booking_link",
|
|
593
|
+
"custom_values.owner_first_name",
|
|
594
|
+
"custom_values.business_name",
|
|
595
|
+
"custom_values.business_phone"
|
|
596
|
+
]
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"ref": "email.n_email_1",
|
|
600
|
+
"name": "Nurture 1 - You Don't Need More Information",
|
|
601
|
+
"subject": "You don't need more information",
|
|
602
|
+
"templateRef": "email_template.n_email_1",
|
|
603
|
+
"copyDirection": "Day 1 of nurture. The core belief shift: the reader has consumed enough content; the gap is a decision and a structure, not knowledge. Give, do not pitch.",
|
|
604
|
+
"mergeTags": [
|
|
605
|
+
"contact.first_name",
|
|
606
|
+
"custom_values.booking_link",
|
|
607
|
+
"custom_values.owner_first_name",
|
|
608
|
+
"custom_values.business_name",
|
|
609
|
+
"custom_values.business_phone"
|
|
610
|
+
]
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
"ref": "email.n_email_2",
|
|
614
|
+
"name": "Nurture 2 - How the Program Works",
|
|
615
|
+
"subject": "How working together actually goes",
|
|
616
|
+
"templateRef": "email_template.n_email_2",
|
|
617
|
+
"copyDirection": "Day 5. Remove the unknown: the program week by week (delivery_format from the brief), what the client does, what the coach does, then name and answer the top objection. One CTA.",
|
|
618
|
+
"mergeTags": [
|
|
619
|
+
"contact.first_name",
|
|
620
|
+
"custom_values.business_name",
|
|
621
|
+
"custom_values.booking_link",
|
|
622
|
+
"custom_values.owner_first_name",
|
|
623
|
+
"custom_values.business_phone"
|
|
624
|
+
]
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"ref": "email.n_email_3",
|
|
628
|
+
"name": "Nurture 3 - Why It Didn't Stick Before",
|
|
629
|
+
"subject": "Why it didn't stick last time",
|
|
630
|
+
"templateRef": "email_template.n_email_3",
|
|
631
|
+
"copyDirection": "Day 10. Belief shift on \"tried before\": failure was structure and accountability, not willpower. Client stories ONLY if the brief supplies them with consent. CTA + reply invite.",
|
|
632
|
+
"mergeTags": [
|
|
633
|
+
"contact.first_name",
|
|
634
|
+
"custom_values.booking_link",
|
|
635
|
+
"custom_values.owner_first_name",
|
|
636
|
+
"custom_values.business_name",
|
|
637
|
+
"custom_values.business_phone"
|
|
638
|
+
]
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"ref": "email.n_email_4",
|
|
642
|
+
"name": "Nurture 4 - About the Time",
|
|
643
|
+
"subject": "About the time it takes",
|
|
644
|
+
"templateRef": "email_template.n_email_4",
|
|
645
|
+
"copyDirection": "Day 14. Handle the time objection head-on: hours per week, what gets cut, the rhythm designed around real life. No made-up numbers beyond the brief.",
|
|
646
|
+
"mergeTags": [
|
|
647
|
+
"contact.first_name",
|
|
648
|
+
"custom_values.booking_link",
|
|
649
|
+
"custom_values.owner_first_name",
|
|
650
|
+
"custom_values.business_name",
|
|
651
|
+
"custom_values.business_phone"
|
|
652
|
+
]
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"ref": "email.n_email_5",
|
|
656
|
+
"name": "Nurture 5 - The Cost of Staying Put",
|
|
657
|
+
"subject": "What staying where you are costs",
|
|
658
|
+
"templateRef": "email_template.n_email_5",
|
|
659
|
+
"copyDirection": "Day 20. Cost of inaction and the money objection, framed honestly: the price of the program vs the price of another year unchanged. No income claims, no fabricated numbers. Soft CTA.",
|
|
660
|
+
"mergeTags": [
|
|
661
|
+
"contact.first_name",
|
|
662
|
+
"custom_values.booking_link",
|
|
663
|
+
"custom_values.owner_first_name",
|
|
664
|
+
"custom_values.business_name",
|
|
665
|
+
"custom_values.business_phone"
|
|
666
|
+
]
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"ref": "email.n_email_6",
|
|
670
|
+
"name": "Nurture 6 - Everything in One Place",
|
|
671
|
+
"subject": "Everything you need to decide, in one place",
|
|
672
|
+
"templateRef": "email_template.n_email_6",
|
|
673
|
+
"copyDirection": "Day 27. The decision sheet: what the call is, format, how the program works, what it costs (only if the brief has prices), the rule, how to book or move. Offer the \"later\" out. One CTA.",
|
|
674
|
+
"mergeTags": [
|
|
675
|
+
"contact.first_name",
|
|
676
|
+
"custom_values.booking_link",
|
|
677
|
+
"custom_values.owner_first_name",
|
|
678
|
+
"custom_values.business_name",
|
|
679
|
+
"custom_values.business_phone"
|
|
680
|
+
]
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"ref": "email.w_email_1",
|
|
684
|
+
"name": "Win-back 1 - One Question",
|
|
685
|
+
"subject": "One question, {{contact.first_name}}",
|
|
686
|
+
"templateRef": "email_template.w_email_1",
|
|
687
|
+
"copyDirection": "Win-back day 0. Acknowledge the gap without guilt; ask what stopped them (timing, money, doubt, something I said); promise to fix it or leave them alone. A reply is the CTA.",
|
|
688
|
+
"mergeTags": [
|
|
689
|
+
"contact.first_name",
|
|
690
|
+
"custom_values.business_name",
|
|
691
|
+
"custom_values.owner_first_name",
|
|
692
|
+
"custom_values.business_phone"
|
|
693
|
+
]
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
"ref": "email.w_email_2",
|
|
697
|
+
"name": "Win-back 2 - What Changed",
|
|
698
|
+
"subject": "What's changed since you applied",
|
|
699
|
+
"templateRef": "email_template.w_email_2",
|
|
700
|
+
"copyDirection": "Win-back day 14. One real reason to look again from the brief (a new cohort or start date, a smaller entry option, new call availability), then what has not changed. One CTA.",
|
|
701
|
+
"mergeTags": [
|
|
702
|
+
"contact.first_name",
|
|
703
|
+
"custom_values.business_name",
|
|
704
|
+
"custom_values.booking_link",
|
|
705
|
+
"custom_values.owner_first_name",
|
|
706
|
+
"custom_values.business_phone"
|
|
707
|
+
]
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"ref": "email.w_email_3",
|
|
711
|
+
"name": "Win-back 3 - The Door Stays Open",
|
|
712
|
+
"subject": "The door stays open",
|
|
713
|
+
"templateRef": "email_template.w_email_3",
|
|
714
|
+
"copyDirection": "Win-back day 30, the last automatic message. Say so plainly, leave the offer open, one CTA, one useful parting thought.",
|
|
715
|
+
"mergeTags": [
|
|
716
|
+
"contact.first_name",
|
|
717
|
+
"custom_values.booking_link",
|
|
718
|
+
"custom_values.owner_first_name",
|
|
719
|
+
"custom_values.business_name",
|
|
720
|
+
"custom_values.business_phone"
|
|
721
|
+
]
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"ref": "email.appt_confirm_email",
|
|
725
|
+
"name": "Call Confirmed",
|
|
726
|
+
"subject": "Confirmed, {{contact.first_name}}: your call details",
|
|
727
|
+
"templateRef": "email_template.appt_confirm_email",
|
|
728
|
+
"copyDirection": "On booking. Date/time via {{appointment.start_time}}, where (video link in the calendar invite), what to prepare (one question, the 90-day picture), how to move it.",
|
|
729
|
+
"mergeTags": [
|
|
730
|
+
"contact.first_name",
|
|
731
|
+
"custom_values.business_name",
|
|
732
|
+
"appointment.start_time",
|
|
733
|
+
"custom_values.booking_link",
|
|
734
|
+
"custom_values.owner_first_name",
|
|
735
|
+
"custom_values.business_phone"
|
|
736
|
+
]
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"ref": "email.appt_prep_email",
|
|
740
|
+
"name": "Call Prep (day before)",
|
|
741
|
+
"subject": "Tomorrow: 3 things that make the call worth it",
|
|
742
|
+
"templateRef": "email_template.appt_prep_email",
|
|
743
|
+
"copyDirection": "Day before. Three concrete prep items, the time, the video link reminder, how to reach us.",
|
|
744
|
+
"mergeTags": [
|
|
745
|
+
"contact.first_name",
|
|
746
|
+
"appointment.start_time",
|
|
747
|
+
"custom_values.business_phone",
|
|
748
|
+
"custom_values.owner_first_name",
|
|
749
|
+
"custom_values.business_name"
|
|
750
|
+
]
|
|
751
|
+
},
|
|
752
|
+
{
|
|
753
|
+
"ref": "email.ns_email_1",
|
|
754
|
+
"name": "No-Show 1 - We Missed You",
|
|
755
|
+
"subject": "Missed you, {{contact.first_name}} (no guilt)",
|
|
756
|
+
"templateRef": "email_template.ns_email_1",
|
|
757
|
+
"copyDirection": "Same day. Zero guilt, the call is still theirs, rebook CTA, invite the honest reason.",
|
|
758
|
+
"mergeTags": [
|
|
759
|
+
"contact.first_name",
|
|
760
|
+
"custom_values.booking_link",
|
|
761
|
+
"custom_values.owner_first_name",
|
|
762
|
+
"custom_values.business_name",
|
|
763
|
+
"custom_values.business_phone"
|
|
764
|
+
]
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
"ref": "email.ns_email_2",
|
|
768
|
+
"name": "No-Show 2 - Still Want This?",
|
|
769
|
+
"subject": "Still want to do this?",
|
|
770
|
+
"templateRef": "email_template.ns_email_2",
|
|
771
|
+
"copyDirection": "Day 4 after the no-show. Honest binary: wrong timing or still want it. One CTA, gracious close.",
|
|
772
|
+
"mergeTags": [
|
|
773
|
+
"contact.first_name",
|
|
774
|
+
"custom_values.booking_link",
|
|
775
|
+
"custom_values.business_name",
|
|
776
|
+
"custom_values.owner_first_name",
|
|
777
|
+
"custom_values.business_phone"
|
|
778
|
+
]
|
|
779
|
+
}
|
|
780
|
+
],
|
|
781
|
+
"sms": [
|
|
782
|
+
{
|
|
783
|
+
"ref": "sms.stl_sms_1",
|
|
784
|
+
"name": "Speed to Lead - Instant Text",
|
|
785
|
+
"templateRef": "sms_template.stl_sms_1",
|
|
786
|
+
"copyDirection": "Instant. Name + business, I read the application, the one-line ask (90 days from now), STOP line. No link. If brief.voice.signatureLine is short enough, use it verbatim as the second sentence.",
|
|
787
|
+
"mergeTags": [
|
|
788
|
+
"contact.first_name",
|
|
789
|
+
"custom_values.owner_first_name",
|
|
790
|
+
"custom_values.business_name"
|
|
791
|
+
],
|
|
792
|
+
"conditionalOn": "channels.sms == true"
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"ref": "sms.stl_sms_2",
|
|
796
|
+
"name": "Speed to Lead - 20 Minute Text",
|
|
797
|
+
"templateRef": "sms_template.stl_sms_2",
|
|
798
|
+
"copyDirection": "20 minutes in. Offer to hold a call time, binary question, booking link.",
|
|
799
|
+
"mergeTags": [
|
|
800
|
+
"contact.first_name",
|
|
801
|
+
"custom_values.booking_link"
|
|
802
|
+
],
|
|
803
|
+
"conditionalOn": "channels.sms == true"
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
"ref": "sms.stl_sms_3",
|
|
807
|
+
"name": "Speed to Lead - Next Day Text",
|
|
808
|
+
"templateRef": "sms_template.stl_sms_3",
|
|
809
|
+
"copyDirection": "Day 1. Not chasing; binary: find a time or \"not now\". No link.",
|
|
810
|
+
"mergeTags": [
|
|
811
|
+
"contact.first_name",
|
|
812
|
+
"custom_values.owner_first_name"
|
|
813
|
+
],
|
|
814
|
+
"conditionalOn": "channels.sms == true"
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
"ref": "sms.mc_sms_1",
|
|
818
|
+
"name": "Missed Call - Instant Text-Back",
|
|
819
|
+
"templateRef": "sms_template.mc_sms_1",
|
|
820
|
+
"copyDirection": "Seconds after a missed inbound call. Apologize, ask how to help, promise a real person, STOP line.",
|
|
821
|
+
"mergeTags": [
|
|
822
|
+
"custom_values.business_name"
|
|
823
|
+
],
|
|
824
|
+
"conditionalOn": "channels.sms == true"
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
"ref": "sms.mc_sms_2",
|
|
828
|
+
"name": "Missed Call - 1 Hour Text",
|
|
829
|
+
"templateRef": "sms_template.mc_sms_2",
|
|
830
|
+
"copyDirection": "One hour later. Ask for a call-back time or offer the booking link; include the number.",
|
|
831
|
+
"mergeTags": [
|
|
832
|
+
"custom_values.booking_link",
|
|
833
|
+
"custom_values.business_name",
|
|
834
|
+
"custom_values.business_phone"
|
|
835
|
+
],
|
|
836
|
+
"conditionalOn": "channels.sms == true"
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
"ref": "sms.n_sms_1",
|
|
840
|
+
"name": "Nurture Text 1 - One Word",
|
|
841
|
+
"templateRef": "sms_template.n_sms_1",
|
|
842
|
+
"copyDirection": "Day 3. A one-word segmenting question (clarity / structure / accountability). STOP line.",
|
|
843
|
+
"mergeTags": [
|
|
844
|
+
"contact.first_name",
|
|
845
|
+
"custom_values.owner_first_name",
|
|
846
|
+
"custom_values.business_name"
|
|
847
|
+
],
|
|
848
|
+
"conditionalOn": "channels.sms == true"
|
|
849
|
+
},
|
|
850
|
+
{
|
|
851
|
+
"ref": "sms.n_sms_2",
|
|
852
|
+
"name": "Nurture Text 2 - Free Tip",
|
|
853
|
+
"templateRef": "sms_template.n_sms_2",
|
|
854
|
+
"copyDirection": "Day 8. A genuinely useful tip (put the one thing on the calendar), offer more on YES. No link.",
|
|
855
|
+
"mergeTags": [
|
|
856
|
+
"custom_values.business_name"
|
|
857
|
+
],
|
|
858
|
+
"conditionalOn": "channels.sms == true"
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
"ref": "sms.n_sms_3",
|
|
862
|
+
"name": "Nurture Text 3 - Midpoint",
|
|
863
|
+
"templateRef": "sms_template.n_sms_3",
|
|
864
|
+
"copyDirection": "Day 15. Personal, from the coach; binary: a call slot this week or check back next month.",
|
|
865
|
+
"mergeTags": [
|
|
866
|
+
"contact.first_name",
|
|
867
|
+
"custom_values.owner_first_name"
|
|
868
|
+
],
|
|
869
|
+
"conditionalOn": "channels.sms == true"
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
"ref": "sms.n_sms_4",
|
|
873
|
+
"name": "Nurture Text 4 - Any Question",
|
|
874
|
+
"templateRef": "sms_template.n_sms_4",
|
|
875
|
+
"copyDirection": "Day 23. No pitch: did they get their question answered? Invite it.",
|
|
876
|
+
"mergeTags": [
|
|
877
|
+
"contact.first_name",
|
|
878
|
+
"custom_values.owner_first_name"
|
|
879
|
+
],
|
|
880
|
+
"conditionalOn": "channels.sms == true"
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"ref": "sms.n_sms_5",
|
|
884
|
+
"name": "Nurture Text 5 - Last Direct Ask",
|
|
885
|
+
"templateRef": "sms_template.n_sms_5",
|
|
886
|
+
"copyDirection": "Day 30. Last one; YES gets two times; no hard feelings; STOP line.",
|
|
887
|
+
"mergeTags": [
|
|
888
|
+
"contact.first_name",
|
|
889
|
+
"custom_values.business_name"
|
|
890
|
+
],
|
|
891
|
+
"conditionalOn": "channels.sms == true"
|
|
892
|
+
},
|
|
893
|
+
{
|
|
894
|
+
"ref": "sms.w_sms_1",
|
|
895
|
+
"name": "Win-back Text 1",
|
|
896
|
+
"templateRef": "sms_template.w_sms_1",
|
|
897
|
+
"copyDirection": "Win-back day 7. Binary: still on the list this quarter, or close the file. STOP line.",
|
|
898
|
+
"mergeTags": [
|
|
899
|
+
"contact.first_name",
|
|
900
|
+
"custom_values.owner_first_name",
|
|
901
|
+
"custom_values.business_name"
|
|
902
|
+
],
|
|
903
|
+
"conditionalOn": "channels.sms == true"
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
"ref": "sms.w_sms_2",
|
|
907
|
+
"name": "Win-back Text 2",
|
|
908
|
+
"templateRef": "sms_template.w_sms_2",
|
|
909
|
+
"copyDirection": "Win-back day 22. A concrete reason (call slots this week / a new start date) and a YES ask.",
|
|
910
|
+
"mergeTags": [
|
|
911
|
+
"contact.first_name",
|
|
912
|
+
"custom_values.business_name"
|
|
913
|
+
],
|
|
914
|
+
"conditionalOn": "channels.sms == true"
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"ref": "sms.appt_confirm_sms",
|
|
918
|
+
"name": "Call Confirmed Text",
|
|
919
|
+
"templateRef": "sms_template.appt_confirm_sms",
|
|
920
|
+
"copyDirection": "On booking. Confirm date/time, video link in the invite, how to change it, STOP line.",
|
|
921
|
+
"mergeTags": [
|
|
922
|
+
"contact.first_name",
|
|
923
|
+
"custom_values.business_name",
|
|
924
|
+
"appointment.start_time"
|
|
925
|
+
],
|
|
926
|
+
"conditionalOn": "channels.sms == true"
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
"ref": "sms.appt_24h_sms",
|
|
930
|
+
"name": "Call Reminder - 24 Hours",
|
|
931
|
+
"templateRef": "sms_template.appt_24h_sms",
|
|
932
|
+
"copyDirection": "24 hours before. Time, C to confirm / R to reschedule.",
|
|
933
|
+
"mergeTags": [
|
|
934
|
+
"custom_values.business_name",
|
|
935
|
+
"appointment.start_time"
|
|
936
|
+
],
|
|
937
|
+
"conditionalOn": "channels.sms == true"
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"ref": "sms.appt_2h_sms",
|
|
941
|
+
"name": "Call Reminder - 2 Hours",
|
|
942
|
+
"templateRef": "sms_template.appt_2h_sms",
|
|
943
|
+
"copyDirection": "2 hours before. Short, warm, video link reminder, reply if late.",
|
|
944
|
+
"mergeTags": [
|
|
945
|
+
"contact.first_name",
|
|
946
|
+
"custom_values.business_name",
|
|
947
|
+
"appointment.start_time"
|
|
948
|
+
],
|
|
949
|
+
"conditionalOn": "channels.sms == true"
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"ref": "sms.ns_sms_1",
|
|
953
|
+
"name": "No-Show Text 1",
|
|
954
|
+
"templateRef": "sms_template.ns_sms_1",
|
|
955
|
+
"copyDirection": "Same day. No guilt, offer a new time this week, YES ask, STOP line.",
|
|
956
|
+
"mergeTags": [
|
|
957
|
+
"contact.first_name"
|
|
958
|
+
],
|
|
959
|
+
"conditionalOn": "channels.sms == true"
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
"ref": "sms.ns_sms_2",
|
|
963
|
+
"name": "No-Show Text 2",
|
|
964
|
+
"templateRef": "sms_template.ns_sms_2",
|
|
965
|
+
"copyDirection": "Next day. Coach kept slots open; ask for a day.",
|
|
966
|
+
"mergeTags": [
|
|
967
|
+
"contact.first_name",
|
|
968
|
+
"custom_values.owner_first_name"
|
|
969
|
+
],
|
|
970
|
+
"conditionalOn": "channels.sms == true"
|
|
971
|
+
}
|
|
972
|
+
],
|
|
973
|
+
"workflows": [
|
|
974
|
+
{
|
|
975
|
+
"ref": "workflow.speed_to_lead",
|
|
976
|
+
"name": "Speed to Lead",
|
|
977
|
+
"trigger": {
|
|
978
|
+
"type": "form_submission",
|
|
979
|
+
"formRef": "form.intake"
|
|
980
|
+
},
|
|
981
|
+
"stopOnResponse": true,
|
|
982
|
+
"_design": "Five touches in the first 24 hours (text + email instantly, the contact assigned to the person who takes calls, a call task and an alert to a real person, an opportunity card, then a 2nd and 3rd touch), then the hand-off tag that starts the 30-day nurture as the LAST action (E_NO_HANDOFF). Ends early only if they reply (stopOnResponse) or book (the booking workflow pulls them out).",
|
|
983
|
+
"actions": [
|
|
984
|
+
{
|
|
985
|
+
"type": "add_contact_tag",
|
|
986
|
+
"tagRef": "tag.lc_new_lead"
|
|
987
|
+
},
|
|
988
|
+
{
|
|
989
|
+
"type": "create_opportunity",
|
|
990
|
+
"pipelineRef": "pipeline.client_journey",
|
|
991
|
+
"stageRef": "stage.new_lead",
|
|
992
|
+
"name": "{{contact.name}} - New Lead"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
"type": "assign_user",
|
|
996
|
+
"userRef": "user.owner"
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"type": "send_sms",
|
|
1000
|
+
"smsRef": "sms.stl_sms_1",
|
|
1001
|
+
"conditionalOn": "channels.sms == true"
|
|
1002
|
+
},
|
|
1003
|
+
{
|
|
1004
|
+
"type": "send_email",
|
|
1005
|
+
"emailRef": "email.stl_email_1"
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
"type": "internal_notification",
|
|
1009
|
+
"userRef": "user.owner",
|
|
1010
|
+
"title": "New lead: {{contact.first_name}} {{contact.last_name}}",
|
|
1011
|
+
"body": "{{contact.first_name}} just applied. Phone {{contact.phone}}. Read their \"biggest challenge\" answer first, then call within 5 minutes; the first text and email already went out."
|
|
1012
|
+
},
|
|
1013
|
+
{
|
|
1014
|
+
"type": "task_notification",
|
|
1015
|
+
"userRef": "user.owner",
|
|
1016
|
+
"title": "Call {{contact.first_name}} now (new lead)",
|
|
1017
|
+
"body": "Speed-to-lead call. {{contact.first_name}} {{contact.last_name}}, {{contact.phone}}, {{contact.email}}. Open with their biggest-challenge answer, ask what they have tried, then hold a discovery call time. Log the outcome in the contact notes.",
|
|
1018
|
+
"dueDate": "1"
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"type": "wait",
|
|
1022
|
+
"value": 20,
|
|
1023
|
+
"unit": "minutes"
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"type": "send_sms",
|
|
1027
|
+
"smsRef": "sms.stl_sms_2",
|
|
1028
|
+
"conditionalOn": "channels.sms == true"
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"type": "wait",
|
|
1032
|
+
"value": 3,
|
|
1033
|
+
"unit": "hours"
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"type": "send_email",
|
|
1037
|
+
"emailRef": "email.stl_email_2"
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
"type": "wait",
|
|
1041
|
+
"value": 1,
|
|
1042
|
+
"unit": "days"
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
"type": "send_sms",
|
|
1046
|
+
"smsRef": "sms.stl_sms_3",
|
|
1047
|
+
"conditionalOn": "channels.sms == true"
|
|
1048
|
+
},
|
|
1049
|
+
{
|
|
1050
|
+
"type": "add_notes",
|
|
1051
|
+
"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."
|
|
1052
|
+
},
|
|
1053
|
+
{
|
|
1054
|
+
"type": "add_contact_tag",
|
|
1055
|
+
"tagRef": "tag.nurture_start"
|
|
1056
|
+
}
|
|
1057
|
+
]
|
|
1058
|
+
},
|
|
1059
|
+
{
|
|
1060
|
+
"ref": "workflow.missed_call",
|
|
1061
|
+
"name": "Missed Call Text-Back",
|
|
1062
|
+
"conditionalOn": "channels.sms == true",
|
|
1063
|
+
"trigger": {
|
|
1064
|
+
"type": "call_status",
|
|
1065
|
+
"callStatuses": [
|
|
1066
|
+
"no-answer",
|
|
1067
|
+
"busy",
|
|
1068
|
+
"voicemail"
|
|
1069
|
+
],
|
|
1070
|
+
"callDirection": "inbound"
|
|
1071
|
+
},
|
|
1072
|
+
"stopOnResponse": true,
|
|
1073
|
+
"_design": "Fires on an inbound call that was not answered (no-answer / busy / voicemail). Texts back within seconds, tags the contact, alerts a real person and creates a call-back task, then one more text an hour later. Stops the moment they reply.",
|
|
1074
|
+
"actions": [
|
|
1075
|
+
{
|
|
1076
|
+
"type": "send_sms",
|
|
1077
|
+
"smsRef": "sms.mc_sms_1",
|
|
1078
|
+
"conditionalOn": "channels.sms == true"
|
|
1079
|
+
},
|
|
1080
|
+
{
|
|
1081
|
+
"type": "add_contact_tag",
|
|
1082
|
+
"tagRef": "tag.missed_call"
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
"type": "add_contact_tag",
|
|
1086
|
+
"tagRef": "tag.source_phone"
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
"type": "internal_notification",
|
|
1090
|
+
"userRef": "user.owner",
|
|
1091
|
+
"title": "Missed call: {{contact.first_name}} {{contact.phone}}",
|
|
1092
|
+
"body": "An inbound call from {{contact.phone}} was not answered. A text-back already went out. Call back as soon as you can."
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"type": "task_notification",
|
|
1096
|
+
"userRef": "user.owner",
|
|
1097
|
+
"title": "Call back {{contact.first_name}} (missed call)",
|
|
1098
|
+
"body": "Missed inbound call from {{contact.phone}}. The text-back asked what they need; check the conversation first, then call.",
|
|
1099
|
+
"dueDate": "1"
|
|
1100
|
+
},
|
|
1101
|
+
{
|
|
1102
|
+
"type": "wait",
|
|
1103
|
+
"value": 1,
|
|
1104
|
+
"unit": "hours"
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
"type": "send_sms",
|
|
1108
|
+
"smsRef": "sms.mc_sms_2",
|
|
1109
|
+
"conditionalOn": "channels.sms == true"
|
|
1110
|
+
}
|
|
1111
|
+
]
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
"ref": "workflow.lead_nurture",
|
|
1115
|
+
"name": "Lead Nurture (30 days)",
|
|
1116
|
+
"trigger": {
|
|
1117
|
+
"type": "contact_tag",
|
|
1118
|
+
"tagRef": "tag.nurture_start"
|
|
1119
|
+
},
|
|
1120
|
+
"stopOnResponse": true,
|
|
1121
|
+
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first so a later hand-off can start it again. Ends by tagging lapsed and handing off to Win-back. Any reply stops it (stopOnResponse) and Replied - Stop & Route takes over.",
|
|
1122
|
+
"actions": [
|
|
1123
|
+
{
|
|
1124
|
+
"type": "remove_contact_tag",
|
|
1125
|
+
"tagRef": "tag.nurture_start"
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
"type": "add_contact_tag",
|
|
1129
|
+
"tagRef": "tag.lc_nurturing"
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
"type": "wait",
|
|
1133
|
+
"value": 1,
|
|
1134
|
+
"unit": "days"
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
"type": "send_email",
|
|
1138
|
+
"emailRef": "email.n_email_1"
|
|
1139
|
+
},
|
|
1140
|
+
{
|
|
1141
|
+
"type": "wait",
|
|
1142
|
+
"value": 2,
|
|
1143
|
+
"unit": "days"
|
|
1144
|
+
},
|
|
1145
|
+
{
|
|
1146
|
+
"type": "send_sms",
|
|
1147
|
+
"smsRef": "sms.n_sms_1",
|
|
1148
|
+
"conditionalOn": "channels.sms == true"
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"type": "wait",
|
|
1152
|
+
"value": 2,
|
|
1153
|
+
"unit": "days"
|
|
1154
|
+
},
|
|
1155
|
+
{
|
|
1156
|
+
"type": "send_email",
|
|
1157
|
+
"emailRef": "email.n_email_2"
|
|
1158
|
+
},
|
|
1159
|
+
{
|
|
1160
|
+
"type": "wait",
|
|
1161
|
+
"value": 3,
|
|
1162
|
+
"unit": "days"
|
|
1163
|
+
},
|
|
1164
|
+
{
|
|
1165
|
+
"type": "send_sms",
|
|
1166
|
+
"smsRef": "sms.n_sms_2",
|
|
1167
|
+
"conditionalOn": "channels.sms == true"
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
"type": "wait",
|
|
1171
|
+
"value": 2,
|
|
1172
|
+
"unit": "days"
|
|
1173
|
+
},
|
|
1174
|
+
{
|
|
1175
|
+
"type": "send_email",
|
|
1176
|
+
"emailRef": "email.n_email_3"
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
"type": "wait",
|
|
1180
|
+
"value": 4,
|
|
1181
|
+
"unit": "days"
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
"type": "send_email",
|
|
1185
|
+
"emailRef": "email.n_email_4"
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
"type": "wait",
|
|
1189
|
+
"value": 1,
|
|
1190
|
+
"unit": "days"
|
|
1191
|
+
},
|
|
1192
|
+
{
|
|
1193
|
+
"type": "send_sms",
|
|
1194
|
+
"smsRef": "sms.n_sms_3",
|
|
1195
|
+
"conditionalOn": "channels.sms == true"
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
"type": "wait",
|
|
1199
|
+
"value": 5,
|
|
1200
|
+
"unit": "days"
|
|
1201
|
+
},
|
|
1202
|
+
{
|
|
1203
|
+
"type": "send_email",
|
|
1204
|
+
"emailRef": "email.n_email_5"
|
|
1205
|
+
},
|
|
1206
|
+
{
|
|
1207
|
+
"type": "wait",
|
|
1208
|
+
"value": 3,
|
|
1209
|
+
"unit": "days"
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
"type": "send_sms",
|
|
1213
|
+
"smsRef": "sms.n_sms_4",
|
|
1214
|
+
"conditionalOn": "channels.sms == true"
|
|
1215
|
+
},
|
|
1216
|
+
{
|
|
1217
|
+
"type": "wait",
|
|
1218
|
+
"value": 4,
|
|
1219
|
+
"unit": "days"
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
"type": "send_email",
|
|
1223
|
+
"emailRef": "email.n_email_6"
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
"type": "wait",
|
|
1227
|
+
"value": 3,
|
|
1228
|
+
"unit": "days"
|
|
1229
|
+
},
|
|
1230
|
+
{
|
|
1231
|
+
"type": "send_sms",
|
|
1232
|
+
"smsRef": "sms.n_sms_5",
|
|
1233
|
+
"conditionalOn": "channels.sms == true"
|
|
1234
|
+
},
|
|
1235
|
+
{
|
|
1236
|
+
"type": "wait",
|
|
1237
|
+
"value": 1,
|
|
1238
|
+
"unit": "days"
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
"type": "add_notes",
|
|
1242
|
+
"body": "Lead Nurture (30 days) finished with no reply: 11 touches over 31 days. Tagged lapsed; Win-back starts from the winback-start tag."
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
"type": "add_contact_tag",
|
|
1246
|
+
"tagRef": "tag.lc_lapsed"
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
"type": "add_contact_tag",
|
|
1250
|
+
"tagRef": "tag.winback_start"
|
|
1251
|
+
}
|
|
1252
|
+
]
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
"ref": "workflow.reply_route",
|
|
1256
|
+
"name": "Replied - Stop & Route",
|
|
1257
|
+
"trigger": {
|
|
1258
|
+
"type": "customer_reply"
|
|
1259
|
+
},
|
|
1260
|
+
"stopOnResponse": false,
|
|
1261
|
+
"_design": "The exit workflow. The moment a contact replies on any channel: pull them out of every sequence, write a note, mark contacted, alert a real person and create a reply task with a 15-minute target.",
|
|
1262
|
+
"actions": [
|
|
1263
|
+
{
|
|
1264
|
+
"type": "remove_from_workflow",
|
|
1265
|
+
"workflowRef": "workflow.speed_to_lead"
|
|
1266
|
+
},
|
|
1267
|
+
{
|
|
1268
|
+
"type": "remove_from_workflow",
|
|
1269
|
+
"workflowRef": "workflow.missed_call",
|
|
1270
|
+
"conditionalOn": "channels.sms == true"
|
|
1271
|
+
},
|
|
1272
|
+
{
|
|
1273
|
+
"type": "remove_from_workflow",
|
|
1274
|
+
"workflowRef": "workflow.lead_nurture"
|
|
1275
|
+
},
|
|
1276
|
+
{
|
|
1277
|
+
"type": "remove_from_workflow",
|
|
1278
|
+
"workflowRef": "workflow.win_back"
|
|
1279
|
+
},
|
|
1280
|
+
{
|
|
1281
|
+
"type": "remove_from_workflow",
|
|
1282
|
+
"workflowRef": "workflow.no_show",
|
|
1283
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
1284
|
+
},
|
|
1285
|
+
{
|
|
1286
|
+
"type": "add_notes",
|
|
1287
|
+
"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."
|
|
1288
|
+
},
|
|
1289
|
+
{
|
|
1290
|
+
"type": "add_contact_tag",
|
|
1291
|
+
"tagRef": "tag.lc_contacted"
|
|
1292
|
+
},
|
|
1293
|
+
{
|
|
1294
|
+
"type": "internal_notification",
|
|
1295
|
+
"userRef": "user.owner",
|
|
1296
|
+
"title": "{{contact.first_name}} replied",
|
|
1297
|
+
"body": "{{contact.first_name}} {{contact.last_name}} replied. All automated sequences stopped. Answer within 15 minutes: {{contact.phone}}"
|
|
1298
|
+
},
|
|
1299
|
+
{
|
|
1300
|
+
"type": "task_notification",
|
|
1301
|
+
"userRef": "user.owner",
|
|
1302
|
+
"title": "Reply to {{contact.first_name}} (15-minute target)",
|
|
1303
|
+
"body": "They replied to a message. Read the conversation, answer the question they asked, and offer one concrete time.",
|
|
1304
|
+
"dueDate": "1"
|
|
1305
|
+
}
|
|
1306
|
+
]
|
|
1307
|
+
},
|
|
1308
|
+
{
|
|
1309
|
+
"ref": "workflow.win_back",
|
|
1310
|
+
"name": "Win-back (30 days)",
|
|
1311
|
+
"trigger": {
|
|
1312
|
+
"type": "contact_tag",
|
|
1313
|
+
"tagRef": "tag.winback_start"
|
|
1314
|
+
},
|
|
1315
|
+
"stopOnResponse": true,
|
|
1316
|
+
"_design": "Starts from the Lead Nurture (or No-Show Rescue) hand-off tag. 5 touches across 31 days of waits, low pressure, one reason to come back per message. Ends by tagging lost. Any reply stops it.",
|
|
1317
|
+
"actions": [
|
|
1318
|
+
{
|
|
1319
|
+
"type": "remove_contact_tag",
|
|
1320
|
+
"tagRef": "tag.winback_start"
|
|
1321
|
+
},
|
|
1322
|
+
{
|
|
1323
|
+
"type": "send_email",
|
|
1324
|
+
"emailRef": "email.w_email_1"
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
"type": "wait",
|
|
1328
|
+
"value": 7,
|
|
1329
|
+
"unit": "days"
|
|
1330
|
+
},
|
|
1331
|
+
{
|
|
1332
|
+
"type": "send_sms",
|
|
1333
|
+
"smsRef": "sms.w_sms_1",
|
|
1334
|
+
"conditionalOn": "channels.sms == true"
|
|
1335
|
+
},
|
|
1336
|
+
{
|
|
1337
|
+
"type": "wait",
|
|
1338
|
+
"value": 7,
|
|
1339
|
+
"unit": "days"
|
|
1340
|
+
},
|
|
1341
|
+
{
|
|
1342
|
+
"type": "send_email",
|
|
1343
|
+
"emailRef": "email.w_email_2"
|
|
1344
|
+
},
|
|
1345
|
+
{
|
|
1346
|
+
"type": "wait",
|
|
1347
|
+
"value": 8,
|
|
1348
|
+
"unit": "days"
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
"type": "send_sms",
|
|
1352
|
+
"smsRef": "sms.w_sms_2",
|
|
1353
|
+
"conditionalOn": "channels.sms == true"
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
"type": "wait",
|
|
1357
|
+
"value": 8,
|
|
1358
|
+
"unit": "days"
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
"type": "send_email",
|
|
1362
|
+
"emailRef": "email.w_email_3"
|
|
1363
|
+
},
|
|
1364
|
+
{
|
|
1365
|
+
"type": "wait",
|
|
1366
|
+
"value": 1,
|
|
1367
|
+
"unit": "days"
|
|
1368
|
+
},
|
|
1369
|
+
{
|
|
1370
|
+
"type": "add_notes",
|
|
1371
|
+
"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."
|
|
1372
|
+
},
|
|
1373
|
+
{
|
|
1374
|
+
"type": "add_contact_tag",
|
|
1375
|
+
"tagRef": "tag.lc_lost"
|
|
1376
|
+
}
|
|
1377
|
+
]
|
|
1378
|
+
},
|
|
1379
|
+
{
|
|
1380
|
+
"ref": "workflow.appointment_booked",
|
|
1381
|
+
"name": "Call Booked - Confirm & Move",
|
|
1382
|
+
"trigger": {
|
|
1383
|
+
"type": "appointment",
|
|
1384
|
+
"appointmentStatus": "confirmed",
|
|
1385
|
+
"calendarRef": "calendar.discovery"
|
|
1386
|
+
},
|
|
1387
|
+
"stopOnResponse": false,
|
|
1388
|
+
"_design": "On a confirmed booking: stop every sequence, tag booked, alert a real person, send the confirmation email and text, then find the opportunity and move it to the booked stage (create it there if none exists).",
|
|
1389
|
+
"actions": [
|
|
1390
|
+
{
|
|
1391
|
+
"type": "remove_from_workflow",
|
|
1392
|
+
"workflowRef": "workflow.speed_to_lead"
|
|
1393
|
+
},
|
|
1394
|
+
{
|
|
1395
|
+
"type": "remove_from_workflow",
|
|
1396
|
+
"workflowRef": "workflow.lead_nurture"
|
|
1397
|
+
},
|
|
1398
|
+
{
|
|
1399
|
+
"type": "remove_from_workflow",
|
|
1400
|
+
"workflowRef": "workflow.win_back"
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
"type": "add_contact_tag",
|
|
1404
|
+
"tagRef": "tag.lc_booked"
|
|
1405
|
+
},
|
|
1406
|
+
{
|
|
1407
|
+
"type": "internal_notification",
|
|
1408
|
+
"userRef": "user.owner",
|
|
1409
|
+
"title": "Call booked: {{contact.first_name}}",
|
|
1410
|
+
"body": "{{contact.first_name}} {{contact.last_name}} booked a call for {{appointment.start_time}}. Confirmation sent."
|
|
1411
|
+
},
|
|
1412
|
+
{
|
|
1413
|
+
"type": "send_email",
|
|
1414
|
+
"emailRef": "email.appt_confirm_email"
|
|
1415
|
+
},
|
|
1416
|
+
{
|
|
1417
|
+
"type": "send_sms",
|
|
1418
|
+
"smsRef": "sms.appt_confirm_sms",
|
|
1419
|
+
"conditionalOn": "channels.sms == true"
|
|
1420
|
+
},
|
|
1421
|
+
{
|
|
1422
|
+
"type": "find_opportunity",
|
|
1423
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1424
|
+
"found": [
|
|
1425
|
+
{
|
|
1426
|
+
"type": "update_opportunity",
|
|
1427
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1428
|
+
"stageRef": "stage.call_booked"
|
|
1429
|
+
}
|
|
1430
|
+
],
|
|
1431
|
+
"notFound": [
|
|
1432
|
+
{
|
|
1433
|
+
"type": "create_opportunity",
|
|
1434
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1435
|
+
"stageRef": "stage.call_booked",
|
|
1436
|
+
"name": "{{contact.name}} - Call Booked"
|
|
1437
|
+
}
|
|
1438
|
+
]
|
|
1439
|
+
}
|
|
1440
|
+
],
|
|
1441
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
"ref": "workflow.appointment_reminders",
|
|
1445
|
+
"name": "Call Reminders",
|
|
1446
|
+
"trigger": {
|
|
1447
|
+
"type": "appointment",
|
|
1448
|
+
"appointmentStatus": "confirmed",
|
|
1449
|
+
"calendarRef": "calendar.discovery"
|
|
1450
|
+
},
|
|
1451
|
+
"stopOnResponse": false,
|
|
1452
|
+
"_design": "Same trigger as Confirm & Move, kept separate so the timers stay simple: 24 hours before (text + prep email) and 2 hours before (text). Appointment-relative waits only work under an appointment trigger.",
|
|
1453
|
+
"actions": [
|
|
1454
|
+
{
|
|
1455
|
+
"type": "wait_appointment",
|
|
1456
|
+
"value": 1,
|
|
1457
|
+
"unit": "days"
|
|
1458
|
+
},
|
|
1459
|
+
{
|
|
1460
|
+
"type": "send_sms",
|
|
1461
|
+
"smsRef": "sms.appt_24h_sms",
|
|
1462
|
+
"conditionalOn": "channels.sms == true"
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
"type": "send_email",
|
|
1466
|
+
"emailRef": "email.appt_prep_email"
|
|
1467
|
+
},
|
|
1468
|
+
{
|
|
1469
|
+
"type": "wait_appointment",
|
|
1470
|
+
"value": 2,
|
|
1471
|
+
"unit": "hours"
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
"type": "send_sms",
|
|
1475
|
+
"smsRef": "sms.appt_2h_sms",
|
|
1476
|
+
"conditionalOn": "channels.sms == true"
|
|
1477
|
+
}
|
|
1478
|
+
],
|
|
1479
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
"ref": "workflow.no_show",
|
|
1483
|
+
"name": "No-Show Rescue",
|
|
1484
|
+
"trigger": {
|
|
1485
|
+
"type": "appointment",
|
|
1486
|
+
"appointmentStatus": "noshow",
|
|
1487
|
+
"calendarRef": "calendar.discovery"
|
|
1488
|
+
},
|
|
1489
|
+
"stopOnResponse": true,
|
|
1490
|
+
"_design": "On a no-show: tag, alert, call-back task, a warm text and email the same day, a second text next day, a last email 3 days later; then tag lapsed, hand off to Win-back, and move the opportunity back to Contacted (find_opportunity is last because its branches do not rejoin).",
|
|
1491
|
+
"actions": [
|
|
1492
|
+
{
|
|
1493
|
+
"type": "add_contact_tag",
|
|
1494
|
+
"tagRef": "tag.no_show"
|
|
1495
|
+
},
|
|
1496
|
+
{
|
|
1497
|
+
"type": "internal_notification",
|
|
1498
|
+
"userRef": "user.owner",
|
|
1499
|
+
"title": "No-show: {{contact.first_name}}",
|
|
1500
|
+
"body": "{{contact.first_name}} {{contact.last_name}} missed their call. A rebook text and email went out. Call-back task created."
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
"type": "task_notification",
|
|
1504
|
+
"userRef": "user.owner",
|
|
1505
|
+
"title": "Call {{contact.first_name}} (no-show)",
|
|
1506
|
+
"body": "Missed call. Call, no guilt, offer two new times.",
|
|
1507
|
+
"dueDate": "1"
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
"type": "send_sms",
|
|
1511
|
+
"smsRef": "sms.ns_sms_1",
|
|
1512
|
+
"conditionalOn": "channels.sms == true"
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
"type": "send_email",
|
|
1516
|
+
"emailRef": "email.ns_email_1"
|
|
1517
|
+
},
|
|
1518
|
+
{
|
|
1519
|
+
"type": "wait",
|
|
1520
|
+
"value": 1,
|
|
1521
|
+
"unit": "days"
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
"type": "send_sms",
|
|
1525
|
+
"smsRef": "sms.ns_sms_2",
|
|
1526
|
+
"conditionalOn": "channels.sms == true"
|
|
1527
|
+
},
|
|
1528
|
+
{
|
|
1529
|
+
"type": "wait",
|
|
1530
|
+
"value": 3,
|
|
1531
|
+
"unit": "days"
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
"type": "send_email",
|
|
1535
|
+
"emailRef": "email.ns_email_2"
|
|
1536
|
+
},
|
|
1537
|
+
{
|
|
1538
|
+
"type": "wait",
|
|
1539
|
+
"value": 3,
|
|
1540
|
+
"unit": "days"
|
|
1541
|
+
},
|
|
1542
|
+
{
|
|
1543
|
+
"type": "add_notes",
|
|
1544
|
+
"body": "No-Show Rescue finished with no reply (4 touches over 7 days). Tagged lapsed; Win-back starts from the winback-start tag."
|
|
1545
|
+
},
|
|
1546
|
+
{
|
|
1547
|
+
"type": "add_contact_tag",
|
|
1548
|
+
"tagRef": "tag.lc_lapsed"
|
|
1549
|
+
},
|
|
1550
|
+
{
|
|
1551
|
+
"type": "add_contact_tag",
|
|
1552
|
+
"tagRef": "tag.winback_start"
|
|
1553
|
+
},
|
|
1554
|
+
{
|
|
1555
|
+
"type": "find_opportunity",
|
|
1556
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1557
|
+
"found": [
|
|
1558
|
+
{
|
|
1559
|
+
"type": "update_opportunity",
|
|
1560
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1561
|
+
"stageRef": "stage.contacted"
|
|
1562
|
+
}
|
|
1563
|
+
],
|
|
1564
|
+
"notFound": []
|
|
1565
|
+
}
|
|
1566
|
+
],
|
|
1567
|
+
"conditionalOn": "goal.bookingNeeded == true"
|
|
1568
|
+
}
|
|
1569
|
+
],
|
|
1570
|
+
"handoffs": [
|
|
1571
|
+
{
|
|
1572
|
+
"ref": "handoff.add_staff",
|
|
1573
|
+
"conditionalOn": "staff is empty",
|
|
1574
|
+
"owner": "OPERATOR-UI",
|
|
1575
|
+
"title": "Add the people who get lead alerts and call tasks",
|
|
1576
|
+
"trigger": "the brief listed no staff",
|
|
1577
|
+
"instruction": "In the sub-account go to Settings > My Staff and add at least one user (yourself is fine): name, email, role. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1578
|
+
"produces": null,
|
|
1579
|
+
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1580
|
+
"blocks": [
|
|
1581
|
+
"workflow.speed_to_lead",
|
|
1582
|
+
"workflow.reply_route",
|
|
1583
|
+
"workflow.appointment_booked",
|
|
1584
|
+
"workflow.no_show",
|
|
1585
|
+
"workflow.missed_call"
|
|
1586
|
+
],
|
|
1587
|
+
"_blocksNote": "Workflows with a notification or task pointed at user.__pending__ stay DRAFT until a real user is assigned. Prune entries whose workflow was dropped by conditional pruning."
|
|
1588
|
+
},
|
|
1589
|
+
{
|
|
1590
|
+
"ref": "handoff.phone_number",
|
|
1591
|
+
"conditionalOn": "flags includes phone_number_needed",
|
|
1592
|
+
"owner": "OPERATOR-UI",
|
|
1593
|
+
"title": "Get a phone number in GoHighLevel (so texts and missed-call text-back can work)",
|
|
1594
|
+
"trigger": "channels.sms == true && channels.hasPhoneNumber != yes",
|
|
1595
|
+
"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.",
|
|
1596
|
+
"produces": "cv.business_phone",
|
|
1597
|
+
"successCheck": "A number shows under Phone Numbers and business_phone matches it",
|
|
1598
|
+
"blocks": [
|
|
1599
|
+
"workflow.speed_to_lead",
|
|
1600
|
+
"workflow.missed_call",
|
|
1601
|
+
"workflow.lead_nurture",
|
|
1602
|
+
"workflow.win_back",
|
|
1603
|
+
"workflow.appointment_booked",
|
|
1604
|
+
"workflow.appointment_reminders",
|
|
1605
|
+
"workflow.no_show"
|
|
1606
|
+
]
|
|
1607
|
+
},
|
|
1608
|
+
{
|
|
1609
|
+
"ref": "handoff.business_details",
|
|
1610
|
+
"owner": "OPERATOR-UI",
|
|
1611
|
+
"title": "Confirm your business phone and the name messages are signed with",
|
|
1612
|
+
"trigger": "always (30 seconds)",
|
|
1613
|
+
"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.",
|
|
1614
|
+
"produces": "cv.owner_first_name",
|
|
1615
|
+
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1616
|
+
"blocks": [
|
|
1617
|
+
"cv.owner_first_name"
|
|
1618
|
+
]
|
|
1619
|
+
},
|
|
1620
|
+
{
|
|
1621
|
+
"ref": "handoff.calendar_oauth",
|
|
1622
|
+
"conditionalOn": "flags includes calendar_oauth_needed && goal.bookingNeeded == true",
|
|
1623
|
+
"owner": "OPERATOR-UI",
|
|
1624
|
+
"title": "Connect your calendar (Google / Outlook)",
|
|
1625
|
+
"trigger": "goal.bookingNeeded == true && channels.calendarConnected == false",
|
|
1626
|
+
"instruction": "Open the Discovery Call 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.",
|
|
1627
|
+
"produces": "cv.booking_link",
|
|
1628
|
+
"successCheck": "Calendar shows a connected external account and the booking link resolves",
|
|
1629
|
+
"blocks": [
|
|
1630
|
+
"cv.booking_link"
|
|
1631
|
+
]
|
|
1632
|
+
},
|
|
1633
|
+
{
|
|
1634
|
+
"ref": "handoff.assign_calendar_staff",
|
|
1635
|
+
"conditionalOn": "business.teamSize != 'Just me' && goal.bookingNeeded == true",
|
|
1636
|
+
"owner": "OPERATOR-UI",
|
|
1637
|
+
"title": "Assign who takes calls on the calendar",
|
|
1638
|
+
"trigger": "a team account: Blueprint will not guess who books",
|
|
1639
|
+
"instruction": "Open the Discovery Call calendar > Team and add the people who take these appointments. Blueprint auto-assigns only when the account has exactly one user.",
|
|
1640
|
+
"produces": null,
|
|
1641
|
+
"successCheck": "The calendar has at least one assigned team member",
|
|
1642
|
+
"blocks": [
|
|
1643
|
+
"calendar.discovery"
|
|
1644
|
+
]
|
|
1645
|
+
},
|
|
1646
|
+
{
|
|
1647
|
+
"ref": "handoff.a2p",
|
|
1648
|
+
"conditionalOn": "flags includes needs_a2p",
|
|
1649
|
+
"owner": "OPERATOR-EXT",
|
|
1650
|
+
"title": "Register A2P 10DLC (so texts can send)",
|
|
1651
|
+
"trigger": "channels.sms == true",
|
|
1652
|
+
"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.",
|
|
1653
|
+
"produces": null,
|
|
1654
|
+
"successCheck": "A2P campaign status shows submitted or approved",
|
|
1655
|
+
"blocks": [
|
|
1656
|
+
"workflow.speed_to_lead",
|
|
1657
|
+
"workflow.missed_call",
|
|
1658
|
+
"workflow.lead_nurture",
|
|
1659
|
+
"workflow.win_back",
|
|
1660
|
+
"workflow.appointment_booked",
|
|
1661
|
+
"workflow.appointment_reminders",
|
|
1662
|
+
"workflow.no_show",
|
|
1663
|
+
"sms.stl_sms_1",
|
|
1664
|
+
"sms.stl_sms_2",
|
|
1665
|
+
"sms.stl_sms_3",
|
|
1666
|
+
"sms.mc_sms_1",
|
|
1667
|
+
"sms.mc_sms_2",
|
|
1668
|
+
"sms.n_sms_1",
|
|
1669
|
+
"sms.n_sms_2",
|
|
1670
|
+
"sms.n_sms_3",
|
|
1671
|
+
"sms.n_sms_4",
|
|
1672
|
+
"sms.n_sms_5",
|
|
1673
|
+
"sms.w_sms_1",
|
|
1674
|
+
"sms.w_sms_2",
|
|
1675
|
+
"sms.appt_confirm_sms",
|
|
1676
|
+
"sms.appt_24h_sms",
|
|
1677
|
+
"sms.appt_2h_sms",
|
|
1678
|
+
"sms.ns_sms_1",
|
|
1679
|
+
"sms.ns_sms_2"
|
|
1680
|
+
],
|
|
1681
|
+
"_blocksNote": "Lists every SMS-bearing WORKFLOW ref (so they stay DRAFT) plus the sms.* asset refs. After conditional pruning, drop any entry whose workflow/asset was removed."
|
|
1682
|
+
},
|
|
1683
|
+
{
|
|
1684
|
+
"ref": "handoff.stripe",
|
|
1685
|
+
"conditionalOn": "flags includes stripe_not_connected",
|
|
1686
|
+
"owner": "OPERATOR-EXT",
|
|
1687
|
+
"title": "Connect Stripe (to enroll clients)",
|
|
1688
|
+
"trigger": "channels.payment != 'Stripe connected'",
|
|
1689
|
+
"instruction": "Connect Stripe under Payments > Integrations and create your program products and payment plans so enrollment can happen on the call. The funnel is built; the money connection is yours to authorize.",
|
|
1690
|
+
"produces": null,
|
|
1691
|
+
"successCheck": "Stripe shows connected and program products exist",
|
|
1692
|
+
"blocks": []
|
|
1693
|
+
},
|
|
1694
|
+
{
|
|
1695
|
+
"ref": "handoff.email_domain",
|
|
1696
|
+
"conditionalOn": "flags includes email_domain_needed",
|
|
1697
|
+
"owner": "OPERATOR-UI",
|
|
1698
|
+
"title": "Set up your sending email",
|
|
1699
|
+
"trigger": "channels.email == false",
|
|
1700
|
+
"instruction": "Connect a sending domain / mailbox in Settings > Email Services so every email below sends from your address instead of a default.",
|
|
1701
|
+
"produces": null,
|
|
1702
|
+
"successCheck": "A verified sending domain / from-address exists",
|
|
1703
|
+
"blocks": [
|
|
1704
|
+
"email.stl_email_1",
|
|
1705
|
+
"email.stl_email_2",
|
|
1706
|
+
"email.n_email_1",
|
|
1707
|
+
"email.n_email_2",
|
|
1708
|
+
"email.n_email_3",
|
|
1709
|
+
"email.n_email_4",
|
|
1710
|
+
"email.n_email_5",
|
|
1711
|
+
"email.n_email_6",
|
|
1712
|
+
"email.w_email_1",
|
|
1713
|
+
"email.w_email_2",
|
|
1714
|
+
"email.w_email_3",
|
|
1715
|
+
"email.appt_confirm_email",
|
|
1716
|
+
"email.appt_prep_email",
|
|
1717
|
+
"email.ns_email_1",
|
|
1718
|
+
"email.ns_email_2"
|
|
1719
|
+
]
|
|
1720
|
+
}
|
|
1721
|
+
]
|
|
1722
|
+
}
|
|
1723
|
+
}
|