@elitedcs/ghl-mcp 3.96.0 → 3.97.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@
3
3
  "presetVersion": "1.0.0",
4
4
  "schemaVersion": "0.1",
5
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.",
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 trial calendar as long as the intake's visit length 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
7
  "default": false,
8
8
  "selectors": {
9
9
  "businessTypes": [
@@ -597,8 +597,8 @@
597
597
  "conditionalOn": "goal.bookingNeeded == true",
598
598
  "name": "{{business.name}} Trial Session || Trial Session",
599
599
  "calendarType": "round_robin",
600
- "_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.",
601
- "slotDuration": "{{offer.visitMinutes}} || 90",
600
+ "_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). With neither, no length is invented: the calendar is left without one and the plan carries a job to set it (handoff.calendar_visit_length), which holds the automations on that calendar until it is ticked.",
601
+ "slotDuration": "{{offer.visitMinutes}} || ",
602
602
  "slotDurationUnit": "mins",
603
603
  "slotBuffer": 0,
604
604
  "appointmentPerSlot": 1,
@@ -606,8 +606,8 @@
606
606
  "allowBookingAfter": 24,
607
607
  "allowBookingAfterUnit": "hours",
608
608
  "_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.",
609
- "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.",
610
- "_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).",
609
+ "description": "Not recommended for anyone with: {{offer.contraindications}}. If you're not sure it suits you, check with your doctor first. || If you're not sure it suits you, check with your doctor first.",
610
+ "_descriptionSource": "PATTERN: a live trial calendar shows its screening list 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). With no list, only the check-with-your-doctor line is shown. No screening-at-the-visit, intake-form or waiver claim: no intake answer gives them.",
611
611
  "teamMemberRefs": [
612
612
  "user.owner"
613
613
  ],
@@ -727,7 +727,7 @@
727
727
  "conditionalOn": "offer.depositAmount is set",
728
728
  "_source": "[NO REAL SOURCE: proposed] The live accounts send no email. Med-spa instant-email structure, trial facts from the live booking texts.",
729
729
  "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
730
- "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>"
730
+ "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}}.</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.</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>"
731
731
  },
732
732
  {
733
733
  "ref": "email_template.stl_email_1b",
@@ -735,14 +735,14 @@
735
735
  "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
736
736
  "_source": "[NO REAL SOURCE: proposed] As stl_email_1, for a clinic that takes no deposit.",
737
737
  "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
738
- "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>"
738
+ "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}}.</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.</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>"
739
739
  },
740
740
  {
741
741
  "ref": "email_template.n_email_1",
742
742
  "name": "Nurture Email 1 - What Happens At Your Visit",
743
- "_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.",
743
+ "_source": "[NO REAL SOURCE: proposed] The visit length is the intake's own answer (offer.visitMinutes). With no answer the length is not said: the second version (after ||) invites a question instead. Nothing about arriving early, an intake form or a consult is said, because no intake answer gives it.",
744
744
  "subject": "What happens at your first visit",
745
- "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>"
745
+ "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 to expect. So here is the main thing: allow about {{offer.visitMinutes}} minutes in total, and bring any questions you have.</p><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> || <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 to expect. The simplest fix is to ask: reply to this email with any question about the visit, and we'll answer it.</p><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>"
746
746
  },
747
747
  {
748
748
  "ref": "email_template.n_email_2",
@@ -763,9 +763,9 @@
763
763
  {
764
764
  "ref": "email_template.n_email_3",
765
765
  "name": "Nurture Email 3 - Is It Right For You",
766
- "_source": "[NO REAL SOURCE: proposed] Screening and results-vary wording follow the pattern of a live calendar's screening note and the claims rule.",
766
+ "_source": "[NO REAL SOURCE: proposed] The screening list is the clinic's own intake answer (offer.contraindications); with no answer, the second version (after ||) gives plain check-with-your-physician advice. Results-vary wording follows the claims rule.",
767
767
  "subject": "Is it right for you?",
768
- "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>"
768
+ "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;\">The {{custom_values.trial_name}} is not recommended for anyone with: {{offer.contraindications}}. If anything on that list applies to you, or you're not sure, check with your physician before you book.</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 visit</a></p><p style=\"margin:0 0 14px;\">Questions first? Reply to this email and I'll answer.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div> || <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;\">If you're not sure it suits you, check with your physician before you book.</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 visit</a></p><p style=\"margin:0 0 14px;\">Questions first? Reply to this email and I'll answer.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
769
769
  },
770
770
  {
771
771
  "ref": "email_template.w_email_1",
@@ -781,7 +781,7 @@
781
781
  "conditionalOn": "offer.trialFree == true",
782
782
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the instant email.",
783
783
  "subject": "Your {{custom_values.trial_name}} link, {{contact.first_name}}",
784
- "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>"
784
+ "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}}.</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.</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>"
785
785
  },
786
786
  {
787
787
  "ref": "email_template.n_email_2f",
@@ -802,9 +802,9 @@
802
802
  {
803
803
  "ref": "email_template.appt_confirm_email",
804
804
  "name": "Trial Confirmed Email",
805
- "_source": "[NO REAL SOURCE: proposed] The live account confirms by text only. Facts from the live confirmation text.",
805
+ "_source": "[NO REAL SOURCE: proposed] The live account confirms by text only. When and where from the booking; how long only from the intake's visit length (the version after || leaves it out).",
806
806
  "subject": "Confirmed: your {{custom_values.trial_name}}",
807
- "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>"
807
+ "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}} minutes</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> || <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></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>"
808
808
  },
809
809
  {
810
810
  "ref": "email_template.ns_email_1",
@@ -818,7 +818,7 @@
818
818
  "name": "Review Request - Email",
819
819
  "_source": "[NO REAL SOURCE: proposed] No review request exists in any account read. Med-spa shape; never incentivized.",
820
820
  "subject": "One minute for a review, {{contact.first_name}}?",
821
- "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>"
821
+ "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 tell us.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
822
822
  }
823
823
  ],
824
824
  "sms": [
@@ -887,7 +887,7 @@
887
887
  "name": "Nurture Text 2 - Talked Yourself Out Of It",
888
888
  "_kind": "marketing",
889
889
  "_source": "PATTERN: live red-light trial account. Drip text that names the hesitation and lowers the risk, with a YES for info ask.",
890
- "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."
890
+ "body": "{{contact.first_name}}, honest question: is there a treatment you've wondered about but kept putting off? If you have a question about the {{custom_values.trial_name}}, just reply here and we'll answer it.\n\nReply YES for the booking link.\nReply N to stop these texts."
891
891
  },
892
892
  {
893
893
  "ref": "sms_template.n_sms_3a",
@@ -895,7 +895,7 @@
895
895
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is set",
896
896
  "_kind": "marketing",
897
897
  "_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.",
898
- "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."
898
+ "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}}, and you reserve your time with a ${{custom_values.deposit_amount}} deposit.\n\nReply YES for the booking link.\nReply N to stop these texts."
899
899
  },
900
900
  {
901
901
  "ref": "sms_template.n_sms_3b",
@@ -903,7 +903,7 @@
903
903
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is set",
904
904
  "_kind": "marketing",
905
905
  "_source": "PATTERN: live red-light trial account. Drip price text without a comparison price: the trial price and the deposit framing.",
906
- "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."
906
+ "body": "{{contact.first_name}}, the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}}, and you reserve your time with a ${{custom_values.deposit_amount}} deposit.\n\nReply YES for the booking link.\nReply N to stop these texts."
907
907
  },
908
908
  {
909
909
  "ref": "sms_template.n_sms_3c",
@@ -911,7 +911,7 @@
911
911
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true",
912
912
  "_kind": "marketing",
913
913
  "_source": "PATTERN: live red-light trial account. Drip price text with a comparison price, for a clinic with no deposit.",
914
- "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."
914
+ "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}}.\n\nReply YES for the booking link.\nReply N to stop these texts."
915
915
  },
916
916
  {
917
917
  "ref": "sms_template.n_sms_3d",
@@ -919,7 +919,7 @@
919
919
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true",
920
920
  "_kind": "marketing",
921
921
  "_source": "PATTERN: live red-light trial account. Drip price text, no comparison price and no deposit.",
922
- "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."
922
+ "body": "{{contact.first_name}}, the {{custom_values.trial_name}} at {{custom_values.business_name}} is ${{custom_values.trial_price}}.\n\nReply YES for the booking link.\nReply N to stop these texts."
923
923
  },
924
924
  {
925
925
  "ref": "sms_template.n_sms_4",
@@ -941,8 +941,8 @@
941
941
  "ref": "sms_template.n_sms_5",
942
942
  "name": "Nurture Text 6 - What Happens At The Visit",
943
943
  "_kind": "marketing",
944
- "_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.",
945
- "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."
944
+ "_source": "[NO REAL SOURCE: proposed] FAQ text. The visit length is the intake's own answer; with none, the version after || invites the question instead. No arrive-early, intake-form or consult line: no intake answer gives them.",
945
+ "body": "{{contact.first_name}}, a question we get a lot: what happens at the {{custom_values.trial_name}}? Plan on about {{offer.visitMinutes}} minutes, and text any question here first.\n\nReply N to stop these texts.\n||\n{{contact.first_name}}, a question we get a lot: what happens at the {{custom_values.trial_name}}? Text your question here and we'll answer it.\n\nReply N to stop these texts."
946
946
  },
947
947
  {
948
948
  "ref": "sms_template.n_sms_6",
@@ -1013,7 +1013,7 @@
1013
1013
  "conditionalOn": "offer.anchorPrice is set && offer.trialFree == true",
1014
1014
  "_kind": "marketing",
1015
1015
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text, with the clinic's comparison price.",
1016
- "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."
1016
+ "body": "{{contact.first_name}}, comparable treatments elsewhere tend to cost {{offer.anchorPrice}} a session. Your first {{custom_values.trial_name}} here is free.\n\nReply YES for the booking link.\nReply N to stop these texts."
1017
1017
  },
1018
1018
  {
1019
1019
  "ref": "sms_template.n_sms_3f",
@@ -1021,7 +1021,7 @@
1021
1021
  "conditionalOn": "offer.anchorPrice is not set && offer.trialFree == true",
1022
1022
  "_kind": "marketing",
1023
1023
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text.",
1024
- "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."
1024
+ "body": "{{contact.first_name}}, your first {{custom_values.trial_name}} at {{custom_values.business_name}} is free.\n\nReply YES for the booking link.\nReply N to stop these texts."
1025
1025
  },
1026
1026
  {
1027
1027
  "ref": "sms_template.n_sms_6f",
@@ -1061,7 +1061,7 @@
1061
1061
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is set",
1062
1062
  "_kind": "marketing",
1063
1063
  "_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.",
1064
- "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."
1064
+ "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}}, 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."
1065
1065
  },
1066
1066
  {
1067
1067
  "ref": "sms_template.w_sms_3b",
@@ -1069,7 +1069,7 @@
1069
1069
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is set",
1070
1070
  "_kind": "marketing",
1071
1071
  "_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.",
1072
- "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."
1072
+ "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}}, 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."
1073
1073
  },
1074
1074
  {
1075
1075
  "ref": "sms_template.w_sms_3c",
@@ -1077,7 +1077,7 @@
1077
1077
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true",
1078
1078
  "_kind": "marketing",
1079
1079
  "_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.",
1080
- "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."
1080
+ "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}}.\n\nReply YES for the booking link.\nReply N to stop these texts."
1081
1081
  },
1082
1082
  {
1083
1083
  "ref": "sms_template.w_sms_3d",
@@ -1085,7 +1085,7 @@
1085
1085
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true",
1086
1086
  "_kind": "marketing",
1087
1087
  "_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.",
1088
- "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."
1088
+ "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}}.\n\nReply YES for the booking link.\nReply N to stop these texts."
1089
1089
  },
1090
1090
  {
1091
1091
  "ref": "sms_template.w_sms_3e",
@@ -1093,7 +1093,7 @@
1093
1093
  "conditionalOn": "offer.anchorPrice is set && offer.trialFree == true",
1094
1094
  "_kind": "marketing",
1095
1095
  "_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.",
1096
- "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."
1096
+ "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.\n\nReply YES for the booking link.\nReply N to stop these texts."
1097
1097
  },
1098
1098
  {
1099
1099
  "ref": "sms_template.w_sms_3f",
@@ -1101,7 +1101,7 @@
1101
1101
  "conditionalOn": "offer.anchorPrice is not set && offer.trialFree == true",
1102
1102
  "_kind": "marketing",
1103
1103
  "_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.",
1104
- "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."
1104
+ "body": "{{contact.first_name}}, in case cost was the question: your first {{custom_values.trial_name}} at {{custom_values.business_name}} is free.\n\nReply YES for the booking link.\nReply N to stop these texts."
1105
1105
  },
1106
1106
  {
1107
1107
  "ref": "sms_template.w_sms_4",
@@ -1147,23 +1147,23 @@
1147
1147
  "name": "Trial Confirmed Text",
1148
1148
  "conditionalOn": "offer.depositAmount is set",
1149
1149
  "_kind": "transactional",
1150
- "_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.",
1151
- "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."
1150
+ "_source": "PATTERN: live red-light trial account. Booking confirmation: time, address, visit length only from the intake answer (the version after || leaves it out); no arrive-early or intake-form line, since no intake answer gives one. 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.",
1151
+ "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}} minutes. || {{contact.first_name}}, you're booked! Your {{custom_values.trial_name}} is on {{appointment.start_time}}. Our address: {{custom_values.business_address}}."
1152
1152
  },
1153
1153
  {
1154
1154
  "ref": "sms_template.appt_confirm_sms_nodeposit",
1155
1155
  "name": "Trial Confirmed Text (no deposit)",
1156
1156
  "conditionalOn": "offer.depositAmount is not set",
1157
1157
  "_kind": "transactional",
1158
- "_source": "PATTERN: live red-light trial account. Booking confirmation without a deposit: time, address, visit length, arrive early for intake.",
1159
- "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."
1158
+ "_source": "PATTERN: live red-light trial account. Booking confirmation without a deposit: time, address, visit length only from the intake answer (the version after || leaves it out); no arrive-early or intake-form line, since no intake answer gives one.",
1159
+ "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}} minutes. Any questions, just text me. || {{contact.first_name}}, you're booked! Your {{custom_values.trial_name}} is on {{appointment.start_time}}. Our address: {{custom_values.business_address}}. Any questions, just text me."
1160
1160
  },
1161
1161
  {
1162
1162
  "ref": "sms_template.appt_24h_sms",
1163
1163
  "name": "Trial Reminder - 24 Hours",
1164
1164
  "_kind": "transactional",
1165
1165
  "_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).",
1166
- "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!"
1166
+ "body": "{{contact.first_name}}, see you tomorrow! Your {{custom_values.trial_name}} at {{custom_values.business_name}} is at {{appointment.start_time}}. {{offer.prepInstructions || Bring any questions you have.}} Looking forward to it!"
1167
1167
  },
1168
1168
  {
1169
1169
  "ref": "sms_template.appt_1h_sms",
@@ -2090,7 +2090,7 @@
2090
2090
  "ref": "sms.ns_sms_2",
2091
2091
  "name": "No-Show Text 2 - Times Kept Open",
2092
2092
  "templateRef": "sms_template.ns_sms_2",
2093
- "copyDirection": "Next day. Times kept open, ask for a day.",
2093
+ "copyDirection": "Next day. Offer to find another time, ask for a day. Never claim times were kept open.",
2094
2094
  "mergeTags": [
2095
2095
  "contact.first_name",
2096
2096
  "custom_values.owner_first_name"
@@ -2345,13 +2345,17 @@
2345
2345
  },
2346
2346
  "stopOnResponse": true,
2347
2347
  "_source": "[NO REAL SOURCE: proposed] No live account has a missed-call text-back. Med-spa's 7-action shape.",
2348
- "_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.",
2348
+ "_design": "Fires on an inbound call that was not answered (no-answer / busy / voicemail). Texts back within seconds, takes the missed-call tag off and puts it back on (so Missed Call - Pipeline Card starts on every missed call, W47), tags the contact, alerts a real person and creates a call-back task. W48 (2026-10-29): allowed to run again on every missed call; the closing 10-minute wait keeps the contact inside it, and GoHighLevel did not start it again for a contact still inside it (live call proof 2026-10-29), so a redial within 10 minutes gets no second text. The hour-later text is its own workflow, Missed Call - Follow-Up.",
2349
2349
  "actions": [
2350
2350
  {
2351
2351
  "type": "send_sms",
2352
2352
  "smsRef": "sms.mc_sms_1",
2353
2353
  "conditionalOn": "channels.sms == true"
2354
2354
  },
2355
+ {
2356
+ "type": "remove_contact_tag",
2357
+ "tagRef": "tag.missed_call"
2358
+ },
2355
2359
  {
2356
2360
  "type": "add_contact_tag",
2357
2361
  "tagRef": "tag.missed_call"
@@ -2375,26 +2379,21 @@
2375
2379
  },
2376
2380
  {
2377
2381
  "type": "wait",
2378
- "value": 1,
2379
- "unit": "hours"
2380
- },
2381
- {
2382
- "type": "send_sms",
2383
- "smsRef": "sms.mc_sms_2",
2384
- "conditionalOn": "channels.sms == true"
2382
+ "value": 10,
2383
+ "unit": "minutes"
2385
2384
  }
2386
2385
  ]
2387
2386
  },
2388
2387
  {
2389
2388
  "ref": "workflow.missed_call_card",
2390
- "allowMultiple": false,
2389
+ "allowMultiple": true,
2391
2390
  "name": "Missed Call - Pipeline Card",
2392
2391
  "conditionalOn": "channels.sms == true",
2393
2392
  "trigger": {
2394
2393
  "type": "contact_tag",
2395
2394
  "tagRef": "tag.missed_call"
2396
2395
  },
2397
- "_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
2396
+ "_design": "W47 (2026-10-29 live call proof): started by the missed-call tag being added, and allowed to run again. The text-back takes the tag off and puts it straight back on every missed call, so the tag is newly added each time and a repeat caller is checked again (a contact who already had the tag, with re-entry off, never reached this workflow). A caller with no card in this pipeline gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card in this pipeline keeps it and is tagged returning-caller. Not yet proven live: whether a closed (won or lost) card counts as found; Find Opportunity reads the latest card in the pipeline and the build sets no status filter. Started by the tag, not the call, because a shared account gates call-started workflows with an If/Else, and find_opportunity must be the last step and cannot sit inside one.",
2398
2397
  "actions": [
2399
2398
  {
2400
2399
  "type": "find_opportunity",
@@ -2424,6 +2423,35 @@
2424
2423
  }
2425
2424
  ]
2426
2425
  },
2426
+ {
2427
+ "ref": "workflow.missed_call_follow_up",
2428
+ "allowMultiple": true,
2429
+ "name": "Missed Call - Follow-Up",
2430
+ "conditionalOn": "channels.sms == true",
2431
+ "trigger": {
2432
+ "type": "call_status",
2433
+ "callStatuses": [
2434
+ "no-answer",
2435
+ "busy",
2436
+ "voicemail"
2437
+ ],
2438
+ "callDirection": "inbound"
2439
+ },
2440
+ "stopOnResponse": true,
2441
+ "_design": "W48 (2026-10-29): the hour-later text, split from the instant text-back so a second missed call inside the hour still gets an instant reply. Started by the same missed call; a redial while a contact is still waiting here gets no second follow-up. Stops the moment they reply.",
2442
+ "actions": [
2443
+ {
2444
+ "type": "wait",
2445
+ "value": 1,
2446
+ "unit": "hours"
2447
+ },
2448
+ {
2449
+ "type": "send_sms",
2450
+ "smsRef": "sms.mc_sms_2",
2451
+ "conditionalOn": "channels.sms == true"
2452
+ }
2453
+ ]
2454
+ },
2427
2455
  {
2428
2456
  "ref": "workflow.lead_nurture",
2429
2457
  "allowMultiple": false,
@@ -2673,6 +2701,11 @@
2673
2701
  "workflowRef": "workflow.missed_call",
2674
2702
  "conditionalOn": "channels.sms == true"
2675
2703
  },
2704
+ {
2705
+ "type": "remove_from_workflow",
2706
+ "workflowRef": "workflow.missed_call_follow_up",
2707
+ "conditionalOn": "channels.sms == true"
2708
+ },
2676
2709
  {
2677
2710
  "type": "remove_from_workflow",
2678
2711
  "workflowRef": "workflow.lead_nurture"
@@ -3058,6 +3091,11 @@
3058
3091
  "workflowRef": "workflow.missed_call",
3059
3092
  "conditionalOn": "channels.sms == true"
3060
3093
  },
3094
+ {
3095
+ "type": "remove_from_workflow",
3096
+ "workflowRef": "workflow.missed_call_follow_up",
3097
+ "conditionalOn": "channels.sms == true"
3098
+ },
3061
3099
  {
3062
3100
  "type": "add_contact_tag",
3063
3101
  "tagRef": "tag.lc_trial_booked"
@@ -3649,6 +3687,7 @@
3649
3687
  "blocks": [
3650
3688
  "workflow.speed_to_lead",
3651
3689
  "workflow.missed_call",
3690
+ "workflow.missed_call_follow_up",
3652
3691
  "workflow.lead_nurture",
3653
3692
  "workflow.book_reply",
3654
3693
  "workflow.win_back",
@@ -3877,6 +3916,7 @@
3877
3916
  "blocks": [
3878
3917
  "workflow.speed_to_lead",
3879
3918
  "workflow.missed_call",
3919
+ "workflow.missed_call_follow_up",
3880
3920
  "workflow.lead_nurture",
3881
3921
  "workflow.book_reply",
3882
3922
  "workflow.win_back",
@@ -3941,6 +3981,18 @@
3941
3981
  "sms.review_sms_1"
3942
3982
  ]
3943
3983
  },
3984
+ {
3985
+ "ref": "handoff.stop_line_check",
3986
+ "conditionalOn": "channels.sms == true",
3987
+ "owner": "OPERATOR-UI",
3988
+ "title": "Check whether the account adds its own Reply STOP line",
3989
+ "trigger": "channels.sms == true",
3990
+ "instruction": "Your GoHighLevel account may already add its own 'Reply STOP' line to the first text each contact gets. If it does, a contact may see the opt-out line twice on that first text. That is safe. Remove the build's own line from a text only if you are sure the account's own line is switched on.",
3991
+ "produces": null,
3992
+ "successCheck": "You know whether the account adds its own Reply STOP line to first texts",
3993
+ "blocks": [],
3994
+ "_design": "W49 (command-center ruling 2026-10-30): a doubled opt-out line is cosmetic, a missing one is a compliance failure, so the build keeps its own STOP line and says so. No settings path is named because none has been seen on screen; the setting is to be checked live later."
3995
+ },
3944
3996
  {
3945
3997
  "ref": "handoff.email_domain",
3946
3998
  "conditionalOn": "flags includes email_domain_needed",
@@ -102,7 +102,7 @@ Replace with a specific: what happened, what we noticed, what we can do, what to
102
102
  | Sequence | Touches | Span | Shape |
103
103
  |---|---|---|---|
104
104
  | Speed to Lead | 5 (3 texts, 2 emails) | 24 hours | instant text + email, call task, +20 min text (binary question), +3 h email (what happens next), +1 day text (not chasing), then the `nurture-start` hand-off as the LAST action |
105
- | Missed Call Text-Back | 2 texts | 1 hour | instant text-back (how can we help), tag, alert, call-back task, +1 h text (call-back time or booking link) |
105
+ | Missed Call Text-Back + Missed Call - Follow-Up | 2 texts | 1 hour | instant text-back (how can we help), tag, alert, call-back task (at most once per 10 minutes per caller); the +1 h text (call-back time or booking link) is its own workflow, so a second missed call inside the hour still gets the instant text |
106
106
  | Lead Nurture (30 days) | 11 (6 emails, 5 texts) | 31 days of waits | day 1 reframe, 3 one-word question, 5 how it works + top objection, 8 free tip, 10 method as proof, 14 price/time head-on, 15 midpoint binary, 20 cost of waiting, 23 any question, 27 decision sheet, 30 last direct ask, then `lifecycle-lapsed` + `winback-start` |
107
107
  | Win-back (30 days) | 5 (3 emails, 2 texts) | 31 days of waits | day 0 one question, 7 binary text, 14 what changed, 22 concrete reason text, 30 the door stays open (says it is the last automatic message), then `lifecycle-lost` |
108
108
  | Appointment | confirm email + text; 24 h text + prep email; 2 h text | appointment-relative | confirmation restates time, what to bring, what they leave with, how to move it |