@elitedcs/ghl-mcp 3.88.3 → 3.89.0-beta.10
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 +262 -2
- package/README.md +8 -6
- package/dist/index.js +33142 -16120
- package/guide/guide.html +50 -13
- package/package.json +1 -1
- package/skills/blueprint/SKILL.md +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 +73 -12
- package/skills/blueprint/presets/coach.preset.json +33 -5
- package/skills/blueprint/presets/ecommerce.preset.json +17 -5
- package/skills/blueprint/presets/generic-client.preset.json +32 -4
- package/skills/blueprint/presets/local-service.preset.json +33 -5
- package/skills/blueprint/presets/med-spa.preset.json +32 -5
- package/skills/blueprint/presets/wellness-clinic.md +55 -0
- package/skills/blueprint/presets/wellness-clinic.preset.json +3907 -0
- package/skills/blueprint/references/build-plan-schema.md +1 -1
- package/skills/blueprint/references/preset-format.md +5 -1
|
@@ -50,36 +50,44 @@
|
|
|
50
50
|
"default": [
|
|
51
51
|
{
|
|
52
52
|
"ref": "stage.new_lead",
|
|
53
|
+
"aliases": ["new lead", "new inquiry", "inquiry", "new", "lead", "prospect"],
|
|
53
54
|
"name": "New Lead"
|
|
54
55
|
},
|
|
55
56
|
{
|
|
56
57
|
"ref": "stage.contacted",
|
|
58
|
+
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up", "working"],
|
|
57
59
|
"name": "Contacted"
|
|
58
60
|
},
|
|
59
61
|
{
|
|
60
62
|
"ref": "stage.call_booked",
|
|
63
|
+
"aliases": ["call booked", "discovery call booked", "strategy call booked", "consult booked", "appointment booked", "booked", "scheduled", "=consultation"],
|
|
61
64
|
"name": "Call Booked",
|
|
62
65
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
63
66
|
},
|
|
64
67
|
{
|
|
65
68
|
"ref": "stage.call_held",
|
|
69
|
+
"aliases": ["call held", "call completed", "showed", "attended", "consultation completed", "consultation done", "consultation attended", "consultation showed", "consultation complete", "consultation held"],
|
|
66
70
|
"name": "Call Held",
|
|
67
71
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
68
72
|
},
|
|
69
73
|
{
|
|
70
74
|
"ref": "stage.offer_made",
|
|
75
|
+
"aliases": ["offer made", "offer sent", "proposal sent", "pitched"],
|
|
71
76
|
"name": "Offer Made"
|
|
72
77
|
},
|
|
73
78
|
{
|
|
74
79
|
"ref": "stage.enrolled",
|
|
80
|
+
"aliases": ["enrolled", "signed", "sold", "purchased"],
|
|
75
81
|
"name": "Enrolled"
|
|
76
82
|
},
|
|
77
83
|
{
|
|
78
84
|
"ref": "stage.alumni",
|
|
85
|
+
"aliases": ["alumni", "referral", "graduated"],
|
|
79
86
|
"name": "Alumni / Referral"
|
|
80
87
|
},
|
|
81
88
|
{
|
|
82
89
|
"ref": "stage.lost",
|
|
90
|
+
"aliases": ["lost", "closed lost", "not interested"],
|
|
83
91
|
"name": "Lost"
|
|
84
92
|
}
|
|
85
93
|
]
|
|
@@ -266,7 +274,7 @@
|
|
|
266
274
|
{
|
|
267
275
|
"ref": "tag.service_done",
|
|
268
276
|
"name": "service-complete",
|
|
269
|
-
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it
|
|
277
|
+
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it. Each contact is asked for a review once."
|
|
270
278
|
}
|
|
271
279
|
],
|
|
272
280
|
"_tagNote": "Interest tags mirror the Program Interest options; the skill renames them to the real program names from the offer at fill time.",
|
|
@@ -520,7 +528,7 @@
|
|
|
520
528
|
{
|
|
521
529
|
"ref": "sms_template.n_sms_1",
|
|
522
530
|
"name": "Nurture Text 1 - One Word",
|
|
523
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: what's the bigger gap right now, clarity on what to do, or structure to actually do it? One word is enough
|
|
531
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: what's the bigger gap right now, clarity on what to do, or structure to actually do it? One word is enough.\nReply STOP to opt out."
|
|
524
532
|
},
|
|
525
533
|
{
|
|
526
534
|
"ref": "sms_template.n_sms_2",
|
|
@@ -545,7 +553,7 @@
|
|
|
545
553
|
{
|
|
546
554
|
"ref": "sms_template.w_sms_1",
|
|
547
555
|
"name": "Win-back Text 1",
|
|
548
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is {{audience.painPoints[0] || the thing you want to change}} still on your list this quarter, or should I close your application for now
|
|
556
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is {{audience.painPoints[0] || the thing you want to change}} still on your list this quarter, or should I close your application for now?\nReply STOP to opt out."
|
|
549
557
|
},
|
|
550
558
|
{
|
|
551
559
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1065,6 +1073,7 @@
|
|
|
1065
1073
|
"workflows": [
|
|
1066
1074
|
{
|
|
1067
1075
|
"ref": "workflow.speed_to_lead",
|
|
1076
|
+
"allowMultiple": false,
|
|
1068
1077
|
"name": "Speed to Lead",
|
|
1069
1078
|
"trigger": {
|
|
1070
1079
|
"type": "form_submission",
|
|
@@ -1150,6 +1159,7 @@
|
|
|
1150
1159
|
},
|
|
1151
1160
|
{
|
|
1152
1161
|
"ref": "workflow.missed_call",
|
|
1162
|
+
"allowMultiple": true,
|
|
1153
1163
|
"name": "Missed Call Text-Back",
|
|
1154
1164
|
"conditionalOn": "channels.sms == true",
|
|
1155
1165
|
"trigger": {
|
|
@@ -1204,13 +1214,14 @@
|
|
|
1204
1214
|
},
|
|
1205
1215
|
{
|
|
1206
1216
|
"ref": "workflow.lead_nurture",
|
|
1217
|
+
"allowMultiple": false,
|
|
1207
1218
|
"name": "Lead Nurture (30 days)",
|
|
1208
1219
|
"trigger": {
|
|
1209
1220
|
"type": "contact_tag",
|
|
1210
1221
|
"tagRef": "tag.nurture_start"
|
|
1211
1222
|
},
|
|
1212
1223
|
"stopOnResponse": true,
|
|
1213
|
-
"_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
|
|
1224
|
+
"_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.",
|
|
1214
1225
|
"actions": [
|
|
1215
1226
|
{
|
|
1216
1227
|
"type": "remove_contact_tag",
|
|
@@ -1345,6 +1356,7 @@
|
|
|
1345
1356
|
},
|
|
1346
1357
|
{
|
|
1347
1358
|
"ref": "workflow.reply_route",
|
|
1359
|
+
"allowMultiple": true,
|
|
1348
1360
|
"name": "Replied - Stop & Route",
|
|
1349
1361
|
"trigger": {
|
|
1350
1362
|
"type": "customer_reply"
|
|
@@ -1399,6 +1411,7 @@
|
|
|
1399
1411
|
},
|
|
1400
1412
|
{
|
|
1401
1413
|
"ref": "workflow.win_back",
|
|
1414
|
+
"allowMultiple": false,
|
|
1402
1415
|
"name": "Win-back (30 days)",
|
|
1403
1416
|
"trigger": {
|
|
1404
1417
|
"type": "contact_tag",
|
|
@@ -1470,6 +1483,7 @@
|
|
|
1470
1483
|
},
|
|
1471
1484
|
{
|
|
1472
1485
|
"ref": "workflow.appointment_booked",
|
|
1486
|
+
"allowMultiple": true,
|
|
1473
1487
|
"name": "Call Booked - Confirm & Move",
|
|
1474
1488
|
"trigger": {
|
|
1475
1489
|
"type": "appointment",
|
|
@@ -1491,6 +1505,15 @@
|
|
|
1491
1505
|
"type": "remove_from_workflow",
|
|
1492
1506
|
"workflowRef": "workflow.win_back"
|
|
1493
1507
|
},
|
|
1508
|
+
{
|
|
1509
|
+
"type": "remove_from_workflow",
|
|
1510
|
+
"workflowRef": "workflow.no_show"
|
|
1511
|
+
},
|
|
1512
|
+
{
|
|
1513
|
+
"type": "remove_from_workflow",
|
|
1514
|
+
"workflowRef": "workflow.missed_call",
|
|
1515
|
+
"conditionalOn": "channels.sms == true"
|
|
1516
|
+
},
|
|
1494
1517
|
{
|
|
1495
1518
|
"type": "add_contact_tag",
|
|
1496
1519
|
"tagRef": "tag.lc_booked"
|
|
@@ -1534,6 +1557,7 @@
|
|
|
1534
1557
|
},
|
|
1535
1558
|
{
|
|
1536
1559
|
"ref": "workflow.appointment_reminders",
|
|
1560
|
+
"allowMultiple": true,
|
|
1537
1561
|
"name": "Call Reminders",
|
|
1538
1562
|
"trigger": {
|
|
1539
1563
|
"type": "appointment",
|
|
@@ -1572,6 +1596,8 @@
|
|
|
1572
1596
|
},
|
|
1573
1597
|
{
|
|
1574
1598
|
"ref": "workflow.no_show",
|
|
1599
|
+
"allowMultiple": true,
|
|
1600
|
+
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1575
1601
|
"name": "No-Show Rescue",
|
|
1576
1602
|
"trigger": {
|
|
1577
1603
|
"type": "appointment",
|
|
@@ -1660,6 +1686,7 @@
|
|
|
1660
1686
|
},
|
|
1661
1687
|
{
|
|
1662
1688
|
"ref": "workflow.quote_follow_up",
|
|
1689
|
+
"allowMultiple": true,
|
|
1663
1690
|
"name": "Quote Follow-up",
|
|
1664
1691
|
"trigger": {
|
|
1665
1692
|
"type": "contact_tag",
|
|
@@ -1721,6 +1748,7 @@
|
|
|
1721
1748
|
},
|
|
1722
1749
|
{
|
|
1723
1750
|
"ref": "workflow.review_request",
|
|
1751
|
+
"allowMultiple": false,
|
|
1724
1752
|
"name": "Review Request",
|
|
1725
1753
|
"trigger": {
|
|
1726
1754
|
"type": "contact_tag",
|
|
@@ -1766,7 +1794,7 @@
|
|
|
1766
1794
|
"owner": "OPERATOR-UI",
|
|
1767
1795
|
"title": "Add the people who get lead alerts and call tasks",
|
|
1768
1796
|
"trigger": "the brief listed no staff",
|
|
1769
|
-
"instruction": "In the sub-account go to Settings
|
|
1797
|
+
"instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1770
1798
|
"produces": null,
|
|
1771
1799
|
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1772
1800
|
"blocks": [
|
|
@@ -50,26 +50,32 @@
|
|
|
50
50
|
"default": [
|
|
51
51
|
{
|
|
52
52
|
"ref": "stage.new_subscriber",
|
|
53
|
+
"aliases": ["new subscriber", "subscriber", "new lead", "signup", "lead", "new"],
|
|
53
54
|
"name": "New Subscriber"
|
|
54
55
|
},
|
|
55
56
|
{
|
|
56
57
|
"ref": "stage.engaged",
|
|
58
|
+
"aliases": ["engaged", "clicked", "contacted"],
|
|
57
59
|
"name": "Engaged"
|
|
58
60
|
},
|
|
59
61
|
{
|
|
60
62
|
"ref": "stage.first_order",
|
|
63
|
+
"aliases": ["first order", "first purchase", "purchased", "customer"],
|
|
61
64
|
"name": "First Order"
|
|
62
65
|
},
|
|
63
66
|
{
|
|
64
67
|
"ref": "stage.repeat",
|
|
68
|
+
"aliases": ["repeat customer", "repeat", "returning"],
|
|
65
69
|
"name": "Repeat Customer"
|
|
66
70
|
},
|
|
67
71
|
{
|
|
68
72
|
"ref": "stage.vip",
|
|
73
|
+
"aliases": ["vip"],
|
|
69
74
|
"name": "VIP"
|
|
70
75
|
},
|
|
71
76
|
{
|
|
72
77
|
"ref": "stage.lapsed",
|
|
78
|
+
"aliases": ["lapsed", "inactive", "churned", "lost"],
|
|
73
79
|
"name": "Lapsed"
|
|
74
80
|
}
|
|
75
81
|
]
|
|
@@ -414,7 +420,7 @@
|
|
|
414
420
|
{
|
|
415
421
|
"ref": "sms_template.n_sms_1",
|
|
416
422
|
"name": "Nurture Text 1 - One Word",
|
|
417
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: best sellers, new arrivals, or a gift? One word and I'll send you the right page
|
|
423
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: best sellers, new arrivals, or a gift? One word and I'll send you the right page.\nReply STOP to opt out."
|
|
418
424
|
},
|
|
419
425
|
{
|
|
420
426
|
"ref": "sms_template.n_sms_2",
|
|
@@ -439,7 +445,7 @@
|
|
|
439
445
|
{
|
|
440
446
|
"ref": "sms_template.w_sms_1",
|
|
441
447
|
"name": "Win-back Text 1",
|
|
442
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Still interested, or would you rather only hear about new arrivals? Reply 1 for still interested, 2 for new arrivals only
|
|
448
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Still interested, or would you rather only hear about new arrivals? Reply 1 for still interested, 2 for new arrivals only.\nReply STOP to opt out."
|
|
443
449
|
},
|
|
444
450
|
{
|
|
445
451
|
"ref": "sms_template.w_sms_2",
|
|
@@ -808,6 +814,7 @@
|
|
|
808
814
|
"workflows": [
|
|
809
815
|
{
|
|
810
816
|
"ref": "workflow.speed_to_lead",
|
|
817
|
+
"allowMultiple": false,
|
|
811
818
|
"name": "Speed to Lead",
|
|
812
819
|
"trigger": {
|
|
813
820
|
"type": "form_submission",
|
|
@@ -893,6 +900,7 @@
|
|
|
893
900
|
},
|
|
894
901
|
{
|
|
895
902
|
"ref": "workflow.missed_call",
|
|
903
|
+
"allowMultiple": true,
|
|
896
904
|
"name": "Missed Call Text-Back",
|
|
897
905
|
"conditionalOn": "channels.sms == true",
|
|
898
906
|
"trigger": {
|
|
@@ -947,13 +955,14 @@
|
|
|
947
955
|
},
|
|
948
956
|
{
|
|
949
957
|
"ref": "workflow.lead_nurture",
|
|
958
|
+
"allowMultiple": false,
|
|
950
959
|
"name": "Lead Nurture (30 days)",
|
|
951
960
|
"trigger": {
|
|
952
961
|
"type": "contact_tag",
|
|
953
962
|
"tagRef": "tag.nurture_start"
|
|
954
963
|
},
|
|
955
964
|
"stopOnResponse": true,
|
|
956
|
-
"_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
|
|
965
|
+
"_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.",
|
|
957
966
|
"actions": [
|
|
958
967
|
{
|
|
959
968
|
"type": "remove_contact_tag",
|
|
@@ -1088,6 +1097,7 @@
|
|
|
1088
1097
|
},
|
|
1089
1098
|
{
|
|
1090
1099
|
"ref": "workflow.reply_route",
|
|
1100
|
+
"allowMultiple": true,
|
|
1091
1101
|
"name": "Replied - Stop & Route",
|
|
1092
1102
|
"trigger": {
|
|
1093
1103
|
"type": "customer_reply"
|
|
@@ -1137,6 +1147,7 @@
|
|
|
1137
1147
|
},
|
|
1138
1148
|
{
|
|
1139
1149
|
"ref": "workflow.win_back",
|
|
1150
|
+
"allowMultiple": false,
|
|
1140
1151
|
"name": "Win-back (30 days)",
|
|
1141
1152
|
"trigger": {
|
|
1142
1153
|
"type": "contact_tag",
|
|
@@ -1208,6 +1219,7 @@
|
|
|
1208
1219
|
},
|
|
1209
1220
|
{
|
|
1210
1221
|
"ref": "workflow.review_request",
|
|
1222
|
+
"allowMultiple": false,
|
|
1211
1223
|
"name": "Review Requests",
|
|
1212
1224
|
"trigger": {
|
|
1213
1225
|
"type": "contact_tag",
|
|
@@ -1263,7 +1275,7 @@
|
|
|
1263
1275
|
"owner": "OPERATOR-UI",
|
|
1264
1276
|
"title": "Add the people who get lead alerts and call tasks",
|
|
1265
1277
|
"trigger": "the brief listed no staff",
|
|
1266
|
-
"instruction": "In the sub-account go to Settings
|
|
1278
|
+
"instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1267
1279
|
"produces": null,
|
|
1268
1280
|
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1269
1281
|
"blocks": [
|
|
@@ -1353,7 +1365,7 @@
|
|
|
1353
1365
|
"owner": "OPERATOR-EXT",
|
|
1354
1366
|
"title": "Connect store orders to GHL",
|
|
1355
1367
|
"trigger": "always",
|
|
1356
|
-
"instruction": "Connect your store so orders reach GHL (Shopify: the native integration under Integrations; other platforms: an order webhook to an inbound webhook trigger). Then add a small workflow: on order → tag lifecycle-first-order, remove from Lead Nurture and Win-back, move the pipeline card to
|
|
1368
|
+
"instruction": "Connect your store so orders reach GHL (Shopify: the native integration under Integrations; other platforms: an order webhook to an inbound webhook trigger). Then add a small workflow: on order → tag lifecycle-first-order, remove from Lead Nurture and Win-back, move the pipeline card to {{stage.first_order}}. Until this exists, staff move cards by hand.",
|
|
1357
1369
|
"produces": null,
|
|
1358
1370
|
"successCheck": "A test order appears on the contact in GHL within a minute",
|
|
1359
1371
|
"blocks": []
|
|
@@ -44,35 +44,43 @@
|
|
|
44
44
|
"default": [
|
|
45
45
|
{
|
|
46
46
|
"ref": "stage.new_lead",
|
|
47
|
+
"aliases": ["new lead", "new inquiry", "inquiry", "new", "lead", "prospect"],
|
|
47
48
|
"name": "New Lead"
|
|
48
49
|
},
|
|
49
50
|
{
|
|
50
51
|
"ref": "stage.contacted",
|
|
52
|
+
"aliases": ["contacted", "engaged", "in conversation", "follow up", "working"],
|
|
51
53
|
"name": "Contacted"
|
|
52
54
|
},
|
|
53
55
|
{
|
|
54
56
|
"ref": "stage.qualified",
|
|
57
|
+
"aliases": ["qualified"],
|
|
55
58
|
"name": "Qualified"
|
|
56
59
|
},
|
|
57
60
|
{
|
|
58
61
|
"ref": "stage.appointment_booked",
|
|
62
|
+
"aliases": ["appointment booked", "consult booked", "consultation booked", "call booked", "booked", "scheduled", "=consultation"],
|
|
59
63
|
"name": "Appointment Booked",
|
|
60
64
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
61
65
|
},
|
|
62
66
|
{
|
|
63
67
|
"ref": "stage.proposal_sent",
|
|
68
|
+
"aliases": ["proposal sent", "quote sent", "estimate sent", "proposal", "quote"],
|
|
64
69
|
"name": "Proposal / Quote Sent"
|
|
65
70
|
},
|
|
66
71
|
{
|
|
67
72
|
"ref": "stage.won",
|
|
73
|
+
"aliases": ["won", "closed won", "sold", "signed"],
|
|
68
74
|
"name": "Won"
|
|
69
75
|
},
|
|
70
76
|
{
|
|
71
77
|
"ref": "stage.repeat",
|
|
78
|
+
"aliases": ["repeat", "retention"],
|
|
72
79
|
"name": "Repeat / Retention"
|
|
73
80
|
},
|
|
74
81
|
{
|
|
75
82
|
"ref": "stage.lost",
|
|
83
|
+
"aliases": ["lost", "closed lost", "not interested"],
|
|
76
84
|
"name": "Lost"
|
|
77
85
|
}
|
|
78
86
|
]
|
|
@@ -486,7 +494,7 @@
|
|
|
486
494
|
{
|
|
487
495
|
"ref": "sms_template.n_sms_1",
|
|
488
496
|
"name": "Nurture Text 1 - One Word",
|
|
489
|
-
"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."
|
|
490
498
|
},
|
|
491
499
|
{
|
|
492
500
|
"ref": "sms_template.n_sms_2",
|
|
@@ -511,7 +519,7 @@
|
|
|
511
519
|
{
|
|
512
520
|
"ref": "sms_template.w_sms_1",
|
|
513
521
|
"name": "Win-back Text 1",
|
|
514
|
-
"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."
|
|
515
523
|
},
|
|
516
524
|
{
|
|
517
525
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1062,6 +1070,7 @@
|
|
|
1062
1070
|
"workflows": [
|
|
1063
1071
|
{
|
|
1064
1072
|
"ref": "workflow.speed_to_lead",
|
|
1073
|
+
"allowMultiple": false,
|
|
1065
1074
|
"name": "Speed to Lead",
|
|
1066
1075
|
"trigger": {
|
|
1067
1076
|
"type": "form_submission",
|
|
@@ -1147,6 +1156,7 @@
|
|
|
1147
1156
|
},
|
|
1148
1157
|
{
|
|
1149
1158
|
"ref": "workflow.missed_call",
|
|
1159
|
+
"allowMultiple": true,
|
|
1150
1160
|
"name": "Missed Call Text-Back",
|
|
1151
1161
|
"conditionalOn": "channels.sms == true",
|
|
1152
1162
|
"trigger": {
|
|
@@ -1201,13 +1211,14 @@
|
|
|
1201
1211
|
},
|
|
1202
1212
|
{
|
|
1203
1213
|
"ref": "workflow.lead_nurture",
|
|
1214
|
+
"allowMultiple": false,
|
|
1204
1215
|
"name": "Lead Nurture (30 days)",
|
|
1205
1216
|
"trigger": {
|
|
1206
1217
|
"type": "contact_tag",
|
|
1207
1218
|
"tagRef": "tag.nurture_start"
|
|
1208
1219
|
},
|
|
1209
1220
|
"stopOnResponse": true,
|
|
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
|
|
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.",
|
|
1211
1222
|
"actions": [
|
|
1212
1223
|
{
|
|
1213
1224
|
"type": "remove_contact_tag",
|
|
@@ -1342,6 +1353,7 @@
|
|
|
1342
1353
|
},
|
|
1343
1354
|
{
|
|
1344
1355
|
"ref": "workflow.reply_route",
|
|
1356
|
+
"allowMultiple": true,
|
|
1345
1357
|
"name": "Replied - Stop & Route",
|
|
1346
1358
|
"trigger": {
|
|
1347
1359
|
"type": "customer_reply"
|
|
@@ -1396,6 +1408,7 @@
|
|
|
1396
1408
|
},
|
|
1397
1409
|
{
|
|
1398
1410
|
"ref": "workflow.win_back",
|
|
1411
|
+
"allowMultiple": false,
|
|
1399
1412
|
"name": "Win-back (30 days)",
|
|
1400
1413
|
"trigger": {
|
|
1401
1414
|
"type": "contact_tag",
|
|
@@ -1467,6 +1480,7 @@
|
|
|
1467
1480
|
},
|
|
1468
1481
|
{
|
|
1469
1482
|
"ref": "workflow.appointment_booked",
|
|
1483
|
+
"allowMultiple": true,
|
|
1470
1484
|
"name": "Appointment Booked - Confirm & Move",
|
|
1471
1485
|
"trigger": {
|
|
1472
1486
|
"type": "appointment",
|
|
@@ -1488,6 +1502,15 @@
|
|
|
1488
1502
|
"type": "remove_from_workflow",
|
|
1489
1503
|
"workflowRef": "workflow.win_back"
|
|
1490
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
|
+
},
|
|
1491
1514
|
{
|
|
1492
1515
|
"type": "add_contact_tag",
|
|
1493
1516
|
"tagRef": "tag.lc_booked"
|
|
@@ -1531,6 +1554,7 @@
|
|
|
1531
1554
|
},
|
|
1532
1555
|
{
|
|
1533
1556
|
"ref": "workflow.appointment_reminders",
|
|
1557
|
+
"allowMultiple": true,
|
|
1534
1558
|
"name": "Appointment Reminders",
|
|
1535
1559
|
"trigger": {
|
|
1536
1560
|
"type": "appointment",
|
|
@@ -1569,6 +1593,8 @@
|
|
|
1569
1593
|
},
|
|
1570
1594
|
{
|
|
1571
1595
|
"ref": "workflow.no_show",
|
|
1596
|
+
"allowMultiple": true,
|
|
1597
|
+
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1572
1598
|
"name": "No-Show Rescue",
|
|
1573
1599
|
"trigger": {
|
|
1574
1600
|
"type": "appointment",
|
|
@@ -1657,6 +1683,7 @@
|
|
|
1657
1683
|
},
|
|
1658
1684
|
{
|
|
1659
1685
|
"ref": "workflow.review_request",
|
|
1686
|
+
"allowMultiple": false,
|
|
1660
1687
|
"name": "Review Requests",
|
|
1661
1688
|
"trigger": {
|
|
1662
1689
|
"type": "contact_tag",
|
|
@@ -1706,6 +1733,7 @@
|
|
|
1706
1733
|
},
|
|
1707
1734
|
{
|
|
1708
1735
|
"ref": "workflow.quote_follow_up",
|
|
1736
|
+
"allowMultiple": true,
|
|
1709
1737
|
"name": "Quote Follow-up",
|
|
1710
1738
|
"trigger": {
|
|
1711
1739
|
"type": "contact_tag",
|
|
@@ -1789,7 +1817,7 @@
|
|
|
1789
1817
|
"owner": "OPERATOR-UI",
|
|
1790
1818
|
"title": "Add the people who get lead alerts and call tasks",
|
|
1791
1819
|
"trigger": "the brief listed no staff",
|
|
1792
|
-
"instruction": "In the sub-account go to Settings
|
|
1820
|
+
"instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1793
1821
|
"produces": null,
|
|
1794
1822
|
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1795
1823
|
"blocks": [
|
|
@@ -53,35 +53,43 @@
|
|
|
53
53
|
"default": [
|
|
54
54
|
{
|
|
55
55
|
"ref": "stage.new_lead",
|
|
56
|
+
"aliases": ["new lead", "new inquiry", "inquiry", "new", "lead", "prospect"],
|
|
56
57
|
"name": "New Lead"
|
|
57
58
|
},
|
|
58
59
|
{
|
|
59
60
|
"ref": "stage.contacted",
|
|
61
|
+
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up", "working"],
|
|
60
62
|
"name": "Contacted"
|
|
61
63
|
},
|
|
62
64
|
{
|
|
63
65
|
"ref": "stage.estimate_scheduled",
|
|
66
|
+
"aliases": ["estimate scheduled", "estimate booked", "appointment booked", "visit booked", "booked", "scheduled"],
|
|
64
67
|
"name": "Estimate Scheduled",
|
|
65
68
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
66
69
|
},
|
|
67
70
|
{
|
|
68
71
|
"ref": "stage.quote_sent",
|
|
72
|
+
"aliases": ["quote sent", "estimate sent", "proposal sent", "quote"],
|
|
69
73
|
"name": "Quote Sent"
|
|
70
74
|
},
|
|
71
75
|
{
|
|
72
76
|
"ref": "stage.job_won",
|
|
77
|
+
"aliases": ["job won", "closed won", "won", "sold", "hired"],
|
|
73
78
|
"name": "Job Won"
|
|
74
79
|
},
|
|
75
80
|
{
|
|
76
81
|
"ref": "stage.job_complete",
|
|
82
|
+
"aliases": ["job complete", "job completed", "completed", "finished"],
|
|
77
83
|
"name": "Job Complete"
|
|
78
84
|
},
|
|
79
85
|
{
|
|
80
86
|
"ref": "stage.maintenance",
|
|
87
|
+
"aliases": ["maintenance", "repeat", "recurring"],
|
|
81
88
|
"name": "Repeat / Maintenance"
|
|
82
89
|
},
|
|
83
90
|
{
|
|
84
91
|
"ref": "stage.lost",
|
|
92
|
+
"aliases": ["lost", "closed lost", "not interested"],
|
|
85
93
|
"name": "Lost"
|
|
86
94
|
}
|
|
87
95
|
]
|
|
@@ -275,7 +283,7 @@
|
|
|
275
283
|
{
|
|
276
284
|
"ref": "tag.service_done",
|
|
277
285
|
"name": "service-complete",
|
|
278
|
-
"_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."
|
|
279
287
|
}
|
|
280
288
|
],
|
|
281
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.",
|
|
@@ -529,7 +537,7 @@
|
|
|
529
537
|
{
|
|
530
538
|
"ref": "sms_template.n_sms_1",
|
|
531
539
|
"name": "Nurture Text 1 - One Word",
|
|
532
|
-
"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."
|
|
533
541
|
},
|
|
534
542
|
{
|
|
535
543
|
"ref": "sms_template.n_sms_2",
|
|
@@ -554,7 +562,7 @@
|
|
|
554
562
|
{
|
|
555
563
|
"ref": "sms_template.w_sms_1",
|
|
556
564
|
"name": "Win-back Text 1",
|
|
557
|
-
"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."
|
|
558
566
|
},
|
|
559
567
|
{
|
|
560
568
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1075,6 +1083,7 @@
|
|
|
1075
1083
|
"workflows": [
|
|
1076
1084
|
{
|
|
1077
1085
|
"ref": "workflow.speed_to_lead",
|
|
1086
|
+
"allowMultiple": false,
|
|
1078
1087
|
"name": "Speed to Lead",
|
|
1079
1088
|
"trigger": {
|
|
1080
1089
|
"type": "form_submission",
|
|
@@ -1160,6 +1169,7 @@
|
|
|
1160
1169
|
},
|
|
1161
1170
|
{
|
|
1162
1171
|
"ref": "workflow.missed_call",
|
|
1172
|
+
"allowMultiple": true,
|
|
1163
1173
|
"name": "Missed Call Text-Back",
|
|
1164
1174
|
"conditionalOn": "channels.sms == true",
|
|
1165
1175
|
"trigger": {
|
|
@@ -1214,13 +1224,14 @@
|
|
|
1214
1224
|
},
|
|
1215
1225
|
{
|
|
1216
1226
|
"ref": "workflow.lead_nurture",
|
|
1227
|
+
"allowMultiple": false,
|
|
1217
1228
|
"name": "Lead Nurture (30 days)",
|
|
1218
1229
|
"trigger": {
|
|
1219
1230
|
"type": "contact_tag",
|
|
1220
1231
|
"tagRef": "tag.nurture_start"
|
|
1221
1232
|
},
|
|
1222
1233
|
"stopOnResponse": true,
|
|
1223
|
-
"_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.",
|
|
1224
1235
|
"actions": [
|
|
1225
1236
|
{
|
|
1226
1237
|
"type": "remove_contact_tag",
|
|
@@ -1355,6 +1366,7 @@
|
|
|
1355
1366
|
},
|
|
1356
1367
|
{
|
|
1357
1368
|
"ref": "workflow.reply_route",
|
|
1369
|
+
"allowMultiple": true,
|
|
1358
1370
|
"name": "Replied - Stop & Route",
|
|
1359
1371
|
"trigger": {
|
|
1360
1372
|
"type": "customer_reply"
|
|
@@ -1409,6 +1421,7 @@
|
|
|
1409
1421
|
},
|
|
1410
1422
|
{
|
|
1411
1423
|
"ref": "workflow.win_back",
|
|
1424
|
+
"allowMultiple": false,
|
|
1412
1425
|
"name": "Win-back (30 days)",
|
|
1413
1426
|
"trigger": {
|
|
1414
1427
|
"type": "contact_tag",
|
|
@@ -1480,6 +1493,7 @@
|
|
|
1480
1493
|
},
|
|
1481
1494
|
{
|
|
1482
1495
|
"ref": "workflow.appointment_booked",
|
|
1496
|
+
"allowMultiple": true,
|
|
1483
1497
|
"name": "Estimate Booked - Confirm & Move",
|
|
1484
1498
|
"trigger": {
|
|
1485
1499
|
"type": "appointment",
|
|
@@ -1501,6 +1515,15 @@
|
|
|
1501
1515
|
"type": "remove_from_workflow",
|
|
1502
1516
|
"workflowRef": "workflow.win_back"
|
|
1503
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
|
+
},
|
|
1504
1527
|
{
|
|
1505
1528
|
"type": "add_contact_tag",
|
|
1506
1529
|
"tagRef": "tag.lc_booked"
|
|
@@ -1544,6 +1567,7 @@
|
|
|
1544
1567
|
},
|
|
1545
1568
|
{
|
|
1546
1569
|
"ref": "workflow.appointment_reminders",
|
|
1570
|
+
"allowMultiple": true,
|
|
1547
1571
|
"name": "Estimate Reminders",
|
|
1548
1572
|
"trigger": {
|
|
1549
1573
|
"type": "appointment",
|
|
@@ -1582,6 +1606,8 @@
|
|
|
1582
1606
|
},
|
|
1583
1607
|
{
|
|
1584
1608
|
"ref": "workflow.no_show",
|
|
1609
|
+
"allowMultiple": true,
|
|
1610
|
+
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1585
1611
|
"name": "No-Show Rescue",
|
|
1586
1612
|
"trigger": {
|
|
1587
1613
|
"type": "appointment",
|
|
@@ -1670,6 +1696,7 @@
|
|
|
1670
1696
|
},
|
|
1671
1697
|
{
|
|
1672
1698
|
"ref": "workflow.quote_follow_up",
|
|
1699
|
+
"allowMultiple": true,
|
|
1673
1700
|
"name": "Quote Follow-up",
|
|
1674
1701
|
"trigger": {
|
|
1675
1702
|
"type": "contact_tag",
|
|
@@ -1731,6 +1758,7 @@
|
|
|
1731
1758
|
},
|
|
1732
1759
|
{
|
|
1733
1760
|
"ref": "workflow.review_request",
|
|
1761
|
+
"allowMultiple": false,
|
|
1734
1762
|
"name": "Review Request",
|
|
1735
1763
|
"trigger": {
|
|
1736
1764
|
"type": "contact_tag",
|
|
@@ -1776,7 +1804,7 @@
|
|
|
1776
1804
|
"owner": "OPERATOR-UI",
|
|
1777
1805
|
"title": "Add the people who get lead alerts and call tasks",
|
|
1778
1806
|
"trigger": "the brief listed no staff",
|
|
1779
|
-
"instruction": "In the sub-account go to Settings
|
|
1807
|
+
"instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1780
1808
|
"produces": null,
|
|
1781
1809
|
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1782
1810
|
"blocks": [
|