@elitedcs/ghl-mcp 3.89.0-beta.4 → 3.89.0-beta.6

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.
@@ -36,7 +36,7 @@
36
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
37
  "quotesNeverAutomatic": true,
38
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 opt-out line starting 'Reply N' (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.",
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
40
  "keywords": "Reply keywords are exact-match lists (GoHighLevel 'Exact match phrase'), never 'contains'. The lists are the live account's own.",
41
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
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}}).",
@@ -80,7 +80,8 @@
80
80
  "contacted",
81
81
  "engaged",
82
82
  "in conversation",
83
- "interested"
83
+ "interested",
84
+ "working"
84
85
  ]
85
86
  },
86
87
  {
@@ -102,7 +103,8 @@
102
103
  "appointment booked",
103
104
  "booked",
104
105
  "scheduled",
105
- "deposit"
106
+ "deposit",
107
+ "=consultation"
106
108
  ],
107
109
  "conditionalOn": "goal.bookingNeeded == true"
108
110
  },
@@ -116,7 +118,13 @@
116
118
  "showed",
117
119
  "visited",
118
120
  "attended",
119
- "completed"
121
+ "completed",
122
+ "consultation completed",
123
+ "consultation done",
124
+ "consultation attended",
125
+ "consultation showed",
126
+ "consultation complete",
127
+ "consultation held"
120
128
  ],
121
129
  "conditionalOn": "goal.bookingNeeded == true"
122
130
  },
@@ -401,11 +409,6 @@
401
409
  "ref": "tag.winback_start",
402
410
  "name": "winback-start"
403
411
  },
404
- {
405
- "ref": "tag.deposit_paid",
406
- "name": "deposit-paid",
407
- "conditionalOn": "goal.bookingNeeded == true && offer.depositAmount is set"
408
- },
409
412
  {
410
413
  "ref": "tag.balance_sent",
411
414
  "name": "balance-sent",
@@ -820,7 +823,7 @@
820
823
  "conditionalOn": "offer.depositAmount is set",
821
824
  "_kind": "marketing",
822
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.",
823
- "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 opt out.\nReply STOP to end all texts."
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."
824
827
  },
825
828
  {
826
829
  "ref": "sms_template.stl_sms_1b",
@@ -828,14 +831,14 @@
828
831
  "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
829
832
  "_kind": "marketing",
830
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.",
831
- "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 opt out.\nReply STOP to end all texts."
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."
832
835
  },
833
836
  {
834
837
  "ref": "sms_template.stl_sms_2",
835
838
  "name": "Speed to Lead - 4 Hour Nudge",
836
839
  "_kind": "marketing",
837
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.",
838
- "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 opt out"
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."
839
842
  },
840
843
  {
841
844
  "ref": "sms_template.stl_sms_3",
@@ -843,7 +846,7 @@
843
846
  "conditionalOn": "offer.capacityLimited == true",
844
847
  "_kind": "marketing",
845
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.",
846
- "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 opt out"
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."
847
850
  },
848
851
  {
849
852
  "ref": "sms_template.stl_sms_3b",
@@ -851,35 +854,35 @@
851
854
  "conditionalOn": "offer.capacityLimited != true",
852
855
  "_kind": "marketing",
853
856
  "_source": "PATTERN: live red-light trial account. Final nudge 24 hours after the link, without scarcity: a plain reminder and the link.",
854
- "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 opt out"
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."
855
858
  },
856
859
  {
857
860
  "ref": "sms_template.mc_sms_1",
858
861
  "name": "Missed Call - Instant Text-Back",
859
862
  "_kind": "marketing",
860
863
  "_source": "[NO REAL SOURCE: proposed] No missed-call text-back exists in any account read. Med-spa preset shape, trial wording.",
861
- "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 opt out"
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."
862
865
  },
863
866
  {
864
867
  "ref": "sms_template.mc_sms_2",
865
868
  "name": "Missed Call - 1 Hour Text",
866
869
  "_kind": "marketing",
867
870
  "_source": "[NO REAL SOURCE: proposed] No real source. Offers the link an hour later, as the research outline asks.",
868
- "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 opt out"
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."
869
872
  },
870
873
  {
871
874
  "ref": "sms_template.n_sms_1",
872
875
  "name": "Nurture Text 1 - In Case You Missed It",
873
876
  "_kind": "marketing",
874
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.",
875
- "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 opt out"
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."
876
879
  },
877
880
  {
878
881
  "ref": "sms_template.n_sms_2",
879
882
  "name": "Nurture Text 2 - Talked Yourself Out Of It",
880
883
  "_kind": "marketing",
881
884
  "_source": "PATTERN: live red-light trial account. Drip text that names the hesitation and lowers the risk, with a YES for info ask.",
882
- "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 info.\nReply N to opt out"
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."
883
886
  },
884
887
  {
885
888
  "ref": "sms_template.n_sms_3a",
@@ -887,7 +890,7 @@
887
890
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is set",
888
891
  "_kind": "marketing",
889
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.",
890
- "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 info.\nReply N to opt out"
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."
891
894
  },
892
895
  {
893
896
  "ref": "sms_template.n_sms_3b",
@@ -895,7 +898,7 @@
895
898
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is set",
896
899
  "_kind": "marketing",
897
900
  "_source": "PATTERN: live red-light trial account. Drip price text without a comparison price: the trial price and the deposit framing.",
898
- "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 info.\nReply N to opt out"
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."
899
902
  },
900
903
  {
901
904
  "ref": "sms_template.n_sms_3c",
@@ -903,7 +906,7 @@
903
906
  "conditionalOn": "offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true",
904
907
  "_kind": "marketing",
905
908
  "_source": "PATTERN: live red-light trial account. Drip price text with a comparison price, for a clinic with no deposit.",
906
- "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 info.\nReply N to opt out"
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."
907
910
  },
908
911
  {
909
912
  "ref": "sms_template.n_sms_3d",
@@ -911,7 +914,7 @@
911
914
  "conditionalOn": "offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true",
912
915
  "_kind": "marketing",
913
916
  "_source": "PATTERN: live red-light trial account. Drip price text, no comparison price and no deposit.",
914
- "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 info.\nReply N to opt out"
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."
915
918
  },
916
919
  {
917
920
  "ref": "sms_template.n_sms_4",
@@ -919,7 +922,7 @@
919
922
  "conditionalOn": "offer.capacityLimited == true",
920
923
  "_kind": "marketing",
921
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.",
922
- "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 info.\nReply N to opt out"
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."
923
926
  },
924
927
  {
925
928
  "ref": "sms_template.n_sms_4b",
@@ -927,14 +930,14 @@
927
930
  "conditionalOn": "offer.capacityLimited != true",
928
931
  "_kind": "marketing",
929
932
  "_source": "PATTERN: live red-light trial account. Late drip text without scarcity: an offer to send the link.",
930
- "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 info.\nReply N to opt out"
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."
931
934
  },
932
935
  {
933
936
  "ref": "sms_template.n_sms_5",
934
937
  "name": "Nurture Text 6 - What Happens At The Visit",
935
938
  "_kind": "marketing",
936
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.",
937
- "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 opt out"
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."
938
941
  },
939
942
  {
940
943
  "ref": "sms_template.n_sms_6",
@@ -942,7 +945,7 @@
942
945
  "conditionalOn": "offer.depositAmount is set",
943
946
  "_kind": "marketing",
944
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.",
945
- "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 opt out"
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."
946
949
  },
947
950
  {
948
951
  "ref": "sms_template.n_sms_6b",
@@ -950,22 +953,30 @@
950
953
  "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
951
954
  "_kind": "marketing",
952
955
  "_source": "[NO REAL SOURCE: proposed] FAQ text for a clinic that takes no deposit.",
953
- "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 opt out"
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."
954
957
  },
955
958
  {
956
959
  "ref": "sms_template.n_sms_7",
957
960
  "name": "Nurture Text 8 - Last One",
958
961
  "_kind": "marketing",
959
962
  "_source": "PATTERN: live red-light trial account. Last text of the drip: the final direct ask with a graceful exit and the link.",
960
- "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 opt out"
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."
961
964
  },
962
965
  {
963
966
  "ref": "sms_template.w_sms_1",
964
967
  "name": "Win-back Text 1 - You Reached Out A While Back",
965
- "conditionalOn": "offer.trialFree != true",
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",
966
977
  "_kind": "marketing",
967
- "_source": "PATTERN: live red-light trial account. First text of the reactivation drip (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.",
968
- "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 details.\nReply N and I won't text about it again."
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."
969
980
  },
970
981
  {
971
982
  "ref": "sms_template.w_sms_2",
@@ -973,7 +984,7 @@
973
984
  "conditionalOn": "offer.depositAmount is set",
974
985
  "_kind": "marketing",
975
986
  "_source": "PATTERN: live red-light trial account. Second reactivation text: price, deposit framing and the link.",
976
- "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 opt out"
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."
977
988
  },
978
989
  {
979
990
  "ref": "sms_template.w_sms_2b",
@@ -981,7 +992,7 @@
981
992
  "conditionalOn": "offer.depositAmount is not set && offer.trialFree != true",
982
993
  "_kind": "marketing",
983
994
  "_source": "PATTERN: live red-light trial account. Second reactivation text for a clinic with no deposit: price and the link.",
984
- "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 opt out"
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."
985
996
  },
986
997
  {
987
998
  "ref": "sms_template.stl_sms_1f",
@@ -989,7 +1000,7 @@
989
1000
  "conditionalOn": "offer.trialFree == true",
990
1001
  "_kind": "marketing",
991
1002
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the instant booking-link text.",
992
- "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 opt out.\nReply STOP to end all texts."
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."
993
1004
  },
994
1005
  {
995
1006
  "ref": "sms_template.n_sms_3e",
@@ -997,7 +1008,7 @@
997
1008
  "conditionalOn": "offer.anchorPrice is set && offer.trialFree == true",
998
1009
  "_kind": "marketing",
999
1010
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text, with the clinic's comparison price.",
1000
- "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 info.\nReply N to opt out"
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."
1001
1012
  },
1002
1013
  {
1003
1014
  "ref": "sms_template.n_sms_3f",
@@ -1005,7 +1016,7 @@
1005
1016
  "conditionalOn": "offer.anchorPrice is not set && offer.trialFree == true",
1006
1017
  "_kind": "marketing",
1007
1018
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the drip price text.",
1008
- "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 info.\nReply N to opt out"
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."
1009
1020
  },
1010
1021
  {
1011
1022
  "ref": "sms_template.n_sms_6f",
@@ -1013,15 +1024,23 @@
1013
1024
  "conditionalOn": "offer.trialFree == true",
1014
1025
  "_kind": "marketing",
1015
1026
  "_source": "[NO REAL SOURCE: proposed] FAQ text for a free trial.",
1016
- "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 opt out"
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."
1017
1028
  },
1018
1029
  {
1019
1030
  "ref": "sms_template.w_sms_1f",
1020
1031
  "name": "Win-back Text 1 - You Reached Out A While Back (free trial)",
1021
- "conditionalOn": "offer.trialFree == true",
1032
+ "conditionalOn": "offer.trialFree == true && offer.capacityLimited == true",
1022
1033
  "_kind": "marketing",
1023
- "_source": "[NO REAL SOURCE: proposed] Free-trial version of the reactivation drip's first text (who is texting, why, YES and N on their own lines).",
1024
- "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 details.\nReply N and I won't text about it again."
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."
1025
1044
  },
1026
1045
  {
1027
1046
  "ref": "sms_template.w_sms_2f",
@@ -1029,7 +1048,78 @@
1029
1048
  "conditionalOn": "offer.trialFree == true",
1030
1049
  "_kind": "marketing",
1031
1050
  "_source": "[NO REAL SOURCE: proposed] Free-trial version of the second reactivation text.",
1032
- "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 opt out"
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."
1033
1123
  },
1034
1124
  {
1035
1125
  "ref": "sms_template.book_link_sms",
@@ -1052,8 +1142,8 @@
1052
1142
  "name": "Trial Confirmed Text",
1053
1143
  "conditionalOn": "offer.depositAmount is set",
1054
1144
  "_kind": "transactional",
1055
- "_source": "PATTERN: live red-light trial account. Booking confirmation: time, deposit received, address, visit length, arrive early for intake.",
1056
- "body": "{{contact.first_name}}, you're booked! Your {{custom_values.trial_name}} is on {{appointment.start_time}}, and we've received your ${{custom_values.deposit_amount}} deposit. Our address: {{custom_values.business_address}}. Allow about {{offer.visitMinutes || 90}} minutes, and come 10 minutes early to fill in a short intake form."
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."
1057
1147
  },
1058
1148
  {
1059
1149
  "ref": "sms_template.appt_confirm_sms_nodeposit",
@@ -1067,8 +1157,8 @@
1067
1157
  "ref": "sms_template.appt_24h_sms",
1068
1158
  "name": "Trial Reminder - 24 Hours",
1069
1159
  "_kind": "transactional",
1070
- "_source": "PATTERN: live red-light trial account. Reminder 24 hours before: time, arrive early, and the clinic's own prep instructions from the intake.",
1071
- "body": "{{contact.first_name}}, see you tomorrow! Your {{custom_values.trial_name}} at {{custom_values.business_name}} is at {{appointment.start_time}}. Please come about 10 minutes early. {{offer.prepInstructions || Comfortable clothes are best, and bring any questions.}} Looking forward to it!"
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!"
1072
1162
  },
1073
1163
  {
1074
1164
  "ref": "sms_template.appt_1h_sms",
@@ -1082,8 +1172,8 @@
1082
1172
  "name": "Trial Balance Link",
1083
1173
  "conditionalOn": "offer.balanceAmount is set",
1084
1174
  "_kind": "transactional",
1085
- "_source": "PATTERN: live red-light trial account. Balance link 15 minutes after check-in. The only payment link any text carries.",
1086
- "body": "Hi {{contact.first_name}}, welcome in! Before your visit starts, 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}}"
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}}"
1087
1177
  },
1088
1178
  {
1089
1179
  "ref": "sms_template.balance_paid_sms",
@@ -1098,14 +1188,14 @@
1098
1188
  "name": "No-Show Text 1 - We Missed You",
1099
1189
  "_kind": "marketing",
1100
1190
  "_source": "PATTERN: live red-light trial account. Same-day no-show text: no guilt, reply to rebook.",
1101
- "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 opt out"
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."
1102
1192
  },
1103
1193
  {
1104
1194
  "ref": "sms_template.ns_sms_2",
1105
1195
  "name": "No-Show Text 2 - Times Kept Open",
1106
1196
  "_kind": "marketing",
1107
- "_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.",
1108
- "body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. I kept a couple of trial times open this week. Want one? Reply with a day that works.\n\nReply N to opt out"
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."
1109
1199
  },
1110
1200
  {
1111
1201
  "ref": "sms_template.cancel_sms",
@@ -1119,7 +1209,7 @@
1119
1209
  "name": "Program Follow-up - 2 Hour Thank You",
1120
1210
  "_kind": "marketing",
1121
1211
  "_source": "PATTERN: live red-light trial account. 72-hour close, text 1 at 2 hours: thanks and questions welcome.",
1122
- "body": "{{contact.first_name}}, thanks for coming in today! We hope you enjoyed the {{custom_values.trial_name}}. Curious about any of the programs we discussed? Text us anytime.\n\nReply N to opt out"
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."
1123
1213
  },
1124
1214
  {
1125
1215
  "ref": "sms_template.pf_sms_2a",
@@ -1127,7 +1217,7 @@
1127
1217
  "conditionalOn": "offer.visitOnlyPrice == true",
1128
1218
  "_kind": "marketing",
1129
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.",
1130
- "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. Shall I send the options again?\n\nReply N to opt out"
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."
1131
1221
  },
1132
1222
  {
1133
1223
  "ref": "sms_template.pf_sms_2b",
@@ -1135,7 +1225,7 @@
1135
1225
  "conditionalOn": "offer.visitOnlyPrice != true",
1136
1226
  "_kind": "marketing",
1137
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.",
1138
- "body": "{{contact.first_name}}, if any of the programs we discussed at your visit caught your eye, I can send the options again. Would that help?\n\nReply N to opt out"
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."
1139
1229
  },
1140
1230
  {
1141
1231
  "ref": "sms_template.pf_sms_3a",
@@ -1143,7 +1233,7 @@
1143
1233
  "conditionalOn": "offer.visitOnlyPrice == true",
1144
1234
  "_kind": "marketing",
1145
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.",
1146
- "body": "{{contact.first_name}}, a note from {{custom_values.business_name}}: the program price from your visit ends tomorrow. Want to reserve it? Reply here.\n\nReply N to opt out"
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."
1147
1237
  },
1148
1238
  {
1149
1239
  "ref": "sms_template.pf_sms_3b",
@@ -1151,7 +1241,7 @@
1151
1241
  "conditionalOn": "offer.visitOnlyPrice != true",
1152
1242
  "_kind": "marketing",
1153
1243
  "_source": "[NO REAL SOURCE: proposed] Replaces the live 48-hour urgency text when the clinic has no visit-only price.",
1154
- "body": "{{contact.first_name}}, quick check-in from {{custom_values.business_name}}. Anything you'd like to know about the programs from your visit? Just reply here and I'll answer.\n\nReply N to opt out"
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."
1155
1245
  },
1156
1246
  {
1157
1247
  "ref": "sms_template.pf_sms_4a",
@@ -1159,7 +1249,7 @@
1159
1249
  "conditionalOn": "offer.visitOnlyPrice == true",
1160
1250
  "_kind": "marketing",
1161
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.",
1162
- "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 here if you'd like it and I'll sort it out.\n\nReply N to opt out"
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."
1163
1253
  },
1164
1254
  {
1165
1255
  "ref": "sms_template.pf_sms_4b",
@@ -1167,7 +1257,7 @@
1167
1257
  "conditionalOn": "offer.visitOnlyPrice != true",
1168
1258
  "_kind": "marketing",
1169
1259
  "_source": "[NO REAL SOURCE: proposed] Replaces the live final-day text when the clinic has no visit-only price.",
1170
- "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 opt out"
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."
1171
1261
  },
1172
1262
  {
1173
1263
  "ref": "sms_template.program_confirm_sms",
@@ -1181,7 +1271,7 @@
1181
1271
  "name": "Review Request - Text",
1182
1272
  "_kind": "marketing",
1183
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.",
1184
- "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 opt out"
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."
1185
1275
  }
1186
1276
  ]
1187
1277
  },
@@ -1632,7 +1722,7 @@
1632
1722
  "ref": "sms.w_sms_1",
1633
1723
  "name": "Win-back Text 1 - You Reached Out A While Back",
1634
1724
  "templateRef": "sms_template.w_sms_1",
1635
- "copyDirection": "Win-back day 0. Say why they are getting the text, YES / N on their own lines.",
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.",
1636
1726
  "mergeTags": [
1637
1727
  "contact.first_name",
1638
1728
  "custom_values.owner_first_name",
@@ -1640,7 +1730,21 @@
1640
1730
  "custom_values.trial_price",
1641
1731
  "custom_values.trial_name"
1642
1732
  ],
1643
- "conditionalOn": "channels.sms == true && offer.trialFree != true"
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"
1644
1748
  },
1645
1749
  {
1646
1750
  "ref": "sms.w_sms_2",
@@ -1721,14 +1825,27 @@
1721
1825
  "ref": "sms.w_sms_1f",
1722
1826
  "name": "Win-back Text 1 - You Reached Out A While Back (free trial)",
1723
1827
  "templateRef": "sms_template.w_sms_1f",
1724
- "copyDirection": "Win-back day 0, free trial.",
1828
+ "copyDirection": "Win-back day 0, free trial, trial spots really run out.",
1725
1829
  "mergeTags": [
1726
1830
  "contact.first_name",
1727
1831
  "custom_values.owner_first_name",
1728
1832
  "custom_values.business_name",
1729
1833
  "custom_values.trial_name"
1730
1834
  ],
1731
- "conditionalOn": "channels.sms == true && offer.trialFree == true"
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"
1732
1849
  },
1733
1850
  {
1734
1851
  "ref": "sms.w_sms_2f",
@@ -1742,6 +1859,115 @@
1742
1859
  ],
1743
1860
  "conditionalOn": "channels.sms == true && offer.trialFree == true"
1744
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
+ },
1745
1971
  {
1746
1972
  "ref": "sms.book_link_sms",
1747
1973
  "name": "Reply BOOK - Booking Link",
@@ -1797,7 +2023,7 @@
1797
2023
  "ref": "sms.appt_24h_sms",
1798
2024
  "name": "Trial Reminder - 24 Hours",
1799
2025
  "templateRef": "sms_template.appt_24h_sms",
1800
- "copyDirection": "24 hours before. Time, arrive early, the clinic's prep instructions.",
2026
+ "copyDirection": "24 hours before. Time, and the clinic's prep instructions (or the usual arrive-early line when there are none).",
1801
2027
  "mergeTags": [
1802
2028
  "contact.first_name",
1803
2029
  "custom_values.trial_name",
@@ -1978,6 +2204,7 @@
1978
2204
  "workflows": [
1979
2205
  {
1980
2206
  "ref": "workflow.speed_to_lead",
2207
+ "allowMultiple": false,
1981
2208
  "name": "Speed to Lead",
1982
2209
  "trigger": {
1983
2210
  "type": "form_submission",
@@ -2099,6 +2326,7 @@
2099
2326
  },
2100
2327
  {
2101
2328
  "ref": "workflow.missed_call",
2329
+ "allowMultiple": true,
2102
2330
  "name": "Missed Call Text-Back",
2103
2331
  "conditionalOn": "channels.sms == true",
2104
2332
  "trigger": {
@@ -2154,6 +2382,7 @@
2154
2382
  },
2155
2383
  {
2156
2384
  "ref": "workflow.lead_nurture",
2385
+ "allowMultiple": false,
2157
2386
  "name": "Lead Nurture (30 days)",
2158
2387
  "trigger": {
2159
2388
  "type": "contact_tag",
@@ -2336,6 +2565,7 @@
2336
2565
  },
2337
2566
  {
2338
2567
  "ref": "workflow.reply_route",
2568
+ "allowMultiple": true,
2339
2569
  "name": "Replied - Stop & Route",
2340
2570
  "trigger": {
2341
2571
  "type": "customer_reply"
@@ -2369,6 +2599,7 @@
2369
2599
  },
2370
2600
  {
2371
2601
  "ref": "workflow.reply_n",
2602
+ "allowMultiple": true,
2372
2603
  "name": "Replied N - Not Interested",
2373
2604
  "trigger": {
2374
2605
  "type": "customer_reply",
@@ -2386,21 +2617,60 @@
2386
2617
  ]
2387
2618
  },
2388
2619
  "stopOnResponse": false,
2389
- "_source": "PATTERN: live red-light trial account. Exact-match soft opt-out (N, No thanks, Not interested; never a bare No), tagged and noted, texting left on. The live card move is not copied.",
2390
- "_design": "Foundation. A soft opt-out: exact words only (never 'contains', which once opted out a patient asking 'when should I stop eating'). Texting is NOT turned off: N is not STOP. Every sequence stops on the reply itself; staff move the card if it is still before booking.",
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.",
2391
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
+ },
2392
2661
  {
2393
2662
  "type": "add_contact_tag",
2394
2663
  "tagRef": "tag.not_interested"
2395
2664
  },
2396
2665
  {
2397
2666
  "type": "add_notes",
2398
- "body": "Replied N, a soft opt-out: texting stays on, because N is not STOP. If their card is still before booking (New Lead, Replied or Link Sent), move it to Not Interested."
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."
2399
2668
  }
2400
2669
  ]
2401
2670
  },
2402
2671
  {
2403
2672
  "ref": "workflow.reply_stop",
2673
+ "allowMultiple": true,
2404
2674
  "name": "Replied STOP - Opt Out",
2405
2675
  "trigger": {
2406
2676
  "type": "customer_reply",
@@ -2440,12 +2710,13 @@
2440
2710
  },
2441
2711
  {
2442
2712
  "type": "add_notes",
2443
- "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 Lost / DND."
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}}."
2444
2714
  }
2445
2715
  ]
2446
2716
  },
2447
2717
  {
2448
2718
  "ref": "workflow.reply_team",
2719
+ "allowMultiple": true,
2449
2720
  "name": "Replied TEAM - Human Help",
2450
2721
  "trigger": {
2451
2722
  "type": "customer_reply",
@@ -2491,10 +2762,23 @@
2491
2762
  },
2492
2763
  {
2493
2764
  "ref": "workflow.book_reply",
2765
+ "allowMultiple": true,
2494
2766
  "name": "Reply BOOK - Send Booking Link",
2495
2767
  "trigger": {
2496
2768
  "type": "customer_reply",
2497
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",
2498
2782
  "BOOK",
2499
2783
  "book",
2500
2784
  "Book",
@@ -2516,7 +2800,7 @@
2516
2800
  "stopOnResponse": false,
2517
2801
  "conditionalOn": "goal.bookingNeeded == true",
2518
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.",
2519
- "_design": "Someone who asks for the link gets it at once.",
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).",
2520
2804
  "actions": [
2521
2805
  {
2522
2806
  "type": "send_sms",
@@ -2532,10 +2816,26 @@
2532
2816
  "type": "add_contact_tag",
2533
2817
  "tagRef": "tag.lc_link_sent"
2534
2818
  }
2535
- ]
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
+ }
2536
2835
  },
2537
2836
  {
2538
2837
  "ref": "workflow.win_back",
2838
+ "allowMultiple": false,
2539
2839
  "name": "Win-back (30 days)",
2540
2840
  "trigger": {
2541
2841
  "type": "contact_tag",
@@ -2552,12 +2852,22 @@
2552
2852
  {
2553
2853
  "type": "send_sms",
2554
2854
  "smsRef": "sms.w_sms_1",
2555
- "conditionalOn": "channels.sms == true && offer.trialFree != true"
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"
2556
2861
  },
2557
2862
  {
2558
2863
  "type": "send_sms",
2559
2864
  "smsRef": "sms.w_sms_1f",
2560
- "conditionalOn": "channels.sms == true && offer.trialFree == true"
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"
2561
2871
  },
2562
2872
  {
2563
2873
  "type": "wait",
@@ -2586,32 +2896,32 @@
2586
2896
  },
2587
2897
  {
2588
2898
  "type": "send_sms",
2589
- "smsRef": "sms.n_sms_3a",
2899
+ "smsRef": "sms.w_sms_3a",
2590
2900
  "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is set"
2591
2901
  },
2592
2902
  {
2593
2903
  "type": "send_sms",
2594
- "smsRef": "sms.n_sms_3b",
2904
+ "smsRef": "sms.w_sms_3b",
2595
2905
  "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is set"
2596
2906
  },
2597
2907
  {
2598
2908
  "type": "send_sms",
2599
- "smsRef": "sms.n_sms_3c",
2909
+ "smsRef": "sms.w_sms_3c",
2600
2910
  "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.depositAmount is not set && offer.trialFree != true"
2601
2911
  },
2602
2912
  {
2603
2913
  "type": "send_sms",
2604
- "smsRef": "sms.n_sms_3d",
2914
+ "smsRef": "sms.w_sms_3d",
2605
2915
  "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.depositAmount is not set && offer.trialFree != true"
2606
2916
  },
2607
2917
  {
2608
2918
  "type": "send_sms",
2609
- "smsRef": "sms.n_sms_3e",
2919
+ "smsRef": "sms.w_sms_3e",
2610
2920
  "conditionalOn": "channels.sms == true && offer.anchorPrice is set && offer.trialFree == true"
2611
2921
  },
2612
2922
  {
2613
2923
  "type": "send_sms",
2614
- "smsRef": "sms.n_sms_3f",
2924
+ "smsRef": "sms.w_sms_3f",
2615
2925
  "conditionalOn": "channels.sms == true && offer.anchorPrice is not set && offer.trialFree == true"
2616
2926
  },
2617
2927
  {
@@ -2636,12 +2946,12 @@
2636
2946
  },
2637
2947
  {
2638
2948
  "type": "send_sms",
2639
- "smsRef": "sms.n_sms_4",
2949
+ "smsRef": "sms.w_sms_4",
2640
2950
  "conditionalOn": "channels.sms == true && offer.capacityLimited == true"
2641
2951
  },
2642
2952
  {
2643
2953
  "type": "send_sms",
2644
- "smsRef": "sms.n_sms_4b",
2954
+ "smsRef": "sms.w_sms_4b",
2645
2955
  "conditionalOn": "channels.sms == true && offer.capacityLimited != true"
2646
2956
  },
2647
2957
  {
@@ -2651,7 +2961,7 @@
2651
2961
  },
2652
2962
  {
2653
2963
  "type": "send_sms",
2654
- "smsRef": "sms.n_sms_7",
2964
+ "smsRef": "sms.w_sms_7",
2655
2965
  "conditionalOn": "channels.sms == true"
2656
2966
  },
2657
2967
  {
@@ -2671,6 +2981,7 @@
2671
2981
  },
2672
2982
  {
2673
2983
  "ref": "workflow.appointment_booked",
2984
+ "allowMultiple": true,
2674
2985
  "name": "Trial Booked - Confirm & Move",
2675
2986
  "conditionalOn": "goal.bookingNeeded == true",
2676
2987
  "trigger": {
@@ -2680,7 +2991,7 @@
2680
2991
  },
2681
2992
  "stopOnResponse": false,
2682
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.",
2683
- "_design": "On a confirmed trial booking: pull the lead out of Speed to Lead, Lead Nurture, Win-back and No-Show Rescue (med-spa's shape; the live account does the same in 'Stop DBR Drip'), tag booked (and deposit paid when the clinic takes one), 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.",
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.",
2684
2995
  "actions": [
2685
2996
  {
2686
2997
  "type": "remove_from_workflow",
@@ -2699,13 +3010,13 @@
2699
3010
  "workflowRef": "workflow.no_show"
2700
3011
  },
2701
3012
  {
2702
- "type": "add_contact_tag",
2703
- "tagRef": "tag.lc_trial_booked"
3013
+ "type": "remove_from_workflow",
3014
+ "workflowRef": "workflow.missed_call",
3015
+ "conditionalOn": "channels.sms == true"
2704
3016
  },
2705
3017
  {
2706
3018
  "type": "add_contact_tag",
2707
- "tagRef": "tag.deposit_paid",
2708
- "conditionalOn": "offer.depositAmount is set"
3019
+ "tagRef": "tag.lc_trial_booked"
2709
3020
  },
2710
3021
  {
2711
3022
  "type": "internal_notification",
@@ -2752,6 +3063,7 @@
2752
3063
  },
2753
3064
  {
2754
3065
  "ref": "workflow.appointment_reminders",
3066
+ "allowMultiple": true,
2755
3067
  "name": "Trial Reminders",
2756
3068
  "conditionalOn": "goal.bookingNeeded == true",
2757
3069
  "trigger": {
@@ -2787,6 +3099,7 @@
2787
3099
  },
2788
3100
  {
2789
3101
  "ref": "workflow.trial_showed",
3102
+ "allowMultiple": true,
2790
3103
  "name": "Trial Completed - Balance",
2791
3104
  "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
2792
3105
  "trigger": {
@@ -2816,6 +3129,7 @@
2816
3129
  },
2817
3130
  {
2818
3131
  "ref": "workflow.visit_outcome",
3132
+ "allowMultiple": true,
2819
3133
  "name": "Trial Completed - Outcome",
2820
3134
  "conditionalOn": "goal.bookingNeeded == true",
2821
3135
  "trigger": {
@@ -2835,7 +3149,7 @@
2835
3149
  "type": "task_notification",
2836
3150
  "userRef": "user.owner",
2837
3151
  "title": "Record {{contact.first_name}}'s visit outcome",
2838
- "body": "Move their card to Program Sold or to No Program Yet - Follow Up. The program confirmation or the 72-hour follow-up texts start from that stage.",
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.",
2839
3153
  "dueDate": "1"
2840
3154
  },
2841
3155
  {
@@ -2861,6 +3175,7 @@
2861
3175
  },
2862
3176
  {
2863
3177
  "ref": "workflow.balance_paid",
3178
+ "allowMultiple": true,
2864
3179
  "name": "Trial Balance Paid",
2865
3180
  "conditionalOn": "goal.bookingNeeded == true && offer.balanceAmount is set",
2866
3181
  "trigger": {
@@ -2889,6 +3204,7 @@
2889
3204
  },
2890
3205
  {
2891
3206
  "ref": "workflow.appointment_canceled",
3207
+ "allowMultiple": true,
2892
3208
  "name": "Trial Canceled",
2893
3209
  "conditionalOn": "goal.bookingNeeded == true",
2894
3210
  "trigger": {
@@ -2898,8 +3214,12 @@
2898
3214
  },
2899
3215
  "stopOnResponse": false,
2900
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.",
2901
- "_design": "Tag, alert a person, and a warm text that leaves the door open.",
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).",
2902
3218
  "actions": [
3219
+ {
3220
+ "type": "remove_from_workflow",
3221
+ "workflowRef": "workflow.appointment_reminders"
3222
+ },
2903
3223
  {
2904
3224
  "type": "add_contact_tag",
2905
3225
  "tagRef": "tag.patient_canceled"
@@ -2919,6 +3239,7 @@
2919
3239
  },
2920
3240
  {
2921
3241
  "ref": "workflow.no_show",
3242
+ "allowMultiple": true,
2922
3243
  "name": "No-Show Rescue",
2923
3244
  "conditionalOn": "goal.bookingNeeded == true",
2924
3245
  "trigger": {
@@ -3041,6 +3362,7 @@
3041
3362
  },
3042
3363
  {
3043
3364
  "ref": "workflow.quote_follow_up",
3365
+ "allowMultiple": true,
3044
3366
  "name": "Program Follow-up (72 hours)",
3045
3367
  "trigger": {
3046
3368
  "type": "pipeline_stage_updated",
@@ -3139,6 +3461,7 @@
3139
3461
  },
3140
3462
  {
3141
3463
  "ref": "workflow.program_sold",
3464
+ "allowMultiple": true,
3142
3465
  "name": "Program Sold - Confirm",
3143
3466
  "trigger": {
3144
3467
  "type": "pipeline_stage_updated",
@@ -3147,7 +3470,7 @@
3147
3470
  },
3148
3471
  "stopOnResponse": false,
3149
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.",
3150
- "_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).",
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.",
3151
3474
  "actions": [
3152
3475
  {
3153
3476
  "type": "remove_from_workflow",
@@ -3171,24 +3494,41 @@
3171
3494
  {
3172
3495
  "type": "wait",
3173
3496
  "value": 14,
3174
- "unit": "days"
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'"
3175
3499
  },
3176
3500
  {
3177
3501
  "type": "add_contact_tag",
3178
- "tagRef": "tag.service_done"
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'"
3179
3504
  }
3180
3505
  ]
3181
3506
  },
3182
3507
  {
3183
3508
  "ref": "workflow.review_request",
3509
+ "allowMultiple": false,
3184
3510
  "name": "Review Request",
3185
- "trigger": {
3186
- "type": "contact_tag",
3187
- "tagRef": "tag.service_done"
3188
- },
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
+ ],
3189
3529
  "stopOnResponse": true,
3190
3530
  "_source": "[NO REAL SOURCE: proposed] No patient review request exists in any account read. Med-spa's shape.",
3191
- "_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.",
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.",
3192
3532
  "actions": [
3193
3533
  {
3194
3534
  "type": "remove_contact_tag",
@@ -3198,10 +3538,17 @@
3198
3538
  "type": "add_contact_tag",
3199
3539
  "tagRef": "tag.review_requested"
3200
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
+ },
3201
3547
  {
3202
3548
  "type": "wait",
3203
3549
  "value": 2,
3204
- "unit": "hours"
3550
+ "unit": "hours",
3551
+ "conditionalOn": "goal.reviewTiming != 'The day after a visit marked showed' || goal.bookingNeeded != true"
3205
3552
  },
3206
3553
  {
3207
3554
  "type": "send_sms",
@@ -3339,7 +3686,7 @@
3339
3686
  "owner": "OPERATOR-EXT",
3340
3687
  "title": "Take the deposit on the calendar",
3341
3688
  "trigger": "the trial takes a deposit",
3342
- "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.",
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.",
3343
3690
  "produces": null,
3344
3691
  "successCheck": "A test booking asks for the deposit"
3345
3692
  },
@@ -3362,7 +3709,7 @@
3362
3709
  "owner": "OPERATOR-UI",
3363
3710
  "title": "Limit the Trial Balance Paid workflow to the balance product",
3364
3711
  "trigger": "a payment trigger with no product filter fires on every payment",
3365
- "instruction": "Open the Trial Balance Paid workflow, click its Payment Received trigger, add the filter for your Trial Balance product and save. Until then it stays DRAFT, because without the filter it would thank people for a balance when they paid the deposit.",
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.",
3366
3713
  "produces": null,
3367
3714
  "successCheck": "The trigger shows the Trial Balance product filter",
3368
3715
  "blocks": [
@@ -3392,16 +3739,16 @@
3392
3739
  "owner": "TEAM",
3393
3740
  "title": "Move each card after the visit",
3394
3741
  "trigger": "after every trial visit",
3395
- "instruction": "After a trial visit, move the card to Program Sold or to No Program Yet - Follow Up. Program Sold sends the confirmation text and alert; No Program Yet starts the 72-hour follow-up texts. A task reminds whoever takes calls.",
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.",
3396
3743
  "produces": null,
3397
- "successCheck": "Every showed trial card sits in Program Sold or No Program Yet within a day"
3744
+ "successCheck": "Every showed trial card sits in {{stage.program_sold}} or {{stage.no_sale}} within a day"
3398
3745
  },
3399
3746
  {
3400
3747
  "ref": "handoff.sms_warming",
3401
3748
  "owner": "OPERATOR-EXT",
3402
3749
  "title": "Warm the number before any bulk win-back send",
3403
3750
  "trigger": "before tagging a past-patient list winback-start",
3404
- "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.",
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.",
3405
3752
  "produces": null,
3406
3753
  "successCheck": "Opt-outs stay under 2% per batch"
3407
3754
  },
@@ -3449,6 +3796,7 @@
3449
3796
  "sms.n_sms_6b",
3450
3797
  "sms.n_sms_7",
3451
3798
  "sms.w_sms_1",
3799
+ "sms.w_sms_1b",
3452
3800
  "sms.w_sms_2",
3453
3801
  "sms.w_sms_2b",
3454
3802
  "sms.stl_sms_1f",
@@ -3456,6 +3804,7 @@
3456
3804
  "sms.n_sms_3f",
3457
3805
  "sms.n_sms_6f",
3458
3806
  "sms.w_sms_1f",
3807
+ "sms.w_sms_1fb",
3459
3808
  "sms.w_sms_2f",
3460
3809
  "sms.book_link_sms",
3461
3810
  "sms.book_link_sms_b",
@@ -3509,7 +3858,7 @@
3509
3858
  "owner": "OPERATOR-UI",
3510
3859
  "title": "Paste the Google review link",
3511
3860
  "trigger": "always (2 minutes)",
3512
- "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 two weeks into a program.",
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.",
3513
3862
  "produces": "cv.review_link",
3514
3863
  "successCheck": "review_link shows a real https link",
3515
3864
  "blocks": [
@@ -3522,6 +3871,34 @@
3522
3871
  "title": "How Review Request starts",
3523
3872
  "trigger": "always (1 minute to read)",
3524
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.",
3525
3902
  "successCheck": "A contact tagged service-complete gets the review text two hours later"
3526
3903
  }
3527
3904
  ]