@elitedcs/ghl-mcp 3.93.1 → 3.94.0
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 +24 -0
- package/README.md +15 -10
- package/dist/index.js +563 -66
- package/guide/guide.html +3 -8
- package/package.json +1 -1
- package/skills/blueprint/examples/validate-plan.cjs +9 -0
- package/skills/blueprint/presets/clinic.preset.json +49 -5
- package/skills/blueprint/presets/coach.preset.json +48 -4
- package/skills/blueprint/presets/ecommerce.preset.json +46 -2
- package/skills/blueprint/presets/generic-client.preset.json +47 -3
- package/skills/blueprint/presets/local-service.preset.json +48 -4
- package/skills/blueprint/presets/med-spa.preset.json +48 -4
- package/skills/blueprint/presets/wellness-clinic.preset.json +122 -12
package/guide/guide.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>GHL Command — User Guide</title>
|
|
7
|
-
<!-- guides-hash:
|
|
7
|
+
<!-- guides-hash: a0d59993c2403c19 -->
|
|
8
8
|
<style>
|
|
9
9
|
/* Deliberately light in every environment, including a dark-mode OS. This is a
|
|
10
10
|
reference document people read at length, print, and save to PDF, and a page
|
|
@@ -1281,11 +1281,11 @@ Before you build: look up the real calendar, the real workflows you are removing
|
|
|
1281
1281
|
<p class="gpara">Have these ready before you connect.</p>
|
|
1282
1282
|
<ul>
|
|
1283
1283
|
<li>A Google account with a calendar you can read.</li>
|
|
1284
|
-
<li>Google sign-in
|
|
1284
|
+
<li>Google sign-in for GHL Command, which is not available yet.</li>
|
|
1285
1285
|
</ul>
|
|
1286
1286
|
<h3>How to connect</h3>
|
|
1287
1287
|
<p class="gpara">Follow these steps to give this machine access.</p>
|
|
1288
|
-
<p class="gpara">
|
|
1288
|
+
<p class="gpara">Google Calendar connect is not available yet. Choosing Connect says so and saves nothing. When Google sign-in arrives in an update, these are the steps:</p>
|
|
1289
1289
|
<h4>3 steps</h4>
|
|
1290
1290
|
<ol class="steps">
|
|
1291
1291
|
<li>On the Google Calendar card on the Connections screen, choose Connect to open Google sign-in.</li>
|
|
@@ -1294,11 +1294,6 @@ Before you build: look up the real calendar, the real workflows you are removing
|
|
|
1294
1294
|
</ol>
|
|
1295
1295
|
<h3>What to say</h3>
|
|
1296
1296
|
<p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
|
|
1297
|
-
<ul>
|
|
1298
|
-
<li>“Connect my own Google Calendar.”</li>
|
|
1299
|
-
<li>“Finish connecting my Google Calendar.”</li>
|
|
1300
|
-
<li>“Read my calendar for today.”</li>
|
|
1301
|
-
</ul>
|
|
1302
1297
|
<h3>How to take access back</h3>
|
|
1303
1298
|
<p class="gpara">Remove the saved connection or take back the provider's permission.</p>
|
|
1304
1299
|
<p class="gpara">Choose Disconnect on this system's Connections card to remove the saved sign-in and request revocation with Google. You can also remove the app in your Google Account's third-party connections at myaccount.google.com/connections.</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.94.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
5
|
"description": "GoHighLevel MCP Server for Claude. 250 tools for CRM, automation and marketing, an account-wide workflow audit, live funnel-capture verification and a workflow builder, across client accounts.",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -40,6 +40,15 @@ function resolvePreset(preset) {
|
|
|
40
40
|
}
|
|
41
41
|
return v;
|
|
42
42
|
};
|
|
43
|
+
// A hand-off may come in two versions of one ref only when their conditions are exact opposites (identical except
|
|
44
|
+
// one "==" turned "!="), so exactly one reaches any plan: the texting-on and texting-off wording of the same job
|
|
45
|
+
// (ask first, 2026-10-29). The maximal plan keeps the first; any other repeat is still a duplicate below.
|
|
46
|
+
if (Array.isArray(sk.handoffs)) {
|
|
47
|
+
const parts = (h) => (typeof h.conditionalOn === 'string' ? h.conditionalOn.split(/(==|!=)/) : null);
|
|
48
|
+
const opposite = (x, y) => { const a = parts(x), b = parts(y); return !!a && !!b && a.length === b.length && a.filter((t, i) => t !== b[i]).length === 1 && a.every((t, i) => t === b[i] || (/^[!=]=$/.test(t) && /^[!=]=$/.test(b[i]))); };
|
|
49
|
+
const count = (ref) => sk.handoffs.filter((e) => e.ref === ref).length;
|
|
50
|
+
sk.handoffs = sk.handoffs.filter((h, i) => !(count(h.ref) === 2 && sk.handoffs.slice(0, i).some((e) => e.ref === h.ref && opposite(e, h))));
|
|
51
|
+
}
|
|
43
52
|
const plan = strip(sk);
|
|
44
53
|
plan.schemaVersion = preset.schemaVersion;
|
|
45
54
|
plan.planId = `preset:${preset.presetId}`;
|
|
@@ -238,6 +238,11 @@
|
|
|
238
238
|
"name": "missed-call",
|
|
239
239
|
"conditionalOn": "channels.sms == true"
|
|
240
240
|
},
|
|
241
|
+
{
|
|
242
|
+
"ref": "tag.returning_caller",
|
|
243
|
+
"name": "returning-caller",
|
|
244
|
+
"conditionalOn": "channels.sms == true"
|
|
245
|
+
},
|
|
241
246
|
{
|
|
242
247
|
"ref": "tag.no_show",
|
|
243
248
|
"name": "no-show",
|
|
@@ -1217,6 +1222,45 @@
|
|
|
1217
1222
|
}
|
|
1218
1223
|
]
|
|
1219
1224
|
},
|
|
1225
|
+
{
|
|
1226
|
+
"ref": "workflow.missed_call_card",
|
|
1227
|
+
"allowMultiple": false,
|
|
1228
|
+
"name": "Missed Call - Pipeline Card",
|
|
1229
|
+
"conditionalOn": "channels.sms == true",
|
|
1230
|
+
"trigger": {
|
|
1231
|
+
"type": "contact_tag",
|
|
1232
|
+
"tagRef": "tag.missed_call"
|
|
1233
|
+
},
|
|
1234
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
1235
|
+
"actions": [
|
|
1236
|
+
{
|
|
1237
|
+
"type": "find_opportunity",
|
|
1238
|
+
"pipelineRef": "pipeline.patients",
|
|
1239
|
+
"found": [
|
|
1240
|
+
{
|
|
1241
|
+
"type": "add_contact_tag",
|
|
1242
|
+
"tagRef": "tag.returning_caller"
|
|
1243
|
+
}
|
|
1244
|
+
],
|
|
1245
|
+
"notFound": [
|
|
1246
|
+
{
|
|
1247
|
+
"type": "add_contact_tag",
|
|
1248
|
+
"tagRef": "tag.lc_new_lead"
|
|
1249
|
+
},
|
|
1250
|
+
{
|
|
1251
|
+
"type": "create_opportunity",
|
|
1252
|
+
"pipelineRef": "pipeline.patients",
|
|
1253
|
+
"stageRef": "stage.new_lead",
|
|
1254
|
+
"name": "{{contact.name}} - Missed Call"
|
|
1255
|
+
},
|
|
1256
|
+
{
|
|
1257
|
+
"type": "assign_user",
|
|
1258
|
+
"userRef": "user.owner"
|
|
1259
|
+
}
|
|
1260
|
+
]
|
|
1261
|
+
}
|
|
1262
|
+
]
|
|
1263
|
+
},
|
|
1220
1264
|
{
|
|
1221
1265
|
"ref": "workflow.lead_nurture",
|
|
1222
1266
|
"allowMultiple": false,
|
|
@@ -1857,7 +1901,7 @@
|
|
|
1857
1901
|
"owner": "OPERATOR-UI",
|
|
1858
1902
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1859
1903
|
"trigger": "always (30 seconds)",
|
|
1860
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1904
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1861
1905
|
"produces": "cv.owner_first_name",
|
|
1862
1906
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1863
1907
|
"blocks": [
|
|
@@ -1936,7 +1980,7 @@
|
|
|
1936
1980
|
"trigger": "always, before publishing",
|
|
1937
1981
|
"instruction": "Open Marketing > Emails > Templates and Conversations > Snippets. The copy never names a condition, diagnosis, treatment or medication; confirm your edits keep it that way and match your own compliance rules (privacy, state advertising rules, insurance language). Ten minutes now saves a complaint later.",
|
|
1938
1982
|
"produces": null,
|
|
1939
|
-
"successCheck": "Every template read by a responsible person; no clinical detail in any
|
|
1983
|
+
"successCheck": "Every template read by a responsible person; no clinical detail in any message",
|
|
1940
1984
|
"blocks": [
|
|
1941
1985
|
"workflow.speed_to_lead",
|
|
1942
1986
|
"workflow.lead_nurture",
|
|
@@ -1989,7 +2033,7 @@
|
|
|
1989
2033
|
"owner": "OPERATOR-UI",
|
|
1990
2034
|
"title": "Paste the Google review link so review requests point somewhere",
|
|
1991
2035
|
"trigger": "always (2 minutes)",
|
|
1992
|
-
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends
|
|
2036
|
+
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends its message with no link, so do this before the first visit is marked showed.",
|
|
1993
2037
|
"produces": "cv.review_link",
|
|
1994
2038
|
"successCheck": "review_link shows a real https link, not a blank",
|
|
1995
2039
|
"blocks": [
|
|
@@ -2003,7 +2047,7 @@
|
|
|
2003
2047
|
"title": "Start Review Request by tagging service-complete when the work is done",
|
|
2004
2048
|
"trigger": "always (1 minute to read)",
|
|
2005
2049
|
"instruction": "The intake chose to ask for a review when the work is done, so Review Request starts from the tag service-complete, not from a visit. Add that tag on the contact when their care is finished. Each patient is asked for a review once.",
|
|
2006
|
-
"successCheck": "A contact tagged service-complete receives the review
|
|
2050
|
+
"successCheck": "A contact tagged service-complete receives the review request two hours later"
|
|
2007
2051
|
},
|
|
2008
2052
|
{
|
|
2009
2053
|
"ref": "handoff.quote_tag",
|
|
@@ -2011,7 +2055,7 @@
|
|
|
2011
2055
|
"title": "Start Quote Follow-up by tagging quote-sent when a treatment plan goes out",
|
|
2012
2056
|
"trigger": "always (1 minute to read)",
|
|
2013
2057
|
"instruction": "Quote Follow-up starts from the tag quote-sent. Add that tag to the contact whenever a treatment plan goes out: by hand on the contact, or, if the treatment plans are sent as GoHighLevel estimates, build one workflow in the UI with the Estimate trigger (status sent) whose only step adds the tag quote-sent. The follow-up removes the tag itself, so the next treatment plan starts it again.",
|
|
2014
|
-
"successCheck": "A contact tagged quote-sent receives the
|
|
2058
|
+
"successCheck": "A contact tagged quote-sent receives the first follow-up message"
|
|
2015
2059
|
}
|
|
2016
2060
|
]
|
|
2017
2061
|
}
|
|
@@ -239,6 +239,11 @@
|
|
|
239
239
|
"name": "missed-call",
|
|
240
240
|
"conditionalOn": "channels.sms == true"
|
|
241
241
|
},
|
|
242
|
+
{
|
|
243
|
+
"ref": "tag.returning_caller",
|
|
244
|
+
"name": "returning-caller",
|
|
245
|
+
"conditionalOn": "channels.sms == true"
|
|
246
|
+
},
|
|
242
247
|
{
|
|
243
248
|
"ref": "tag.no_show",
|
|
244
249
|
"name": "no-show",
|
|
@@ -1212,6 +1217,45 @@
|
|
|
1212
1217
|
}
|
|
1213
1218
|
]
|
|
1214
1219
|
},
|
|
1220
|
+
{
|
|
1221
|
+
"ref": "workflow.missed_call_card",
|
|
1222
|
+
"allowMultiple": false,
|
|
1223
|
+
"name": "Missed Call - Pipeline Card",
|
|
1224
|
+
"conditionalOn": "channels.sms == true",
|
|
1225
|
+
"trigger": {
|
|
1226
|
+
"type": "contact_tag",
|
|
1227
|
+
"tagRef": "tag.missed_call"
|
|
1228
|
+
},
|
|
1229
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
1230
|
+
"actions": [
|
|
1231
|
+
{
|
|
1232
|
+
"type": "find_opportunity",
|
|
1233
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1234
|
+
"found": [
|
|
1235
|
+
{
|
|
1236
|
+
"type": "add_contact_tag",
|
|
1237
|
+
"tagRef": "tag.returning_caller"
|
|
1238
|
+
}
|
|
1239
|
+
],
|
|
1240
|
+
"notFound": [
|
|
1241
|
+
{
|
|
1242
|
+
"type": "add_contact_tag",
|
|
1243
|
+
"tagRef": "tag.lc_new_lead"
|
|
1244
|
+
},
|
|
1245
|
+
{
|
|
1246
|
+
"type": "create_opportunity",
|
|
1247
|
+
"pipelineRef": "pipeline.client_journey",
|
|
1248
|
+
"stageRef": "stage.new_lead",
|
|
1249
|
+
"name": "{{contact.name}} - Missed Call"
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
"type": "assign_user",
|
|
1253
|
+
"userRef": "user.owner"
|
|
1254
|
+
}
|
|
1255
|
+
]
|
|
1256
|
+
}
|
|
1257
|
+
]
|
|
1258
|
+
},
|
|
1215
1259
|
{
|
|
1216
1260
|
"ref": "workflow.lead_nurture",
|
|
1217
1261
|
"allowMultiple": false,
|
|
@@ -1835,7 +1879,7 @@
|
|
|
1835
1879
|
"owner": "OPERATOR-UI",
|
|
1836
1880
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1837
1881
|
"trigger": "always (30 seconds)",
|
|
1838
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1882
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1839
1883
|
"produces": "cv.owner_first_name",
|
|
1840
1884
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1841
1885
|
"blocks": [
|
|
@@ -1952,7 +1996,7 @@
|
|
|
1952
1996
|
"owner": "OPERATOR-UI",
|
|
1953
1997
|
"title": "Paste the Google review link so review requests point somewhere",
|
|
1954
1998
|
"trigger": "always (2 minutes)",
|
|
1955
|
-
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends
|
|
1999
|
+
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends its message with no link, so do this before the first call is marked showed.",
|
|
1956
2000
|
"produces": "cv.review_link",
|
|
1957
2001
|
"successCheck": "review_link shows a real https link, not a blank",
|
|
1958
2002
|
"blocks": [
|
|
@@ -1965,7 +2009,7 @@
|
|
|
1965
2009
|
"title": "Start Quote Follow-up by tagging quote-sent when a proposal goes out",
|
|
1966
2010
|
"trigger": "always (1 minute to read)",
|
|
1967
2011
|
"instruction": "Quote Follow-up starts from the tag quote-sent. Add that tag to the contact whenever a proposal goes out: by hand on the contact, or, if the proposals are sent as GoHighLevel estimates, build one workflow in the UI with the Estimate trigger (status sent) whose only step adds the tag quote-sent. The follow-up removes the tag itself, so the next proposal starts it again.",
|
|
1968
|
-
"successCheck": "A contact tagged quote-sent receives the
|
|
2012
|
+
"successCheck": "A contact tagged quote-sent receives the first follow-up message"
|
|
1969
2013
|
},
|
|
1970
2014
|
{
|
|
1971
2015
|
"ref": "handoff.review_tag",
|
|
@@ -1973,7 +2017,7 @@
|
|
|
1973
2017
|
"title": "Start Review Request by tagging service-complete when the work is done",
|
|
1974
2018
|
"trigger": "always (1 minute to read)",
|
|
1975
2019
|
"instruction": "Review Request starts from the tag service-complete. Add that tag when the job is finished and paid for: by hand on the contact, or from the pipeline's won stage with one small workflow whose only step adds the tag. It never starts from a consult, estimate or discovery call, so nobody who did not buy is asked for a review.",
|
|
1976
|
-
"successCheck": "A contact tagged service-complete receives the review
|
|
2020
|
+
"successCheck": "A contact tagged service-complete receives the review request two hours later"
|
|
1977
2021
|
}
|
|
1978
2022
|
]
|
|
1979
2023
|
}
|
|
@@ -219,6 +219,11 @@
|
|
|
219
219
|
"name": "missed-call",
|
|
220
220
|
"conditionalOn": "channels.sms == true"
|
|
221
221
|
},
|
|
222
|
+
{
|
|
223
|
+
"ref": "tag.returning_caller",
|
|
224
|
+
"name": "returning-caller",
|
|
225
|
+
"conditionalOn": "channels.sms == true"
|
|
226
|
+
},
|
|
222
227
|
{
|
|
223
228
|
"ref": "tag.interest_best_sellers",
|
|
224
229
|
"name": "interest-best-sellers"
|
|
@@ -953,6 +958,45 @@
|
|
|
953
958
|
}
|
|
954
959
|
]
|
|
955
960
|
},
|
|
961
|
+
{
|
|
962
|
+
"ref": "workflow.missed_call_card",
|
|
963
|
+
"allowMultiple": false,
|
|
964
|
+
"name": "Missed Call - Pipeline Card",
|
|
965
|
+
"conditionalOn": "channels.sms == true",
|
|
966
|
+
"trigger": {
|
|
967
|
+
"type": "contact_tag",
|
|
968
|
+
"tagRef": "tag.missed_call"
|
|
969
|
+
},
|
|
970
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
971
|
+
"actions": [
|
|
972
|
+
{
|
|
973
|
+
"type": "find_opportunity",
|
|
974
|
+
"pipelineRef": "pipeline.store_leads",
|
|
975
|
+
"found": [
|
|
976
|
+
{
|
|
977
|
+
"type": "add_contact_tag",
|
|
978
|
+
"tagRef": "tag.returning_caller"
|
|
979
|
+
}
|
|
980
|
+
],
|
|
981
|
+
"notFound": [
|
|
982
|
+
{
|
|
983
|
+
"type": "add_contact_tag",
|
|
984
|
+
"tagRef": "tag.lc_new_lead"
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"type": "create_opportunity",
|
|
988
|
+
"pipelineRef": "pipeline.store_leads",
|
|
989
|
+
"stageRef": "stage.new_subscriber",
|
|
990
|
+
"name": "{{contact.name}} - Missed Call"
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
"type": "assign_user",
|
|
994
|
+
"userRef": "user.owner"
|
|
995
|
+
}
|
|
996
|
+
]
|
|
997
|
+
}
|
|
998
|
+
]
|
|
999
|
+
},
|
|
956
1000
|
{
|
|
957
1001
|
"ref": "workflow.lead_nurture",
|
|
958
1002
|
"allowMultiple": false,
|
|
@@ -1308,7 +1352,7 @@
|
|
|
1308
1352
|
"owner": "OPERATOR-UI",
|
|
1309
1353
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1310
1354
|
"trigger": "always (30 seconds)",
|
|
1311
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1355
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1312
1356
|
"produces": "cv.owner_first_name",
|
|
1313
1357
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1314
1358
|
"blocks": [
|
|
@@ -1402,7 +1446,7 @@
|
|
|
1402
1446
|
"trigger": "always",
|
|
1403
1447
|
"instruction": "In your Google Business Profile, open Ask for reviews and copy the short link. Paste it into the review_link custom value. From then on, add the tag review-ask to a contact when an order has arrived (or automate it from the stage you use for finished work); the requests start from the tag and stop the moment they reply.",
|
|
1404
1448
|
"produces": "cv.review_link",
|
|
1405
|
-
"successCheck": "The review_link custom value opens your Google review form, and a test contact tagged review-ask receives the first
|
|
1449
|
+
"successCheck": "The review_link custom value opens your Google review form, and a test contact tagged review-ask receives the first review request two hours later",
|
|
1406
1450
|
"blocks": [
|
|
1407
1451
|
"cv.review_link"
|
|
1408
1452
|
]
|
|
@@ -222,6 +222,11 @@
|
|
|
222
222
|
"name": "missed-call",
|
|
223
223
|
"conditionalOn": "channels.sms == true"
|
|
224
224
|
},
|
|
225
|
+
{
|
|
226
|
+
"ref": "tag.returning_caller",
|
|
227
|
+
"name": "returning-caller",
|
|
228
|
+
"conditionalOn": "channels.sms == true"
|
|
229
|
+
},
|
|
225
230
|
{
|
|
226
231
|
"ref": "tag.no_show",
|
|
227
232
|
"name": "no-show",
|
|
@@ -1209,6 +1214,45 @@
|
|
|
1209
1214
|
}
|
|
1210
1215
|
]
|
|
1211
1216
|
},
|
|
1217
|
+
{
|
|
1218
|
+
"ref": "workflow.missed_call_card",
|
|
1219
|
+
"allowMultiple": false,
|
|
1220
|
+
"name": "Missed Call - Pipeline Card",
|
|
1221
|
+
"conditionalOn": "channels.sms == true",
|
|
1222
|
+
"trigger": {
|
|
1223
|
+
"type": "contact_tag",
|
|
1224
|
+
"tagRef": "tag.missed_call"
|
|
1225
|
+
},
|
|
1226
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
1227
|
+
"actions": [
|
|
1228
|
+
{
|
|
1229
|
+
"type": "find_opportunity",
|
|
1230
|
+
"pipelineRef": "pipeline.main",
|
|
1231
|
+
"found": [
|
|
1232
|
+
{
|
|
1233
|
+
"type": "add_contact_tag",
|
|
1234
|
+
"tagRef": "tag.returning_caller"
|
|
1235
|
+
}
|
|
1236
|
+
],
|
|
1237
|
+
"notFound": [
|
|
1238
|
+
{
|
|
1239
|
+
"type": "add_contact_tag",
|
|
1240
|
+
"tagRef": "tag.lc_new_lead"
|
|
1241
|
+
},
|
|
1242
|
+
{
|
|
1243
|
+
"type": "create_opportunity",
|
|
1244
|
+
"pipelineRef": "pipeline.main",
|
|
1245
|
+
"stageRef": "stage.new_lead",
|
|
1246
|
+
"name": "{{contact.name}} - Missed Call"
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
"type": "assign_user",
|
|
1250
|
+
"userRef": "user.owner"
|
|
1251
|
+
}
|
|
1252
|
+
]
|
|
1253
|
+
}
|
|
1254
|
+
]
|
|
1255
|
+
},
|
|
1212
1256
|
{
|
|
1213
1257
|
"ref": "workflow.lead_nurture",
|
|
1214
1258
|
"allowMultiple": false,
|
|
@@ -1856,7 +1900,7 @@
|
|
|
1856
1900
|
"owner": "OPERATOR-UI",
|
|
1857
1901
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1858
1902
|
"trigger": "always (30 seconds)",
|
|
1859
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1903
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1860
1904
|
"produces": "cv.owner_first_name",
|
|
1861
1905
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1862
1906
|
"blocks": [
|
|
@@ -1977,7 +2021,7 @@
|
|
|
1977
2021
|
"trigger": "always",
|
|
1978
2022
|
"instruction": "In your Google Business Profile, open Ask for reviews and copy the short link. Paste it into the review_link custom value. From then on, add the tag review-ask to a contact when the work is done (or automate it from the stage you use for finished work); the requests start from the tag and stop the moment they reply.",
|
|
1979
2023
|
"produces": "cv.review_link",
|
|
1980
|
-
"successCheck": "The review_link custom value opens your Google review form, and a test contact tagged review-ask receives the first
|
|
2024
|
+
"successCheck": "The review_link custom value opens your Google review form, and a test contact tagged review-ask receives the first review request two hours later",
|
|
1981
2025
|
"blocks": [
|
|
1982
2026
|
"cv.review_link"
|
|
1983
2027
|
]
|
|
@@ -1989,7 +2033,7 @@
|
|
|
1989
2033
|
"trigger": "always",
|
|
1990
2034
|
"instruction": "When a quote goes out, add the tag quote-sent to the contact, by hand or automated from your quoting tool or a pipeline stage. The follow-up starts from the tag, asks one thing per touch, and stops the moment they reply.",
|
|
1991
2035
|
"produces": null,
|
|
1992
|
-
"successCheck": "A test contact tagged quote-sent receives the first
|
|
2036
|
+
"successCheck": "A test contact tagged quote-sent receives the first follow-up message",
|
|
1993
2037
|
"blocks": []
|
|
1994
2038
|
}
|
|
1995
2039
|
]
|
|
@@ -244,6 +244,11 @@
|
|
|
244
244
|
"name": "missed-call",
|
|
245
245
|
"conditionalOn": "channels.sms == true"
|
|
246
246
|
},
|
|
247
|
+
{
|
|
248
|
+
"ref": "tag.returning_caller",
|
|
249
|
+
"name": "returning-caller",
|
|
250
|
+
"conditionalOn": "channels.sms == true"
|
|
251
|
+
},
|
|
247
252
|
{
|
|
248
253
|
"ref": "tag.no_show",
|
|
249
254
|
"name": "no-show",
|
|
@@ -1222,6 +1227,45 @@
|
|
|
1222
1227
|
}
|
|
1223
1228
|
]
|
|
1224
1229
|
},
|
|
1230
|
+
{
|
|
1231
|
+
"ref": "workflow.missed_call_card",
|
|
1232
|
+
"allowMultiple": false,
|
|
1233
|
+
"name": "Missed Call - Pipeline Card",
|
|
1234
|
+
"conditionalOn": "channels.sms == true",
|
|
1235
|
+
"trigger": {
|
|
1236
|
+
"type": "contact_tag",
|
|
1237
|
+
"tagRef": "tag.missed_call"
|
|
1238
|
+
},
|
|
1239
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
1240
|
+
"actions": [
|
|
1241
|
+
{
|
|
1242
|
+
"type": "find_opportunity",
|
|
1243
|
+
"pipelineRef": "pipeline.jobs",
|
|
1244
|
+
"found": [
|
|
1245
|
+
{
|
|
1246
|
+
"type": "add_contact_tag",
|
|
1247
|
+
"tagRef": "tag.returning_caller"
|
|
1248
|
+
}
|
|
1249
|
+
],
|
|
1250
|
+
"notFound": [
|
|
1251
|
+
{
|
|
1252
|
+
"type": "add_contact_tag",
|
|
1253
|
+
"tagRef": "tag.lc_new_lead"
|
|
1254
|
+
},
|
|
1255
|
+
{
|
|
1256
|
+
"type": "create_opportunity",
|
|
1257
|
+
"pipelineRef": "pipeline.jobs",
|
|
1258
|
+
"stageRef": "stage.new_lead",
|
|
1259
|
+
"name": "{{contact.name}} - Missed Call"
|
|
1260
|
+
},
|
|
1261
|
+
{
|
|
1262
|
+
"type": "assign_user",
|
|
1263
|
+
"userRef": "user.owner"
|
|
1264
|
+
}
|
|
1265
|
+
]
|
|
1266
|
+
}
|
|
1267
|
+
]
|
|
1268
|
+
},
|
|
1225
1269
|
{
|
|
1226
1270
|
"ref": "workflow.lead_nurture",
|
|
1227
1271
|
"allowMultiple": false,
|
|
@@ -1845,7 +1889,7 @@
|
|
|
1845
1889
|
"owner": "OPERATOR-UI",
|
|
1846
1890
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1847
1891
|
"trigger": "always (30 seconds)",
|
|
1848
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1892
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1849
1893
|
"produces": "cv.owner_first_name",
|
|
1850
1894
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1851
1895
|
"blocks": [
|
|
@@ -1962,7 +2006,7 @@
|
|
|
1962
2006
|
"owner": "OPERATOR-UI",
|
|
1963
2007
|
"title": "Paste the Google review link so review requests point somewhere",
|
|
1964
2008
|
"trigger": "always (2 minutes)",
|
|
1965
|
-
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends
|
|
2009
|
+
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends its message with no link, so do this before the first appointment is marked showed.",
|
|
1966
2010
|
"produces": "cv.review_link",
|
|
1967
2011
|
"successCheck": "review_link shows a real https link, not a blank",
|
|
1968
2012
|
"blocks": [
|
|
@@ -1975,7 +2019,7 @@
|
|
|
1975
2019
|
"title": "Start Quote Follow-up by tagging quote-sent when a quote goes out",
|
|
1976
2020
|
"trigger": "always (1 minute to read)",
|
|
1977
2021
|
"instruction": "Quote Follow-up starts from the tag quote-sent. Add that tag to the contact whenever a quote goes out: by hand on the contact, or, if the quotes are sent as GoHighLevel estimates, build one workflow in the UI with the Estimate trigger (status sent) whose only step adds the tag quote-sent. The follow-up removes the tag itself, so the next quote starts it again.",
|
|
1978
|
-
"successCheck": "A contact tagged quote-sent receives the
|
|
2022
|
+
"successCheck": "A contact tagged quote-sent receives the first follow-up message"
|
|
1979
2023
|
},
|
|
1980
2024
|
{
|
|
1981
2025
|
"ref": "handoff.review_tag",
|
|
@@ -1983,7 +2027,7 @@
|
|
|
1983
2027
|
"title": "Start Review Request by tagging service-complete when the work is done",
|
|
1984
2028
|
"trigger": "always (1 minute to read)",
|
|
1985
2029
|
"instruction": "Review Request starts from the tag service-complete. Add that tag when the job is finished and paid for: by hand on the contact, or from the pipeline's won stage with one small workflow whose only step adds the tag. It never starts from a consult, estimate or discovery call, so nobody who did not buy is asked for a review.",
|
|
1986
|
-
"successCheck": "A contact tagged service-complete receives the review
|
|
2030
|
+
"successCheck": "A contact tagged service-complete receives the review request two hours later"
|
|
1987
2031
|
}
|
|
1988
2032
|
]
|
|
1989
2033
|
}
|
|
@@ -230,6 +230,11 @@
|
|
|
230
230
|
"name": "missed-call",
|
|
231
231
|
"conditionalOn": "channels.sms == true"
|
|
232
232
|
},
|
|
233
|
+
{
|
|
234
|
+
"ref": "tag.returning_caller",
|
|
235
|
+
"name": "returning-caller",
|
|
236
|
+
"conditionalOn": "channels.sms == true"
|
|
237
|
+
},
|
|
233
238
|
{
|
|
234
239
|
"ref": "tag.no_show",
|
|
235
240
|
"name": "no-show",
|
|
@@ -1198,6 +1203,45 @@
|
|
|
1198
1203
|
}
|
|
1199
1204
|
]
|
|
1200
1205
|
},
|
|
1206
|
+
{
|
|
1207
|
+
"ref": "workflow.missed_call_card",
|
|
1208
|
+
"allowMultiple": false,
|
|
1209
|
+
"name": "Missed Call - Pipeline Card",
|
|
1210
|
+
"conditionalOn": "channels.sms == true",
|
|
1211
|
+
"trigger": {
|
|
1212
|
+
"type": "contact_tag",
|
|
1213
|
+
"tagRef": "tag.missed_call"
|
|
1214
|
+
},
|
|
1215
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
1216
|
+
"actions": [
|
|
1217
|
+
{
|
|
1218
|
+
"type": "find_opportunity",
|
|
1219
|
+
"pipelineRef": "pipeline.patient_journey",
|
|
1220
|
+
"found": [
|
|
1221
|
+
{
|
|
1222
|
+
"type": "add_contact_tag",
|
|
1223
|
+
"tagRef": "tag.returning_caller"
|
|
1224
|
+
}
|
|
1225
|
+
],
|
|
1226
|
+
"notFound": [
|
|
1227
|
+
{
|
|
1228
|
+
"type": "add_contact_tag",
|
|
1229
|
+
"tagRef": "tag.lc_new_lead"
|
|
1230
|
+
},
|
|
1231
|
+
{
|
|
1232
|
+
"type": "create_opportunity",
|
|
1233
|
+
"pipelineRef": "pipeline.patient_journey",
|
|
1234
|
+
"stageRef": "stage.new_lead",
|
|
1235
|
+
"name": "{{contact.name}} - Missed Call"
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
"type": "assign_user",
|
|
1239
|
+
"userRef": "user.owner"
|
|
1240
|
+
}
|
|
1241
|
+
]
|
|
1242
|
+
}
|
|
1243
|
+
]
|
|
1244
|
+
},
|
|
1201
1245
|
{
|
|
1202
1246
|
"ref": "workflow.lead_nurture",
|
|
1203
1247
|
"allowMultiple": false,
|
|
@@ -1821,7 +1865,7 @@
|
|
|
1821
1865
|
"owner": "OPERATOR-UI",
|
|
1822
1866
|
"title": "Confirm your business phone and the name messages are signed with",
|
|
1823
1867
|
"trigger": "always (30 seconds)",
|
|
1824
|
-
"instruction": "Settings > Custom Values: set business_phone to the number customers should call
|
|
1868
|
+
"instruction": "Settings > Custom Values: set business_phone to the number customers should call, and owner_first_name to the first name every email is signed with. The build pre-fills both from the intake when it can.",
|
|
1825
1869
|
"produces": "cv.owner_first_name",
|
|
1826
1870
|
"successCheck": "business_phone and owner_first_name show real values, not blanks",
|
|
1827
1871
|
"blocks": [
|
|
@@ -1938,7 +1982,7 @@
|
|
|
1938
1982
|
"owner": "OPERATOR-UI",
|
|
1939
1983
|
"title": "Paste the Google review link so review requests point somewhere",
|
|
1940
1984
|
"trigger": "always (2 minutes)",
|
|
1941
|
-
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends
|
|
1985
|
+
"instruction": "In Google Business Profile, open the profile, choose Ask for reviews and copy the short link. Then in the sub-account: Settings > Custom Values: set review_link to that link. Until it is set, the Review Request workflow sends its message with no link, so do this before the first appointment is marked showed.",
|
|
1942
1986
|
"produces": "cv.review_link",
|
|
1943
1987
|
"successCheck": "review_link shows a real https link, not a blank",
|
|
1944
1988
|
"blocks": [
|
|
@@ -1951,7 +1995,7 @@
|
|
|
1951
1995
|
"title": "Start Quote Follow-up by tagging quote-sent when a quote goes out",
|
|
1952
1996
|
"trigger": "always (1 minute to read)",
|
|
1953
1997
|
"instruction": "Quote Follow-up starts from the tag quote-sent. Add that tag to the contact whenever a quote goes out: by hand on the contact, or, if the quotes are sent as GoHighLevel estimates, build one workflow in the UI with the Estimate trigger (status sent) whose only step adds the tag quote-sent. The follow-up removes the tag itself, so the next quote starts it again.",
|
|
1954
|
-
"successCheck": "A contact tagged quote-sent receives the
|
|
1998
|
+
"successCheck": "A contact tagged quote-sent receives the first follow-up message"
|
|
1955
1999
|
},
|
|
1956
2000
|
{
|
|
1957
2001
|
"ref": "handoff.review_tag",
|
|
@@ -1959,7 +2003,7 @@
|
|
|
1959
2003
|
"title": "Start Review Request by tagging service-complete when the work is done",
|
|
1960
2004
|
"trigger": "always (1 minute to read)",
|
|
1961
2005
|
"instruction": "Review Request starts from the tag service-complete. Add that tag when the job is finished and paid for: by hand on the contact, or from the pipeline's won stage with one small workflow whose only step adds the tag. It never starts from a consult, estimate or discovery call, so nobody who did not buy is asked for a review.",
|
|
1962
|
-
"successCheck": "A contact tagged service-complete receives the review
|
|
2006
|
+
"successCheck": "A contact tagged service-complete receives the review request two hours later"
|
|
1963
2007
|
}
|
|
1964
2008
|
]
|
|
1965
2009
|
}
|