@elitedcs/ghl-mcp 3.89.0-beta.3 → 3.89.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +128 -0
- package/README.md +1 -1
- package/dist/index.js +9154 -4374
- package/package.json +1 -1
- package/skills/blueprint/examples/medspa-build-plan.json +4 -4
- package/skills/blueprint/examples/sample-build-plan.json +4 -4
- package/skills/blueprint/examples/validate-plan.cjs +15 -9
- package/skills/blueprint/presets/clinic.preset.json +66 -13
- package/skills/blueprint/presets/coach.preset.json +26 -7
- package/skills/blueprint/presets/ecommerce.preset.json +10 -4
- package/skills/blueprint/presets/generic-client.preset.json +24 -5
- package/skills/blueprint/presets/local-service.preset.json +24 -5
- package/skills/blueprint/presets/med-spa.preset.json +26 -7
- package/skills/blueprint/presets/wellness-clinic.md +55 -0
- package/skills/blueprint/presets/wellness-clinic.preset.json +3906 -0
- package/skills/blueprint/references/build-plan-schema.md +1 -1
- package/skills/blueprint/references/preset-format.md +5 -1
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"ref": "stage.contacted",
|
|
52
|
-
"aliases": ["contacted", "engaged", "in conversation", "follow up"],
|
|
52
|
+
"aliases": ["contacted", "engaged", "in conversation", "follow up", "working"],
|
|
53
53
|
"name": "Contacted"
|
|
54
54
|
},
|
|
55
55
|
{
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"ref": "stage.appointment_booked",
|
|
62
|
-
"aliases": ["appointment booked", "consult booked", "consultation booked", "call booked", "booked", "scheduled"],
|
|
62
|
+
"aliases": ["appointment booked", "consult booked", "consultation booked", "call booked", "booked", "scheduled", "=consultation"],
|
|
63
63
|
"name": "Appointment Booked",
|
|
64
64
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
65
65
|
},
|
|
@@ -494,7 +494,7 @@
|
|
|
494
494
|
{
|
|
495
495
|
"ref": "sms_template.n_sms_1",
|
|
496
496
|
"name": "Nurture Text 1 - One Word",
|
|
497
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: what matters most to you here, speed, price, or getting it right first time? One word is enough
|
|
497
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: what matters most to you here, speed, price, or getting it right first time? One word is enough.\nReply STOP to opt out."
|
|
498
498
|
},
|
|
499
499
|
{
|
|
500
500
|
"ref": "sms_template.n_sms_2",
|
|
@@ -519,7 +519,7 @@
|
|
|
519
519
|
{
|
|
520
520
|
"ref": "sms_template.w_sms_1",
|
|
521
521
|
"name": "Win-back Text 1",
|
|
522
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is this still on your list this quarter, or should I close your file for now
|
|
522
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is this still on your list this quarter, or should I close your file for now?\nReply STOP to opt out."
|
|
523
523
|
},
|
|
524
524
|
{
|
|
525
525
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1070,6 +1070,7 @@
|
|
|
1070
1070
|
"workflows": [
|
|
1071
1071
|
{
|
|
1072
1072
|
"ref": "workflow.speed_to_lead",
|
|
1073
|
+
"allowMultiple": false,
|
|
1073
1074
|
"name": "Speed to Lead",
|
|
1074
1075
|
"trigger": {
|
|
1075
1076
|
"type": "form_submission",
|
|
@@ -1155,6 +1156,7 @@
|
|
|
1155
1156
|
},
|
|
1156
1157
|
{
|
|
1157
1158
|
"ref": "workflow.missed_call",
|
|
1159
|
+
"allowMultiple": true,
|
|
1158
1160
|
"name": "Missed Call Text-Back",
|
|
1159
1161
|
"conditionalOn": "channels.sms == true",
|
|
1160
1162
|
"trigger": {
|
|
@@ -1209,13 +1211,14 @@
|
|
|
1209
1211
|
},
|
|
1210
1212
|
{
|
|
1211
1213
|
"ref": "workflow.lead_nurture",
|
|
1214
|
+
"allowMultiple": false,
|
|
1212
1215
|
"name": "Lead Nurture (30 days)",
|
|
1213
1216
|
"trigger": {
|
|
1214
1217
|
"type": "contact_tag",
|
|
1215
1218
|
"tagRef": "tag.nurture_start"
|
|
1216
1219
|
},
|
|
1217
1220
|
"stopOnResponse": true,
|
|
1218
|
-
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first
|
|
1221
|
+
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first; each contact goes through it once (re-entry off). Ends by tagging lapsed and handing off to Win-back. Any reply stops it (stopOnResponse) and Replied - Stop & Route takes over.",
|
|
1219
1222
|
"actions": [
|
|
1220
1223
|
{
|
|
1221
1224
|
"type": "remove_contact_tag",
|
|
@@ -1350,6 +1353,7 @@
|
|
|
1350
1353
|
},
|
|
1351
1354
|
{
|
|
1352
1355
|
"ref": "workflow.reply_route",
|
|
1356
|
+
"allowMultiple": true,
|
|
1353
1357
|
"name": "Replied - Stop & Route",
|
|
1354
1358
|
"trigger": {
|
|
1355
1359
|
"type": "customer_reply"
|
|
@@ -1404,6 +1408,7 @@
|
|
|
1404
1408
|
},
|
|
1405
1409
|
{
|
|
1406
1410
|
"ref": "workflow.win_back",
|
|
1411
|
+
"allowMultiple": false,
|
|
1407
1412
|
"name": "Win-back (30 days)",
|
|
1408
1413
|
"trigger": {
|
|
1409
1414
|
"type": "contact_tag",
|
|
@@ -1475,6 +1480,7 @@
|
|
|
1475
1480
|
},
|
|
1476
1481
|
{
|
|
1477
1482
|
"ref": "workflow.appointment_booked",
|
|
1483
|
+
"allowMultiple": true,
|
|
1478
1484
|
"name": "Appointment Booked - Confirm & Move",
|
|
1479
1485
|
"trigger": {
|
|
1480
1486
|
"type": "appointment",
|
|
@@ -1496,6 +1502,15 @@
|
|
|
1496
1502
|
"type": "remove_from_workflow",
|
|
1497
1503
|
"workflowRef": "workflow.win_back"
|
|
1498
1504
|
},
|
|
1505
|
+
{
|
|
1506
|
+
"type": "remove_from_workflow",
|
|
1507
|
+
"workflowRef": "workflow.no_show"
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
"type": "remove_from_workflow",
|
|
1511
|
+
"workflowRef": "workflow.missed_call",
|
|
1512
|
+
"conditionalOn": "channels.sms == true"
|
|
1513
|
+
},
|
|
1499
1514
|
{
|
|
1500
1515
|
"type": "add_contact_tag",
|
|
1501
1516
|
"tagRef": "tag.lc_booked"
|
|
@@ -1539,6 +1554,7 @@
|
|
|
1539
1554
|
},
|
|
1540
1555
|
{
|
|
1541
1556
|
"ref": "workflow.appointment_reminders",
|
|
1557
|
+
"allowMultiple": true,
|
|
1542
1558
|
"name": "Appointment Reminders",
|
|
1543
1559
|
"trigger": {
|
|
1544
1560
|
"type": "appointment",
|
|
@@ -1577,6 +1593,7 @@
|
|
|
1577
1593
|
},
|
|
1578
1594
|
{
|
|
1579
1595
|
"ref": "workflow.no_show",
|
|
1596
|
+
"allowMultiple": true,
|
|
1580
1597
|
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1581
1598
|
"name": "No-Show Rescue",
|
|
1582
1599
|
"trigger": {
|
|
@@ -1666,6 +1683,7 @@
|
|
|
1666
1683
|
},
|
|
1667
1684
|
{
|
|
1668
1685
|
"ref": "workflow.review_request",
|
|
1686
|
+
"allowMultiple": false,
|
|
1669
1687
|
"name": "Review Requests",
|
|
1670
1688
|
"trigger": {
|
|
1671
1689
|
"type": "contact_tag",
|
|
@@ -1715,6 +1733,7 @@
|
|
|
1715
1733
|
},
|
|
1716
1734
|
{
|
|
1717
1735
|
"ref": "workflow.quote_follow_up",
|
|
1736
|
+
"allowMultiple": true,
|
|
1718
1737
|
"name": "Quote Follow-up",
|
|
1719
1738
|
"trigger": {
|
|
1720
1739
|
"type": "contact_tag",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
"ref": "stage.contacted",
|
|
61
|
-
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up"],
|
|
61
|
+
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up", "working"],
|
|
62
62
|
"name": "Contacted"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
{
|
|
284
284
|
"ref": "tag.service_done",
|
|
285
285
|
"name": "service-complete",
|
|
286
|
-
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it
|
|
286
|
+
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it. Each contact is asked for a review once."
|
|
287
287
|
}
|
|
288
288
|
],
|
|
289
289
|
"_tagNote": "Interest tags mirror the Service Needed options. The skill derives trade-specific ones from offer.summary (e.g. interest-roof-replacement) at fill time.",
|
|
@@ -537,7 +537,7 @@
|
|
|
537
537
|
{
|
|
538
538
|
"ref": "sms_template.n_sms_1",
|
|
539
539
|
"name": "Nurture Text 1 - One Word",
|
|
540
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: are you leaning toward a repair, a replacement, or just pricing it for now? One word is enough
|
|
540
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: are you leaning toward a repair, a replacement, or just pricing it for now? One word is enough.\nReply STOP to opt out."
|
|
541
541
|
},
|
|
542
542
|
{
|
|
543
543
|
"ref": "sms_template.n_sms_2",
|
|
@@ -562,7 +562,7 @@
|
|
|
562
562
|
{
|
|
563
563
|
"ref": "sms_template.w_sms_1",
|
|
564
564
|
"name": "Win-back Text 1",
|
|
565
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is {{offer.summary || the work you asked about}} still on your list this season, or did you get it handled
|
|
565
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is {{offer.summary || the work you asked about}} still on your list this season, or did you get it handled?\nReply STOP to opt out."
|
|
566
566
|
},
|
|
567
567
|
{
|
|
568
568
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1083,6 +1083,7 @@
|
|
|
1083
1083
|
"workflows": [
|
|
1084
1084
|
{
|
|
1085
1085
|
"ref": "workflow.speed_to_lead",
|
|
1086
|
+
"allowMultiple": false,
|
|
1086
1087
|
"name": "Speed to Lead",
|
|
1087
1088
|
"trigger": {
|
|
1088
1089
|
"type": "form_submission",
|
|
@@ -1168,6 +1169,7 @@
|
|
|
1168
1169
|
},
|
|
1169
1170
|
{
|
|
1170
1171
|
"ref": "workflow.missed_call",
|
|
1172
|
+
"allowMultiple": true,
|
|
1171
1173
|
"name": "Missed Call Text-Back",
|
|
1172
1174
|
"conditionalOn": "channels.sms == true",
|
|
1173
1175
|
"trigger": {
|
|
@@ -1222,13 +1224,14 @@
|
|
|
1222
1224
|
},
|
|
1223
1225
|
{
|
|
1224
1226
|
"ref": "workflow.lead_nurture",
|
|
1227
|
+
"allowMultiple": false,
|
|
1225
1228
|
"name": "Lead Nurture (30 days)",
|
|
1226
1229
|
"trigger": {
|
|
1227
1230
|
"type": "contact_tag",
|
|
1228
1231
|
"tagRef": "tag.nurture_start"
|
|
1229
1232
|
},
|
|
1230
1233
|
"stopOnResponse": true,
|
|
1231
|
-
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first
|
|
1234
|
+
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first; each contact goes through it once (re-entry off). Ends by tagging lapsed and handing off to Win-back. Any reply stops it (stopOnResponse) and Replied - Stop & Route takes over.",
|
|
1232
1235
|
"actions": [
|
|
1233
1236
|
{
|
|
1234
1237
|
"type": "remove_contact_tag",
|
|
@@ -1363,6 +1366,7 @@
|
|
|
1363
1366
|
},
|
|
1364
1367
|
{
|
|
1365
1368
|
"ref": "workflow.reply_route",
|
|
1369
|
+
"allowMultiple": true,
|
|
1366
1370
|
"name": "Replied - Stop & Route",
|
|
1367
1371
|
"trigger": {
|
|
1368
1372
|
"type": "customer_reply"
|
|
@@ -1417,6 +1421,7 @@
|
|
|
1417
1421
|
},
|
|
1418
1422
|
{
|
|
1419
1423
|
"ref": "workflow.win_back",
|
|
1424
|
+
"allowMultiple": false,
|
|
1420
1425
|
"name": "Win-back (30 days)",
|
|
1421
1426
|
"trigger": {
|
|
1422
1427
|
"type": "contact_tag",
|
|
@@ -1488,6 +1493,7 @@
|
|
|
1488
1493
|
},
|
|
1489
1494
|
{
|
|
1490
1495
|
"ref": "workflow.appointment_booked",
|
|
1496
|
+
"allowMultiple": true,
|
|
1491
1497
|
"name": "Estimate Booked - Confirm & Move",
|
|
1492
1498
|
"trigger": {
|
|
1493
1499
|
"type": "appointment",
|
|
@@ -1509,6 +1515,15 @@
|
|
|
1509
1515
|
"type": "remove_from_workflow",
|
|
1510
1516
|
"workflowRef": "workflow.win_back"
|
|
1511
1517
|
},
|
|
1518
|
+
{
|
|
1519
|
+
"type": "remove_from_workflow",
|
|
1520
|
+
"workflowRef": "workflow.no_show"
|
|
1521
|
+
},
|
|
1522
|
+
{
|
|
1523
|
+
"type": "remove_from_workflow",
|
|
1524
|
+
"workflowRef": "workflow.missed_call",
|
|
1525
|
+
"conditionalOn": "channels.sms == true"
|
|
1526
|
+
},
|
|
1512
1527
|
{
|
|
1513
1528
|
"type": "add_contact_tag",
|
|
1514
1529
|
"tagRef": "tag.lc_booked"
|
|
@@ -1552,6 +1567,7 @@
|
|
|
1552
1567
|
},
|
|
1553
1568
|
{
|
|
1554
1569
|
"ref": "workflow.appointment_reminders",
|
|
1570
|
+
"allowMultiple": true,
|
|
1555
1571
|
"name": "Estimate Reminders",
|
|
1556
1572
|
"trigger": {
|
|
1557
1573
|
"type": "appointment",
|
|
@@ -1590,6 +1606,7 @@
|
|
|
1590
1606
|
},
|
|
1591
1607
|
{
|
|
1592
1608
|
"ref": "workflow.no_show",
|
|
1609
|
+
"allowMultiple": true,
|
|
1593
1610
|
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1594
1611
|
"name": "No-Show Rescue",
|
|
1595
1612
|
"trigger": {
|
|
@@ -1679,6 +1696,7 @@
|
|
|
1679
1696
|
},
|
|
1680
1697
|
{
|
|
1681
1698
|
"ref": "workflow.quote_follow_up",
|
|
1699
|
+
"allowMultiple": true,
|
|
1682
1700
|
"name": "Quote Follow-up",
|
|
1683
1701
|
"trigger": {
|
|
1684
1702
|
"type": "contact_tag",
|
|
@@ -1740,6 +1758,7 @@
|
|
|
1740
1758
|
},
|
|
1741
1759
|
{
|
|
1742
1760
|
"ref": "workflow.review_request",
|
|
1761
|
+
"allowMultiple": false,
|
|
1743
1762
|
"name": "Review Request",
|
|
1744
1763
|
"trigger": {
|
|
1745
1764
|
"type": "contact_tag",
|
|
@@ -54,18 +54,18 @@
|
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"ref": "stage.contacted",
|
|
57
|
-
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up"],
|
|
57
|
+
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up", "working"],
|
|
58
58
|
"name": "Contacted"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"ref": "stage.consult_booked",
|
|
62
|
-
"aliases": ["consult booked", "consultation booked", "trial booked", "appointment booked", "booked", "scheduled"],
|
|
62
|
+
"aliases": ["consult booked", "consultation booked", "trial booked", "appointment booked", "booked", "scheduled", "=consultation"],
|
|
63
63
|
"name": "Consult Booked",
|
|
64
64
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"ref": "stage.showed",
|
|
68
|
-
"aliases": ["showed", "trial showed", "consult completed", "attended"],
|
|
68
|
+
"aliases": ["showed", "trial showed", "consult completed", "attended", "consultation completed", "consultation done", "consultation attended", "consultation showed", "consultation complete", "consultation held"],
|
|
69
69
|
"name": "Showed",
|
|
70
70
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
71
71
|
},
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
{
|
|
270
270
|
"ref": "tag.service_done",
|
|
271
271
|
"name": "service-complete",
|
|
272
|
-
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it
|
|
272
|
+
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it. Each contact is asked for a review once."
|
|
273
273
|
}
|
|
274
274
|
],
|
|
275
275
|
"_tagNote": "The skill derives interest-<x> tags from offer.summary at fill time (injectables / filler / facials / membership for a med spa) and mirrors them onto the Service Interest field options. Declared here so they are reviewable.",
|
|
@@ -513,7 +513,7 @@
|
|
|
513
513
|
{
|
|
514
514
|
"ref": "sms_template.n_sms_1",
|
|
515
515
|
"name": "Nurture Text 1 - One Word",
|
|
516
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough
|
|
516
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough.\nReply STOP to opt out."
|
|
517
517
|
},
|
|
518
518
|
{
|
|
519
519
|
"ref": "sms_template.n_sms_2",
|
|
@@ -538,7 +538,7 @@
|
|
|
538
538
|
{
|
|
539
539
|
"ref": "sms_template.w_sms_1",
|
|
540
540
|
"name": "Win-back Text 1",
|
|
541
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now
|
|
541
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now?\nReply STOP to opt out."
|
|
542
542
|
},
|
|
543
543
|
{
|
|
544
544
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1059,6 +1059,7 @@
|
|
|
1059
1059
|
"workflows": [
|
|
1060
1060
|
{
|
|
1061
1061
|
"ref": "workflow.speed_to_lead",
|
|
1062
|
+
"allowMultiple": false,
|
|
1062
1063
|
"name": "Speed to Lead",
|
|
1063
1064
|
"trigger": {
|
|
1064
1065
|
"type": "form_submission",
|
|
@@ -1144,6 +1145,7 @@
|
|
|
1144
1145
|
},
|
|
1145
1146
|
{
|
|
1146
1147
|
"ref": "workflow.missed_call",
|
|
1148
|
+
"allowMultiple": true,
|
|
1147
1149
|
"name": "Missed Call Text-Back",
|
|
1148
1150
|
"conditionalOn": "channels.sms == true",
|
|
1149
1151
|
"trigger": {
|
|
@@ -1198,13 +1200,14 @@
|
|
|
1198
1200
|
},
|
|
1199
1201
|
{
|
|
1200
1202
|
"ref": "workflow.lead_nurture",
|
|
1203
|
+
"allowMultiple": false,
|
|
1201
1204
|
"name": "Lead Nurture (30 days)",
|
|
1202
1205
|
"trigger": {
|
|
1203
1206
|
"type": "contact_tag",
|
|
1204
1207
|
"tagRef": "tag.nurture_start"
|
|
1205
1208
|
},
|
|
1206
1209
|
"stopOnResponse": true,
|
|
1207
|
-
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first
|
|
1210
|
+
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first; each contact goes through it once (re-entry off). Ends by tagging lapsed and handing off to Win-back. Any reply stops it (stopOnResponse) and Replied - Stop & Route takes over.",
|
|
1208
1211
|
"actions": [
|
|
1209
1212
|
{
|
|
1210
1213
|
"type": "remove_contact_tag",
|
|
@@ -1339,6 +1342,7 @@
|
|
|
1339
1342
|
},
|
|
1340
1343
|
{
|
|
1341
1344
|
"ref": "workflow.reply_route",
|
|
1345
|
+
"allowMultiple": true,
|
|
1342
1346
|
"name": "Replied - Stop & Route",
|
|
1343
1347
|
"trigger": {
|
|
1344
1348
|
"type": "customer_reply"
|
|
@@ -1393,6 +1397,7 @@
|
|
|
1393
1397
|
},
|
|
1394
1398
|
{
|
|
1395
1399
|
"ref": "workflow.win_back",
|
|
1400
|
+
"allowMultiple": false,
|
|
1396
1401
|
"name": "Win-back (30 days)",
|
|
1397
1402
|
"trigger": {
|
|
1398
1403
|
"type": "contact_tag",
|
|
@@ -1464,6 +1469,7 @@
|
|
|
1464
1469
|
},
|
|
1465
1470
|
{
|
|
1466
1471
|
"ref": "workflow.appointment_booked",
|
|
1472
|
+
"allowMultiple": true,
|
|
1467
1473
|
"name": "Consult Booked - Confirm & Move",
|
|
1468
1474
|
"trigger": {
|
|
1469
1475
|
"type": "appointment",
|
|
@@ -1485,6 +1491,15 @@
|
|
|
1485
1491
|
"type": "remove_from_workflow",
|
|
1486
1492
|
"workflowRef": "workflow.win_back"
|
|
1487
1493
|
},
|
|
1494
|
+
{
|
|
1495
|
+
"type": "remove_from_workflow",
|
|
1496
|
+
"workflowRef": "workflow.no_show"
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"type": "remove_from_workflow",
|
|
1500
|
+
"workflowRef": "workflow.missed_call",
|
|
1501
|
+
"conditionalOn": "channels.sms == true"
|
|
1502
|
+
},
|
|
1488
1503
|
{
|
|
1489
1504
|
"type": "add_contact_tag",
|
|
1490
1505
|
"tagRef": "tag.lc_booked"
|
|
@@ -1528,6 +1543,7 @@
|
|
|
1528
1543
|
},
|
|
1529
1544
|
{
|
|
1530
1545
|
"ref": "workflow.appointment_reminders",
|
|
1546
|
+
"allowMultiple": true,
|
|
1531
1547
|
"name": "Consult Reminders",
|
|
1532
1548
|
"trigger": {
|
|
1533
1549
|
"type": "appointment",
|
|
@@ -1566,6 +1582,7 @@
|
|
|
1566
1582
|
},
|
|
1567
1583
|
{
|
|
1568
1584
|
"ref": "workflow.no_show",
|
|
1585
|
+
"allowMultiple": true,
|
|
1569
1586
|
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1570
1587
|
"name": "No-Show Rescue",
|
|
1571
1588
|
"trigger": {
|
|
@@ -1655,6 +1672,7 @@
|
|
|
1655
1672
|
},
|
|
1656
1673
|
{
|
|
1657
1674
|
"ref": "workflow.quote_follow_up",
|
|
1675
|
+
"allowMultiple": true,
|
|
1658
1676
|
"name": "Quote Follow-up",
|
|
1659
1677
|
"trigger": {
|
|
1660
1678
|
"type": "contact_tag",
|
|
@@ -1716,6 +1734,7 @@
|
|
|
1716
1734
|
},
|
|
1717
1735
|
{
|
|
1718
1736
|
"ref": "workflow.review_request",
|
|
1737
|
+
"allowMultiple": false,
|
|
1719
1738
|
"name": "Review Request",
|
|
1720
1739
|
"trigger": {
|
|
1721
1740
|
"type": "contact_tag",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Preset: Wellness Clinic
|
|
2
|
+
|
|
3
|
+
**File:** `wellness-clinic.preset.json` · **id:** `wellness_clinic` · **version:** 1.0.0 · **default:** no
|
|
4
|
+
**Source:** built 2026-09-29 from live wellness trial accounts (a red-light trial clinic's published workflows, pipeline, calendar, products and custom values, read-only, plus two sister accounts running the same paid-trial-with-deposit offer) and the agency's own texting lessons. The messages follow the patterns that work in those accounts (who is texting and why, a clear YES / N ask, the deposit framing, the 72-hour close) in new wording: no message here copies the live text. Every template carries a `_source` note: `PATTERN:` (the live pattern it follows, described, never quoted) or `[NO REAL SOURCE: proposed]`.
|
|
5
|
+
|
|
6
|
+
## When it is selected
|
|
7
|
+
The cockpit industry **Wellness clinic** (`wellness-clinic`), the business types Wellness clinic, Red light therapy, Body contouring, IV therapy, IV hydration, Peptide clinic, Longevity clinic and Recovery studio, and the aliases `wellness`, `wellness_clinic`, `red_light`, `rlt`, `body_contouring`, `iv_therapy`, `peptides`. It never takes `cll` / `dbr` / `launch_event`: time-boxed launch events stay in the launch-event preset.
|
|
8
|
+
|
|
9
|
+
## What it builds
|
|
10
|
+
- **1 pipeline, 10 stages:** New Lead, Replied / Engaged, Booking Link Sent, Trial Booked, Trial Completed, Program Sold, No Program Yet - Follow Up, No Show, Not Interested, Lost / DND. A client's own stage list replaces it; every automation is mapped onto the client's stages (the follow-up workflow carries a `stagePreference` so a "No sale" stage is used).
|
|
11
|
+
- **13 custom fields:** lead source, service interest, body focus areas, goal timeline, screening confirmed, results vary understood, program recommended (names only, no prices), visit outcome, payment method (no text-to-pay), program value, appointment date, and the two SMS consent boxes (transactional and marketing, separate, unchecked).
|
|
12
|
+
- **36 tags, 17 custom values** (trial name, price, deposit, balance, balance link, address, programs; spots left and capacity only with the `launch_event` flag).
|
|
13
|
+
- **Trial calendar:** the calendar answer's length, else the intake's visit length, else 90 minutes; 24 hours' minimum notice, 1 per slot, the daily cap from the intake, and the clinic's screening text as its description. The deposit is a calendar payment product set in the UI (`handoff.deposit_product`). An optional 30-minute Program Consult calendar is built only when `goal.programConsult` is true.
|
|
14
|
+
- **Trial Request form:** name, email, optional phone, service interest, body focus, two consent boxes.
|
|
15
|
+
- **13 emails, 50 texts, 19 workflows.** A trial price of 0 or Free uses free-trial wording with no price, deposit or balance. A deposit or balance of 0, none or blank counts as none: the deposit-free texts and emails go instead, and the balance workflows, tags and hand-offs are not built. Scarcity or exclusivity wording ("a set number of trial visits a week", "fill up most weeks", "a small number of spots", "before anyone else") is said only when the intake answers Yes to "Do trial spots really run out most weeks?". A No or a blank answer gets the plain version of each of those texts, including the first win-back text. The day-before reminder already asks the client to come 10 minutes early, so the intake's prep question asks only for anything besides that.
|
|
16
|
+
|
|
17
|
+
## Workflows
|
|
18
|
+
|
|
19
|
+
| Workflow | Feature | Trigger | Pattern from |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| Speed to Lead | speed_to_lead | form_submission | ad-lead text + link follow-up |
|
|
22
|
+
| Missed Call Text-Back | missed_call | call_status (missed, inbound) | proposed |
|
|
23
|
+
| Lead Nurture (30 days) | nurture | contact_tag nurture-start | 9-text drip + proposed FAQ texts and emails |
|
|
24
|
+
| Win-back (30 days) | winback | contact_tag winback-start | reactivation drip, led by its best first text |
|
|
25
|
+
| Trial Booked - Confirm & Move | booking | appointment confirmed | booking confirmation |
|
|
26
|
+
| Trial Reminders | booking | appointment confirmed | appointment reminders |
|
|
27
|
+
| Trial Completed - Balance | booking | appointment showed (only with a balance) | balance on arrival |
|
|
28
|
+
| Trial Completed - Outcome | booking | appointment showed | visit showed |
|
|
29
|
+
| Trial Balance Paid | booking | payment_received (only with a balance; held DRAFT until scoped) | balance paid |
|
|
30
|
+
| Trial Canceled | booking | appointment cancelled | cancellation |
|
|
31
|
+
| No-Show Rescue | booking | appointment noshow | no-show text + proposed rescue |
|
|
32
|
+
| Reply BOOK - Send Booking Link | booking | exact reply BOOK | BOOK keyword |
|
|
33
|
+
| Program Follow-up (72 hours) | quote_followup | stage No Program Yet | 72-hour close |
|
|
34
|
+
| Review Request | review_requests | contact_tag service-complete | proposed |
|
|
35
|
+
| Replied - Stop & Route | foundation | any reply | any reply |
|
|
36
|
+
| Replied N - Not Interested | foundation | exact reply N list | soft opt-out |
|
|
37
|
+
| Replied STOP - Opt Out | foundation | exact reply STOP list | hard opt-out |
|
|
38
|
+
| Replied TEAM - Human Help | foundation | exact reply TEAM list | TEAM keyword |
|
|
39
|
+
| Program Sold - Confirm | foundation | stage Program Sold | program sale |
|
|
40
|
+
|
|
41
|
+
## The rules this preset keeps
|
|
42
|
+
- **Claims:** no outcome claim in the preset copy, never pain, inflammation, sleep, weight-loss or fat-loss. The live drip's health-claim text and its named testimonial are not carried. A client quote is never put into a message by the build, even with written permission: a consented quote is shown on the claims review hand-off for a person to read and add by hand.
|
|
43
|
+
- **GSM-7:** no em dashes, en dashes or curly quotes in any text; intake answers filled into texts are straightened too (`conventions.gsm7`).
|
|
44
|
+
- **Opt-out:** every marketing text carries its own line starting "Reply N"; the first text of a sequence puts N on its own line.
|
|
45
|
+
- **Keywords:** N, STOP, TEAM and BOOK are exact-match lists (the live account's own), never "contains".
|
|
46
|
+
- **Links:** booking links only through `{{custom_values.booking_link}}`, on a domain at least 30 days old (`handoff.link_domain`).
|
|
47
|
+
- **No text-to-pay for programs:** the only payment link any text carries is the trial balance.
|
|
48
|
+
- **Hand-offs are tags,** never `add_to_workflow`. A booking removes the lead from Speed to Lead, Lead Nurture, Win-back and No-Show Rescue (med-spa's shape), and Program Sold removes the 72-hour follow-up.
|
|
49
|
+
- **N and STOP never move a card.** N (exact: N, No thanks, Not interested; never a bare "No") tags and notes; STOP tags and turns on Do Not Disturb.
|
|
50
|
+
- **A consented client quote goes to a person, never straight into a text.** The claims review hand-off carries it, with anything obvious (a result or health claim, a name) already flagged.
|
|
51
|
+
|
|
52
|
+
## Known limits
|
|
53
|
+
- The Trial Balance Paid workflow cannot be limited to the balance product by the build; it stays DRAFT behind `handoff.balance_trigger`.
|
|
54
|
+
- The build cannot limit a card move to cards still before booking, so N and STOP leave the card where it is; the note asks staff to move a pre-booking card.
|
|
55
|
+
- Hand-off and task wording names the preset's stages (Program Sold, No Program Yet); on a client's own stage list the composer's mapping notes say which of their stages those are.
|