@elitedcs/ghl-mcp 3.89.0-beta.3 → 3.89.0-beta.5

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.
@@ -0,0 +1,3906 @@
1
+ {
2
+ "presetId": "wellness_clinic",
3
+ "presetVersion": "1.0.0",
4
+ "schemaVersion": "0.1",
5
+ "title": "Wellness Clinic",
6
+ "description": "A trial-to-program system for red light, body contouring, IV, peptide, longevity and recovery clinics, built from live wellness trial accounts (read 2026-09-29). Patient Journey pipeline (10 stages), a 90-minute trial calendar with 24 hours' notice and a deposit, an A2P-ready trial form with two separate consent boxes, and 19 workflows: Speed to Lead (booking link in seconds, 4 and 24 hour nudges), Missed Call Text-Back, Lead Nurture (31 days), Win-back (31 days, led by the best-performing real first text), exact-match N / STOP / TEAM / BOOK reply routing, trial booking, reminders, balance, cancel and no-show rescue, the 72-hour program follow-up, program confirmation and a review request. Real copy wherever a live account had it; everything else marked proposed. No health or weight claims, no named testimonials, no text-to-pay for programs.",
7
+ "default": false,
8
+ "selectors": {
9
+ "businessTypes": [
10
+ "Wellness clinic",
11
+ "Red light therapy",
12
+ "Body contouring",
13
+ "IV therapy",
14
+ "IV hydration",
15
+ "Peptide clinic",
16
+ "Longevity clinic",
17
+ "Recovery studio"
18
+ ],
19
+ "aliases": [
20
+ "wellness",
21
+ "wellness_clinic",
22
+ "red_light",
23
+ "rlt",
24
+ "body_contouring",
25
+ "iv_therapy",
26
+ "peptides"
27
+ ]
28
+ },
29
+ "source": "Built 2026-09-29 from live wellness trial accounts: a red-light trial clinic's 46 published workflows, pipeline, calendar, products and custom values (read-only), two sister accounts running the same paid-trial-with-deposit offer, and the agency's own texting lessons (A2P, opt-out and link-blocking). Every message template carries a _source note: PATTERN describes the live pattern it follows (never its wording); [NO REAL SOURCE: proposed] means no live example exists. The event-only launch system stays in the launch-event preset.",
30
+ "conventions": {
31
+ "triggerTokens": "Use ONLY the executor's native trigger types: contact_tag, form_submission, appointment (confirmed / showed / noshow / cancelled), customer_reply (optionally replyKeywords, an exact-match list), pipeline_stage_updated, call_status, payment_received.",
32
+ "handoffTag": "Sequences hand off with add_contact_tag + a contact_tag trigger (nurture-start, winback-start, service-complete), never add_to_workflow (preset-format section 7 bans only that). A booking pulls the lead out with remove_from_workflow (Speed to Lead, Lead Nurture, Win-back, No-Show Rescue), exactly as med-spa's booking workflow does, and Program Sold removes the 72-hour follow-up. Every sequence also stops on reply by itself (stopOnResponse).",
33
+ "nurtureSpan": "Lead Nurture waits sum to 31 days and Win-back waits to 31 days (owner rule: nothing under 30). Speed to Lead ends with the nurture-start hand-off tag.",
34
+ "staff": "Every internal_notification, task_notification and assign_user carries userRef user.owner (a role placeholder resolved from brief.team). No staff = user.__pending__, the step is kept and handoff.add_staff holds the workflow DRAFT.",
35
+ "a2pGating": "handoff.a2p.blocks lists every SMS-bearing workflow ref, so nothing texts before A2P approval. Use case Low Volume Mixed; the website form with two separate unchecked consent boxes is the only opt-in.",
36
+ "claims": "No outcome claim of any kind in the preset copy, and never a pain, inflammation, sleep, weight-loss or fat-loss claim. The live drip's health-claim text is deliberately not carried. A client quote is never put into a message by the build, even with written consent: a consented quote is carried on handoff.claims_review for a person to read first.",
37
+ "quotesNeverAutomatic": true,
38
+ "gsm7": "No em dashes, en dashes or curly quotes in any SMS: one of them forces UCS-2 billing (a live account went from 22 to 47 segments per contact). The composer also straightens them in brief values filled into SMS.",
39
+ "optOut": "Every marketing text carries its own line starting 'Reply N' that says what N does ('Reply N to stop these texts.'), and N does it: Replied N takes the contact out of every marketing sequence (rehearsal 4 audit E6). GoHighLevel appends STOP only to the first message. The first text of a sequence puts N on its own line. Appointment and payment facts (confirmations, reminders, balance) are transactional and carry none.",
40
+ "keywords": "Reply keywords are exact-match lists (GoHighLevel 'Exact match phrase'), never 'contains'. The lists are the live account's own.",
41
+ "links": "Booking links only via {{custom_values.booking_link}}, on a domain at least 30 days old (handoff.link_domain): links on a new domain were carrier-blocked (error 30007) and GoHighLevel never retries.",
42
+ "noTextToPay": "Programs are paid in person (card reader or financing). The only payment link any text carries is the trial balance ({{custom_values.balance_payment_link}}).",
43
+ "copy": "All copy lives in templates.* and is COMPLETE. The build stage may rewrite for the brief's voice, but must keep every rule above, the merge fields, the single CTA and the opt-out lines.",
44
+ "fortyCap": "Max 40 actions per workflow. The longest here is Lead Nurture at 35 actions."
45
+ },
46
+ "skeleton": {
47
+ "users": {
48
+ "fillFrom": "team.staff",
49
+ "transform": "userList",
50
+ "default": [],
51
+ "_note": "One plan user per brief.team.staff[] entry. user.owner is a ROLE PLACEHOLDER resolved per step (notifications -> team.notifyName; tasks and assignment -> team.callsName; calendars -> that calendar's staffNames). No staff = user.__pending__ and the step is kept."
52
+ },
53
+ "pipelines": [
54
+ {
55
+ "ref": "pipeline.patient_journey",
56
+ "name": "{{business.name}} Patient Journey || Trial to Program",
57
+ "stages": {
58
+ "fillFrom": "goal.salesStages",
59
+ "transform": "stageList",
60
+ "_stagesNote": "The live account's 15 stages trimmed to 10: Canceled and Rescheduled became tags, and the DBR-only stages (Active In DBR, Completed DBR) stay in the launch-event preset. No Program Yet is matched onto a client's 'No sale' stage through the follow-up workflow's stagePreference, and Not Interested onto 'Lost' through the N workflow's.",
61
+ "default": [
62
+ {
63
+ "ref": "stage.new_lead",
64
+ "name": "New Lead",
65
+ "aliases": [
66
+ "new lead",
67
+ "new inquiry",
68
+ "inquiry",
69
+ "new",
70
+ "lead",
71
+ "prospect",
72
+ "dbr lead"
73
+ ]
74
+ },
75
+ {
76
+ "ref": "stage.contacted",
77
+ "name": "Replied / Engaged",
78
+ "aliases": [
79
+ "replied",
80
+ "contacted",
81
+ "engaged",
82
+ "in conversation",
83
+ "interested",
84
+ "working"
85
+ ]
86
+ },
87
+ {
88
+ "ref": "stage.link_sent",
89
+ "name": "Booking Link Sent",
90
+ "aliases": [
91
+ "booking link sent",
92
+ "link sent",
93
+ "invited"
94
+ ]
95
+ },
96
+ {
97
+ "ref": "stage.trial_booked",
98
+ "name": "Trial Booked",
99
+ "aliases": [
100
+ "trial booked",
101
+ "deposit paid",
102
+ "consult booked",
103
+ "appointment booked",
104
+ "booked",
105
+ "scheduled",
106
+ "deposit",
107
+ "=consultation"
108
+ ],
109
+ "conditionalOn": "goal.bookingNeeded == true"
110
+ },
111
+ {
112
+ "ref": "stage.showed",
113
+ "name": "Trial Completed",
114
+ "aliases": [
115
+ "trial showed",
116
+ "trial completed",
117
+ "trial done",
118
+ "showed",
119
+ "visited",
120
+ "attended",
121
+ "completed",
122
+ "consultation completed",
123
+ "consultation done",
124
+ "consultation attended",
125
+ "consultation showed",
126
+ "consultation complete",
127
+ "consultation held"
128
+ ],
129
+ "conditionalOn": "goal.bookingNeeded == true"
130
+ },
131
+ {
132
+ "ref": "stage.program_sold",
133
+ "name": "Program Sold",
134
+ "aliases": [
135
+ "program sold",
136
+ "package sold",
137
+ "sold",
138
+ "purchased",
139
+ "member",
140
+ "program",
141
+ "package"
142
+ ]
143
+ },
144
+ {
145
+ "ref": "stage.no_sale",
146
+ "name": "No Program Yet - Follow Up",
147
+ "aliases": [
148
+ "no program",
149
+ "no sale",
150
+ "no package",
151
+ "not sold",
152
+ "follow up",
153
+ "thinking"
154
+ ]
155
+ },
156
+ {
157
+ "ref": "stage.no_show",
158
+ "name": "No Show",
159
+ "aliases": [
160
+ "no show",
161
+ "noshow",
162
+ "missed appointment",
163
+ "did not show",
164
+ "missed"
165
+ ],
166
+ "conditionalOn": "goal.bookingNeeded == true"
167
+ },
168
+ {
169
+ "ref": "stage.not_interested",
170
+ "name": "Not Interested",
171
+ "aliases": [
172
+ "not interested",
173
+ "opted out"
174
+ ]
175
+ },
176
+ {
177
+ "ref": "stage.lost",
178
+ "name": "Lost / DND",
179
+ "aliases": [
180
+ "lost",
181
+ "dnd",
182
+ "do not disturb",
183
+ "closed lost",
184
+ "dead"
185
+ ]
186
+ }
187
+ ]
188
+ }
189
+ }
190
+ ],
191
+ "customFields": [
192
+ {
193
+ "ref": "field.lead_source",
194
+ "name": "Lead Source",
195
+ "dataType": "SINGLE_OPTIONS",
196
+ "model": "contact",
197
+ "options": [
198
+ "Website",
199
+ "Facebook / Instagram ad",
200
+ "Google",
201
+ "Referral",
202
+ "Past patient list",
203
+ "Walk-in",
204
+ "Other"
205
+ ]
206
+ },
207
+ {
208
+ "ref": "field.service_interest",
209
+ "name": "Service Interest",
210
+ "dataType": "MULTIPLE_OPTIONS",
211
+ "model": "contact",
212
+ "options": [
213
+ "Red Light / Body Contouring",
214
+ "IV Therapy",
215
+ "Peptides",
216
+ "Recovery Support",
217
+ "Skin / Anti-Aging",
218
+ "Other"
219
+ ],
220
+ "_optionsNote": "Live 'Intake - Interested In', reworded: its weight-loss and metabolism options are left out. Mirror these with the interest-* tags; the build may trim to brief.offer.modalities."
221
+ },
222
+ {
223
+ "ref": "field.body_focus",
224
+ "name": "Body Focus Areas",
225
+ "dataType": "MULTIPLE_OPTIONS",
226
+ "model": "contact",
227
+ "options": [
228
+ "Abdomen",
229
+ "Thighs",
230
+ "Arms",
231
+ "Hips",
232
+ "Back",
233
+ "Chin / Neck",
234
+ "Other"
235
+ ]
236
+ },
237
+ {
238
+ "ref": "field.goal_timeline",
239
+ "name": "Goal Timeline",
240
+ "dataType": "SINGLE_OPTIONS",
241
+ "model": "contact",
242
+ "options": [
243
+ "As soon as possible",
244
+ "Within a few months",
245
+ "No specific timeline"
246
+ ]
247
+ },
248
+ {
249
+ "ref": "field.screening_ok",
250
+ "name": "Screening Confirmed",
251
+ "dataType": "CHECKBOX",
252
+ "model": "contact",
253
+ "options": [
254
+ "I confirm none of the listed conditions apply to me"
255
+ ]
256
+ },
257
+ {
258
+ "ref": "field.results_vary",
259
+ "name": "Results Vary Understood",
260
+ "dataType": "CHECKBOX",
261
+ "model": "contact",
262
+ "options": [
263
+ "I understand results vary"
264
+ ]
265
+ },
266
+ {
267
+ "ref": "field.program_recommended",
268
+ "name": "Program Recommended",
269
+ "dataType": "SINGLE_OPTIONS",
270
+ "model": "contact",
271
+ "options": [
272
+ "{{offer.programs[0].name || Program 1}}",
273
+ "{{offer.programs[1].name || Program 2}}",
274
+ "Other"
275
+ ],
276
+ "_optionsNote": "Program names from the intake, WITHOUT prices (a priced label goes stale the day the price changes)."
277
+ },
278
+ {
279
+ "ref": "field.visit_outcome",
280
+ "name": "Visit Outcome",
281
+ "dataType": "SINGLE_OPTIONS",
282
+ "model": "contact",
283
+ "options": [
284
+ "Program Sold",
285
+ "No Sale"
286
+ ]
287
+ },
288
+ {
289
+ "ref": "field.payment_method",
290
+ "name": "Payment Method",
291
+ "dataType": "SINGLE_OPTIONS",
292
+ "model": "contact",
293
+ "options": [
294
+ "Card reader",
295
+ "Financing (CareCredit / Cherry)",
296
+ "Card on file",
297
+ "Cash",
298
+ "Check",
299
+ "Other"
300
+ ],
301
+ "_optionsNote": "No text-to-pay option on purpose."
302
+ },
303
+ {
304
+ "ref": "field.program_value",
305
+ "name": "Program Sold Value",
306
+ "dataType": "MONETORY",
307
+ "model": "contact"
308
+ },
309
+ {
310
+ "ref": "field.appointment_date",
311
+ "name": "Appointment Date",
312
+ "dataType": "DATE",
313
+ "model": "contact",
314
+ "conditionalOn": "goal.bookingNeeded == true"
315
+ },
316
+ {
317
+ "ref": "field.consent_transactional",
318
+ "name": "SMS Consent - Transactional",
319
+ "dataType": "CHECKBOX",
320
+ "model": "contact",
321
+ "options": [
322
+ "Yes, {{business.name}} may text me about my inquiry, bookings and visits, such as confirmations and reminders. How often varies. Msg & data rates may apply. Text HELP for help or STOP to stop."
323
+ ],
324
+ "_source": "PATTERN: the approved A2P submission of a live red-light trial account: a separate, unticked box for service texts, naming the business, the message types, that frequency varies, rates, HELP and STOP."
325
+ },
326
+ {
327
+ "ref": "field.consent_marketing",
328
+ "name": "SMS Consent - Marketing",
329
+ "dataType": "CHECKBOX",
330
+ "model": "contact",
331
+ "options": [
332
+ "Yes, {{business.name}} may send me marketing texts, such as offers, program news and event invitations. How often varies. Msg & data rates may apply. Text HELP for help or STOP to stop."
333
+ ],
334
+ "_source": "PATTERN: the approved A2P submission of a live red-light trial account: a separate, unticked box for marketing texts, naming the business, the message types, that frequency varies, rates, HELP and STOP."
335
+ }
336
+ ],
337
+ "tags": [
338
+ {
339
+ "ref": "tag.source_website",
340
+ "name": "source-website"
341
+ },
342
+ {
343
+ "ref": "tag.source_facebook",
344
+ "name": "source-facebook"
345
+ },
346
+ {
347
+ "ref": "tag.source_instagram",
348
+ "name": "source-instagram"
349
+ },
350
+ {
351
+ "ref": "tag.source_google",
352
+ "name": "source-google"
353
+ },
354
+ {
355
+ "ref": "tag.source_referral",
356
+ "name": "source-referral"
357
+ },
358
+ {
359
+ "ref": "tag.source_past_patient",
360
+ "name": "source-past-patient"
361
+ },
362
+ {
363
+ "ref": "tag.source_phone",
364
+ "name": "source-phone"
365
+ },
366
+ {
367
+ "ref": "tag.source_other",
368
+ "name": "source-other"
369
+ },
370
+ {
371
+ "ref": "tag.lc_new_lead",
372
+ "name": "lifecycle-new-lead"
373
+ },
374
+ {
375
+ "ref": "tag.lc_replied",
376
+ "name": "lifecycle-replied"
377
+ },
378
+ {
379
+ "ref": "tag.lc_link_sent",
380
+ "name": "lifecycle-link-sent"
381
+ },
382
+ {
383
+ "ref": "tag.lc_trial_booked",
384
+ "name": "lifecycle-trial-booked",
385
+ "conditionalOn": "goal.bookingNeeded == true"
386
+ },
387
+ {
388
+ "ref": "tag.lc_trial_done",
389
+ "name": "lifecycle-trial-done",
390
+ "conditionalOn": "goal.bookingNeeded == true"
391
+ },
392
+ {
393
+ "ref": "tag.lc_program",
394
+ "name": "lifecycle-program"
395
+ },
396
+ {
397
+ "ref": "tag.lc_lapsed",
398
+ "name": "lifecycle-lapsed"
399
+ },
400
+ {
401
+ "ref": "tag.lc_lost",
402
+ "name": "lifecycle-lost"
403
+ },
404
+ {
405
+ "ref": "tag.nurture_start",
406
+ "name": "nurture-start"
407
+ },
408
+ {
409
+ "ref": "tag.winback_start",
410
+ "name": "winback-start"
411
+ },
412
+ {
413
+ "ref": "tag.balance_sent",
414
+ "name": "balance-sent",
415
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set"
416
+ },
417
+ {
418
+ "ref": "tag.balance_paid",
419
+ "name": "balance-paid",
420
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set"
421
+ },
422
+ {
423
+ "ref": "tag.link_sent_no_book",
424
+ "name": "link-sent-no-book"
425
+ },
426
+ {
427
+ "ref": "tag.no_program_yet",
428
+ "name": "no-program-yet"
429
+ },
430
+ {
431
+ "ref": "tag.follow_up_exhausted",
432
+ "name": "follow-up-exhausted"
433
+ },
434
+ {
435
+ "ref": "tag.patient_no_show",
436
+ "name": "patient-no-show",
437
+ "conditionalOn": "goal.bookingNeeded == true"
438
+ },
439
+ {
440
+ "ref": "tag.patient_canceled",
441
+ "name": "patient-canceled",
442
+ "conditionalOn": "goal.bookingNeeded == true"
443
+ },
444
+ {
445
+ "ref": "tag.not_interested",
446
+ "name": "not-interested"
447
+ },
448
+ {
449
+ "ref": "tag.replied_stop",
450
+ "name": "replied-stop"
451
+ },
452
+ {
453
+ "ref": "tag.human_follow_up",
454
+ "name": "human-follow-up-needed"
455
+ },
456
+ {
457
+ "ref": "tag.missed_call",
458
+ "name": "missed-call",
459
+ "conditionalOn": "channels.sms == true"
460
+ },
461
+ {
462
+ "ref": "tag.service_done",
463
+ "name": "service-complete"
464
+ },
465
+ {
466
+ "ref": "tag.review_requested",
467
+ "name": "review-requested"
468
+ },
469
+ {
470
+ "ref": "tag.interest_red_light",
471
+ "name": "interest-red-light"
472
+ },
473
+ {
474
+ "ref": "tag.interest_iv",
475
+ "name": "interest-iv"
476
+ },
477
+ {
478
+ "ref": "tag.interest_peptides",
479
+ "name": "interest-peptides"
480
+ },
481
+ {
482
+ "ref": "tag.interest_recovery",
483
+ "name": "interest-recovery"
484
+ }
485
+ ],
486
+ "customValues": [
487
+ {
488
+ "ref": "cv.business_name",
489
+ "name": "business_name",
490
+ "value": "{{business.name}}"
491
+ },
492
+ {
493
+ "ref": "cv.business_phone",
494
+ "name": "business_phone",
495
+ "value": "",
496
+ "filledBy": "handoff.business_details"
497
+ },
498
+ {
499
+ "ref": "cv.owner_first_name",
500
+ "name": "owner_first_name",
501
+ "value": "",
502
+ "filledBy": "handoff.business_details"
503
+ },
504
+ {
505
+ "ref": "cv.business_address",
506
+ "name": "business_address",
507
+ "value": "",
508
+ "filledBy": "handoff.business_details",
509
+ "_fill": "the street address patients drive to (the live account's clinic_address)"
510
+ },
511
+ {
512
+ "ref": "cv.booking_link",
513
+ "name": "booking_link",
514
+ "value": "",
515
+ "filledBy": "handoff.link_domain",
516
+ "conditionalOn": "goal.bookingNeeded == true"
517
+ },
518
+ {
519
+ "ref": "cv.review_link",
520
+ "name": "review_link",
521
+ "value": "",
522
+ "filledBy": "handoff.review_link"
523
+ },
524
+ {
525
+ "ref": "cv.trial_name",
526
+ "name": "trial_name",
527
+ "value": "{{offer.trialName || Intro Trial}}"
528
+ },
529
+ {
530
+ "ref": "cv.trial_price",
531
+ "name": "trial_price",
532
+ "value": "{{offer.trialPrice}} || ",
533
+ "filledBy": "handoff.trial_offer",
534
+ "_fill": "a number, no dollar sign (the copy writes the $)"
535
+ },
536
+ {
537
+ "ref": "cv.deposit_amount",
538
+ "name": "deposit_amount",
539
+ "value": "{{offer.depositAmount}} || ",
540
+ "filledBy": "handoff.trial_offer"
541
+ },
542
+ {
543
+ "ref": "cv.balance_amount",
544
+ "name": "balance_amount",
545
+ "value": "{{offer.balanceAmount}} || ",
546
+ "filledBy": "handoff.trial_offer"
547
+ },
548
+ {
549
+ "ref": "cv.balance_payment_link",
550
+ "name": "balance_payment_link",
551
+ "value": "",
552
+ "filledBy": "handoff.balance_product",
553
+ "conditionalOn": "offer.balanceAmount is set"
554
+ },
555
+ {
556
+ "ref": "cv.program_1_name",
557
+ "name": "program_1_name",
558
+ "value": "{{offer.programs[0].name}} || "
559
+ },
560
+ {
561
+ "ref": "cv.program_1_price",
562
+ "name": "program_1_price",
563
+ "value": "{{offer.programs[0].price}} || "
564
+ },
565
+ {
566
+ "ref": "cv.program_2_name",
567
+ "name": "program_2_name",
568
+ "value": "{{offer.programs[1].name}} || "
569
+ },
570
+ {
571
+ "ref": "cv.program_2_price",
572
+ "name": "program_2_price",
573
+ "value": "{{offer.programs[1].price}} || "
574
+ },
575
+ {
576
+ "ref": "cv.event_capacity",
577
+ "name": "event_capacity",
578
+ "value": "",
579
+ "conditionalOn": "flags includes launch_event",
580
+ "_fill": "launch events only; the event workflows live in the launch-event preset"
581
+ },
582
+ {
583
+ "ref": "cv.spots_left",
584
+ "name": "spots_left",
585
+ "value": "",
586
+ "conditionalOn": "flags includes launch_event"
587
+ }
588
+ ],
589
+ "calendars": [
590
+ {
591
+ "ref": "calendar.trial",
592
+ "conditionalOn": "goal.bookingNeeded == true",
593
+ "name": "{{business.name}} Trial Session || Trial Session",
594
+ "calendarType": "round_robin",
595
+ "_slotDuration": "Carry the appointment length from the brief (brief.calendars[].durationMinutes, or the words in the calendar answer) onto slotDuration. Next comes the intake's visit length (offer.visitMinutes); the live trial calendar's 90 minutes applies ONLY when neither gives a length.",
596
+ "slotDuration": "{{offer.visitMinutes}} || 90",
597
+ "slotDurationUnit": "mins",
598
+ "slotBuffer": 0,
599
+ "appointmentPerSlot": 1,
600
+ "appointmentPerDay": "{{offer.dailyCap}} || ",
601
+ "allowBookingAfter": 24,
602
+ "allowBookingAfterUnit": "hours",
603
+ "_bookingNotice": "24 hours' minimum notice: the live trial calendar's prep window (hydration, no alcohol). Daily cap from the intake (offer.dailyCap); omitted when not given.",
604
+ "description": "Every client is screened at the visit. Not recommended for anyone with: {{offer.contraindications || the conditions on our screening list}}. If you're not sure it suits you, check with your doctor first. Booking means you'll fill in our intake form and waiver when you arrive.",
605
+ "_descriptionSource": "PATTERN: a live trial calendar shows its screening list and waiver note on the booking page; the clinic's own list comes from the intake and must match the form and anything a bot says (handoff.contraindications).",
606
+ "teamMemberRefs": [
607
+ "user.owner"
608
+ ],
609
+ "openHours": [
610
+ {
611
+ "daysOfTheWeek": [
612
+ 1,
613
+ 2,
614
+ 3,
615
+ 4,
616
+ 5
617
+ ],
618
+ "hours": [
619
+ {
620
+ "openHour": 9,
621
+ "openMinute": 0,
622
+ "closeHour": 17,
623
+ "closeMinute": 0
624
+ }
625
+ ]
626
+ }
627
+ ],
628
+ "availabilityType": 0,
629
+ "requiresStaff": true,
630
+ "notes": "Deposit: GoHighLevel takes it through a calendar payment product, set in the UI (handoff.deposit_product). The build does not create products."
631
+ },
632
+ {
633
+ "ref": "calendar.consult",
634
+ "conditionalOn": "goal.programConsult == true",
635
+ "name": "{{business.name}} Program Consult || Program Consult",
636
+ "calendarType": "round_robin",
637
+ "_slotDuration": "Carry the appointment length from the brief (brief.calendars[].durationMinutes). 30 minutes applies only when the brief gives none.",
638
+ "_source": "[NO REAL SOURCE: proposed] For IV and peptide intake calls. No live wellness account has one.",
639
+ "slotDuration": 30,
640
+ "slotDurationUnit": "mins",
641
+ "slotBuffer": 10,
642
+ "teamMemberRefs": [
643
+ "user.owner"
644
+ ],
645
+ "openHours": [
646
+ {
647
+ "daysOfTheWeek": [
648
+ 1,
649
+ 2,
650
+ 3,
651
+ 4,
652
+ 5
653
+ ],
654
+ "hours": [
655
+ {
656
+ "openHour": 9,
657
+ "openMinute": 0,
658
+ "closeHour": 17,
659
+ "closeMinute": 0
660
+ }
661
+ ]
662
+ }
663
+ ],
664
+ "availabilityType": 0,
665
+ "requiresStaff": true
666
+ }
667
+ ],
668
+ "forms": [
669
+ {
670
+ "ref": "form.trial_request",
671
+ "name": "{{business.name}} Book Your Trial || Trial Request",
672
+ "_source": "Live A2P rule: phone is optional and the two consent boxes are separate and unchecked (required: false), so consent is never a condition of booking.",
673
+ "fields": [
674
+ {
675
+ "type": "standard",
676
+ "key": "first_name",
677
+ "required": true
678
+ },
679
+ {
680
+ "type": "standard",
681
+ "key": "last_name",
682
+ "required": false
683
+ },
684
+ {
685
+ "type": "standard",
686
+ "key": "email",
687
+ "required": true
688
+ },
689
+ {
690
+ "type": "standard",
691
+ "key": "phone",
692
+ "required": false
693
+ },
694
+ {
695
+ "type": "custom",
696
+ "fieldRef": "field.service_interest",
697
+ "required": false
698
+ },
699
+ {
700
+ "type": "custom",
701
+ "fieldRef": "field.body_focus",
702
+ "required": false
703
+ },
704
+ {
705
+ "type": "custom",
706
+ "fieldRef": "field.consent_transactional",
707
+ "required": false
708
+ },
709
+ {
710
+ "type": "custom",
711
+ "fieldRef": "field.consent_marketing",
712
+ "required": false
713
+ }
714
+ ]
715
+ }
716
+ ],
717
+ "templates": {
718
+ "emails": [
719
+ {
720
+ "ref": "email_template.stl_email_1",
721
+ "name": "Speed to Lead - Instant Email",
722
+ "conditionalOn": "offer.depositAmount is set",
723
+ "_source": "[NO REAL SOURCE: proposed] The live accounts send no email. Med-spa instant-email structure, trial facts from the live booking texts.",
724
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
725
+ "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;\">Thanks for reaching out to {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}, and I read every one of these myself.</p><p style=\"margin:0 0 14px;\">Here's how the {{custom_values.trial_name}} works: you pick a time, a ${{custom_values.deposit_amount}} deposit holds it, and the deposit comes off your ${{custom_values.trial_price}} visit. Every visit starts with a consult, and we answer all of your questions before anything begins.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">If you'd rather ask something first, reply to this email. A real person answers.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
726
+ },
727
+ {
728
+ "ref": "email_template.stl_email_1b",
729
+ "name": "Speed to Lead - Instant Email (no deposit)",
730
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
731
+ "_source": "[NO REAL SOURCE: proposed] As stl_email_1, for a clinic that takes no deposit.",
732
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
733
+ "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;\">Thanks for reaching out to {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}, and I read every one of these myself.</p><p style=\"margin:0 0 14px;\">Here's how the {{custom_values.trial_name}} works: you pick a time, and you pay the ${{custom_values.trial_price}} at your visit. Every visit starts with a consult, and we answer all of your questions before anything begins.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">If you'd rather ask something first, reply to this email. A real person answers.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
734
+ },
735
+ {
736
+ "ref": "email_template.n_email_1",
737
+ "name": "Nurture Email 1 - What Happens At Your Visit",
738
+ "_source": "[NO REAL SOURCE: proposed] Visit facts (arrive 10 minutes early, intake form, consult first, 90 minutes) come from the live confirmation text and the live offer page.",
739
+ "subject": "What happens at your first visit",
740
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">People put off a first visit because they don't know what's inside the door. So here it is:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">You arrive about 10 minutes early and fill in a short intake form.</li><li style=\"margin:0 0 6px;\">We start with a consult: what you want, what you've tried, and whether the {{custom_values.trial_name}} is right for you.</li><li style=\"margin:0 0 6px;\">Then your session, with time at the end for questions.</li><li style=\"margin:0 0 6px;\">Plan for about {{offer.visitMinutes || 90}} minutes in total.</li></ul><p style=\"margin:0 0 14px;\">There's no pressure to buy anything at the visit. If a program makes sense for you, we'll explain the options and you can take them home.</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 visit</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
741
+ },
742
+ {
743
+ "ref": "email_template.n_email_2",
744
+ "name": "Nurture Email 2 - About The Price",
745
+ "conditionalOn": "offer.depositAmount is set",
746
+ "_source": "[NO REAL SOURCE: proposed] Price facts are the clinic's own custom values; the line about nothing being sold by text is the no-text-to-pay rule.",
747
+ "subject": "About the price",
748
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">The {{custom_values.trial_name}} is ${{custom_values.trial_price}}. You pay a ${{custom_values.deposit_amount}} deposit to reserve the time, and it is taken off the visit price, so it is not an extra fee.</p><p style=\"margin:0 0 14px;\">If you decide a program is right for you, we go over the options and prices in person at your visit. Nobody is asked to decide in the chair, and nothing is sold by text.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Hold my time</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
749
+ },
750
+ {
751
+ "ref": "email_template.n_email_2b",
752
+ "name": "Nurture Email 2 - About The Price (no deposit)",
753
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
754
+ "_source": "[NO REAL SOURCE: proposed] As n_email_2, for a clinic that takes no deposit.",
755
+ "subject": "About the price",
756
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">The {{custom_values.trial_name}} is ${{custom_values.trial_price}}, paid at your visit. Booking your time costs nothing.</p><p style=\"margin:0 0 14px;\">If you decide a program is right for you, we go over the options and prices in person at your visit. Nobody is asked to decide in the chair, and nothing is sold by text.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Hold my time</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
757
+ },
758
+ {
759
+ "ref": "email_template.n_email_3",
760
+ "name": "Nurture Email 3 - Is It Right For You",
761
+ "_source": "[NO REAL SOURCE: proposed] Screening and results-vary wording follow the pattern of a live calendar's screening note and the claims rule.",
762
+ "subject": "Is it right for you?",
763
+ "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 fair question before any first visit: is this right for me?</p><p style=\"margin:0 0 14px;\">That's exactly what the consult at the start of your {{custom_values.trial_name}} is for. We go through a short screening list with every client, and if anything on it applies to you, we'll tell you honestly and suggest you check with your physician first.</p><p style=\"margin:0 0 14px;\">Results vary from person to person, and we'll never promise you a number.</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 consult and visit</a></p><p style=\"margin:0 0 14px;\">Questions first? Reply to this email and I'll answer personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
764
+ },
765
+ {
766
+ "ref": "email_template.w_email_1",
767
+ "name": "Win-back Email - Closing The Loop",
768
+ "conditionalOn": "offer.trialFree != true",
769
+ "_source": "[NO REAL SOURCE: proposed] Tone modeled on the agency's own plain, low-pressure closing email.",
770
+ "subject": "Closing the loop, {{contact.first_name}}",
771
+ "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 email I'll send about it.</p><p style=\"margin:0 0 14px;\">You reached out to {{custom_values.business_name}} a while back, and I'd rather not keep writing if it isn't helpful. If now isn't the right time, that's okay too.</p><p style=\"margin:0 0 14px;\">If you're still curious, the {{custom_values.trial_name}} is ${{custom_values.trial_price}} and the link below always works.</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>"
772
+ },
773
+ {
774
+ "ref": "email_template.stl_email_1f",
775
+ "name": "Speed to Lead - Instant Email (free trial)",
776
+ "conditionalOn": "offer.trialFree == true",
777
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the instant email.",
778
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
779
+ "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;\">Thanks for reaching out to {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}, and I read every one of these myself.</p><p style=\"margin:0 0 14px;\">Here's how the {{custom_values.trial_name}} works: you pick a time, and your first visit is free. Every visit starts with a consult, and we answer all of your questions before anything begins.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">If you'd rather ask something first, reply to this email. A real person answers.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
780
+ },
781
+ {
782
+ "ref": "email_template.n_email_2f",
783
+ "name": "Nurture Email 2 - About The Price (free trial)",
784
+ "conditionalOn": "offer.trialFree == true",
785
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the price email.",
786
+ "subject": "About the price",
787
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">Your first {{custom_values.trial_name}} is free. Booking costs nothing.</p><p style=\"margin:0 0 14px;\">If you decide a program is right for you, we go over the options and prices in person at your visit. Nobody is asked to decide in the chair, and nothing is sold by text.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Hold my time</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
788
+ },
789
+ {
790
+ "ref": "email_template.w_email_1f",
791
+ "name": "Win-back Email - Closing The Loop (free trial)",
792
+ "conditionalOn": "offer.trialFree == true",
793
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the closing email.",
794
+ "subject": "Closing the loop, {{contact.first_name}}",
795
+ "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 email I'll send about it.</p><p style=\"margin:0 0 14px;\">You reached out to {{custom_values.business_name}} a while back, and I'd rather not keep writing if it isn't helpful. If now isn't the right time, that's okay too.</p><p style=\"margin:0 0 14px;\">If you're still curious, the {{custom_values.trial_name}} is free and the link below always works.</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>"
796
+ },
797
+ {
798
+ "ref": "email_template.appt_confirm_email",
799
+ "name": "Trial Confirmed Email",
800
+ "_source": "[NO REAL SOURCE: proposed] The live account confirms by text only. Facts from the live confirmation text.",
801
+ "subject": "Confirmed: your {{custom_values.trial_name}}",
802
+ "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;\">You're booked in for the {{custom_values.trial_name}} with {{custom_values.business_name}} on {{appointment.start_time}}.</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Where: {{custom_values.business_address}}</li><li style=\"margin:0 0 6px;\">How long: about {{offer.visitMinutes || 90}} minutes</li><li style=\"margin:0 0 6px;\">Arrive: 10 minutes ahead, to fill in a brief intake form</li></ul><p style=\"margin:0 0 14px;\">Need to move it? Just reply here, or phone {{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>"
803
+ },
804
+ {
805
+ "ref": "email_template.ns_email_1",
806
+ "name": "No-Show Email - Still Want This",
807
+ "_source": "[NO REAL SOURCE: proposed] Med-spa no-show email shape, trial wording.",
808
+ "subject": "We missed you, {{contact.first_name}}",
809
+ "html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">We had you down for a {{custom_values.trial_name}} and it didn't work out. Life happens; nobody here is bothered.</p><p style=\"margin:0 0 14px;\">If it's still something you want, pick a new time below. If the timing is wrong, just reply and say so.</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;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
810
+ },
811
+ {
812
+ "ref": "email_template.review_email_1",
813
+ "name": "Review Request - Day 3 Email",
814
+ "_source": "[NO REAL SOURCE: proposed] No review request exists in any account read. Med-spa shape; never incentivized.",
815
+ "subject": "One minute for a review, {{contact.first_name}}?",
816
+ "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;\">Thank you for choosing {{custom_values.business_name}}.</p><p style=\"margin:0 0 14px;\">If your experience has been good, a short review is the most useful thing you could do for us. It takes about a minute and it's how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything hasn't been right, reply to this email instead and I'll fix it personally.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
817
+ }
818
+ ],
819
+ "sms": [
820
+ {
821
+ "ref": "sms_template.stl_sms_1",
822
+ "name": "Speed to Lead - Instant Text (booking link)",
823
+ "conditionalOn": "offer.depositAmount is set",
824
+ "_kind": "marketing",
825
+ "_source": "PATTERN: live red-light trial account. Instant text from the ad-lead workflow: who is texting, why, the booking link, the deposit framing (it counts toward the visit), then separate N and STOP lines.",
826
+ "body": "Hi {{contact.first_name}}, this is {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You asked about the {{custom_values.trial_name}}, so here is your booking link: {{custom_values.booking_link}}\n\nYour ${{custom_values.deposit_amount}} deposit saves the time and is taken off the ${{custom_values.trial_price}} price.\n\nReply N to stop these texts.\nReply STOP to end all texts."
827
+ },
828
+ {
829
+ "ref": "sms_template.stl_sms_1b",
830
+ "name": "Speed to Lead - Instant Text (no deposit)",
831
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
832
+ "_kind": "marketing",
833
+ "_source": "PATTERN: live red-light trial account. Instant text from the ad-lead workflow, for a clinic with no deposit: who is texting, why, the booking link, the price, then separate N and STOP lines.",
834
+ "body": "Hi {{contact.first_name}}, this is {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You asked about the {{custom_values.trial_name}}, so here is your booking link: {{custom_values.booking_link}}\n\nThe visit is ${{custom_values.trial_price}}, paid when you come in. Questions? Just text back.\n\nReply N to stop these texts.\nReply STOP to end all texts."
835
+ },
836
+ {
837
+ "ref": "sms_template.stl_sms_2",
838
+ "name": "Speed to Lead - 4 Hour Nudge",
839
+ "_kind": "marketing",
840
+ "_source": "PATTERN: live red-light trial account. Soft nudge 4 hours after the booking link with no booking: the link again and a TEAM keyword for a person.",
841
+ "body": "{{contact.first_name}}, checking in. Your booking link is still open whenever you want it: {{custom_values.booking_link}}\n\nWant a person to help? Reply TEAM.\nReply N to stop these texts."
842
+ },
843
+ {
844
+ "ref": "sms_template.stl_sms_3",
845
+ "name": "Speed to Lead - Next Day Final Nudge",
846
+ "conditionalOn": "offer.capacityLimited == true",
847
+ "_kind": "marketing",
848
+ "_source": "PATTERN: live red-light trial account. Final nudge 24 hours after the link: honest weekly capacity (only when the intake says capacity really runs out) and the link.",
849
+ "body": "{{contact.first_name}}, a quick note: we can only fit a set number of trial visits a week, since room and staff time run short. Book yours here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
850
+ },
851
+ {
852
+ "ref": "sms_template.stl_sms_3b",
853
+ "name": "Speed to Lead - Next Day Reminder",
854
+ "conditionalOn": "offer.capacityLimited != true",
855
+ "_kind": "marketing",
856
+ "_source": "PATTERN: live red-light trial account. Final nudge 24 hours after the link, without scarcity: a plain reminder and the link.",
857
+ "body": "{{contact.first_name}}, a quick note in case the link got buried. Book your {{custom_values.trial_name}} whenever it suits you: {{custom_values.booking_link}}\n\nReply N to stop these texts."
858
+ },
859
+ {
860
+ "ref": "sms_template.mc_sms_1",
861
+ "name": "Missed Call - Instant Text-Back",
862
+ "_kind": "marketing",
863
+ "_source": "[NO REAL SOURCE: proposed] No missed-call text-back exists in any account read. Med-spa preset shape, trial wording.",
864
+ "body": "Hi, it's {{custom_values.business_name}}. Sorry we missed your call. Want me to text you the {{custom_values.trial_name}} booking link? Reply YES, or tell us what you need.\n\nReply N to stop these texts."
865
+ },
866
+ {
867
+ "ref": "sms_template.mc_sms_2",
868
+ "name": "Missed Call - 1 Hour Text",
869
+ "_kind": "marketing",
870
+ "_source": "[NO REAL SOURCE: proposed] No real source. Offers the link an hour later, as the research outline asks.",
871
+ "body": "Here's the {{custom_values.trial_name}} booking link in case it helps: {{custom_values.booking_link}}\nOr reply with a good time and we'll call you back.\n\nReply N to stop these texts."
872
+ },
873
+ {
874
+ "ref": "sms_template.n_sms_1",
875
+ "name": "Nurture Text 1 - In Case You Missed It",
876
+ "_kind": "marketing",
877
+ "_source": "PATTERN: live red-light trial account. Second text of a 9-text drip: follow-up on the first text with one link. The drip's result claim is not carried.",
878
+ "body": "{{contact.first_name}}, following up on my earlier text. Here's where to see how the {{custom_values.trial_name}} works and choose a time: {{custom_values.booking_link}}\n\nReply N to stop these texts."
879
+ },
880
+ {
881
+ "ref": "sms_template.n_sms_2",
882
+ "name": "Nurture Text 2 - Talked Yourself Out Of It",
883
+ "_kind": "marketing",
884
+ "_source": "PATTERN: live red-light trial account. Drip text that names the hesitation and lowers the risk, with a YES for info ask.",
885
+ "body": "{{contact.first_name}}, honest question: is there a treatment you've wondered about but kept putting off? The {{custom_values.trial_name}} begins with a consult, and we answer every question before we start anything.\n\nReply YES for the booking link.\nReply N to stop these texts."
886
+ },
887
+ {
888
+ "ref": "sms_template.n_sms_3a",
889
+ "name": "Nurture Text 3 - Price With Anchor",
890
+ "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is set",
891
+ "_kind": "marketing",
892
+ "_source": "PATTERN: live red-light trial account. Drip price text: the clinic's own comparison price from the intake, the trial price and the deposit framing.",
893
+ "body": "{{contact.first_name}}, comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. The {{custom_values.trial_name}} here is ${{custom_values.trial_price}}, consult included, and a ${{custom_values.deposit_amount}} deposit reserves your time.\n\nReply YES for the booking link.\nReply N to stop these texts."
894
+ },
895
+ {
896
+ "ref": "sms_template.n_sms_3b",
897
+ "name": "Nurture Text 3 - Trial Price",
898
+ "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is set",
899
+ "_kind": "marketing",
900
+ "_source": "PATTERN: live red-light trial account. Drip price text without a comparison price: the trial price and the deposit framing.",
901
+ "body": "{{contact.first_name}}, the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}} with the consult included, and a ${{custom_values.deposit_amount}} deposit reserves your time.\n\nReply YES for the booking link.\nReply N to stop these texts."
902
+ },
903
+ {
904
+ "ref": "sms_template.n_sms_3c",
905
+ "name": "Nurture Text 3 - Price With Anchor (no deposit)",
906
+ "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true",
907
+ "_kind": "marketing",
908
+ "_source": "PATTERN: live red-light trial account. Drip price text with a comparison price, for a clinic with no deposit.",
909
+ "body": "{{contact.first_name}}, comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. The {{custom_values.trial_name}} here is ${{custom_values.trial_price}}, consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
910
+ },
911
+ {
912
+ "ref": "sms_template.n_sms_3d",
913
+ "name": "Nurture Text 3 - Trial Price (no deposit)",
914
+ "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true",
915
+ "_kind": "marketing",
916
+ "_source": "PATTERN: live red-light trial account. Drip price text, no comparison price and no deposit.",
917
+ "body": "{{contact.first_name}}, the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}} with the consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
918
+ },
919
+ {
920
+ "ref": "sms_template.n_sms_4",
921
+ "name": "Nurture Text 5 - On The Fence",
922
+ "conditionalOn": "offer.capacityLimited == true",
923
+ "_kind": "marketing",
924
+ "_source": "PATTERN: live red-light trial account. Late drip text: honest weekly capacity (only when the intake says so) and an offer to send the link.",
925
+ "body": "{{contact.first_name}}, a heads up: trial times at {{custom_values.business_name}} fill up most weeks. If you've been thinking it over, now is a good moment. Shall I text you the booking link?\n\nReply YES for the booking link.\nReply N to stop these texts."
926
+ },
927
+ {
928
+ "ref": "sms_template.n_sms_4b",
929
+ "name": "Nurture Text 5 - On The Fence (no scarcity)",
930
+ "conditionalOn": "offer.capacityLimited != true",
931
+ "_kind": "marketing",
932
+ "_source": "PATTERN: live red-light trial account. Late drip text without scarcity: an offer to send the link.",
933
+ "body": "{{contact.first_name}}, just checking in. If you've been thinking it over, the {{custom_values.trial_name}} is easy to book. Shall I text you the booking link?\n\nReply YES for the booking link.\nReply N to stop these texts."
934
+ },
935
+ {
936
+ "ref": "sms_template.n_sms_5",
937
+ "name": "Nurture Text 6 - What Happens At The Visit",
938
+ "_kind": "marketing",
939
+ "_source": "[NO REAL SOURCE: proposed] FAQ text. The facts (plan for 90 minutes, arrive 10 minutes early, short intake form) come from the live booking confirmation.",
940
+ "body": "{{contact.first_name}}, a question we get a lot: what happens at the {{custom_values.trial_name}}? Plan on about {{offer.visitMinutes || 90}} minutes. Get there 10 minutes ahead to fill in a brief intake form, and a consult comes before anything else.\n\nReply N to stop these texts."
941
+ },
942
+ {
943
+ "ref": "sms_template.n_sms_6",
944
+ "name": "Nurture Text 7 - About The Deposit",
945
+ "conditionalOn": "offer.depositAmount is set",
946
+ "_kind": "marketing",
947
+ "_source": "[NO REAL SOURCE: proposed] FAQ text on the deposit. The deposit-comes-off-the-visit fact is from the live booking texts; no refund promise is made because the refund policy is the clinic's to state.",
948
+ "body": "Another common question, {{contact.first_name}}: the ${{custom_values.deposit_amount}} deposit comes off your ${{custom_values.trial_price}} visit, so it is not an extra fee. Need to move your time? Just text us.\n\nReply N to stop these texts."
949
+ },
950
+ {
951
+ "ref": "sms_template.n_sms_6b",
952
+ "name": "Nurture Text 7 - Booking Is Free",
953
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
954
+ "_kind": "marketing",
955
+ "_source": "[NO REAL SOURCE: proposed] FAQ text for a clinic that takes no deposit.",
956
+ "body": "Another common question, {{contact.first_name}}: do you pay anything to book? No. You pay for your {{custom_values.trial_name}} at the visit. Need to move your time? Just text us.\n\nReply N to stop these texts."
957
+ },
958
+ {
959
+ "ref": "sms_template.n_sms_7",
960
+ "name": "Nurture Text 8 - Last One",
961
+ "_kind": "marketing",
962
+ "_source": "PATTERN: live red-light trial account. Last text of the drip: the final direct ask with a graceful exit and the link.",
963
+ "body": "Hi {{contact.first_name}}, this is my last note about it, because I really do think you'd enjoy it. If it isn't for you, that's completely fine. If you've been meaning to book, the link is here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
964
+ },
965
+ {
966
+ "ref": "sms_template.w_sms_1",
967
+ "name": "Win-back Text 1 - You Reached Out A While Back",
968
+ "conditionalOn": "offer.trialFree != true && offer.capacityLimited == true",
969
+ "_kind": "marketing",
970
+ "_source": "PATTERN: live red-light trial account. First text of the reactivation drip, scarcity version (only when the intake says trial spots really run out) (the best performer on warm contacts): who is texting, why they are hearing from us, the offer, then YES and N each on their own line.",
971
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You contacted us some time ago, so you're hearing about this before anyone else: we've opened a small number of ${{custom_values.trial_price}} {{custom_values.trial_name}} spots.\n\nReply YES for the booking link.\nReply N to stop these texts."
972
+ },
973
+ {
974
+ "ref": "sms_template.w_sms_1b",
975
+ "name": "Win-back Text 1 - You Reached Out A While Back (no scarcity)",
976
+ "conditionalOn": "offer.trialFree != true && offer.capacityLimited != true",
977
+ "_kind": "marketing",
978
+ "_source": "PATTERN: live red-light trial account. First reactivation text without scarcity or exclusivity, for a clinic whose trial spots do not run out (or that did not say): who is texting, why they are hearing from us, the offer, then YES and N each on their own line.",
979
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You contacted us some time ago, so I wanted you to know you can book a ${{custom_values.trial_price}} {{custom_values.trial_name}} with us.\n\nReply YES for the booking link.\nReply N to stop these texts."
980
+ },
981
+ {
982
+ "ref": "sms_template.w_sms_2",
983
+ "name": "Win-back Text 2 - In Case You Missed It",
984
+ "conditionalOn": "offer.depositAmount is set",
985
+ "_kind": "marketing",
986
+ "_source": "PATTERN: live red-light trial account. Second reactivation text: price, deposit framing and the link.",
987
+ "body": "{{contact.first_name}}, following up on my last message: a {{custom_values.trial_name}} costs ${{custom_values.trial_price}}; ${{custom_values.deposit_amount}} of it is paid when you book. Choose a time here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
988
+ },
989
+ {
990
+ "ref": "sms_template.w_sms_2b",
991
+ "name": "Win-back Text 2 - In Case You Missed It (no deposit)",
992
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
993
+ "_kind": "marketing",
994
+ "_source": "PATTERN: live red-light trial account. Second reactivation text for a clinic with no deposit: price and the link.",
995
+ "body": "{{contact.first_name}}, following up on my last message: the {{custom_values.trial_name}} is ${{custom_values.trial_price}}. Choose a time here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
996
+ },
997
+ {
998
+ "ref": "sms_template.stl_sms_1f",
999
+ "name": "Speed to Lead - Instant Text (free trial)",
1000
+ "conditionalOn": "offer.trialFree == true",
1001
+ "_kind": "marketing",
1002
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the instant booking-link text.",
1003
+ "body": "Hi {{contact.first_name}}, this is {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You asked about the {{custom_values.trial_name}}, so here is your booking link: {{custom_values.booking_link}}\n\nYour first visit is free. Questions? Just text back.\n\nReply N to stop these texts.\nReply STOP to end all texts."
1004
+ },
1005
+ {
1006
+ "ref": "sms_template.n_sms_3e",
1007
+ "name": "Nurture Text 3 - Free Trial With Anchor",
1008
+ "conditionalOn": "offer.anchorPrice is set && offer.trialFree == true",
1009
+ "_kind": "marketing",
1010
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text, with the clinic's comparison price.",
1011
+ "body": "{{contact.first_name}}, comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. Your first {{custom_values.trial_name}} here is free, consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
1012
+ },
1013
+ {
1014
+ "ref": "sms_template.n_sms_3f",
1015
+ "name": "Nurture Text 3 - Free Trial",
1016
+ "conditionalOn": "offer.anchorPrice is not set && offer.trialFree == true",
1017
+ "_kind": "marketing",
1018
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text.",
1019
+ "body": "{{contact.first_name}}, your first {{custom_values.trial_name}} at {{custom_values.business_name}} is free, with the consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
1020
+ },
1021
+ {
1022
+ "ref": "sms_template.n_sms_6f",
1023
+ "name": "Nurture Text 7 - Free To Book",
1024
+ "conditionalOn": "offer.trialFree == true",
1025
+ "_kind": "marketing",
1026
+ "_source": "[NO REAL SOURCE: proposed] FAQ text for a free trial.",
1027
+ "body": "Another common question, {{contact.first_name}}: is there a catch? No. The {{custom_values.trial_name}} is free, and booking costs nothing. Need to move your time? Just text us.\n\nReply N to stop these texts."
1028
+ },
1029
+ {
1030
+ "ref": "sms_template.w_sms_1f",
1031
+ "name": "Win-back Text 1 - You Reached Out A While Back (free trial)",
1032
+ "conditionalOn": "offer.trialFree == true && offer.capacityLimited == true",
1033
+ "_kind": "marketing",
1034
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the reactivation drip's first text, scarcity version (only when the intake says trial spots really run out) (who is texting, why, YES and N on their own lines).",
1035
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You contacted us some time ago, so you're hearing about this before anyone else: we've opened a small number of free {{custom_values.trial_name}} spots.\n\nReply YES for the booking link.\nReply N to stop these texts."
1036
+ },
1037
+ {
1038
+ "ref": "sms_template.w_sms_1fb",
1039
+ "name": "Win-back Text 1 - You Reached Out A While Back (free trial, no scarcity)",
1040
+ "conditionalOn": "offer.trialFree == true && offer.capacityLimited != true",
1041
+ "_kind": "marketing",
1042
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the reactivation drip's first text without scarcity or exclusivity (who is texting, why, YES and N on their own lines).",
1043
+ "body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. You contacted us some time ago, so I wanted you to know you can book a free {{custom_values.trial_name}} with us.\n\nReply YES for the booking link.\nReply N to stop these texts."
1044
+ },
1045
+ {
1046
+ "ref": "sms_template.w_sms_2f",
1047
+ "name": "Win-back Text 2 - In Case You Missed It (free trial)",
1048
+ "conditionalOn": "offer.trialFree == true",
1049
+ "_kind": "marketing",
1050
+ "_source": "[NO REAL SOURCE: proposed] Free-trial version of the second reactivation text.",
1051
+ "body": "{{contact.first_name}}, following up on my last message: the {{custom_values.trial_name}} is free. Choose a time here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
1052
+ },
1053
+ {
1054
+ "ref": "sms_template.w_sms_3a",
1055
+ "name": "Win-back Text 3 - Price Check With Anchor",
1056
+ "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is set",
1057
+ "_kind": "marketing",
1058
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1059
+ "body": "{{contact.first_name}}, in case price was the question: comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. Our {{custom_values.trial_name}} is ${{custom_values.trial_price}} with the consult, and ${{custom_values.deposit_amount}} of it holds your time when you book.\n\nReply YES for the booking link.\nReply N to stop these texts."
1060
+ },
1061
+ {
1062
+ "ref": "sms_template.w_sms_3b",
1063
+ "name": "Win-back Text 3 - Price Check",
1064
+ "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is set",
1065
+ "_kind": "marketing",
1066
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1067
+ "body": "{{contact.first_name}}, in case price was the question: the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}} with the consult, and ${{custom_values.deposit_amount}} of it holds your time when you book.\n\nReply YES for the booking link.\nReply N to stop these texts."
1068
+ },
1069
+ {
1070
+ "ref": "sms_template.w_sms_3c",
1071
+ "name": "Win-back Text 3 - Price Check With Anchor (no deposit)",
1072
+ "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true",
1073
+ "_kind": "marketing",
1074
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1075
+ "body": "{{contact.first_name}}, in case price was the question: comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. Our {{custom_values.trial_name}} is ${{custom_values.trial_price}} with the consult.\n\nReply YES for the booking link.\nReply N to stop these texts."
1076
+ },
1077
+ {
1078
+ "ref": "sms_template.w_sms_3d",
1079
+ "name": "Win-back Text 3 - Price Check (no deposit)",
1080
+ "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true",
1081
+ "_kind": "marketing",
1082
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1083
+ "body": "{{contact.first_name}}, in case price was the question: the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}}, consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
1084
+ },
1085
+ {
1086
+ "ref": "sms_template.w_sms_3e",
1087
+ "name": "Win-back Text 3 - Cost Check With Anchor (free trial)",
1088
+ "conditionalOn": "offer.anchorPrice is set && offer.trialFree == true",
1089
+ "_kind": "marketing",
1090
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1091
+ "body": "{{contact.first_name}}, in case cost was the question: comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session, and your first {{custom_values.trial_name}} with us is free, consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
1092
+ },
1093
+ {
1094
+ "ref": "sms_template.w_sms_3f",
1095
+ "name": "Win-back Text 3 - Cost Check (free trial)",
1096
+ "conditionalOn": "offer.anchorPrice is not set && offer.trialFree == true",
1097
+ "_kind": "marketing",
1098
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1099
+ "body": "{{contact.first_name}}, in case cost was the question: your first {{custom_values.trial_name}} at {{custom_values.business_name}} is free, consult included.\n\nReply YES for the booking link.\nReply N to stop these texts."
1100
+ },
1101
+ {
1102
+ "ref": "sms_template.w_sms_4",
1103
+ "name": "Win-back Text 4 - Still Interested",
1104
+ "conditionalOn": "offer.capacityLimited == true",
1105
+ "_kind": "marketing",
1106
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1107
+ "body": "{{contact.first_name}}, trial times at {{custom_values.business_name}} fill up most weeks, so if you'd still like one it helps to pick a time soon. Want me to text you the booking link?\n\nReply YES for the booking link.\nReply N to stop these texts."
1108
+ },
1109
+ {
1110
+ "ref": "sms_template.w_sms_4b",
1111
+ "name": "Win-back Text 4 - Still Interested (no scarcity)",
1112
+ "conditionalOn": "offer.capacityLimited != true",
1113
+ "_kind": "marketing",
1114
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1115
+ "body": "{{contact.first_name}}, no rush at all. If you'd still like to try the {{custom_values.trial_name}}, I can text you the booking link.\n\nReply YES for the booking link.\nReply N to stop these texts."
1116
+ },
1117
+ {
1118
+ "ref": "sms_template.w_sms_7",
1119
+ "name": "Win-back Text 5 - Last One",
1120
+ "_kind": "marketing",
1121
+ "_source": "[NO REAL SOURCE: proposed] Win-back-only wording of the nurture text in the same slot (rehearsal 4 #8, 2026-09-29): a lead who went through Lead Nurture and then Win-back no longer gets the same text twice. Same shape: who, why, the offer, one ask, the opt-out line.",
1122
+ "body": "Hi {{contact.first_name}}, this is the last text I'll send about the {{custom_values.trial_name}}. If now isn't the time, no problem at all. If you'd like to come in, pick a time here: {{custom_values.booking_link}}\n\nReply N to stop these texts."
1123
+ },
1124
+ {
1125
+ "ref": "sms_template.book_link_sms",
1126
+ "name": "Reply BOOK - Booking Link",
1127
+ "conditionalOn": "offer.depositAmount is set",
1128
+ "_kind": "transactional",
1129
+ "_source": "PATTERN: live red-light trial account. Sent when someone replies BOOK (exact match): the link and the deposit framing.",
1130
+ "body": "Great, here's where to book your {{custom_values.trial_name}}: {{custom_values.booking_link}}\nChoose any open time. A ${{custom_values.deposit_amount}} deposit reserves it and counts toward the ${{custom_values.trial_price}} visit."
1131
+ },
1132
+ {
1133
+ "ref": "sms_template.book_link_sms_b",
1134
+ "name": "Reply BOOK - Booking Link (no deposit)",
1135
+ "conditionalOn": "offer.depositAmount is not set",
1136
+ "_kind": "transactional",
1137
+ "_source": "PATTERN: live red-light trial account. Sent when someone replies BOOK (exact match), no deposit: the link.",
1138
+ "body": "Great, here's where to book your {{custom_values.trial_name}}: {{custom_values.booking_link}}\nChoose any open time that suits you."
1139
+ },
1140
+ {
1141
+ "ref": "sms_template.appt_confirm_sms",
1142
+ "name": "Trial Confirmed Text",
1143
+ "conditionalOn": "offer.depositAmount is set",
1144
+ "_kind": "transactional",
1145
+ "_source": "PATTERN: live red-light trial account. Booking confirmation: time, address, visit length, arrive early for intake. It no longer says the deposit was received (rehearsal 4 audit E3): this workflow cannot see a payment, and until Stripe and the calendar payment are on, bookings come in without one. GoHighLevel's own payment receipt confirms a deposit.",
1146
+ "body": "{{contact.first_name}}, you're booked! Your {{custom_values.trial_name}} is on {{appointment.start_time}}. Our address: {{custom_values.business_address}}. Allow about {{offer.visitMinutes || 90}} minutes, and come 10 minutes early to fill in a short intake form."
1147
+ },
1148
+ {
1149
+ "ref": "sms_template.appt_confirm_sms_nodeposit",
1150
+ "name": "Trial Confirmed Text (no deposit)",
1151
+ "conditionalOn": "offer.depositAmount is not set",
1152
+ "_kind": "transactional",
1153
+ "_source": "PATTERN: live red-light trial account. Booking confirmation without a deposit: time, address, visit length, arrive early for intake.",
1154
+ "body": "{{contact.first_name}}, you're booked! Your {{custom_values.trial_name}} is on {{appointment.start_time}}. Our address: {{custom_values.business_address}}. Allow about {{offer.visitMinutes || 90}} minutes, and come 10 minutes early to fill in a short intake form. Any questions, just text me."
1155
+ },
1156
+ {
1157
+ "ref": "sms_template.appt_24h_sms",
1158
+ "name": "Trial Reminder - 24 Hours",
1159
+ "_kind": "transactional",
1160
+ "_source": "PATTERN: live red-light trial account. Reminder 24 hours before: time, and the prep instructions the clinic gave in the intake; without an answer, the usual arrive-early line. The fixed early line is no longer added in front of the answer, which usually says it too (rehearsal 4 audit E10).",
1161
+ "body": "{{contact.first_name}}, see you tomorrow! Your {{custom_values.trial_name}} at {{custom_values.business_name}} is at {{appointment.start_time}}. {{offer.prepInstructions || Please come about 10 minutes early. Comfortable clothes are best, and bring any questions.}} Looking forward to it!"
1162
+ },
1163
+ {
1164
+ "ref": "sms_template.appt_1h_sms",
1165
+ "name": "Trial Reminder - 1 Hour",
1166
+ "_kind": "transactional",
1167
+ "_source": "PATTERN: live red-light trial account. Reminder 1 hour before: the address.",
1168
+ "body": "{{contact.first_name}}, about an hour to go until your {{custom_values.trial_name}} at {{custom_values.business_name}}. We're at {{custom_values.business_address}}. See you soon!"
1169
+ },
1170
+ {
1171
+ "ref": "sms_template.balance_sms",
1172
+ "name": "Trial Balance Link",
1173
+ "conditionalOn": "offer.balanceAmount is set",
1174
+ "_kind": "transactional",
1175
+ "_source": "PATTERN: live red-light trial account. Balance link 15 minutes after the visit is marked showed. The only payment link any text carries. It no longer says the visit has not started yet: staff mark a visit showed at or after it (rehearsal 4 audit).",
1176
+ "body": "Hi {{contact.first_name}}, thanks for coming in! You can settle the ${{custom_values.balance_amount}} balance here (it completes your ${{custom_values.trial_price}} {{custom_values.trial_name}}): {{custom_values.balance_payment_link}}"
1177
+ },
1178
+ {
1179
+ "ref": "sms_template.balance_paid_sms",
1180
+ "name": "Trial Balance Received",
1181
+ "conditionalOn": "offer.balanceAmount is set",
1182
+ "_kind": "transactional",
1183
+ "_source": "PATTERN: live red-light trial account. Confirmation when the trial balance is paid.",
1184
+ "body": "Thanks {{contact.first_name}}, we've received your ${{custom_values.balance_amount}} balance. Nothing more to pay for this visit."
1185
+ },
1186
+ {
1187
+ "ref": "sms_template.ns_sms_1",
1188
+ "name": "No-Show Text 1 - We Missed You",
1189
+ "_kind": "marketing",
1190
+ "_source": "PATTERN: live red-light trial account. Same-day no-show text: no guilt, reply to rebook.",
1191
+ "body": "{{contact.first_name}}, we didn't see you for your {{custom_values.trial_name}} today. Hope all is well! If you'd like another time, reply here and we'll look at what's open.\n\nReply N to stop these texts."
1192
+ },
1193
+ {
1194
+ "ref": "sms_template.ns_sms_2",
1195
+ "name": "No-Show Text 2 - Times Kept Open",
1196
+ "_kind": "marketing",
1197
+ "_source": "[NO REAL SOURCE: proposed] The live account sends one no-show text. This second touch is the med-spa preset's rescue step, reworded for a trial. Reworded 2026-09-29 (rehearsal 4): it no longer claims times were held back, which implied scarcity whatever the intake said.",
1198
+ "body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. We'd be glad to find you another trial time. Want one? Reply with a day that works.\n\nReply N to stop these texts."
1199
+ },
1200
+ {
1201
+ "ref": "sms_template.cancel_sms",
1202
+ "name": "Trial Canceled Text",
1203
+ "_kind": "transactional",
1204
+ "_source": "PATTERN: live red-light trial account. Cancellation text: confirm it and leave the door open.",
1205
+ "body": "{{contact.first_name}}, your {{custom_values.trial_name}} has been cancelled. If you'd like to book again later, text us and we'll see what's open. We'd be glad to have you in!"
1206
+ },
1207
+ {
1208
+ "ref": "sms_template.pf_sms_1",
1209
+ "name": "Program Follow-up - 2 Hour Thank You",
1210
+ "_kind": "marketing",
1211
+ "_source": "PATTERN: live red-light trial account. 72-hour close, text 1 at 2 hours: thanks and questions welcome.",
1212
+ "body": "{{contact.first_name}}, thanks for coming in today! We hope you enjoyed the {{custom_values.trial_name}}. If you have a question about the programs we discussed, just text it here.\n\nReply N to stop these texts."
1213
+ },
1214
+ {
1215
+ "ref": "sms_template.pf_sms_2a",
1216
+ "name": "Program Follow-up - 24 Hour Visit Pricing",
1217
+ "conditionalOn": "offer.visitOnlyPrice == true",
1218
+ "_kind": "marketing",
1219
+ "_source": "PATTERN: live red-light trial account. 72-hour close, text 2 at 24 hours: the visit-only price window. Only when the intake says the clinic offers one.",
1220
+ "body": "{{contact.first_name}}, a reminder that the program price from your visit is good for a couple more days. If one caught your eye, this is the moment to decide. Reply TEAM and I'll send the options again.\n\nReply N to stop these texts."
1221
+ },
1222
+ {
1223
+ "ref": "sms_template.pf_sms_2b",
1224
+ "name": "Program Follow-up - 24 Hour Options",
1225
+ "conditionalOn": "offer.visitOnlyPrice != true",
1226
+ "_kind": "marketing",
1227
+ "_source": "PATTERN: live red-light trial account. 72-hour close, text 2 at 24 hours, without a visit-only price: offer the options again.",
1228
+ "body": "{{contact.first_name}}, if any of the programs we discussed at your visit caught your eye, reply TEAM and I'll send the options again.\n\nReply N to stop these texts."
1229
+ },
1230
+ {
1231
+ "ref": "sms_template.pf_sms_3a",
1232
+ "name": "Program Follow-up - 48 Hour Heads Up",
1233
+ "conditionalOn": "offer.visitOnlyPrice == true",
1234
+ "_kind": "marketing",
1235
+ "_source": "PATTERN: live red-light trial account. 72-hour close, text 3 at 48 hours: the window ends tomorrow. Only with a visit-only price.",
1236
+ "body": "{{contact.first_name}}, a note from {{custom_values.business_name}}: the program price from your visit ends tomorrow. To reserve it, reply TEAM.\n\nReply N to stop these texts."
1237
+ },
1238
+ {
1239
+ "ref": "sms_template.pf_sms_3b",
1240
+ "name": "Program Follow-up - 48 Hour Check-in",
1241
+ "conditionalOn": "offer.visitOnlyPrice != true",
1242
+ "_kind": "marketing",
1243
+ "_source": "[NO REAL SOURCE: proposed] Replaces the live 48-hour urgency text when the clinic has no visit-only price.",
1244
+ "body": "{{contact.first_name}}, quick check-in from {{custom_values.business_name}}. If you have a question about the programs from your visit, text it here and I'll answer.\n\nReply N to stop these texts."
1245
+ },
1246
+ {
1247
+ "ref": "sms_template.pf_sms_4a",
1248
+ "name": "Program Follow-up - Final Day",
1249
+ "conditionalOn": "offer.visitOnlyPrice == true",
1250
+ "_kind": "marketing",
1251
+ "_source": "PATTERN: live red-light trial account. 72-hour close, text 4 at about 70 hours: final day. Only with a visit-only price.",
1252
+ "body": "{{contact.first_name}}, today is the last day for the visit price at {{custom_values.business_name}}. From tomorrow, programs return to the usual price. Reply TEAM if you'd like it and I'll sort it out.\n\nReply N to stop these texts."
1253
+ },
1254
+ {
1255
+ "ref": "sms_template.pf_sms_4b",
1256
+ "name": "Program Follow-up - Last Note",
1257
+ "conditionalOn": "offer.visitOnlyPrice != true",
1258
+ "_kind": "marketing",
1259
+ "_source": "[NO REAL SOURCE: proposed] Replaces the live final-day text when the clinic has no visit-only price.",
1260
+ "body": "{{contact.first_name}}, last note from me about the programs. If now is not the right time, no hard feelings. Just reply here whenever you're ready.\n\nReply N to stop these texts."
1261
+ },
1262
+ {
1263
+ "ref": "sms_template.program_confirm_sms",
1264
+ "name": "Program Sold - Confirmation",
1265
+ "_kind": "transactional",
1266
+ "_source": "PATTERN: live red-light trial account. Program sale confirmation. No payment link is ever sent for a program.",
1267
+ "body": "{{contact.first_name}}, you're confirmed for your program with {{custom_values.business_name}}. We can't wait to get started with you. Questions any time? Just text us."
1268
+ },
1269
+ {
1270
+ "ref": "sms_template.review_sms_1",
1271
+ "name": "Review Request - Text",
1272
+ "_kind": "marketing",
1273
+ "_source": "[NO REAL SOURCE: proposed] No patient review request exists in any account read. Med-spa shape. Never offers anything in return for a review.",
1274
+ "body": "Thanks for choosing {{custom_values.business_name}}, {{contact.first_name}}. If we did right by you, a quick review helps the next person find us: {{custom_values.review_link}}\n\nReply N to stop these texts."
1275
+ }
1276
+ ]
1277
+ },
1278
+ "_templatesNote": "Every message is complete and send-ready. _kind marks marketing texts (which carry an opt-out line) and transactional ones. _source says where each came from.",
1279
+ "emails": [
1280
+ {
1281
+ "ref": "email.stl_email_1",
1282
+ "name": "Speed to Lead - Instant Email",
1283
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
1284
+ "templateRef": "email_template.stl_email_1",
1285
+ "copyDirection": "Instant. Who I am, how the trial works (deposit comes off the visit), one CTA, reply invitation. If brief.voice.signatureLine exists, insert it verbatim after the greeting.",
1286
+ "mergeTags": [
1287
+ "custom_values.trial_name",
1288
+ "contact.first_name",
1289
+ "custom_values.business_name",
1290
+ "custom_values.owner_first_name",
1291
+ "custom_values.deposit_amount",
1292
+ "custom_values.trial_price",
1293
+ "custom_values.booking_link",
1294
+ "custom_values.business_phone"
1295
+ ],
1296
+ "conditionalOn": "offer.depositAmount is set"
1297
+ },
1298
+ {
1299
+ "ref": "email.stl_email_1b",
1300
+ "name": "Speed to Lead - Instant Email (no deposit)",
1301
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
1302
+ "templateRef": "email_template.stl_email_1b",
1303
+ "copyDirection": "Instant, no deposit. Who I am, how the trial works, one CTA, reply invitation.",
1304
+ "mergeTags": [
1305
+ "custom_values.trial_name",
1306
+ "contact.first_name",
1307
+ "custom_values.business_name",
1308
+ "custom_values.owner_first_name",
1309
+ "custom_values.trial_price",
1310
+ "custom_values.booking_link",
1311
+ "custom_values.business_phone"
1312
+ ],
1313
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true"
1314
+ },
1315
+ {
1316
+ "ref": "email.n_email_1",
1317
+ "name": "Nurture Email 1 - What Happens At Your Visit",
1318
+ "subject": "What happens at your first visit",
1319
+ "templateRef": "email_template.n_email_1",
1320
+ "copyDirection": "Day 2. Remove the unknown. No outcome claims.",
1321
+ "mergeTags": [
1322
+ "contact.first_name",
1323
+ "custom_values.trial_name",
1324
+ "custom_values.booking_link",
1325
+ "custom_values.owner_first_name",
1326
+ "custom_values.business_name",
1327
+ "custom_values.business_phone"
1328
+ ]
1329
+ },
1330
+ {
1331
+ "ref": "email.n_email_2",
1332
+ "name": "Nurture Email 2 - About The Price",
1333
+ "subject": "About the price",
1334
+ "templateRef": "email_template.n_email_2",
1335
+ "copyDirection": "Day 7. Price head-on: trial price, deposit, programs discussed in person.",
1336
+ "mergeTags": [
1337
+ "contact.first_name",
1338
+ "custom_values.trial_name",
1339
+ "custom_values.trial_price",
1340
+ "custom_values.deposit_amount",
1341
+ "custom_values.booking_link",
1342
+ "custom_values.owner_first_name",
1343
+ "custom_values.business_name",
1344
+ "custom_values.business_phone"
1345
+ ],
1346
+ "conditionalOn": "offer.depositAmount is set"
1347
+ },
1348
+ {
1349
+ "ref": "email.n_email_2b",
1350
+ "name": "Nurture Email 2 - About The Price (no deposit)",
1351
+ "subject": "About the price",
1352
+ "templateRef": "email_template.n_email_2b",
1353
+ "copyDirection": "Day 7, no deposit. Price head-on, programs discussed in person.",
1354
+ "mergeTags": [
1355
+ "contact.first_name",
1356
+ "custom_values.trial_name",
1357
+ "custom_values.trial_price",
1358
+ "custom_values.booking_link",
1359
+ "custom_values.owner_first_name",
1360
+ "custom_values.business_name",
1361
+ "custom_values.business_phone"
1362
+ ],
1363
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true"
1364
+ },
1365
+ {
1366
+ "ref": "email.n_email_3",
1367
+ "name": "Nurture Email 3 - Is It Right For You",
1368
+ "subject": "Is it right for you?",
1369
+ "templateRef": "email_template.n_email_3",
1370
+ "copyDirection": "Day 16. Screening and honesty. No outcome claims.",
1371
+ "mergeTags": [
1372
+ "contact.first_name",
1373
+ "custom_values.trial_name",
1374
+ "custom_values.booking_link",
1375
+ "custom_values.owner_first_name",
1376
+ "custom_values.business_name",
1377
+ "custom_values.business_phone"
1378
+ ]
1379
+ },
1380
+ {
1381
+ "ref": "email.w_email_1",
1382
+ "name": "Win-back Email - Closing The Loop",
1383
+ "subject": "Closing the loop, {{contact.first_name}}",
1384
+ "templateRef": "email_template.w_email_1",
1385
+ "copyDirection": "Win-back day 10. Say it is the last email, the door stays open, one CTA.",
1386
+ "mergeTags": [
1387
+ "contact.first_name",
1388
+ "custom_values.business_name",
1389
+ "custom_values.trial_name",
1390
+ "custom_values.trial_price",
1391
+ "custom_values.booking_link",
1392
+ "custom_values.owner_first_name",
1393
+ "custom_values.business_phone"
1394
+ ],
1395
+ "conditionalOn": "offer.trialFree != true"
1396
+ },
1397
+ {
1398
+ "ref": "email.stl_email_1f",
1399
+ "name": "Speed to Lead - Instant Email (free trial)",
1400
+ "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
1401
+ "templateRef": "email_template.stl_email_1f",
1402
+ "copyDirection": "Instant, free trial. Who I am, how the trial works, one CTA.",
1403
+ "mergeTags": [
1404
+ "custom_values.trial_name",
1405
+ "contact.first_name",
1406
+ "custom_values.business_name",
1407
+ "custom_values.owner_first_name",
1408
+ "custom_values.booking_link",
1409
+ "custom_values.business_phone"
1410
+ ],
1411
+ "conditionalOn": "offer.trialFree == true"
1412
+ },
1413
+ {
1414
+ "ref": "email.n_email_2f",
1415
+ "name": "Nurture Email 2 - About The Price (free trial)",
1416
+ "subject": "About the price",
1417
+ "templateRef": "email_template.n_email_2f",
1418
+ "copyDirection": "Day 7, free trial. Price head-on, programs discussed in person.",
1419
+ "mergeTags": [
1420
+ "contact.first_name",
1421
+ "custom_values.trial_name",
1422
+ "custom_values.booking_link",
1423
+ "custom_values.owner_first_name",
1424
+ "custom_values.business_name",
1425
+ "custom_values.business_phone"
1426
+ ],
1427
+ "conditionalOn": "offer.trialFree == true"
1428
+ },
1429
+ {
1430
+ "ref": "email.w_email_1f",
1431
+ "name": "Win-back Email - Closing The Loop (free trial)",
1432
+ "subject": "Closing the loop, {{contact.first_name}}",
1433
+ "templateRef": "email_template.w_email_1f",
1434
+ "copyDirection": "Win-back day 10, free trial.",
1435
+ "mergeTags": [
1436
+ "contact.first_name",
1437
+ "custom_values.business_name",
1438
+ "custom_values.trial_name",
1439
+ "custom_values.booking_link",
1440
+ "custom_values.owner_first_name",
1441
+ "custom_values.business_phone"
1442
+ ],
1443
+ "conditionalOn": "offer.trialFree == true"
1444
+ },
1445
+ {
1446
+ "ref": "email.appt_confirm_email",
1447
+ "name": "Trial Confirmed Email",
1448
+ "subject": "Confirmed: your {{custom_values.trial_name}}",
1449
+ "templateRef": "email_template.appt_confirm_email",
1450
+ "copyDirection": "On booking. When, where, how long, how to move it.",
1451
+ "mergeTags": [
1452
+ "custom_values.trial_name",
1453
+ "contact.first_name",
1454
+ "custom_values.business_name",
1455
+ "appointment.start_time",
1456
+ "custom_values.business_address",
1457
+ "custom_values.business_phone",
1458
+ "custom_values.owner_first_name"
1459
+ ]
1460
+ },
1461
+ {
1462
+ "ref": "email.ns_email_1",
1463
+ "name": "No-Show Email - Still Want This",
1464
+ "subject": "We missed you, {{contact.first_name}}",
1465
+ "templateRef": "email_template.ns_email_1",
1466
+ "copyDirection": "Day 4 after the no-show. No guilt, rebook CTA.",
1467
+ "mergeTags": [
1468
+ "contact.first_name",
1469
+ "custom_values.trial_name",
1470
+ "custom_values.booking_link",
1471
+ "custom_values.owner_first_name",
1472
+ "custom_values.business_name",
1473
+ "custom_values.business_phone"
1474
+ ]
1475
+ },
1476
+ {
1477
+ "ref": "email.review_email_1",
1478
+ "name": "Review Request - Day 3 Email",
1479
+ "subject": "One minute for a review, {{contact.first_name}}?",
1480
+ "templateRef": "email_template.review_email_1",
1481
+ "copyDirection": "Three days after the review text. Thank, why it matters, the link, reply if something is wrong.",
1482
+ "mergeTags": [
1483
+ "contact.first_name",
1484
+ "custom_values.business_name",
1485
+ "custom_values.review_link",
1486
+ "custom_values.owner_first_name",
1487
+ "custom_values.business_phone"
1488
+ ]
1489
+ }
1490
+ ],
1491
+ "sms": [
1492
+ {
1493
+ "ref": "sms.stl_sms_1",
1494
+ "name": "Speed to Lead - Instant Text (booking link)",
1495
+ "templateRef": "sms_template.stl_sms_1",
1496
+ "copyDirection": "Instant, from the form. Name + business, the booking link, the deposit and price in one line, then the N / STOP line on its own.",
1497
+ "mergeTags": [
1498
+ "contact.first_name",
1499
+ "custom_values.owner_first_name",
1500
+ "custom_values.business_name",
1501
+ "custom_values.trial_name",
1502
+ "custom_values.booking_link",
1503
+ "custom_values.deposit_amount",
1504
+ "custom_values.trial_price"
1505
+ ],
1506
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
1507
+ },
1508
+ {
1509
+ "ref": "sms.stl_sms_1b",
1510
+ "name": "Speed to Lead - Instant Text (no deposit)",
1511
+ "templateRef": "sms_template.stl_sms_1b",
1512
+ "copyDirection": "Instant, no deposit. Name + business, the booking link, the price, N / STOP on its own line.",
1513
+ "mergeTags": [
1514
+ "contact.first_name",
1515
+ "custom_values.owner_first_name",
1516
+ "custom_values.business_name",
1517
+ "custom_values.trial_name",
1518
+ "custom_values.booking_link",
1519
+ "custom_values.trial_price"
1520
+ ],
1521
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
1522
+ },
1523
+ {
1524
+ "ref": "sms.stl_sms_2",
1525
+ "name": "Speed to Lead - 4 Hour Nudge",
1526
+ "templateRef": "sms_template.stl_sms_2",
1527
+ "copyDirection": "4 hours in, no booking yet. Soft nudge, the link, TEAM for a person.",
1528
+ "mergeTags": [
1529
+ "contact.first_name",
1530
+ "custom_values.booking_link"
1531
+ ],
1532
+ "conditionalOn": "channels.sms == true"
1533
+ },
1534
+ {
1535
+ "ref": "sms.stl_sms_3",
1536
+ "name": "Speed to Lead - Next Day Final Nudge",
1537
+ "templateRef": "sms_template.stl_sms_3",
1538
+ "copyDirection": "24 hours in. Honest scarcity (weekly capacity), the link. Only when the intake says capacity really is limited.",
1539
+ "mergeTags": [
1540
+ "contact.first_name",
1541
+ "custom_values.booking_link"
1542
+ ],
1543
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
1544
+ },
1545
+ {
1546
+ "ref": "sms.stl_sms_3b",
1547
+ "name": "Speed to Lead - Next Day Reminder",
1548
+ "templateRef": "sms_template.stl_sms_3b",
1549
+ "copyDirection": "24 hours in, capacity not limited. A plain reminder and the link.",
1550
+ "mergeTags": [
1551
+ "contact.first_name",
1552
+ "custom_values.trial_name",
1553
+ "custom_values.booking_link"
1554
+ ],
1555
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
1556
+ },
1557
+ {
1558
+ "ref": "sms.mc_sms_1",
1559
+ "name": "Missed Call - Instant Text-Back",
1560
+ "templateRef": "sms_template.mc_sms_1",
1561
+ "copyDirection": "Seconds after a missed inbound call. Apologize, offer the link, invite a reply.",
1562
+ "mergeTags": [
1563
+ "custom_values.business_name",
1564
+ "custom_values.trial_name"
1565
+ ],
1566
+ "conditionalOn": "channels.sms == true"
1567
+ },
1568
+ {
1569
+ "ref": "sms.mc_sms_2",
1570
+ "name": "Missed Call - 1 Hour Text",
1571
+ "templateRef": "sms_template.mc_sms_2",
1572
+ "copyDirection": "One hour later. The link, or a call-back time.",
1573
+ "mergeTags": [
1574
+ "custom_values.trial_name",
1575
+ "custom_values.booking_link"
1576
+ ],
1577
+ "conditionalOn": "channels.sms == true"
1578
+ },
1579
+ {
1580
+ "ref": "sms.n_sms_1",
1581
+ "name": "Nurture Text 1 - In Case You Missed It",
1582
+ "templateRef": "sms_template.n_sms_1",
1583
+ "copyDirection": "Day 1. Re-surface the offer, one link.",
1584
+ "mergeTags": [
1585
+ "contact.first_name",
1586
+ "custom_values.trial_name",
1587
+ "custom_values.booking_link"
1588
+ ],
1589
+ "conditionalOn": "channels.sms == true"
1590
+ },
1591
+ {
1592
+ "ref": "sms.n_sms_2",
1593
+ "name": "Nurture Text 2 - Talked Yourself Out Of It",
1594
+ "templateRef": "sms_template.n_sms_2",
1595
+ "copyDirection": "Day 3. Name the hesitation, lower the risk, YES for info.",
1596
+ "mergeTags": [
1597
+ "contact.first_name",
1598
+ "custom_values.trial_name"
1599
+ ],
1600
+ "conditionalOn": "channels.sms == true"
1601
+ },
1602
+ {
1603
+ "ref": "sms.n_sms_3a",
1604
+ "name": "Nurture Text 3 - Price With Anchor",
1605
+ "templateRef": "sms_template.n_sms_3a",
1606
+ "copyDirection": "Day 5. Price against the clinic's own anchor, trial price, deposit.",
1607
+ "mergeTags": [
1608
+ "contact.first_name",
1609
+ "custom_values.trial_name",
1610
+ "custom_values.trial_price",
1611
+ "custom_values.deposit_amount"
1612
+ ],
1613
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is set"
1614
+ },
1615
+ {
1616
+ "ref": "sms.n_sms_3b",
1617
+ "name": "Nurture Text 3 - Trial Price",
1618
+ "templateRef": "sms_template.n_sms_3b",
1619
+ "copyDirection": "Day 5 (no anchor price in the intake). Trial price and deposit.",
1620
+ "mergeTags": [
1621
+ "contact.first_name",
1622
+ "custom_values.trial_name",
1623
+ "custom_values.business_name",
1624
+ "custom_values.trial_price",
1625
+ "custom_values.deposit_amount"
1626
+ ],
1627
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is set"
1628
+ },
1629
+ {
1630
+ "ref": "sms.n_sms_3c",
1631
+ "name": "Nurture Text 3 - Price With Anchor (no deposit)",
1632
+ "templateRef": "sms_template.n_sms_3c",
1633
+ "copyDirection": "Day 5, anchor price, no deposit.",
1634
+ "mergeTags": [
1635
+ "contact.first_name",
1636
+ "custom_values.trial_name",
1637
+ "custom_values.trial_price"
1638
+ ],
1639
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true"
1640
+ },
1641
+ {
1642
+ "ref": "sms.n_sms_3d",
1643
+ "name": "Nurture Text 3 - Trial Price (no deposit)",
1644
+ "templateRef": "sms_template.n_sms_3d",
1645
+ "copyDirection": "Day 5, no anchor price, no deposit.",
1646
+ "mergeTags": [
1647
+ "contact.first_name",
1648
+ "custom_values.trial_name",
1649
+ "custom_values.business_name",
1650
+ "custom_values.trial_price"
1651
+ ],
1652
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true"
1653
+ },
1654
+ {
1655
+ "ref": "sms.n_sms_4",
1656
+ "name": "Nurture Text 5 - On The Fence",
1657
+ "templateRef": "sms_template.n_sms_4",
1658
+ "copyDirection": "Day 14. Honest scarcity, offer to send the link. Only when the intake says capacity really is limited.",
1659
+ "mergeTags": [
1660
+ "contact.first_name",
1661
+ "custom_values.business_name"
1662
+ ],
1663
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
1664
+ },
1665
+ {
1666
+ "ref": "sms.n_sms_4b",
1667
+ "name": "Nurture Text 5 - On The Fence (no scarcity)",
1668
+ "templateRef": "sms_template.n_sms_4b",
1669
+ "copyDirection": "Day 14, capacity not limited. On the fence, offer the link.",
1670
+ "mergeTags": [
1671
+ "contact.first_name",
1672
+ "custom_values.trial_name"
1673
+ ],
1674
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
1675
+ },
1676
+ {
1677
+ "ref": "sms.n_sms_5",
1678
+ "name": "Nurture Text 6 - What Happens At The Visit",
1679
+ "templateRef": "sms_template.n_sms_5",
1680
+ "copyDirection": "Day 18. Remove the unknown: what the visit is.",
1681
+ "mergeTags": [
1682
+ "contact.first_name",
1683
+ "custom_values.trial_name"
1684
+ ],
1685
+ "conditionalOn": "channels.sms == true"
1686
+ },
1687
+ {
1688
+ "ref": "sms.n_sms_6",
1689
+ "name": "Nurture Text 7 - About The Deposit",
1690
+ "templateRef": "sms_template.n_sms_6",
1691
+ "copyDirection": "Day 22. The deposit, plainly.",
1692
+ "mergeTags": [
1693
+ "contact.first_name",
1694
+ "custom_values.deposit_amount",
1695
+ "custom_values.trial_price"
1696
+ ],
1697
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
1698
+ },
1699
+ {
1700
+ "ref": "sms.n_sms_6b",
1701
+ "name": "Nurture Text 7 - Booking Is Free",
1702
+ "templateRef": "sms_template.n_sms_6b",
1703
+ "copyDirection": "Day 22, no deposit. Booking costs nothing up front.",
1704
+ "mergeTags": [
1705
+ "contact.first_name",
1706
+ "custom_values.trial_name"
1707
+ ],
1708
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
1709
+ },
1710
+ {
1711
+ "ref": "sms.n_sms_7",
1712
+ "name": "Nurture Text 8 - Last One",
1713
+ "templateRef": "sms_template.n_sms_7",
1714
+ "copyDirection": "Day 30. The last direct ask, graceful exit.",
1715
+ "mergeTags": [
1716
+ "contact.first_name",
1717
+ "custom_values.booking_link"
1718
+ ],
1719
+ "conditionalOn": "channels.sms == true"
1720
+ },
1721
+ {
1722
+ "ref": "sms.w_sms_1",
1723
+ "name": "Win-back Text 1 - You Reached Out A While Back",
1724
+ "templateRef": "sms_template.w_sms_1",
1725
+ "copyDirection": "Win-back day 0, trial spots really run out. Say why they are getting the text, the limited spots, YES / N on their own lines.",
1726
+ "mergeTags": [
1727
+ "contact.first_name",
1728
+ "custom_values.owner_first_name",
1729
+ "custom_values.business_name",
1730
+ "custom_values.trial_price",
1731
+ "custom_values.trial_name"
1732
+ ],
1733
+ "conditionalOn": "channels.sms == true && offer.trialFree != true && offer.capacityLimited == true"
1734
+ },
1735
+ {
1736
+ "ref": "sms.w_sms_1b",
1737
+ "name": "Win-back Text 1 - You Reached Out A While Back (no scarcity)",
1738
+ "templateRef": "sms_template.w_sms_1b",
1739
+ "copyDirection": "Win-back day 0, capacity not limited. Say why they are getting the text, the offer with no scarcity, YES / N on their own lines.",
1740
+ "mergeTags": [
1741
+ "contact.first_name",
1742
+ "custom_values.owner_first_name",
1743
+ "custom_values.business_name",
1744
+ "custom_values.trial_price",
1745
+ "custom_values.trial_name"
1746
+ ],
1747
+ "conditionalOn": "channels.sms == true && offer.trialFree != true && offer.capacityLimited != true"
1748
+ },
1749
+ {
1750
+ "ref": "sms.w_sms_2",
1751
+ "name": "Win-back Text 2 - In Case You Missed It",
1752
+ "templateRef": "sms_template.w_sms_2",
1753
+ "copyDirection": "Win-back day 2. Price, deposit, link.",
1754
+ "mergeTags": [
1755
+ "contact.first_name",
1756
+ "custom_values.trial_name",
1757
+ "custom_values.trial_price",
1758
+ "custom_values.deposit_amount",
1759
+ "custom_values.booking_link"
1760
+ ],
1761
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
1762
+ },
1763
+ {
1764
+ "ref": "sms.w_sms_2b",
1765
+ "name": "Win-back Text 2 - In Case You Missed It (no deposit)",
1766
+ "templateRef": "sms_template.w_sms_2b",
1767
+ "copyDirection": "Win-back day 2, no deposit. Price, link.",
1768
+ "mergeTags": [
1769
+ "contact.first_name",
1770
+ "custom_values.trial_name",
1771
+ "custom_values.trial_price",
1772
+ "custom_values.booking_link"
1773
+ ],
1774
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
1775
+ },
1776
+ {
1777
+ "ref": "sms.stl_sms_1f",
1778
+ "name": "Speed to Lead - Instant Text (free trial)",
1779
+ "templateRef": "sms_template.stl_sms_1f",
1780
+ "copyDirection": "Instant, free trial. Who is texting, why, the link, that the visit is free, N and STOP lines.",
1781
+ "mergeTags": [
1782
+ "contact.first_name",
1783
+ "custom_values.owner_first_name",
1784
+ "custom_values.business_name",
1785
+ "custom_values.trial_name",
1786
+ "custom_values.booking_link"
1787
+ ],
1788
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
1789
+ },
1790
+ {
1791
+ "ref": "sms.n_sms_3e",
1792
+ "name": "Nurture Text 3 - Free Trial With Anchor",
1793
+ "templateRef": "sms_template.n_sms_3e",
1794
+ "copyDirection": "Day 5, free trial, anchor price.",
1795
+ "mergeTags": [
1796
+ "contact.first_name",
1797
+ "custom_values.trial_name"
1798
+ ],
1799
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.trialFree == true"
1800
+ },
1801
+ {
1802
+ "ref": "sms.n_sms_3f",
1803
+ "name": "Nurture Text 3 - Free Trial",
1804
+ "templateRef": "sms_template.n_sms_3f",
1805
+ "copyDirection": "Day 5, free trial.",
1806
+ "mergeTags": [
1807
+ "contact.first_name",
1808
+ "custom_values.trial_name",
1809
+ "custom_values.business_name"
1810
+ ],
1811
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.trialFree == true"
1812
+ },
1813
+ {
1814
+ "ref": "sms.n_sms_6f",
1815
+ "name": "Nurture Text 7 - Free To Book",
1816
+ "templateRef": "sms_template.n_sms_6f",
1817
+ "copyDirection": "Day 22, free trial. Nothing to pay.",
1818
+ "mergeTags": [
1819
+ "contact.first_name",
1820
+ "custom_values.trial_name"
1821
+ ],
1822
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
1823
+ },
1824
+ {
1825
+ "ref": "sms.w_sms_1f",
1826
+ "name": "Win-back Text 1 - You Reached Out A While Back (free trial)",
1827
+ "templateRef": "sms_template.w_sms_1f",
1828
+ "copyDirection": "Win-back day 0, free trial, trial spots really run out.",
1829
+ "mergeTags": [
1830
+ "contact.first_name",
1831
+ "custom_values.owner_first_name",
1832
+ "custom_values.business_name",
1833
+ "custom_values.trial_name"
1834
+ ],
1835
+ "conditionalOn": "channels.sms == true && offer.trialFree == true && offer.capacityLimited == true"
1836
+ },
1837
+ {
1838
+ "ref": "sms.w_sms_1fb",
1839
+ "name": "Win-back Text 1 - You Reached Out A While Back (free trial, no scarcity)",
1840
+ "templateRef": "sms_template.w_sms_1fb",
1841
+ "copyDirection": "Win-back day 0, free trial, capacity not limited. No scarcity.",
1842
+ "mergeTags": [
1843
+ "contact.first_name",
1844
+ "custom_values.owner_first_name",
1845
+ "custom_values.business_name",
1846
+ "custom_values.trial_name"
1847
+ ],
1848
+ "conditionalOn": "channels.sms == true && offer.trialFree == true && offer.capacityLimited != true"
1849
+ },
1850
+ {
1851
+ "ref": "sms.w_sms_2f",
1852
+ "name": "Win-back Text 2 - In Case You Missed It (free trial)",
1853
+ "templateRef": "sms_template.w_sms_2f",
1854
+ "copyDirection": "Win-back day 2, free trial.",
1855
+ "mergeTags": [
1856
+ "contact.first_name",
1857
+ "custom_values.trial_name",
1858
+ "custom_values.booking_link"
1859
+ ],
1860
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
1861
+ },
1862
+ {
1863
+ "ref": "sms.w_sms_3a",
1864
+ "name": "Win-back Text 3 - Price Check With Anchor",
1865
+ "templateRef": "sms_template.w_sms_3a",
1866
+ "copyDirection": "Win-back day 7. Price against the clinic's own anchor, trial price, deposit. Worded apart from the nurture price text so a lead who had both does not read it twice.",
1867
+ "mergeTags": [
1868
+ "contact.first_name",
1869
+ "custom_values.trial_name",
1870
+ "custom_values.trial_price",
1871
+ "custom_values.deposit_amount"
1872
+ ],
1873
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is set"
1874
+ },
1875
+ {
1876
+ "ref": "sms.w_sms_3b",
1877
+ "name": "Win-back Text 3 - Price Check",
1878
+ "templateRef": "sms_template.w_sms_3b",
1879
+ "copyDirection": "Win-back day 7 (no anchor price in the intake). Trial price and deposit.",
1880
+ "mergeTags": [
1881
+ "contact.first_name",
1882
+ "custom_values.trial_name",
1883
+ "custom_values.business_name",
1884
+ "custom_values.trial_price",
1885
+ "custom_values.deposit_amount"
1886
+ ],
1887
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is set"
1888
+ },
1889
+ {
1890
+ "ref": "sms.w_sms_3c",
1891
+ "name": "Win-back Text 3 - Price Check With Anchor (no deposit)",
1892
+ "templateRef": "sms_template.w_sms_3c",
1893
+ "copyDirection": "Win-back day 7, anchor price, no deposit.",
1894
+ "mergeTags": [
1895
+ "contact.first_name",
1896
+ "custom_values.trial_name",
1897
+ "custom_values.trial_price"
1898
+ ],
1899
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true"
1900
+ },
1901
+ {
1902
+ "ref": "sms.w_sms_3d",
1903
+ "name": "Win-back Text 3 - Price Check (no deposit)",
1904
+ "templateRef": "sms_template.w_sms_3d",
1905
+ "copyDirection": "Win-back day 7, no anchor price, no deposit.",
1906
+ "mergeTags": [
1907
+ "contact.first_name",
1908
+ "custom_values.trial_name",
1909
+ "custom_values.business_name",
1910
+ "custom_values.trial_price"
1911
+ ],
1912
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true"
1913
+ },
1914
+ {
1915
+ "ref": "sms.w_sms_3e",
1916
+ "name": "Win-back Text 3 - Cost Check With Anchor (free trial)",
1917
+ "templateRef": "sms_template.w_sms_3e",
1918
+ "copyDirection": "Win-back day 7, free trial, anchor price.",
1919
+ "mergeTags": [
1920
+ "contact.first_name",
1921
+ "custom_values.trial_name"
1922
+ ],
1923
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.trialFree == true"
1924
+ },
1925
+ {
1926
+ "ref": "sms.w_sms_3f",
1927
+ "name": "Win-back Text 3 - Cost Check (free trial)",
1928
+ "templateRef": "sms_template.w_sms_3f",
1929
+ "copyDirection": "Win-back day 7, free trial.",
1930
+ "mergeTags": [
1931
+ "contact.first_name",
1932
+ "custom_values.trial_name",
1933
+ "custom_values.business_name"
1934
+ ],
1935
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.trialFree == true"
1936
+ },
1937
+ {
1938
+ "ref": "sms.w_sms_4",
1939
+ "name": "Win-back Text 4 - Still Interested",
1940
+ "templateRef": "sms_template.w_sms_4",
1941
+ "copyDirection": "Win-back day 14. Honest weekly capacity, only when the intake says trial spots really run out; offer to send the link.",
1942
+ "mergeTags": [
1943
+ "contact.first_name",
1944
+ "custom_values.business_name"
1945
+ ],
1946
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
1947
+ },
1948
+ {
1949
+ "ref": "sms.w_sms_4b",
1950
+ "name": "Win-back Text 4 - Still Interested (no scarcity)",
1951
+ "templateRef": "sms_template.w_sms_4b",
1952
+ "copyDirection": "Win-back day 14, capacity not limited. Offer the link, no scarcity.",
1953
+ "mergeTags": [
1954
+ "contact.first_name",
1955
+ "custom_values.trial_name"
1956
+ ],
1957
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
1958
+ },
1959
+ {
1960
+ "ref": "sms.w_sms_7",
1961
+ "name": "Win-back Text 5 - Last One",
1962
+ "templateRef": "sms_template.w_sms_7",
1963
+ "copyDirection": "Win-back day 30. The last direct ask, graceful exit, the link.",
1964
+ "mergeTags": [
1965
+ "contact.first_name",
1966
+ "custom_values.trial_name",
1967
+ "custom_values.booking_link"
1968
+ ],
1969
+ "conditionalOn": "channels.sms == true"
1970
+ },
1971
+ {
1972
+ "ref": "sms.book_link_sms",
1973
+ "name": "Reply BOOK - Booking Link",
1974
+ "templateRef": "sms_template.book_link_sms",
1975
+ "copyDirection": "The person replied BOOK. The link, the deposit, the price.",
1976
+ "mergeTags": [
1977
+ "custom_values.trial_name",
1978
+ "custom_values.booking_link",
1979
+ "custom_values.deposit_amount",
1980
+ "custom_values.trial_price"
1981
+ ],
1982
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
1983
+ },
1984
+ {
1985
+ "ref": "sms.book_link_sms_b",
1986
+ "name": "Reply BOOK - Booking Link (no deposit)",
1987
+ "templateRef": "sms_template.book_link_sms_b",
1988
+ "copyDirection": "The person replied BOOK, no deposit. The link.",
1989
+ "mergeTags": [
1990
+ "custom_values.trial_name",
1991
+ "custom_values.booking_link"
1992
+ ],
1993
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set"
1994
+ },
1995
+ {
1996
+ "ref": "sms.appt_confirm_sms",
1997
+ "name": "Trial Confirmed Text",
1998
+ "templateRef": "sms_template.appt_confirm_sms",
1999
+ "copyDirection": "On booking (deposit taken). Time, deposit confirmed, address, how long, arrive early.",
2000
+ "mergeTags": [
2001
+ "contact.first_name",
2002
+ "custom_values.trial_name",
2003
+ "appointment.start_time",
2004
+ "custom_values.deposit_amount",
2005
+ "custom_values.business_address"
2006
+ ],
2007
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
2008
+ },
2009
+ {
2010
+ "ref": "sms.appt_confirm_sms_nodeposit",
2011
+ "name": "Trial Confirmed Text (no deposit)",
2012
+ "templateRef": "sms_template.appt_confirm_sms_nodeposit",
2013
+ "copyDirection": "On booking (no deposit). Time, address, how long, arrive early.",
2014
+ "mergeTags": [
2015
+ "contact.first_name",
2016
+ "custom_values.trial_name",
2017
+ "appointment.start_time",
2018
+ "custom_values.business_address"
2019
+ ],
2020
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set"
2021
+ },
2022
+ {
2023
+ "ref": "sms.appt_24h_sms",
2024
+ "name": "Trial Reminder - 24 Hours",
2025
+ "templateRef": "sms_template.appt_24h_sms",
2026
+ "copyDirection": "24 hours before. Time, and the clinic's prep instructions (or the usual arrive-early line when there are none).",
2027
+ "mergeTags": [
2028
+ "contact.first_name",
2029
+ "custom_values.trial_name",
2030
+ "custom_values.business_name",
2031
+ "appointment.start_time"
2032
+ ],
2033
+ "conditionalOn": "channels.sms == true"
2034
+ },
2035
+ {
2036
+ "ref": "sms.appt_1h_sms",
2037
+ "name": "Trial Reminder - 1 Hour",
2038
+ "templateRef": "sms_template.appt_1h_sms",
2039
+ "copyDirection": "1 hour before. Address, see you shortly.",
2040
+ "mergeTags": [
2041
+ "contact.first_name",
2042
+ "custom_values.trial_name",
2043
+ "custom_values.business_name",
2044
+ "custom_values.business_address"
2045
+ ],
2046
+ "conditionalOn": "channels.sms == true"
2047
+ },
2048
+ {
2049
+ "ref": "sms.balance_sms",
2050
+ "name": "Trial Balance Link",
2051
+ "templateRef": "sms_template.balance_sms",
2052
+ "copyDirection": "15 minutes after the visit is marked showed, when there is a balance. The trial balance link only.",
2053
+ "mergeTags": [
2054
+ "contact.first_name",
2055
+ "custom_values.balance_amount",
2056
+ "custom_values.trial_price",
2057
+ "custom_values.trial_name",
2058
+ "custom_values.balance_payment_link"
2059
+ ],
2060
+ "conditionalOn": "channels.sms == true && offer.balanceAmount is set"
2061
+ },
2062
+ {
2063
+ "ref": "sms.balance_paid_sms",
2064
+ "name": "Trial Balance Received",
2065
+ "templateRef": "sms_template.balance_paid_sms",
2066
+ "copyDirection": "When the trial balance is paid.",
2067
+ "mergeTags": [
2068
+ "contact.first_name",
2069
+ "custom_values.balance_amount"
2070
+ ],
2071
+ "conditionalOn": "channels.sms == true && offer.balanceAmount is set"
2072
+ },
2073
+ {
2074
+ "ref": "sms.ns_sms_1",
2075
+ "name": "No-Show Text 1 - We Missed You",
2076
+ "templateRef": "sms_template.ns_sms_1",
2077
+ "copyDirection": "Same day as the no-show. No guilt, reply to rebook.",
2078
+ "mergeTags": [
2079
+ "contact.first_name",
2080
+ "custom_values.trial_name"
2081
+ ],
2082
+ "conditionalOn": "channels.sms == true"
2083
+ },
2084
+ {
2085
+ "ref": "sms.ns_sms_2",
2086
+ "name": "No-Show Text 2 - Times Kept Open",
2087
+ "templateRef": "sms_template.ns_sms_2",
2088
+ "copyDirection": "Next day. Times kept open, ask for a day.",
2089
+ "mergeTags": [
2090
+ "contact.first_name",
2091
+ "custom_values.owner_first_name"
2092
+ ],
2093
+ "conditionalOn": "channels.sms == true"
2094
+ },
2095
+ {
2096
+ "ref": "sms.cancel_sms",
2097
+ "name": "Trial Canceled Text",
2098
+ "templateRef": "sms_template.cancel_sms",
2099
+ "copyDirection": "On a cancellation. Confirm it, leave the door open.",
2100
+ "mergeTags": [
2101
+ "contact.first_name",
2102
+ "custom_values.trial_name"
2103
+ ],
2104
+ "conditionalOn": "channels.sms == true"
2105
+ },
2106
+ {
2107
+ "ref": "sms.pf_sms_1",
2108
+ "name": "Program Follow-up - 2 Hour Thank You",
2109
+ "templateRef": "sms_template.pf_sms_1",
2110
+ "copyDirection": "2 hours after the card lands in No Program Yet. Thank you, questions welcome.",
2111
+ "mergeTags": [
2112
+ "contact.first_name",
2113
+ "custom_values.trial_name"
2114
+ ],
2115
+ "conditionalOn": "channels.sms == true"
2116
+ },
2117
+ {
2118
+ "ref": "sms.pf_sms_2a",
2119
+ "name": "Program Follow-up - 24 Hour Visit Pricing",
2120
+ "templateRef": "sms_template.pf_sms_2a",
2121
+ "copyDirection": "24 hours in, visit-only price offered. The window, offer the options.",
2122
+ "mergeTags": [
2123
+ "contact.first_name"
2124
+ ],
2125
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
2126
+ },
2127
+ {
2128
+ "ref": "sms.pf_sms_2b",
2129
+ "name": "Program Follow-up - 24 Hour Options",
2130
+ "templateRef": "sms_template.pf_sms_2b",
2131
+ "copyDirection": "24 hours in, no visit-only price. Offer the options again.",
2132
+ "mergeTags": [
2133
+ "contact.first_name"
2134
+ ],
2135
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
2136
+ },
2137
+ {
2138
+ "ref": "sms.pf_sms_3a",
2139
+ "name": "Program Follow-up - 48 Hour Heads Up",
2140
+ "templateRef": "sms_template.pf_sms_3a",
2141
+ "copyDirection": "48 hours in, visit-only price offered. Expires tomorrow.",
2142
+ "mergeTags": [
2143
+ "contact.first_name",
2144
+ "custom_values.business_name"
2145
+ ],
2146
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
2147
+ },
2148
+ {
2149
+ "ref": "sms.pf_sms_3b",
2150
+ "name": "Program Follow-up - 48 Hour Check-in",
2151
+ "templateRef": "sms_template.pf_sms_3b",
2152
+ "copyDirection": "48 hours in, no visit-only price. Questions welcome.",
2153
+ "mergeTags": [
2154
+ "contact.first_name",
2155
+ "custom_values.business_name"
2156
+ ],
2157
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
2158
+ },
2159
+ {
2160
+ "ref": "sms.pf_sms_4a",
2161
+ "name": "Program Follow-up - Final Day",
2162
+ "templateRef": "sms_template.pf_sms_4a",
2163
+ "copyDirection": "About 70 hours in, visit-only price offered. Final day.",
2164
+ "mergeTags": [
2165
+ "contact.first_name",
2166
+ "custom_values.business_name"
2167
+ ],
2168
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
2169
+ },
2170
+ {
2171
+ "ref": "sms.pf_sms_4b",
2172
+ "name": "Program Follow-up - Last Note",
2173
+ "templateRef": "sms_template.pf_sms_4b",
2174
+ "copyDirection": "About 70 hours in, no visit-only price. Graceful last note.",
2175
+ "mergeTags": [
2176
+ "contact.first_name"
2177
+ ],
2178
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
2179
+ },
2180
+ {
2181
+ "ref": "sms.program_confirm_sms",
2182
+ "name": "Program Sold - Confirmation",
2183
+ "templateRef": "sms_template.program_confirm_sms",
2184
+ "copyDirection": "When the card reaches Program Sold. Confirmed, excited, text back anytime.",
2185
+ "mergeTags": [
2186
+ "contact.first_name",
2187
+ "custom_values.business_name"
2188
+ ],
2189
+ "conditionalOn": "channels.sms == true"
2190
+ },
2191
+ {
2192
+ "ref": "sms.review_sms_1",
2193
+ "name": "Review Request - Text",
2194
+ "templateRef": "sms_template.review_sms_1",
2195
+ "copyDirection": "Two hours after the service-complete tag (two weeks into a program). Thank them, the review link, no incentive.",
2196
+ "mergeTags": [
2197
+ "custom_values.business_name",
2198
+ "contact.first_name",
2199
+ "custom_values.review_link"
2200
+ ],
2201
+ "conditionalOn": "channels.sms == true"
2202
+ }
2203
+ ],
2204
+ "workflows": [
2205
+ {
2206
+ "ref": "workflow.speed_to_lead",
2207
+ "allowMultiple": false,
2208
+ "name": "Speed to Lead",
2209
+ "trigger": {
2210
+ "type": "form_submission",
2211
+ "formRef": "form.trial_request"
2212
+ },
2213
+ "stopOnResponse": true,
2214
+ "_source": "PATTERN: live red-light trial account. Ad-lead workflow plus the booking-link follow-up: the link within seconds, a staff alert, nudges at 4 and 24 hours, and a no-booking alert. Card, assignment, call task and email added to the v2 depth floor.",
2215
+ "_design": "Booking link within seconds (bookings come from the first text and the first hour), a real person alerted with a call task, the card created in New Lead, then the two real nudges at 4 and 24 hours, the no-book alert, and the nurture-start hand-off as the LAST action. Stops on any reply; a booking pulls the lead out (Trial Booked - Confirm & Move starts with remove_from_workflow, as med-spa's booking workflow and the live account's 'Stop Drip' workflow do).",
2216
+ "actions": [
2217
+ {
2218
+ "type": "add_contact_tag",
2219
+ "tagRef": "tag.lc_new_lead"
2220
+ },
2221
+ {
2222
+ "type": "add_contact_tag",
2223
+ "tagRef": "tag.source_website"
2224
+ },
2225
+ {
2226
+ "type": "create_opportunity",
2227
+ "pipelineRef": "pipeline.patient_journey",
2228
+ "stageRef": "stage.new_lead",
2229
+ "name": "{{contact.name}} - New Lead"
2230
+ },
2231
+ {
2232
+ "type": "assign_user",
2233
+ "userRef": "user.owner"
2234
+ },
2235
+ {
2236
+ "type": "send_sms",
2237
+ "smsRef": "sms.stl_sms_1",
2238
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
2239
+ },
2240
+ {
2241
+ "type": "send_sms",
2242
+ "smsRef": "sms.stl_sms_1b",
2243
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
2244
+ },
2245
+ {
2246
+ "type": "send_sms",
2247
+ "smsRef": "sms.stl_sms_1f",
2248
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
2249
+ },
2250
+ {
2251
+ "type": "send_email",
2252
+ "emailRef": "email.stl_email_1",
2253
+ "conditionalOn": "offer.depositAmount is set"
2254
+ },
2255
+ {
2256
+ "type": "send_email",
2257
+ "emailRef": "email.stl_email_1b",
2258
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true"
2259
+ },
2260
+ {
2261
+ "type": "send_email",
2262
+ "emailRef": "email.stl_email_1f",
2263
+ "conditionalOn": "offer.trialFree == true"
2264
+ },
2265
+ {
2266
+ "type": "internal_notification",
2267
+ "userRef": "user.owner",
2268
+ "title": "New lead: {{contact.first_name}} {{contact.last_name}}",
2269
+ "body": "{{contact.name}} just asked about a trial ({{contact.phone}}, {{contact.email}}). The booking link has been texted."
2270
+ },
2271
+ {
2272
+ "type": "task_notification",
2273
+ "userRef": "user.owner",
2274
+ "title": "Call {{contact.first_name}} now (new trial lead)",
2275
+ "body": "Speed-to-lead call. {{contact.first_name}} {{contact.last_name}}, {{contact.phone}}, {{contact.email}}. The booking link already went out by text. Goal: answer one question and help them pick a time. Log the outcome in the contact notes.",
2276
+ "dueDate": "1"
2277
+ },
2278
+ {
2279
+ "type": "add_contact_tag",
2280
+ "tagRef": "tag.lc_link_sent"
2281
+ },
2282
+ {
2283
+ "type": "wait",
2284
+ "value": 4,
2285
+ "unit": "hours"
2286
+ },
2287
+ {
2288
+ "type": "send_sms",
2289
+ "smsRef": "sms.stl_sms_2",
2290
+ "conditionalOn": "channels.sms == true"
2291
+ },
2292
+ {
2293
+ "type": "wait",
2294
+ "value": 20,
2295
+ "unit": "hours"
2296
+ },
2297
+ {
2298
+ "type": "send_sms",
2299
+ "smsRef": "sms.stl_sms_3",
2300
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
2301
+ },
2302
+ {
2303
+ "type": "send_sms",
2304
+ "smsRef": "sms.stl_sms_3b",
2305
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
2306
+ },
2307
+ {
2308
+ "type": "add_contact_tag",
2309
+ "tagRef": "tag.link_sent_no_book"
2310
+ },
2311
+ {
2312
+ "type": "internal_notification",
2313
+ "userRef": "user.owner",
2314
+ "title": "Link sent, no booking: {{contact.first_name}}",
2315
+ "body": "A day after getting the booking link, {{contact.first_name}} {{contact.last_name}} ({{contact.phone}}) still has not booked. A personal text from someone at the clinic could help."
2316
+ },
2317
+ {
2318
+ "type": "add_notes",
2319
+ "body": "Speed to Lead finished with no reply (booking link at once, nudges at 4 and 24 hours). Handed off to Lead Nurture (30 days) by the nurture-start tag."
2320
+ },
2321
+ {
2322
+ "type": "add_contact_tag",
2323
+ "tagRef": "tag.nurture_start"
2324
+ }
2325
+ ]
2326
+ },
2327
+ {
2328
+ "ref": "workflow.missed_call",
2329
+ "allowMultiple": true,
2330
+ "name": "Missed Call Text-Back",
2331
+ "conditionalOn": "channels.sms == true",
2332
+ "trigger": {
2333
+ "type": "call_status",
2334
+ "callStatuses": [
2335
+ "no-answer",
2336
+ "busy",
2337
+ "voicemail"
2338
+ ],
2339
+ "callDirection": "inbound"
2340
+ },
2341
+ "stopOnResponse": true,
2342
+ "_source": "[NO REAL SOURCE: proposed] No live account has a missed-call text-back. Med-spa's 7-action shape.",
2343
+ "_design": "An unanswered inbound call gets a text within seconds offering the trial link, a person is alerted with a call-back task, and the link follows an hour later. Stops on reply.",
2344
+ "actions": [
2345
+ {
2346
+ "type": "send_sms",
2347
+ "smsRef": "sms.mc_sms_1",
2348
+ "conditionalOn": "channels.sms == true"
2349
+ },
2350
+ {
2351
+ "type": "add_contact_tag",
2352
+ "tagRef": "tag.missed_call"
2353
+ },
2354
+ {
2355
+ "type": "add_contact_tag",
2356
+ "tagRef": "tag.source_phone"
2357
+ },
2358
+ {
2359
+ "type": "internal_notification",
2360
+ "userRef": "user.owner",
2361
+ "title": "Missed call: {{contact.phone}}",
2362
+ "body": "An inbound call from {{contact.phone}} was not answered. A text-back already went out offering the trial link. Call back as soon as you can."
2363
+ },
2364
+ {
2365
+ "type": "task_notification",
2366
+ "userRef": "user.owner",
2367
+ "title": "Call back {{contact.phone}} (missed call)",
2368
+ "body": "Missed inbound call. Check the conversation first, then call.",
2369
+ "dueDate": "1"
2370
+ },
2371
+ {
2372
+ "type": "wait",
2373
+ "value": 1,
2374
+ "unit": "hours"
2375
+ },
2376
+ {
2377
+ "type": "send_sms",
2378
+ "smsRef": "sms.mc_sms_2",
2379
+ "conditionalOn": "channels.sms == true"
2380
+ }
2381
+ ]
2382
+ },
2383
+ {
2384
+ "ref": "workflow.lead_nurture",
2385
+ "allowMultiple": false,
2386
+ "name": "Lead Nurture (30 days)",
2387
+ "trigger": {
2388
+ "type": "contact_tag",
2389
+ "tagRef": "tag.nurture_start"
2390
+ },
2391
+ "stopOnResponse": true,
2392
+ "_source": "PATTERN: the live 9-text drip's timing (a text every one or two days) stretched to the 30-day floor. Days 1, 3, 5, 14 and 30 are real texts; day 11 exists only with a consented testimonial; days 18 and 22 and all three emails are proposed.",
2393
+ "_design": "Starts from the Speed to Lead hand-off. Up to 9 texts and 3 emails over 31 days of waits; any reply stops it. The live drip's health-claim text (pain, inflammation, sleep) and its named testimonial are deliberately NOT carried. Ends by tagging lapsed and handing off to Win-back. A booking pulls the lead out (Trial Booked - Confirm & Move).",
2394
+ "actions": [
2395
+ {
2396
+ "type": "remove_contact_tag",
2397
+ "tagRef": "tag.nurture_start"
2398
+ },
2399
+ {
2400
+ "type": "wait",
2401
+ "value": 1,
2402
+ "unit": "days"
2403
+ },
2404
+ {
2405
+ "type": "send_sms",
2406
+ "smsRef": "sms.n_sms_1",
2407
+ "conditionalOn": "channels.sms == true"
2408
+ },
2409
+ {
2410
+ "type": "wait",
2411
+ "value": 1,
2412
+ "unit": "days"
2413
+ },
2414
+ {
2415
+ "type": "send_email",
2416
+ "emailRef": "email.n_email_1"
2417
+ },
2418
+ {
2419
+ "type": "wait",
2420
+ "value": 1,
2421
+ "unit": "days"
2422
+ },
2423
+ {
2424
+ "type": "send_sms",
2425
+ "smsRef": "sms.n_sms_2",
2426
+ "conditionalOn": "channels.sms == true"
2427
+ },
2428
+ {
2429
+ "type": "wait",
2430
+ "value": 2,
2431
+ "unit": "days"
2432
+ },
2433
+ {
2434
+ "type": "send_sms",
2435
+ "smsRef": "sms.n_sms_3a",
2436
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is set"
2437
+ },
2438
+ {
2439
+ "type": "send_sms",
2440
+ "smsRef": "sms.n_sms_3b",
2441
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is set"
2442
+ },
2443
+ {
2444
+ "type": "send_sms",
2445
+ "smsRef": "sms.n_sms_3c",
2446
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true"
2447
+ },
2448
+ {
2449
+ "type": "send_sms",
2450
+ "smsRef": "sms.n_sms_3d",
2451
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true"
2452
+ },
2453
+ {
2454
+ "type": "send_sms",
2455
+ "smsRef": "sms.n_sms_3e",
2456
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.trialFree == true"
2457
+ },
2458
+ {
2459
+ "type": "send_sms",
2460
+ "smsRef": "sms.n_sms_3f",
2461
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.trialFree == true"
2462
+ },
2463
+ {
2464
+ "type": "wait",
2465
+ "value": 2,
2466
+ "unit": "days"
2467
+ },
2468
+ {
2469
+ "type": "send_email",
2470
+ "emailRef": "email.n_email_2",
2471
+ "conditionalOn": "offer.depositAmount is set"
2472
+ },
2473
+ {
2474
+ "type": "send_email",
2475
+ "emailRef": "email.n_email_2b",
2476
+ "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true"
2477
+ },
2478
+ {
2479
+ "type": "send_email",
2480
+ "emailRef": "email.n_email_2f",
2481
+ "conditionalOn": "offer.trialFree == true"
2482
+ },
2483
+ {
2484
+ "type": "wait",
2485
+ "value": 7,
2486
+ "unit": "days"
2487
+ },
2488
+ {
2489
+ "type": "send_sms",
2490
+ "smsRef": "sms.n_sms_4",
2491
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
2492
+ },
2493
+ {
2494
+ "type": "send_sms",
2495
+ "smsRef": "sms.n_sms_4b",
2496
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
2497
+ },
2498
+ {
2499
+ "type": "wait",
2500
+ "value": 2,
2501
+ "unit": "days"
2502
+ },
2503
+ {
2504
+ "type": "send_email",
2505
+ "emailRef": "email.n_email_3"
2506
+ },
2507
+ {
2508
+ "type": "wait",
2509
+ "value": 2,
2510
+ "unit": "days"
2511
+ },
2512
+ {
2513
+ "type": "send_sms",
2514
+ "smsRef": "sms.n_sms_5",
2515
+ "conditionalOn": "channels.sms == true"
2516
+ },
2517
+ {
2518
+ "type": "wait",
2519
+ "value": 4,
2520
+ "unit": "days"
2521
+ },
2522
+ {
2523
+ "type": "send_sms",
2524
+ "smsRef": "sms.n_sms_6",
2525
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
2526
+ },
2527
+ {
2528
+ "type": "send_sms",
2529
+ "smsRef": "sms.n_sms_6b",
2530
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
2531
+ },
2532
+ {
2533
+ "type": "send_sms",
2534
+ "smsRef": "sms.n_sms_6f",
2535
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
2536
+ },
2537
+ {
2538
+ "type": "wait",
2539
+ "value": 8,
2540
+ "unit": "days"
2541
+ },
2542
+ {
2543
+ "type": "send_sms",
2544
+ "smsRef": "sms.n_sms_7",
2545
+ "conditionalOn": "channels.sms == true"
2546
+ },
2547
+ {
2548
+ "type": "wait",
2549
+ "value": 1,
2550
+ "unit": "days"
2551
+ },
2552
+ {
2553
+ "type": "add_notes",
2554
+ "body": "Lead Nurture (30 days) finished with no reply. Tagged lapsed; Win-back starts from the winback-start tag."
2555
+ },
2556
+ {
2557
+ "type": "add_contact_tag",
2558
+ "tagRef": "tag.lc_lapsed"
2559
+ },
2560
+ {
2561
+ "type": "add_contact_tag",
2562
+ "tagRef": "tag.winback_start"
2563
+ }
2564
+ ]
2565
+ },
2566
+ {
2567
+ "ref": "workflow.reply_route",
2568
+ "allowMultiple": true,
2569
+ "name": "Replied - Stop & Route",
2570
+ "trigger": {
2571
+ "type": "customer_reply"
2572
+ },
2573
+ "stopOnResponse": false,
2574
+ "_source": "PATTERN: live red-light trial account. Any reply is tagged. The note, alert and 15-minute task are the med-spa route. The live card move is not copied, because the build's move can go backwards.",
2575
+ "_design": "Foundation. Every messaging sequence here stops on reply by itself (stopOnResponse), so this workflow does not remove anyone from anything: it marks the contact replied, notes it, and gives a real person a 15-minute reply task.",
2576
+ "actions": [
2577
+ {
2578
+ "type": "add_contact_tag",
2579
+ "tagRef": "tag.lc_replied"
2580
+ },
2581
+ {
2582
+ "type": "add_notes",
2583
+ "body": "Contact replied. Every sequence that stops on reply has stopped for them. A person owns the conversation from here."
2584
+ },
2585
+ {
2586
+ "type": "internal_notification",
2587
+ "userRef": "user.owner",
2588
+ "title": "{{contact.first_name}} replied",
2589
+ "body": "{{contact.first_name}} {{contact.last_name}} replied. Automated sequences stopped. Answer within 15 minutes: {{contact.phone}}"
2590
+ },
2591
+ {
2592
+ "type": "task_notification",
2593
+ "userRef": "user.owner",
2594
+ "title": "Reply to {{contact.first_name}} (15-minute target)",
2595
+ "body": "They replied to a message. Read the conversation and answer the question they asked. If they replied N or STOP, no answer is needed: those are handled automatically.",
2596
+ "dueDate": "1"
2597
+ }
2598
+ ]
2599
+ },
2600
+ {
2601
+ "ref": "workflow.reply_n",
2602
+ "allowMultiple": true,
2603
+ "name": "Replied N - Not Interested",
2604
+ "trigger": {
2605
+ "type": "customer_reply",
2606
+ "replyKeywords": [
2607
+ "N",
2608
+ "n",
2609
+ "N.",
2610
+ "n.",
2611
+ "No thanks",
2612
+ "no thanks",
2613
+ "No thank you",
2614
+ "no thank you",
2615
+ "Not interested",
2616
+ "not interested"
2617
+ ]
2618
+ },
2619
+ "stopOnResponse": false,
2620
+ "_source": "PATTERN: live red-light trial account. Exact-match soft opt-out (N, No thanks, Not interested; never a bare No), tagged and noted. The removals are added here; the live card move is not copied.",
2621
+ "_design": "Foundation. N means 'not this, thanks' (rehearsal 4 audit E6: the texts promised 'Reply N to opt out' and N only added a tag). Exact words only (never 'contains', which once opted out a patient asking 'when should I stop eating'). N takes the contact out of every marketing sequence (Speed to Lead, Missed Call Text-Back, Lead Nurture, Win-back, No-Show Rescue, Program Follow-up, Review Request), removes the tags that start the next one, and tags not-interested, so the texts' promise 'Reply N to stop these texts' is true. Lead Nurture and Win-back never let a contact in twice. Appointment texts still go out; STOP is the full opt-out.",
2622
+ "actions": [
2623
+ {
2624
+ "type": "remove_from_workflow",
2625
+ "workflowRef": "workflow.speed_to_lead"
2626
+ },
2627
+ {
2628
+ "type": "remove_from_workflow",
2629
+ "workflowRef": "workflow.missed_call",
2630
+ "conditionalOn": "channels.sms == true"
2631
+ },
2632
+ {
2633
+ "type": "remove_from_workflow",
2634
+ "workflowRef": "workflow.lead_nurture"
2635
+ },
2636
+ {
2637
+ "type": "remove_from_workflow",
2638
+ "workflowRef": "workflow.win_back"
2639
+ },
2640
+ {
2641
+ "type": "remove_from_workflow",
2642
+ "workflowRef": "workflow.no_show",
2643
+ "conditionalOn": "goal.bookingNeeded == true"
2644
+ },
2645
+ {
2646
+ "type": "remove_from_workflow",
2647
+ "workflowRef": "workflow.quote_follow_up"
2648
+ },
2649
+ {
2650
+ "type": "remove_from_workflow",
2651
+ "workflowRef": "workflow.review_request"
2652
+ },
2653
+ {
2654
+ "type": "remove_contact_tag",
2655
+ "tagRef": "tag.nurture_start"
2656
+ },
2657
+ {
2658
+ "type": "remove_contact_tag",
2659
+ "tagRef": "tag.winback_start"
2660
+ },
2661
+ {
2662
+ "type": "add_contact_tag",
2663
+ "tagRef": "tag.not_interested"
2664
+ },
2665
+ {
2666
+ "type": "add_notes",
2667
+ "body": "Replied N: taken out of every follow-up sequence and the review request. Appointment texts still go out; STOP would turn texting off completely. Leave this contact out of any win-back list."
2668
+ }
2669
+ ]
2670
+ },
2671
+ {
2672
+ "ref": "workflow.reply_stop",
2673
+ "allowMultiple": true,
2674
+ "name": "Replied STOP - Opt Out",
2675
+ "trigger": {
2676
+ "type": "customer_reply",
2677
+ "replyKeywords": [
2678
+ "Stop",
2679
+ "STOP",
2680
+ "stop",
2681
+ "Stop.",
2682
+ "STOP.",
2683
+ "stop.",
2684
+ "Stop!",
2685
+ "STOP!",
2686
+ "Stop all",
2687
+ "STOP ALL",
2688
+ "stop all",
2689
+ "Stop texting me",
2690
+ "stop texting me",
2691
+ "Stop texting",
2692
+ "stop texting",
2693
+ "Unsubscribe",
2694
+ "UNSUBSCRIBE",
2695
+ "unsubscribe",
2696
+ "Remove me",
2697
+ "remove me"
2698
+ ]
2699
+ },
2700
+ "stopOnResponse": false,
2701
+ "_source": "PATTERN: live red-light trial account. Exact-match STOP list: tag and Do Not Disturb for outbound messages. The live card move is not copied, so a sold card never moves to Lost.",
2702
+ "_design": "Foundation. Hard opt-out on the exact STOP words: tag and turn on Do Not Disturb for outbound messages. The card stays where it is.",
2703
+ "actions": [
2704
+ {
2705
+ "type": "add_contact_tag",
2706
+ "tagRef": "tag.replied_stop"
2707
+ },
2708
+ {
2709
+ "type": "enable_dnd"
2710
+ },
2711
+ {
2712
+ "type": "add_notes",
2713
+ "body": "Contact replied STOP: Do Not Disturb turned on for outbound messages. The card was not moved; if it is still before booking, move it to {{stage.lost}}."
2714
+ }
2715
+ ]
2716
+ },
2717
+ {
2718
+ "ref": "workflow.reply_team",
2719
+ "allowMultiple": true,
2720
+ "name": "Replied TEAM - Human Help",
2721
+ "trigger": {
2722
+ "type": "customer_reply",
2723
+ "replyKeywords": [
2724
+ "TEAM",
2725
+ "team",
2726
+ "Team",
2727
+ "\"TEAM\"",
2728
+ "\"team\"",
2729
+ "TEAM.",
2730
+ "team.",
2731
+ "Team.",
2732
+ "TEAM please",
2733
+ "team please"
2734
+ ]
2735
+ },
2736
+ "stopOnResponse": false,
2737
+ "_source": "PATTERN: live red-light trial account. Exact-match TEAM keyword: tag, staff alert, note, and a task so a person owns it. No chat assistant involved.",
2738
+ "_design": "Foundation. TEAM means a person answers now.",
2739
+ "actions": [
2740
+ {
2741
+ "type": "add_contact_tag",
2742
+ "tagRef": "tag.human_follow_up"
2743
+ },
2744
+ {
2745
+ "type": "internal_notification",
2746
+ "userRef": "user.owner",
2747
+ "title": "{{contact.first_name}} asked for a person",
2748
+ "body": "{{contact.first_name}} {{contact.last_name}} ({{contact.phone}}) texted TEAM: they want a person. Open the conversation and answer them."
2749
+ },
2750
+ {
2751
+ "type": "add_notes",
2752
+ "body": "Texted TEAM to ask for a person. A staff member should answer in the conversation."
2753
+ },
2754
+ {
2755
+ "type": "task_notification",
2756
+ "userRef": "user.owner",
2757
+ "title": "Answer {{contact.first_name}} now (asked for a person)",
2758
+ "body": "They replied TEAM. Read the conversation and answer them personally.",
2759
+ "dueDate": "1"
2760
+ }
2761
+ ]
2762
+ },
2763
+ {
2764
+ "ref": "workflow.book_reply",
2765
+ "allowMultiple": true,
2766
+ "name": "Reply BOOK - Send Booking Link",
2767
+ "trigger": {
2768
+ "type": "customer_reply",
2769
+ "replyKeywords": [
2770
+ "YES",
2771
+ "Yes",
2772
+ "yes",
2773
+ "YES.",
2774
+ "Yes.",
2775
+ "yes.",
2776
+ "YES!",
2777
+ "Yes!",
2778
+ "yes!",
2779
+ "Yes please",
2780
+ "yes please",
2781
+ "YES PLEASE",
2782
+ "BOOK",
2783
+ "book",
2784
+ "Book",
2785
+ "BOOK.",
2786
+ "book.",
2787
+ "Book.",
2788
+ "BOOK ME",
2789
+ "Book me",
2790
+ "book me",
2791
+ "Book Me",
2792
+ "BOOK IT",
2793
+ "Book it",
2794
+ "book it",
2795
+ "I want to book",
2796
+ "Let's book",
2797
+ "lets book"
2798
+ ]
2799
+ },
2800
+ "stopOnResponse": false,
2801
+ "conditionalOn": "goal.bookingNeeded == true",
2802
+ "_source": "PATTERN: live red-light trial account. Exact-match BOOK keyword sends the booking link at once. The live card move is not copied.",
2803
+ "_design": "Someone who asks for the link gets it at once. Listens for YES, which every text that offers the link invites, and for BOOK (rehearsal 4 audit E5: the texts said Reply YES and only BOOK was listened for). Exact match only, so 'yes but not this week' goes to a person through Replied - Stop & Route. A contact who already had the trial (tag lc_trial_done) is never sent the trial link: a person is told instead (review of batch C: the program follow-up texts could draw a bare yes).",
2804
+ "actions": [
2805
+ {
2806
+ "type": "send_sms",
2807
+ "smsRef": "sms.book_link_sms",
2808
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
2809
+ },
2810
+ {
2811
+ "type": "send_sms",
2812
+ "smsRef": "sms.book_link_sms_b",
2813
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set"
2814
+ },
2815
+ {
2816
+ "type": "add_contact_tag",
2817
+ "tagRef": "tag.lc_link_sent"
2818
+ }
2819
+ ],
2820
+ "branchOnTag": {
2821
+ "tagRef": "tag.lc_trial_done",
2822
+ "ifTagged": [
2823
+ {
2824
+ "type": "internal_notification",
2825
+ "userRef": "user.owner",
2826
+ "title": "{{contact.first_name}} replied after their trial",
2827
+ "body": "{{contact.first_name}} {{contact.last_name}} replied YES or BOOK after their trial visit. They were NOT sent the trial booking link. Answer them yourself: {{contact.phone}}"
2828
+ },
2829
+ {
2830
+ "type": "add_notes",
2831
+ "body": "Replied YES or BOOK after the trial visit: no trial booking link was sent. A person answers."
2832
+ }
2833
+ ]
2834
+ }
2835
+ },
2836
+ {
2837
+ "ref": "workflow.win_back",
2838
+ "allowMultiple": false,
2839
+ "name": "Win-back (30 days)",
2840
+ "trigger": {
2841
+ "type": "contact_tag",
2842
+ "tagRef": "tag.winback_start"
2843
+ },
2844
+ "stopOnResponse": true,
2845
+ "_source": "PATTERN: live red-light trial account. 9-text reactivation drip: its first text (the best performer on warm contacts) opens, then the price, on-the-fence and last-chance texts re-timed across 31 days. The email is proposed.",
2846
+ "_design": "Starts from the Lead Nurture or No-Show hand-off, or from a past-patient list tagged winback-start in batches. 6 touches over 31 days of waits; any reply stops it. Before a bulk send: A2P approved, the number warmed, 1 sending number per 500 contacts (at most 4), warmest contacts first, batches of 25, no Sunday sends (handoff.sms_warming). The launch-event version (spots left, sold-out waitlist, WAIT keyword) stays in the launch-event preset.",
2847
+ "actions": [
2848
+ {
2849
+ "type": "remove_contact_tag",
2850
+ "tagRef": "tag.winback_start"
2851
+ },
2852
+ {
2853
+ "type": "send_sms",
2854
+ "smsRef": "sms.w_sms_1",
2855
+ "conditionalOn": "channels.sms == true && offer.trialFree != true && offer.capacityLimited == true"
2856
+ },
2857
+ {
2858
+ "type": "send_sms",
2859
+ "smsRef": "sms.w_sms_1b",
2860
+ "conditionalOn": "channels.sms == true && offer.trialFree != true && offer.capacityLimited != true"
2861
+ },
2862
+ {
2863
+ "type": "send_sms",
2864
+ "smsRef": "sms.w_sms_1f",
2865
+ "conditionalOn": "channels.sms == true && offer.trialFree == true && offer.capacityLimited == true"
2866
+ },
2867
+ {
2868
+ "type": "send_sms",
2869
+ "smsRef": "sms.w_sms_1fb",
2870
+ "conditionalOn": "channels.sms == true && offer.trialFree == true && offer.capacityLimited != true"
2871
+ },
2872
+ {
2873
+ "type": "wait",
2874
+ "value": 2,
2875
+ "unit": "days"
2876
+ },
2877
+ {
2878
+ "type": "send_sms",
2879
+ "smsRef": "sms.w_sms_2",
2880
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
2881
+ },
2882
+ {
2883
+ "type": "send_sms",
2884
+ "smsRef": "sms.w_sms_2b",
2885
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set && offer.trialFree != true"
2886
+ },
2887
+ {
2888
+ "type": "send_sms",
2889
+ "smsRef": "sms.w_sms_2f",
2890
+ "conditionalOn": "channels.sms == true && offer.trialFree == true"
2891
+ },
2892
+ {
2893
+ "type": "wait",
2894
+ "value": 5,
2895
+ "unit": "days"
2896
+ },
2897
+ {
2898
+ "type": "send_sms",
2899
+ "smsRef": "sms.w_sms_3a",
2900
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is set"
2901
+ },
2902
+ {
2903
+ "type": "send_sms",
2904
+ "smsRef": "sms.w_sms_3b",
2905
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is set"
2906
+ },
2907
+ {
2908
+ "type": "send_sms",
2909
+ "smsRef": "sms.w_sms_3c",
2910
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true"
2911
+ },
2912
+ {
2913
+ "type": "send_sms",
2914
+ "smsRef": "sms.w_sms_3d",
2915
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true"
2916
+ },
2917
+ {
2918
+ "type": "send_sms",
2919
+ "smsRef": "sms.w_sms_3e",
2920
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.trialFree == true"
2921
+ },
2922
+ {
2923
+ "type": "send_sms",
2924
+ "smsRef": "sms.w_sms_3f",
2925
+ "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.trialFree == true"
2926
+ },
2927
+ {
2928
+ "type": "wait",
2929
+ "value": 3,
2930
+ "unit": "days"
2931
+ },
2932
+ {
2933
+ "type": "send_email",
2934
+ "emailRef": "email.w_email_1",
2935
+ "conditionalOn": "offer.trialFree != true"
2936
+ },
2937
+ {
2938
+ "type": "send_email",
2939
+ "emailRef": "email.w_email_1f",
2940
+ "conditionalOn": "offer.trialFree == true"
2941
+ },
2942
+ {
2943
+ "type": "wait",
2944
+ "value": 4,
2945
+ "unit": "days"
2946
+ },
2947
+ {
2948
+ "type": "send_sms",
2949
+ "smsRef": "sms.w_sms_4",
2950
+ "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
2951
+ },
2952
+ {
2953
+ "type": "send_sms",
2954
+ "smsRef": "sms.w_sms_4b",
2955
+ "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
2956
+ },
2957
+ {
2958
+ "type": "wait",
2959
+ "value": 16,
2960
+ "unit": "days"
2961
+ },
2962
+ {
2963
+ "type": "send_sms",
2964
+ "smsRef": "sms.w_sms_7",
2965
+ "conditionalOn": "channels.sms == true"
2966
+ },
2967
+ {
2968
+ "type": "wait",
2969
+ "value": 1,
2970
+ "unit": "days"
2971
+ },
2972
+ {
2973
+ "type": "add_notes",
2974
+ "body": "Win-back finished with no reply: 6 touches over 31 days. Tagged lost. Nothing else sends automatically."
2975
+ },
2976
+ {
2977
+ "type": "add_contact_tag",
2978
+ "tagRef": "tag.lc_lost"
2979
+ }
2980
+ ]
2981
+ },
2982
+ {
2983
+ "ref": "workflow.appointment_booked",
2984
+ "allowMultiple": true,
2985
+ "name": "Trial Booked - Confirm & Move",
2986
+ "conditionalOn": "goal.bookingNeeded == true",
2987
+ "trigger": {
2988
+ "type": "appointment",
2989
+ "appointmentStatus": "confirmed",
2990
+ "calendarRef": "calendar.trial"
2991
+ },
2992
+ "stopOnResponse": false,
2993
+ "_source": "PATTERN: live red-light trial account. Booking workflow: stop the drips, tag, alert staff, confirm by text, move the card to booked with the trial price as its value. The email is proposed.",
2994
+ "_design": "On a confirmed trial booking: pull the lead out of Speed to Lead, Missed Call Text-Back, Lead Nurture, Win-back and No-Show Rescue (med-spa's shape; the live account does the same in 'Stop DBR Drip'), tag booked (never deposit paid: a booking is not proof of payment), alert a real person, confirm by text and email, then find the card and move it to Trial Booked with the trial price, or create it there.",
2995
+ "actions": [
2996
+ {
2997
+ "type": "remove_from_workflow",
2998
+ "workflowRef": "workflow.speed_to_lead"
2999
+ },
3000
+ {
3001
+ "type": "remove_from_workflow",
3002
+ "workflowRef": "workflow.lead_nurture"
3003
+ },
3004
+ {
3005
+ "type": "remove_from_workflow",
3006
+ "workflowRef": "workflow.win_back"
3007
+ },
3008
+ {
3009
+ "type": "remove_from_workflow",
3010
+ "workflowRef": "workflow.no_show"
3011
+ },
3012
+ {
3013
+ "type": "remove_from_workflow",
3014
+ "workflowRef": "workflow.missed_call",
3015
+ "conditionalOn": "channels.sms == true"
3016
+ },
3017
+ {
3018
+ "type": "add_contact_tag",
3019
+ "tagRef": "tag.lc_trial_booked"
3020
+ },
3021
+ {
3022
+ "type": "internal_notification",
3023
+ "userRef": "user.owner",
3024
+ "title": "Trial booked: {{contact.first_name}}",
3025
+ "body": "{{contact.name}} booked a trial for {{appointment.start_time}}."
3026
+ },
3027
+ {
3028
+ "type": "send_sms",
3029
+ "smsRef": "sms.appt_confirm_sms",
3030
+ "conditionalOn": "channels.sms == true && offer.depositAmount is set"
3031
+ },
3032
+ {
3033
+ "type": "send_sms",
3034
+ "smsRef": "sms.appt_confirm_sms_nodeposit",
3035
+ "conditionalOn": "channels.sms == true && offer.depositAmount is not set"
3036
+ },
3037
+ {
3038
+ "type": "send_email",
3039
+ "emailRef": "email.appt_confirm_email"
3040
+ },
3041
+ {
3042
+ "type": "find_opportunity",
3043
+ "pipelineRef": "pipeline.patient_journey",
3044
+ "found": [
3045
+ {
3046
+ "type": "update_opportunity",
3047
+ "pipelineRef": "pipeline.patient_journey",
3048
+ "stageRef": "stage.trial_booked",
3049
+ "value": "{{offer.trialPrice}} || "
3050
+ }
3051
+ ],
3052
+ "notFound": [
3053
+ {
3054
+ "type": "create_opportunity",
3055
+ "pipelineRef": "pipeline.patient_journey",
3056
+ "stageRef": "stage.trial_booked",
3057
+ "name": "{{contact.name}} - Trial Booked",
3058
+ "value": "{{offer.trialPrice}} || "
3059
+ }
3060
+ ]
3061
+ }
3062
+ ]
3063
+ },
3064
+ {
3065
+ "ref": "workflow.appointment_reminders",
3066
+ "allowMultiple": true,
3067
+ "name": "Trial Reminders",
3068
+ "conditionalOn": "goal.bookingNeeded == true",
3069
+ "trigger": {
3070
+ "type": "appointment",
3071
+ "appointmentStatus": "confirmed",
3072
+ "calendarRef": "calendar.trial"
3073
+ },
3074
+ "stopOnResponse": false,
3075
+ "_source": "PATTERN: live red-light trial account. Reminders 24 hours and 1 hour before, on appointment-relative waits.",
3076
+ "_design": "Same trigger as Confirm & Move, kept separate so the timers stay simple. The 24-hour text carries the clinic's own prep instructions.",
3077
+ "actions": [
3078
+ {
3079
+ "type": "wait_appointment",
3080
+ "value": 1,
3081
+ "unit": "days"
3082
+ },
3083
+ {
3084
+ "type": "send_sms",
3085
+ "smsRef": "sms.appt_24h_sms",
3086
+ "conditionalOn": "channels.sms == true"
3087
+ },
3088
+ {
3089
+ "type": "wait_appointment",
3090
+ "value": 1,
3091
+ "unit": "hours"
3092
+ },
3093
+ {
3094
+ "type": "send_sms",
3095
+ "smsRef": "sms.appt_1h_sms",
3096
+ "conditionalOn": "channels.sms == true"
3097
+ }
3098
+ ]
3099
+ },
3100
+ {
3101
+ "ref": "workflow.trial_showed",
3102
+ "allowMultiple": true,
3103
+ "name": "Trial Completed - Balance",
3104
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
3105
+ "trigger": {
3106
+ "type": "appointment",
3107
+ "appointmentStatus": "showed",
3108
+ "calendarRef": "calendar.trial"
3109
+ },
3110
+ "stopOnResponse": false,
3111
+ "_source": "PATTERN: live red-light trial account. Balance link 15 minutes after the visit is marked showed, then a balance-sent tag. Only with a balance.",
3112
+ "_design": "When the visit is marked showed and the clinic collects a balance: 15 minutes (time to pay at the desk), then the trial balance link.",
3113
+ "actions": [
3114
+ {
3115
+ "type": "wait",
3116
+ "value": 15,
3117
+ "unit": "minutes"
3118
+ },
3119
+ {
3120
+ "type": "send_sms",
3121
+ "smsRef": "sms.balance_sms",
3122
+ "conditionalOn": "channels.sms == true && offer.balanceAmount is set"
3123
+ },
3124
+ {
3125
+ "type": "add_contact_tag",
3126
+ "tagRef": "tag.balance_sent"
3127
+ }
3128
+ ]
3129
+ },
3130
+ {
3131
+ "ref": "workflow.visit_outcome",
3132
+ "allowMultiple": true,
3133
+ "name": "Trial Completed - Outcome",
3134
+ "conditionalOn": "goal.bookingNeeded == true",
3135
+ "trigger": {
3136
+ "type": "appointment",
3137
+ "appointmentStatus": "showed",
3138
+ "calendarRef": "calendar.trial"
3139
+ },
3140
+ "stopOnResponse": false,
3141
+ "_source": "PATTERN: live red-light trial account. Visit marked showed: tag and move the card. The outcome task is proposed.",
3142
+ "_design": "When the visit is marked showed: tag, a task to record the visit outcome, and the card moved to Trial Completed (or created there).",
3143
+ "actions": [
3144
+ {
3145
+ "type": "add_contact_tag",
3146
+ "tagRef": "tag.lc_trial_done"
3147
+ },
3148
+ {
3149
+ "type": "task_notification",
3150
+ "userRef": "user.owner",
3151
+ "title": "Record {{contact.first_name}}'s visit outcome",
3152
+ "body": "Move their card to {{stage.program_sold}} or to {{stage.no_sale}}. The program confirmation or the 72-hour follow-up texts start from that stage.",
3153
+ "dueDate": "1"
3154
+ },
3155
+ {
3156
+ "type": "find_opportunity",
3157
+ "pipelineRef": "pipeline.patient_journey",
3158
+ "found": [
3159
+ {
3160
+ "type": "update_opportunity",
3161
+ "pipelineRef": "pipeline.patient_journey",
3162
+ "stageRef": "stage.showed"
3163
+ }
3164
+ ],
3165
+ "notFound": [
3166
+ {
3167
+ "type": "create_opportunity",
3168
+ "pipelineRef": "pipeline.patient_journey",
3169
+ "stageRef": "stage.showed",
3170
+ "name": "{{contact.name}} - Trial Completed"
3171
+ }
3172
+ ]
3173
+ }
3174
+ ]
3175
+ },
3176
+ {
3177
+ "ref": "workflow.balance_paid",
3178
+ "allowMultiple": true,
3179
+ "name": "Trial Balance Paid",
3180
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
3181
+ "trigger": {
3182
+ "type": "payment_received"
3183
+ },
3184
+ "stopOnResponse": false,
3185
+ "_source": "PATTERN: live red-light trial account. Balance paid: tag, confirmation text, staff alert. The live trigger is limited to the balance product; the build cannot set that filter, so handoff.balance_trigger holds this DRAFT.",
3186
+ "_design": "Unscoped, a payment trigger fires on every payment (the booking deposit too), so this stays DRAFT behind handoff.balance_trigger until the trigger is limited to the trial balance product.",
3187
+ "actions": [
3188
+ {
3189
+ "type": "add_contact_tag",
3190
+ "tagRef": "tag.balance_paid"
3191
+ },
3192
+ {
3193
+ "type": "send_sms",
3194
+ "smsRef": "sms.balance_paid_sms",
3195
+ "conditionalOn": "channels.sms == true && offer.balanceAmount is set"
3196
+ },
3197
+ {
3198
+ "type": "internal_notification",
3199
+ "userRef": "user.owner",
3200
+ "title": "Trial balance paid: {{contact.first_name}}",
3201
+ "body": "{{contact.first_name}} {{contact.last_name}} paid the ${{custom_values.balance_amount}} trial balance; nothing more is owed for the visit."
3202
+ }
3203
+ ]
3204
+ },
3205
+ {
3206
+ "ref": "workflow.appointment_canceled",
3207
+ "allowMultiple": true,
3208
+ "name": "Trial Canceled",
3209
+ "conditionalOn": "goal.bookingNeeded == true",
3210
+ "trigger": {
3211
+ "type": "appointment",
3212
+ "appointmentStatus": "cancelled",
3213
+ "calendarRef": "calendar.trial"
3214
+ },
3215
+ "stopOnResponse": false,
3216
+ "_source": "PATTERN: live red-light trial account. Cancellation: staff alert and a warm text. The live spots-left count and Canceled stage are launch-event pieces, not carried.",
3217
+ "_design": "Tag, alert a person, and a warm text that leaves the door open. First takes the contact out of Trial Reminders, so no reminder goes out for a visit that was cancelled (rehearsal 4 audit E7).",
3218
+ "actions": [
3219
+ {
3220
+ "type": "remove_from_workflow",
3221
+ "workflowRef": "workflow.appointment_reminders"
3222
+ },
3223
+ {
3224
+ "type": "add_contact_tag",
3225
+ "tagRef": "tag.patient_canceled"
3226
+ },
3227
+ {
3228
+ "type": "internal_notification",
3229
+ "userRef": "user.owner",
3230
+ "title": "Cancellation: {{contact.first_name}}",
3231
+ "body": "{{contact.first_name}} {{contact.last_name}} ({{contact.phone}}) cancelled their {{custom_values.trial_name}}. Check the calendar shows the time as free again."
3232
+ },
3233
+ {
3234
+ "type": "send_sms",
3235
+ "smsRef": "sms.cancel_sms",
3236
+ "conditionalOn": "channels.sms == true"
3237
+ }
3238
+ ]
3239
+ },
3240
+ {
3241
+ "ref": "workflow.no_show",
3242
+ "allowMultiple": true,
3243
+ "name": "No-Show Rescue",
3244
+ "conditionalOn": "goal.bookingNeeded == true",
3245
+ "trigger": {
3246
+ "type": "appointment",
3247
+ "appointmentStatus": "noshow",
3248
+ "calendarRef": "calendar.trial"
3249
+ },
3250
+ "stopOnResponse": true,
3251
+ "_source": "PATTERN: live red-light trial account. No-show: tag, card moved to No Show, same-day text, staff alert. The next-day text and day-4 email are proposed.",
3252
+ "_design": "On a no-show: tag, alert, call-back task, the real same-day text, then the card moves to No Show at once and the rescue continues inside both branches (a lead with no card gets the same messages). Ends by handing off to Win-back.",
3253
+ "actions": [
3254
+ {
3255
+ "type": "add_contact_tag",
3256
+ "tagRef": "tag.patient_no_show"
3257
+ },
3258
+ {
3259
+ "type": "internal_notification",
3260
+ "userRef": "user.owner",
3261
+ "title": "No-show: {{contact.first_name}}",
3262
+ "body": "{{contact.first_name}} {{contact.last_name}} ({{contact.phone}}) missed their {{custom_values.trial_name}}. Look at open times on the calendar before offering a new one."
3263
+ },
3264
+ {
3265
+ "type": "task_notification",
3266
+ "userRef": "user.owner",
3267
+ "title": "Call {{contact.first_name}} (no-show)",
3268
+ "body": "Missed trial. Call, no guilt, offer two new times.",
3269
+ "dueDate": "1"
3270
+ },
3271
+ {
3272
+ "type": "send_sms",
3273
+ "smsRef": "sms.ns_sms_1",
3274
+ "conditionalOn": "channels.sms == true"
3275
+ },
3276
+ {
3277
+ "type": "find_opportunity",
3278
+ "pipelineRef": "pipeline.patient_journey",
3279
+ "found": [
3280
+ {
3281
+ "type": "update_opportunity",
3282
+ "pipelineRef": "pipeline.patient_journey",
3283
+ "stageRef": "stage.no_show"
3284
+ },
3285
+ {
3286
+ "type": "wait",
3287
+ "value": 1,
3288
+ "unit": "days"
3289
+ },
3290
+ {
3291
+ "type": "send_sms",
3292
+ "smsRef": "sms.ns_sms_2",
3293
+ "conditionalOn": "channels.sms == true"
3294
+ },
3295
+ {
3296
+ "type": "wait",
3297
+ "value": 3,
3298
+ "unit": "days"
3299
+ },
3300
+ {
3301
+ "type": "send_email",
3302
+ "emailRef": "email.ns_email_1"
3303
+ },
3304
+ {
3305
+ "type": "wait",
3306
+ "value": 3,
3307
+ "unit": "days"
3308
+ },
3309
+ {
3310
+ "type": "add_notes",
3311
+ "body": "No-Show Rescue finished with no reply (3 touches over 7 days). Tagged lapsed; Win-back starts from the winback-start tag."
3312
+ },
3313
+ {
3314
+ "type": "add_contact_tag",
3315
+ "tagRef": "tag.lc_lapsed"
3316
+ },
3317
+ {
3318
+ "type": "add_contact_tag",
3319
+ "tagRef": "tag.winback_start"
3320
+ }
3321
+ ],
3322
+ "notFound": [
3323
+ {
3324
+ "type": "wait",
3325
+ "value": 1,
3326
+ "unit": "days"
3327
+ },
3328
+ {
3329
+ "type": "send_sms",
3330
+ "smsRef": "sms.ns_sms_2",
3331
+ "conditionalOn": "channels.sms == true"
3332
+ },
3333
+ {
3334
+ "type": "wait",
3335
+ "value": 3,
3336
+ "unit": "days"
3337
+ },
3338
+ {
3339
+ "type": "send_email",
3340
+ "emailRef": "email.ns_email_1"
3341
+ },
3342
+ {
3343
+ "type": "wait",
3344
+ "value": 3,
3345
+ "unit": "days"
3346
+ },
3347
+ {
3348
+ "type": "add_notes",
3349
+ "body": "No-Show Rescue finished with no reply (3 touches over 7 days). Tagged lapsed; Win-back starts from the winback-start tag."
3350
+ },
3351
+ {
3352
+ "type": "add_contact_tag",
3353
+ "tagRef": "tag.lc_lapsed"
3354
+ },
3355
+ {
3356
+ "type": "add_contact_tag",
3357
+ "tagRef": "tag.winback_start"
3358
+ }
3359
+ ]
3360
+ }
3361
+ ]
3362
+ },
3363
+ {
3364
+ "ref": "workflow.quote_follow_up",
3365
+ "allowMultiple": true,
3366
+ "name": "Program Follow-up (72 hours)",
3367
+ "trigger": {
3368
+ "type": "pipeline_stage_updated",
3369
+ "pipelineRef": "pipeline.patient_journey",
3370
+ "stageRef": "stage.no_sale"
3371
+ },
3372
+ "stopOnResponse": true,
3373
+ "stagePreference": {
3374
+ "stage.no_sale": [
3375
+ "no program",
3376
+ "no sale",
3377
+ "no package",
3378
+ "not sold",
3379
+ "follow up"
3380
+ ]
3381
+ },
3382
+ "_source": "PATTERN: live red-light trial account. 72-hour close for trial non-buyers, started by the no-sale stage: texts at 2, 26, 50 and 72 hours, then a last check. Urgency only when the clinic really offers a visit-only price.",
3383
+ "_design": "Starts when staff move the card to No Program Yet - Follow Up after the visit. Four texts over about 72 hours, any reply stops it, then a call task and the follow-up-exhausted tag. Trial non-buyers are NOT handed to Win-back: its first text is written for people who never came in.",
3384
+ "actions": [
3385
+ {
3386
+ "type": "add_contact_tag",
3387
+ "tagRef": "tag.no_program_yet"
3388
+ },
3389
+ {
3390
+ "type": "wait",
3391
+ "value": 2,
3392
+ "unit": "hours"
3393
+ },
3394
+ {
3395
+ "type": "send_sms",
3396
+ "smsRef": "sms.pf_sms_1",
3397
+ "conditionalOn": "channels.sms == true"
3398
+ },
3399
+ {
3400
+ "type": "wait",
3401
+ "value": 24,
3402
+ "unit": "hours"
3403
+ },
3404
+ {
3405
+ "type": "send_sms",
3406
+ "smsRef": "sms.pf_sms_2a",
3407
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
3408
+ },
3409
+ {
3410
+ "type": "send_sms",
3411
+ "smsRef": "sms.pf_sms_2b",
3412
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
3413
+ },
3414
+ {
3415
+ "type": "wait",
3416
+ "value": 24,
3417
+ "unit": "hours"
3418
+ },
3419
+ {
3420
+ "type": "send_sms",
3421
+ "smsRef": "sms.pf_sms_3a",
3422
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
3423
+ },
3424
+ {
3425
+ "type": "send_sms",
3426
+ "smsRef": "sms.pf_sms_3b",
3427
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
3428
+ },
3429
+ {
3430
+ "type": "wait",
3431
+ "value": 22,
3432
+ "unit": "hours"
3433
+ },
3434
+ {
3435
+ "type": "send_sms",
3436
+ "smsRef": "sms.pf_sms_4a",
3437
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice == true"
3438
+ },
3439
+ {
3440
+ "type": "send_sms",
3441
+ "smsRef": "sms.pf_sms_4b",
3442
+ "conditionalOn": "channels.sms == true && offer.visitOnlyPrice != true"
3443
+ },
3444
+ {
3445
+ "type": "wait",
3446
+ "value": 4,
3447
+ "unit": "hours"
3448
+ },
3449
+ {
3450
+ "type": "task_notification",
3451
+ "userRef": "user.owner",
3452
+ "title": "Call {{contact.first_name}} about a program",
3453
+ "body": "No reply to the 72-hour follow-up. One call, no pressure: what would make this a yes, or when should we check back.",
3454
+ "dueDate": "1"
3455
+ },
3456
+ {
3457
+ "type": "add_contact_tag",
3458
+ "tagRef": "tag.follow_up_exhausted"
3459
+ }
3460
+ ]
3461
+ },
3462
+ {
3463
+ "ref": "workflow.program_sold",
3464
+ "allowMultiple": true,
3465
+ "name": "Program Sold - Confirm",
3466
+ "trigger": {
3467
+ "type": "pipeline_stage_updated",
3468
+ "pipelineRef": "pipeline.patient_journey",
3469
+ "stageRef": "stage.program_sold"
3470
+ },
3471
+ "stopOnResponse": false,
3472
+ "_source": "PATTERN: live red-light trial account. Program sale: tag, confirmation text, staff alert. No payment link: programs are paid in person. The two-week wait before the review tag is proposed.",
3473
+ "_design": "Foundation. When staff move the card to Program Sold: stop the 72-hour follow-up, tag, confirm by text, alert a person, then two weeks into the program add service-complete so Review Request can ask (never after a trial alone). The two-week service-complete tag is added only when the intake left review timing at two weeks into a program. With no booking calendar, a visit timing cannot apply, so the two-week tag stays.",
3474
+ "actions": [
3475
+ {
3476
+ "type": "remove_from_workflow",
3477
+ "workflowRef": "workflow.quote_follow_up"
3478
+ },
3479
+ {
3480
+ "type": "add_contact_tag",
3481
+ "tagRef": "tag.lc_program"
3482
+ },
3483
+ {
3484
+ "type": "send_sms",
3485
+ "smsRef": "sms.program_confirm_sms",
3486
+ "conditionalOn": "channels.sms == true"
3487
+ },
3488
+ {
3489
+ "type": "internal_notification",
3490
+ "userRef": "user.owner",
3491
+ "title": "New program sale: {{contact.first_name}}",
3492
+ "body": "{{contact.first_name}} {{contact.last_name}} bought a program. Add the payment method and the program value to the contact."
3493
+ },
3494
+ {
3495
+ "type": "wait",
3496
+ "value": 14,
3497
+ "unit": "days",
3498
+ "conditionalOn": "goal.reviewTiming != 'A few hours after a visit marked showed' && goal.reviewTiming != 'The day after a visit marked showed' && goal.reviewTiming != 'When you mark the work done' || goal.bookingNeeded != true && goal.reviewTiming != 'When you mark the work done'"
3499
+ },
3500
+ {
3501
+ "type": "add_contact_tag",
3502
+ "tagRef": "tag.service_done",
3503
+ "conditionalOn": "goal.reviewTiming != 'A few hours after a visit marked showed' && goal.reviewTiming != 'The day after a visit marked showed' && goal.reviewTiming != 'When you mark the work done' || goal.bookingNeeded != true && goal.reviewTiming != 'When you mark the work done'"
3504
+ }
3505
+ ]
3506
+ },
3507
+ {
3508
+ "ref": "workflow.review_request",
3509
+ "allowMultiple": false,
3510
+ "name": "Review Request",
3511
+ "trigger": [
3512
+ {
3513
+ "conditionalOn": "goal.reviewTiming == 'A few hours after a visit marked showed' && goal.bookingNeeded == true",
3514
+ "type": "appointment",
3515
+ "appointmentStatus": "showed",
3516
+ "calendarRef": "calendar.trial"
3517
+ },
3518
+ {
3519
+ "conditionalOn": "goal.reviewTiming == 'The day after a visit marked showed' && goal.bookingNeeded == true",
3520
+ "type": "appointment",
3521
+ "appointmentStatus": "showed",
3522
+ "calendarRef": "calendar.trial"
3523
+ },
3524
+ {
3525
+ "type": "contact_tag",
3526
+ "tagRef": "tag.service_done"
3527
+ }
3528
+ ],
3529
+ "stopOnResponse": true,
3530
+ "_source": "[NO REAL SOURCE: proposed] No patient review request exists in any account read. Med-spa's shape.",
3531
+ "_design": "Starts from the service-complete tag (added two weeks into a program, or by hand). Never after a trial alone. Text two hours later with the review link, email three days later; any reply stops it. Nothing is offered in return for a review. The intake's review timing question (goal.reviewTiming, 2026-09-29) can instead start it when a trial visit is marked showed (a few hours or a day later), or leave the service-complete tag to the team alone.",
3532
+ "actions": [
3533
+ {
3534
+ "type": "remove_contact_tag",
3535
+ "tagRef": "tag.service_done"
3536
+ },
3537
+ {
3538
+ "type": "add_contact_tag",
3539
+ "tagRef": "tag.review_requested"
3540
+ },
3541
+ {
3542
+ "type": "wait",
3543
+ "value": 1,
3544
+ "unit": "days",
3545
+ "conditionalOn": "goal.reviewTiming == 'The day after a visit marked showed' && goal.bookingNeeded == true"
3546
+ },
3547
+ {
3548
+ "type": "wait",
3549
+ "value": 2,
3550
+ "unit": "hours",
3551
+ "conditionalOn": "goal.reviewTiming != 'The day after a visit marked showed' || goal.bookingNeeded != true"
3552
+ },
3553
+ {
3554
+ "type": "send_sms",
3555
+ "smsRef": "sms.review_sms_1",
3556
+ "conditionalOn": "channels.sms == true"
3557
+ },
3558
+ {
3559
+ "type": "wait",
3560
+ "value": 3,
3561
+ "unit": "days"
3562
+ },
3563
+ {
3564
+ "type": "send_email",
3565
+ "emailRef": "email.review_email_1"
3566
+ }
3567
+ ]
3568
+ }
3569
+ ],
3570
+ "handoffs": [
3571
+ {
3572
+ "ref": "handoff.add_staff",
3573
+ "conditionalOn": "staff is empty",
3574
+ "owner": "OPERATOR-UI",
3575
+ "title": "Add the people who get lead alerts and call tasks",
3576
+ "trigger": "the brief listed no staff",
3577
+ "instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every alert and call-task step is already built and waiting for them; then re-run the build with useSavedPlan:true so the waiting steps point at the person.",
3578
+ "produces": null,
3579
+ "successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
3580
+ "blocks": [
3581
+ "workflow.speed_to_lead",
3582
+ "workflow.missed_call",
3583
+ "workflow.reply_route",
3584
+ "workflow.reply_team",
3585
+ "workflow.appointment_booked",
3586
+ "workflow.visit_outcome",
3587
+ "workflow.balance_paid",
3588
+ "workflow.appointment_canceled",
3589
+ "workflow.no_show",
3590
+ "workflow.quote_follow_up",
3591
+ "workflow.program_sold"
3592
+ ]
3593
+ },
3594
+ {
3595
+ "ref": "handoff.phone_number",
3596
+ "conditionalOn": "flags includes phone_number_needed",
3597
+ "owner": "OPERATOR-UI",
3598
+ "title": "Get a phone number in GoHighLevel (so texts and missed-call text-back can work)",
3599
+ "trigger": "channels.sms == true && channels.hasPhoneNumber != yes",
3600
+ "instruction": "Settings > Phone Numbers > Add Number: buy a local number, then paste it into the business_phone custom value. A2P registration needs it too.",
3601
+ "produces": "cv.business_phone",
3602
+ "successCheck": "A number shows under Phone Numbers and business_phone matches it",
3603
+ "blocks": [
3604
+ "workflow.speed_to_lead",
3605
+ "workflow.missed_call",
3606
+ "workflow.lead_nurture",
3607
+ "workflow.book_reply",
3608
+ "workflow.win_back",
3609
+ "workflow.appointment_booked",
3610
+ "workflow.appointment_reminders",
3611
+ "workflow.trial_showed",
3612
+ "workflow.balance_paid",
3613
+ "workflow.appointment_canceled",
3614
+ "workflow.no_show",
3615
+ "workflow.quote_follow_up",
3616
+ "workflow.program_sold",
3617
+ "workflow.review_request"
3618
+ ]
3619
+ },
3620
+ {
3621
+ "ref": "handoff.business_details",
3622
+ "owner": "OPERATOR-UI",
3623
+ "title": "Confirm your business phone, address and the name texts are signed with",
3624
+ "trigger": "always (1 minute)",
3625
+ "instruction": "Settings > Custom Values: set business_phone, business_address (the street address patients drive to; the confirmation and 1-hour texts send it) and owner_first_name (the first name every text is signed with).",
3626
+ "produces": "cv.owner_first_name",
3627
+ "successCheck": "business_phone, business_address and owner_first_name show real values, not blanks",
3628
+ "blocks": [
3629
+ "cv.owner_first_name",
3630
+ "cv.business_address"
3631
+ ]
3632
+ },
3633
+ {
3634
+ "ref": "handoff.trial_offer",
3635
+ "owner": "OPERATOR-UI",
3636
+ "title": "Check the trial price, deposit and balance",
3637
+ "trigger": "always (1 minute)",
3638
+ "instruction": "Settings > Custom Values: trial_price, deposit_amount and balance_amount are numbers without a dollar sign (the texts add it). The deposit plus the balance should equal the trial price. The build fills them from the intake when it can.",
3639
+ "produces": "cv.trial_price",
3640
+ "successCheck": "trial_price, deposit_amount and balance_amount are numbers and deposit + balance = trial price",
3641
+ "blocks": [
3642
+ "cv.trial_price",
3643
+ "cv.deposit_amount",
3644
+ "cv.balance_amount"
3645
+ ]
3646
+ },
3647
+ {
3648
+ "ref": "handoff.calendar_oauth",
3649
+ "conditionalOn": "flags includes calendar_oauth_needed && goal.bookingNeeded == true",
3650
+ "owner": "OPERATOR-UI",
3651
+ "title": "Connect your calendar (Google / Outlook)",
3652
+ "trigger": "goal.bookingNeeded == true && channels.calendarConnected == false",
3653
+ "instruction": "Open the Trial Session calendar > Connections and authorize your Google or Outlook account. This login can only be approved by you.",
3654
+ "produces": null,
3655
+ "successCheck": "Calendar shows a connected external account"
3656
+ },
3657
+ {
3658
+ "ref": "handoff.assign_calendar_staff",
3659
+ "conditionalOn": "business.teamSize != 'Just me' && goal.bookingNeeded == true",
3660
+ "owner": "OPERATOR-UI",
3661
+ "title": "Assign who takes trial visits on the calendar",
3662
+ "trigger": "a team account: Blueprint will not guess who books",
3663
+ "instruction": "Open the Trial Session calendar > Team and add the people who take trial visits. Capacity is people x slots per day, because the per-slot limit counts per person.",
3664
+ "produces": null,
3665
+ "successCheck": "The calendar has at least one assigned team member",
3666
+ "blocks": [
3667
+ "calendar.trial"
3668
+ ]
3669
+ },
3670
+ {
3671
+ "ref": "handoff.link_domain",
3672
+ "conditionalOn": "goal.bookingNeeded == true",
3673
+ "owner": "OPERATOR-UI",
3674
+ "title": "Paste a booking link on a domain at least 30 days old",
3675
+ "trigger": "always (2 minutes)",
3676
+ "instruction": "Copy the Trial Session calendar's booking link and paste it into the booking_link custom value (Settings > Custom Values). If the link sits on a domain registered less than 30 days ago, use a shared, older subdomain until it ages: carriers blocked links on a week-old domain (error 30007) and GoHighLevel never retries a blocked text.",
3677
+ "produces": "cv.booking_link",
3678
+ "successCheck": "booking_link opens the booking page and its domain is at least 30 days old",
3679
+ "blocks": [
3680
+ "cv.booking_link"
3681
+ ]
3682
+ },
3683
+ {
3684
+ "ref": "handoff.deposit_product",
3685
+ "conditionalOn": "goal.bookingNeeded == true && offer.depositAmount is set",
3686
+ "owner": "OPERATOR-EXT",
3687
+ "title": "Take the deposit on the calendar",
3688
+ "trigger": "the trial takes a deposit",
3689
+ "instruction": "Connect Stripe in LIVE mode (Stripe in test mode refuses real cards). Create a product for the deposit and turn on payment for the Trial Session calendar with it. Programs are never sold by text link: take them in person. The booking confirmation text never says a deposit was received, because the automation cannot see the payment; GoHighLevel's own payment receipt does that.",
3690
+ "produces": null,
3691
+ "successCheck": "A test booking asks for the deposit"
3692
+ },
3693
+ {
3694
+ "ref": "handoff.balance_product",
3695
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
3696
+ "owner": "OPERATOR-EXT",
3697
+ "title": "Set up the trial balance link",
3698
+ "trigger": "a balance is due at the visit",
3699
+ "instruction": "Connect Stripe in LIVE mode if it is not already. Create a Trial Balance product, make a payment link for it and paste that link into the balance_payment_link custom value. This is the only payment link any text carries: programs are never sold by text link.",
3700
+ "produces": "cv.balance_payment_link",
3701
+ "successCheck": "balance_payment_link opens a payment page for the balance",
3702
+ "blocks": [
3703
+ "cv.balance_payment_link"
3704
+ ]
3705
+ },
3706
+ {
3707
+ "ref": "handoff.balance_trigger",
3708
+ "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
3709
+ "owner": "OPERATOR-UI",
3710
+ "title": "Limit the Trial Balance Paid workflow to the balance product",
3711
+ "trigger": "a payment trigger with no product filter fires on every payment",
3712
+ "instruction": "Open the Trial Balance Paid workflow, click its Payment Received trigger, add the filter for your Trial Balance product and save. Build keeps it a DRAFT and never switches it on, even after this is ticked, because the trigger it built has no product filter and would thank people for a balance when they paid the deposit. Once the filter is saved, switch the workflow on yourself.",
3713
+ "produces": null,
3714
+ "successCheck": "The trigger shows the Trial Balance product filter",
3715
+ "blocks": [
3716
+ "workflow.balance_paid"
3717
+ ]
3718
+ },
3719
+ {
3720
+ "ref": "handoff.contraindications",
3721
+ "owner": "TEAM",
3722
+ "title": "Confirm your screening list matches everywhere",
3723
+ "trigger": "always",
3724
+ "instruction": "Read the screening text on the Trial Session calendar. It must list the same conditions as your intake paperwork and anything a chat assistant tells people. Fix any difference before the first booking.",
3725
+ "produces": null,
3726
+ "successCheck": "The calendar text, the intake paperwork and any assistant list the same conditions"
3727
+ },
3728
+ {
3729
+ "ref": "handoff.claims_review",
3730
+ "owner": "TEAM",
3731
+ "title": "Approve every result the texts mention",
3732
+ "trigger": "always",
3733
+ "instruction": "The texts make no result claims unless you add them. If you add one, it must be a number you can source, followed by 'results vary', and never about pain, inflammation, sleep, weight or fat loss. A client quote is used only with that client's written consent and never with their name.",
3734
+ "produces": null,
3735
+ "successCheck": "Every result in the texts has a source and 'results vary'"
3736
+ },
3737
+ {
3738
+ "ref": "handoff.visit_outcome",
3739
+ "owner": "TEAM",
3740
+ "title": "Move each card after the visit",
3741
+ "trigger": "after every trial visit",
3742
+ "instruction": "After a trial visit, move the card to {{stage.program_sold}} or to {{stage.no_sale}}. The first sends the program confirmation text and alert; the second starts the 72-hour follow-up texts. A task reminds whoever takes calls.",
3743
+ "produces": null,
3744
+ "successCheck": "Every showed trial card sits in {{stage.program_sold}} or {{stage.no_sale}} within a day"
3745
+ },
3746
+ {
3747
+ "ref": "handoff.sms_warming",
3748
+ "owner": "OPERATOR-EXT",
3749
+ "title": "Warm the number before any bulk win-back send",
3750
+ "trigger": "before tagging a past-patient list winback-start",
3751
+ "instruction": "Only after A2P approval: warm the sending number, use one number per 500 contacts (at most 4), send to the warmest contacts first (the age of a contact drives the opt-out rate more than wording), in batches of 25 about 5 minutes apart, 08:00 to 19:30, never on Sundays. Leave out anyone tagged not-interested or replied-stop: they asked not to be texted about this.",
3752
+ "produces": null,
3753
+ "successCheck": "Opt-outs stay under 2% per batch"
3754
+ },
3755
+ {
3756
+ "ref": "handoff.a2p",
3757
+ "conditionalOn": "flags includes needs_a2p",
3758
+ "owner": "OPERATOR-EXT",
3759
+ "title": "Register A2P 10DLC (so texts can send)",
3760
+ "trigger": "channels.sms == true",
3761
+ "instruction": "Submit your A2P brand and campaign in the GHL Trust Center. Use case: Low Volume Mixed, typically 2-8 messages per month. The website trial form is the only opt-in, with its two separate unchecked consent boxes quoted word for word. Keep the words weight loss, fat loss and GLP-1 off the website. Every text-bearing workflow stays DRAFT until approval. Save your full submission before you submit it.",
3762
+ "produces": null,
3763
+ "successCheck": "A2P campaign status shows submitted or approved",
3764
+ "blocks": [
3765
+ "workflow.speed_to_lead",
3766
+ "workflow.missed_call",
3767
+ "workflow.lead_nurture",
3768
+ "workflow.book_reply",
3769
+ "workflow.win_back",
3770
+ "workflow.appointment_booked",
3771
+ "workflow.appointment_reminders",
3772
+ "workflow.trial_showed",
3773
+ "workflow.balance_paid",
3774
+ "workflow.appointment_canceled",
3775
+ "workflow.no_show",
3776
+ "workflow.quote_follow_up",
3777
+ "workflow.program_sold",
3778
+ "workflow.review_request",
3779
+ "sms.stl_sms_1",
3780
+ "sms.stl_sms_1b",
3781
+ "sms.stl_sms_2",
3782
+ "sms.stl_sms_3",
3783
+ "sms.stl_sms_3b",
3784
+ "sms.mc_sms_1",
3785
+ "sms.mc_sms_2",
3786
+ "sms.n_sms_1",
3787
+ "sms.n_sms_2",
3788
+ "sms.n_sms_3a",
3789
+ "sms.n_sms_3b",
3790
+ "sms.n_sms_3c",
3791
+ "sms.n_sms_3d",
3792
+ "sms.n_sms_4",
3793
+ "sms.n_sms_4b",
3794
+ "sms.n_sms_5",
3795
+ "sms.n_sms_6",
3796
+ "sms.n_sms_6b",
3797
+ "sms.n_sms_7",
3798
+ "sms.w_sms_1",
3799
+ "sms.w_sms_1b",
3800
+ "sms.w_sms_2",
3801
+ "sms.w_sms_2b",
3802
+ "sms.stl_sms_1f",
3803
+ "sms.n_sms_3e",
3804
+ "sms.n_sms_3f",
3805
+ "sms.n_sms_6f",
3806
+ "sms.w_sms_1f",
3807
+ "sms.w_sms_1fb",
3808
+ "sms.w_sms_2f",
3809
+ "sms.book_link_sms",
3810
+ "sms.book_link_sms_b",
3811
+ "sms.appt_confirm_sms",
3812
+ "sms.appt_confirm_sms_nodeposit",
3813
+ "sms.appt_24h_sms",
3814
+ "sms.appt_1h_sms",
3815
+ "sms.balance_sms",
3816
+ "sms.balance_paid_sms",
3817
+ "sms.ns_sms_1",
3818
+ "sms.ns_sms_2",
3819
+ "sms.cancel_sms",
3820
+ "sms.pf_sms_1",
3821
+ "sms.pf_sms_2a",
3822
+ "sms.pf_sms_2b",
3823
+ "sms.pf_sms_3a",
3824
+ "sms.pf_sms_3b",
3825
+ "sms.pf_sms_4a",
3826
+ "sms.pf_sms_4b",
3827
+ "sms.program_confirm_sms",
3828
+ "sms.review_sms_1"
3829
+ ]
3830
+ },
3831
+ {
3832
+ "ref": "handoff.email_domain",
3833
+ "conditionalOn": "flags includes email_domain_needed",
3834
+ "owner": "OPERATOR-UI",
3835
+ "title": "Set up your sending email",
3836
+ "trigger": "channels.email == false",
3837
+ "instruction": "Connect a sending domain in Settings > Email Services so the emails send from your address.",
3838
+ "produces": null,
3839
+ "successCheck": "A verified sending domain exists",
3840
+ "blocks": [
3841
+ "email.stl_email_1",
3842
+ "email.stl_email_1b",
3843
+ "email.n_email_1",
3844
+ "email.n_email_2",
3845
+ "email.n_email_2b",
3846
+ "email.n_email_3",
3847
+ "email.w_email_1",
3848
+ "email.stl_email_1f",
3849
+ "email.n_email_2f",
3850
+ "email.w_email_1f",
3851
+ "email.appt_confirm_email",
3852
+ "email.ns_email_1",
3853
+ "email.review_email_1"
3854
+ ]
3855
+ },
3856
+ {
3857
+ "ref": "handoff.review_link",
3858
+ "owner": "OPERATOR-UI",
3859
+ "title": "Paste the Google review link",
3860
+ "trigger": "always (2 minutes)",
3861
+ "instruction": "In Google Business Profile choose Ask for reviews and copy the short link, then set review_link in Settings > Custom Values. Review Request texts it to clients.",
3862
+ "produces": "cv.review_link",
3863
+ "successCheck": "review_link shows a real https link",
3864
+ "blocks": [
3865
+ "cv.review_link"
3866
+ ]
3867
+ },
3868
+ {
3869
+ "ref": "handoff.review_tag",
3870
+ "owner": "OPERATOR-UI",
3871
+ "title": "How Review Request starts",
3872
+ "trigger": "always (1 minute to read)",
3873
+ "instruction": "Review Request starts from the tag service-complete. Program Sold adds it two weeks after the sale; you can also add it by hand. It never starts after a trial alone, and nothing is offered in return for a review.",
3874
+ "successCheck": "A contact tagged service-complete gets the review text two hours later",
3875
+ "conditionalOn": "goal.reviewTiming != 'A few hours after a visit marked showed' && goal.reviewTiming != 'The day after a visit marked showed' && goal.reviewTiming != 'When you mark the work done' || goal.bookingNeeded != true && goal.reviewTiming != 'When you mark the work done'"
3876
+ },
3877
+ {
3878
+ "ref": "handoff.review_tag_visit",
3879
+ "conditionalOn": "goal.reviewTiming == 'A few hours after a visit marked showed' && goal.bookingNeeded == true",
3880
+ "owner": "OPERATOR-UI",
3881
+ "title": "How Review Request starts",
3882
+ "trigger": "always (1 minute to read)",
3883
+ "instruction": "Review Request starts when a trial visit is marked showed on the calendar, and texts the review link a few hours later. Mark a visit showed only once it has happened. Nothing is offered in return for a review.",
3884
+ "successCheck": "A trial visit marked showed gets the review text two hours later"
3885
+ },
3886
+ {
3887
+ "ref": "handoff.review_tag_next_day",
3888
+ "conditionalOn": "goal.reviewTiming == 'The day after a visit marked showed' && goal.bookingNeeded == true",
3889
+ "owner": "OPERATOR-UI",
3890
+ "title": "How Review Request starts",
3891
+ "trigger": "always (1 minute to read)",
3892
+ "instruction": "Review Request starts when a trial visit is marked showed on the calendar, and texts the review link the next day. Mark a visit showed only once it has happened. Nothing is offered in return for a review.",
3893
+ "successCheck": "A trial visit marked showed gets the review text the next day"
3894
+ },
3895
+ {
3896
+ "ref": "handoff.review_tag_marked",
3897
+ "conditionalOn": "goal.reviewTiming == 'When you mark the work done'",
3898
+ "owner": "OPERATOR-UI",
3899
+ "title": "Start Review Request by tagging service-complete when the work is done",
3900
+ "trigger": "always (1 minute to read)",
3901
+ "instruction": "Review Request starts from the tag service-complete, and nothing adds it for you. Add it on the contact when their program or visit is finished. Each contact is asked for a review once. Nothing is offered in return for a review.",
3902
+ "successCheck": "A contact tagged service-complete gets the review text two hours later"
3903
+ }
3904
+ ]
3905
+ }
3906
+ }