@elitedcs/ghl-mcp 3.74.0 → 3.76.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 +101 -0
- package/README.md +11 -9
- package/dist/index.js +5423 -1967
- package/guide/guide.html +86 -8
- package/package.json +4 -4
- package/skills/blueprint/references/copy-guide.md +1 -1
- package/templates/action-schemas.json +31 -8
- package/dist/assessment.html +0 -789
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: a372a7f6a8ce5823 -->
|
|
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
|
|
@@ -226,7 +226,7 @@ body.app.reading #indexview{display:none}
|
|
|
226
226
|
<p class="eyebrow">GHL Command</p>
|
|
227
227
|
<h1>What do you want to get done?</h1>
|
|
228
228
|
<p class="sub">Every guide is a job, in plain English: open one, copy a prompt, paste it to Claude. A job is not a button, so one guide usually puts a dozen of GHL Command's tools to work at once. Every prompt marked "Proven live" was run against a real GoHighLevel account before it shipped.</p>
|
|
229
|
-
<div class="badges"><span class="badge on">
|
|
229
|
+
<div class="badges"><span class="badge on">31 guides</span><span class="badge">10 categories</span><span class="badge">Updates with the product</span></div>
|
|
230
230
|
</div></section>
|
|
231
231
|
<div class="shell">
|
|
232
232
|
<main>
|
|
@@ -243,7 +243,8 @@ body.app.reading #indexview{display:none}
|
|
|
243
243
|
<a class="card pub" href="#g-audit-your-workflows" data-k="audit workflows broken silent failure check review existing validate not sending nothing happens"><h3>Audit your workflows</h3><p>Find silent failures and dead ends in existing workflows before your client does.</p><div class="meta"><span class="pill free">Free plan</span><span class="time">~2 minutes</span><span class="open">Open guide →</span></div></a>
|
|
244
244
|
<a class="card pub" href="#g-branch-on-tags-and-fields" data-k="if else branch condition vip tag field split two paths different message"><h3>Branch on tags and fields</h3><p>If they are a VIP, send this. Otherwise, send that. Built correctly the first time.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~5 minutes</span><span class="open">Open guide →</span></div></a>
|
|
245
245
|
<a class="card pub" href="#g-build-nurture-sequence" data-k="nurture sequence drip texts emails follow up workflow build quiet hours sending window contact hours"><h3>Build a nurture sequence</h3><p>A follow-up machine that texts, emails, waits, and stops the second someone replies.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~15 minutes</span><span class="open">Open guide →</span></div></a>
|
|
246
|
-
<a class="card pub" href="#g-send-data-to-other-apps" data-k="webhook zapier make integromat slack google sheets api send data integration notify push connect n8n other app"><h3>Send GHL data to another app</h3><p>Push contacts into Slack, Sheets, Zapier, Make or your own software the moment something happens in GHL.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~2 minutes</span><span class="open">Open guide →</span></div></a
|
|
246
|
+
<a class="card pub" href="#g-send-data-to-other-apps" data-k="webhook zapier make integromat slack google sheets api send data integration notify push connect n8n other app"><h3>Send GHL data to another app</h3><p>Push contacts into Slack, Sheets, Zapier, Make or your own software the moment something happens in GHL.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~2 minutes</span><span class="open">Open guide →</span></div></a>
|
|
247
|
+
<a class="card pub" href="#g-workflows-that-will-not-save" data-k="cannot save will not save invalid uuid action validation failed step id legacy snapshot day days wait unit notification recipient 400 rejected edit workflow parked mid-sequence"><h3>When a workflow runs fine but will not save</h3><p>Understand the error that names steps you never touched, and fix it without dropping anyone mid-sequence.</p><div class="meta"><span class="pill free">Free plan</span><span class="time">~3 minutes</span><span class="open">Open guide →</span></div></a></div></div>
|
|
247
248
|
<div class="catsec" id="cat-pipelines-and-sales"><h2>Pipelines and sales</h2><div class="cards"><a class="card pub" href="#g-documents-and-contracts" data-k="documents contracts proposals signature send sign agreement esign template"><h3>Documents and contracts</h3><p>Proposals and contracts sent for signature and tracked from Claude.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~5 minutes</span><span class="open">Open guide →</span></div></a>
|
|
248
249
|
<a class="card pub" href="#g-invoices-and-payments" data-k="invoice bill billing payment paid product price coupon promo code discount transactions orders revenue estimate"><h3>Bill a client and see what you were paid</h3><p>Products, invoices, coupons, and the money reads, without opening the billing screen.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~5 minutes</span><span class="open">Open guide →</span></div></a>
|
|
249
250
|
<a class="card pub" href="#g-stand-up-a-pipeline" data-k="pipeline stages create new client setup opportunity sales process deal stages"><h3>Stand up a pipeline</h3><p>Stages, fields, and tags for a new client in one conversation.</p><div class="meta"><span class="pill full">Full license</span><span class="time">~10 minutes</span><span class="open">Open guide →</span></div></a>
|
|
@@ -313,6 +314,8 @@ Do not change anything. This is a read.</p></div>
|
|
|
313
314
|
<li>Snapshots are how you carry a whole account setup to a new client. Claude can list what you have and create a share link for one.</li>
|
|
314
315
|
<li>Creating and deleting sub-accounts is switched off by default, on purpose. It stays off unless you deliberately turn it on.</li>
|
|
315
316
|
<li>Needs the full license. Reading users and numbers is free.</li>
|
|
317
|
+
<li><b>Destructive actions ask before they act.</b> Twelve of them did not until 31 August, including deleting a custom field, which erases that field on every contact, and deleting or voiding an invoice.</li>
|
|
318
|
+
<li><b>Changing a sub-account's business details is refused if Claude cannot read the account first.</b> Those are the details your text-message registration is filed against, and a check that could not run is not a check that passed. Timezone and other settings are unaffected.</li>
|
|
316
319
|
</ul>
|
|
317
320
|
</div>
|
|
318
321
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -837,6 +840,7 @@ Do not change any contact, and do not delete any list that is already there.</p>
|
|
|
837
840
|
<li>Saved lists are built from conditions, not from a frozen set of names. Tag somebody tomorrow and they appear in the list on their own.</li>
|
|
838
841
|
<li>Saving lists needs version 3.65.0 or later. In every version before it, the list tools reported success and quietly created nothing, so if you tried this before and found nothing in GHL, that is why. Ask Claude "what version are you running" if you are not sure.</li>
|
|
839
842
|
<li>Bulk changes need the full license. The Free plan can find and count the group, but not change it.</li>
|
|
843
|
+
<li><b>A bulk update with nothing in it is refused.</b> It used to report every contact as updated while changing nothing at all.</li>
|
|
840
844
|
</ul>
|
|
841
845
|
</div>
|
|
842
846
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -1008,6 +1012,7 @@ When it saves, read the form back to me question by question, and tell me exactl
|
|
|
1008
1012
|
<li>Wire the answers to contact fields. That is what lets you tag, segment, and branch on them later.</li>
|
|
1009
1013
|
<li>Attach the form to a page in a funnel, or send the form link directly. Both work.</li>
|
|
1010
1014
|
<li>Submissions can be read on the Free plan. Building and changing forms needs the full license.</li>
|
|
1015
|
+
<li><b>Reading submissions with no other instruction works from 31 August.</b> It used to fail unless you happened to name a page size, and the error blamed a number you never gave it.</li>
|
|
1011
1016
|
</ul>
|
|
1012
1017
|
</div>
|
|
1013
1018
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -1074,6 +1079,8 @@ Read them back to me afterwards with their exact names and types, and tell me wh
|
|
|
1074
1079
|
<li>Renaming a field is safe. Deleting one is not: anything pointing at it goes quiet. If a field is retired, leave it and stop using it.</li>
|
|
1075
1080
|
<li>Custom objects are for things that are not people. Most accounts never need one, and that is fine.</li>
|
|
1076
1081
|
<li>Needs the full license. Reading the field list is free.</li>
|
|
1082
|
+
<li><b>Deleting a custom field now asks you to confirm.</b> It takes the stored value on every contact with it, which is not something you can undo, and until 31 August it happened from a single instruction with no check.</li>
|
|
1083
|
+
<li><b>Searching, editing and deleting custom object records works from 31 August.</b> All three were aimed at addresses GoHighLevel does not answer on, so none of them did anything.</li>
|
|
1077
1084
|
</ul>
|
|
1078
1085
|
</div>
|
|
1079
1086
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -1131,10 +1138,11 @@ Then tell me which ones I should chase, in order.</p></div>
|
|
|
1131
1138
|
<li>GHL hands documents over in modest batches, so on a busy account a full read takes a few passes. Claude will say when it is still fetching.</li>
|
|
1132
1139
|
<li>A document sent to the wrong contact cannot be unsent. Say the full name or the email in the ask.</li>
|
|
1133
1140
|
<li>Needs the full license.</li>
|
|
1141
|
+
<li><b>A contract built from a template is prepared as a draft.</b> It is only sent when you say to send it. Before 31 August it went out to the customer the moment it was created, which is not something you can take back.</li>
|
|
1134
1142
|
</ul>
|
|
1135
1143
|
</div>
|
|
1136
1144
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1137
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"It sent to the wrong Dana."</td><td>Two contacts, same first name. Give the email address and Claude confirms the match before sending.</td></tr><tr><td>"The template list is missing one."</td><td>It exists in a different sub-account. Confirm which account you are in first.</td></tr><tr><td>"The client says the document is blank."</td><td>The template has no signature or content blocks filled in. That is fixed in the GHL template editor, then resent.</td></tr></table></div>
|
|
1145
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"It sent to the wrong Dana."</td><td>Two contacts, same first name. Give the email address and Claude confirms the match before sending.</td></tr><tr><td>"The template list is missing one."</td><td>It exists in a different sub-account. Confirm which account you are in first.</td></tr><tr><td>"The client says the document is blank."</td><td>The template has no signature or content blocks filled in. That is fixed in the GHL template editor, then resent.</td></tr><tr><td>"I only wanted to see what it would look like, and the client got it."</td><td>That was the old behaviour and it changed on 31 August. Creating from a template now leaves the contract as a draft, and sending is a separate instruction.</td></tr></table></div>
|
|
1138
1146
|
</div>
|
|
1139
1147
|
<div class="gsec"><h2>Related guides</h2>
|
|
1140
1148
|
<ul>
|
|
@@ -1286,10 +1294,16 @@ Do not send it. I will send it myself once I have read it.</p></div>
|
|
|
1286
1294
|
<li>Coupons need a code, a type (percentage or fixed) and an amount. Without all three GHL rejects it.</li>
|
|
1287
1295
|
<li>"What was I paid" is a different question from "what did I invoice". Ask for transactions or orders for money that actually moved, and for invoices for money you asked for.</li>
|
|
1288
1296
|
<li>Invoicing needs the full license. The Free plan can read invoices and payments but not raise them.</li>
|
|
1297
|
+
<li><b>Estimates and quotes work from 31 August.</b> Before that they failed outright, you could not create one, list them, or delete one. If you tried earlier and gave up, try again.</li>
|
|
1298
|
+
<li><b>Invoice dates now follow the sub-account's timezone.</b> An invoice raised late in the evening used to be dated the next day, because the date was worked out in UTC.</li>
|
|
1299
|
+
<li><b>Deleting or voiding an invoice now asks you to confirm.</b> Voiding asks you to say VOID rather than DELETE, so the word matches what you are actually doing.</li>
|
|
1300
|
+
<li><b>Estimate dates are plain calendar dates.</b> Give them as year-month-day. A full timestamp is refused rather than quietly shifted by a day when it is converted back.</li>
|
|
1301
|
+
<li><b>Renaming an invoice and sending one both work from 31 August.</b> Neither did before: an edit was rejected outright, and a send was refused for missing details the tool never supplied. If you gave up on either, try again.</li>
|
|
1302
|
+
<li><b>Recording a payment is final.</b> Once an invoice has a payment against it, GoHighLevel will not let it be voided or deleted, by us or by anyone. Take the payment when you mean it.</li>
|
|
1289
1303
|
</ul>
|
|
1290
1304
|
</div>
|
|
1291
1305
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1292
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"Creating an invoice used to just fail."</td><td>It did, for everyone, until 3.65.2. The call was missing six fields GHL requires and crashed its server rather than telling us. Update and it works.</td></tr><tr><td>"It sent before I was ready."</td><td>Say "do not send it" in the ask. Sending is the only step here that reaches a customer.</td></tr><tr><td>"The invoice shows the wrong name or no email."</td><td>Those come from the contact record, not the invoice. Fix the contact first, then raise the invoice.</td></tr><tr><td>"My revenue number looks too low."</td><td>You are reading invoices, which is money requested. Ask for transactions instead, which is money received.</td></tr><tr><td>"The promo code was rejected."</td><td>A coupon needs all three of code, type and amount. Percentage discounts take a number like 10, not "10%".</td></tr></table></div>
|
|
1306
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"Creating an invoice used to just fail."</td><td>It did, for everyone, until 3.65.2. The call was missing six fields GHL requires and crashed its server rather than telling us. Update and it works.</td></tr><tr><td>"It sent before I was ready."</td><td>Say "do not send it" in the ask. Sending is the only step here that reaches a customer.</td></tr><tr><td>"The invoice shows the wrong name or no email."</td><td>Those come from the contact record, not the invoice. Fix the contact first, then raise the invoice.</td></tr><tr><td>"My revenue number looks too low."</td><td>You are reading invoices, which is money requested. Ask for transactions instead, which is money received.</td></tr><tr><td>"The promo code was rejected."</td><td>A coupon needs all three of code, type and amount. Percentage discounts take a number like 10, not "10%".</td></tr><tr><td>"An invoice is dated tomorrow."</td><td>Fixed on 31 August. Dates are now taken from the sub-account's own timezone rather than UTC. Invoices raised before then may carry the wrong day; check any that were created late in the evening.</td></tr></table></div>
|
|
1293
1307
|
</div>
|
|
1294
1308
|
<div class="gsec"><h2>Related guides</h2>
|
|
1295
1309
|
<ul>
|
|
@@ -1447,10 +1461,11 @@ Do not reply to anyone. This is a read.</p></div>
|
|
|
1447
1461
|
<li>Timezone comes from the sub-account. On a new client account, confirm it once, because everything downstream inherits it.</li>
|
|
1448
1462
|
<li>Booking, moving, and cancelling appointments need the full license. Reading them is free.</li>
|
|
1449
1463
|
<li>Appointment totals are deliberately left out of the weekly account report. Ask for them here instead, where the window is explicit.</li>
|
|
1464
|
+
<li><b>Booking and moving now insist on knowing which 2pm you mean.</b> If you say "book Dana at 2pm", Claude works that out against the sub-account's timezone before it books. Until 31 August a bare time was read as UTC, so a 2pm booking could land at 7am.</li>
|
|
1450
1465
|
</ul>
|
|
1451
1466
|
</div>
|
|
1452
1467
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1453
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The times look an hour off."</td><td>The sub-account timezone is set to the wrong city. Fix it in GHL once and every reading is right afterwards.</td></tr><tr><td>"It missed an appointment I know about."</td><td>It is on a calendar you did not name. Ask "list every calendar in this account" and then ask across all of them.</td></tr><tr><td>"I asked for today and got this week."</td><td>Say the word today on its own. Claude prints the window it used, so you can spot it immediately.</td></tr></table></div>
|
|
1468
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The times look an hour off."</td><td>The sub-account timezone is set to the wrong city. Fix it in GHL once and every reading is right afterwards.</td></tr><tr><td>"It missed an appointment I know about."</td><td>It is on a calendar you did not name. Ask "list every calendar in this account" and then ask across all of them.</td></tr><tr><td>"I asked for today and got this week."</td><td>Say the word today on its own. Claude prints the window it used, so you can spot it immediately.</td></tr><tr><td>"It says the slot is not available, but the diary is empty."</td><td>That was usually the time, not the diary. A time with no timezone on it was read as UTC and landed outside opening hours, and GHL reported it as an availability problem. It is now caught and explained before anything is booked. If you still see this, the slot really is outside the calendar's open hours.</td></tr></table></div>
|
|
1454
1469
|
</div>
|
|
1455
1470
|
<div class="gsec"><h2>Related guides</h2>
|
|
1456
1471
|
<ul>
|
|
@@ -1561,10 +1576,12 @@ Before you send: confirm the exact contact you matched, show me their phone numb
|
|
|
1561
1576
|
<li>One-off messages are for one person. For a sequence to many people, build a nurture instead so replies stop it automatically.</li>
|
|
1562
1577
|
<li>Compliance stays yours. Business hours, opt-out language, and consent are your responsibility, not the tool's.</li>
|
|
1563
1578
|
<li>Needs the full license.</li>
|
|
1579
|
+
<li><b>Every send now tells you whether it actually went.</b> GHL accepting a message is not the same as delivering it: on an account whose text registration is not approved, messages sit queued for ever and nothing looks wrong. You now get told which of those happened.</li>
|
|
1580
|
+
<li><b>"Delivered" is the carrier's word, not proof somebody read it.</b> It is right nearly always, and it is not a receipt. For anything that matters, confirm with the person.</li>
|
|
1564
1581
|
</ul>
|
|
1565
1582
|
</div>
|
|
1566
1583
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1567
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The text says sent but never arrived."</td><td>The sub-account is not fully registered for texting. Check A2P status in GHL. This is the most common cause by far.</td></tr><tr><td>"It went to the wrong person."</td><td>Two contacts share a first name. Always give the full name or email and read the match Claude shows you.</td></tr><tr><td>"I meant to send twenty of these."</td><td>Twenty one-off sends is a sequence in disguise. Build a nurture; it stops on reply and keeps you out of trouble.</td></tr></table></div>
|
|
1584
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The text says sent but never arrived."</td><td>The sub-account is not fully registered for texting. Check A2P status in GHL. This is the most common cause by far.</td></tr><tr><td>"It went to the wrong person."</td><td>Two contacts share a first name. Always give the full name or email and read the match Claude shows you.</td></tr><tr><td>"I meant to send twenty of these."</td><td>Twenty one-off sends is a sequence in disguise. Build a nurture; it stops on reply and keeps you out of trouble.</td></tr><tr><td>"We texted them and they say they never got it."</td><td>Check what the send reported. If it says queued, the account's text registration is almost certainly not approved and the message never left. Before 31 August this looked identical to a successful send.</td></tr></table></div>
|
|
1568
1585
|
</div>
|
|
1569
1586
|
<div class="gsec"><h2>Bulk campaigns</h2>
|
|
1570
1587
|
<p class="gpara">Individual messages are one thing; a campaign is the older bulk-send layer sitting alongside your workflows.</p>
|
|
@@ -1686,6 +1703,8 @@ This is a read. Do not apply anything.</p></div>
|
|
|
1686
1703
|
<li>Imported snapshots are somebody else's work and can change out from under you. If a template matters to your business, build your own from an account you control.</li>
|
|
1687
1704
|
<li>Applying a snapshot is an agency-level action. Reading the list works with your agency key; the rollout itself happens in the GHL agency view.</li>
|
|
1688
1705
|
<li>Needs the full license.</li>
|
|
1706
|
+
<li><b>A cloned automation is checked after it is copied.</b> You are told how many steps and triggers actually landed, and whether anything in the copy still points back at the original.</li>
|
|
1707
|
+
<li><b>This mattered:</b> until 31 August a cloned automation could still enrol people into the workflow it was copied from. Clone a nurture sequence for a new client and their leads went into the previous client's automation, while the copy reported itself perfect.</li>
|
|
1689
1708
|
</ul>
|
|
1690
1709
|
</div>
|
|
1691
1710
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -1743,6 +1762,8 @@ Then confirm back to me, one line each, that every post saved as a draft and whi
|
|
|
1743
1762
|
<li>Images are not written by this. Attach them in the planner, or ask Claude to build an image separately and add it.</li>
|
|
1744
1763
|
<li>Publishing straight from the chat is possible, and this guide deliberately does not teach it. A misfired post on a client's real page is not a mistake you can quietly fix.</li>
|
|
1745
1764
|
<li>Needs the full license.</li>
|
|
1765
|
+
<li><b>A scheduled post has to say which hour it means.</b> A time with no timezone on it is read as UTC, so a post set for 9am would go out at 2am, publicly, on the client's own accounts, with nothing to undo. Claude now catches that before anything is scheduled.</li>
|
|
1766
|
+
<li><b>Asking for scheduled posts now really gives you only scheduled posts.</b> Until 31 August the filter was advertised and never applied, so a request for one queue came back with published and failed posts mixed in.</li>
|
|
1746
1767
|
</ul>
|
|
1747
1768
|
</div>
|
|
1748
1769
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -1807,10 +1828,11 @@ Do not add any contacts or deals to it yet.</p></div>
|
|
|
1807
1828
|
<li>Fewer stages is better. Six is plenty. Ten stages means nobody keeps the board clean.</li>
|
|
1808
1829
|
<li>Keep the pipeline. When stages change, ask Claude to update the pipeline in place. Deleting and recreating gives every stage a new ID, and every workflow that referenced the old ones goes silently dead.</li>
|
|
1809
1830
|
<li>Needs the full license.</li>
|
|
1831
|
+
<li><b>Editing stages is all-or-nothing, and that is now enforced.</b> Sending only the stage you are renaming used to delete every other stage, and the deals sitting in them were cut loose. Claude now refuses that and tells you which stages were at risk.</li>
|
|
1810
1832
|
</ul>
|
|
1811
1833
|
</div>
|
|
1812
1834
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
1813
|
-
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"I recreated the pipeline and all my automations stopped."</td><td>Recreating changes every stage ID. Say "update the existing pipeline" instead, and Claude keeps the IDs alive.</td></tr><tr><td>"A workflow that moves deals does nothing."</td><td>It is pointing at a stage that no longer exists. Run a workflow audit; this is the single most common find.</td></tr><tr><td>"The stage order came out wrong."</td><td>Say the stages in order in one line and ask for the read-back. The read-back shows you the true order.</td></tr></table></div>
|
|
1835
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"I recreated the pipeline and all my automations stopped."</td><td>Recreating changes every stage ID. Say "update the existing pipeline" instead, and Claude keeps the IDs alive.</td></tr><tr><td>"A workflow that moves deals does nothing."</td><td>It is pointing at a stage that no longer exists. Run a workflow audit; this is the single most common find.</td></tr><tr><td>"The stage order came out wrong."</td><td>Say the stages in order in one line and ask for the read-back. The read-back shows you the true order.</td></tr><tr><td>"I renamed one stage and the others disappeared."</td><td>That was possible until 31 August. The stage list replaces the whole board, so anything left out was deleted. It is now refused unless you explicitly say you mean to remove those stages.</td></tr></table></div>
|
|
1814
1836
|
</div>
|
|
1815
1837
|
<div class="gsec"><h2>Related guides</h2>
|
|
1816
1838
|
<ul>
|
|
@@ -1924,6 +1946,7 @@ Do not move anything. This is a read.</p></div>
|
|
|
1924
1946
|
<li>Won and lost are a different thing from stages. A deal can sit in "Treatment Scheduled" and be marked won. Ask for both when you want the true picture.</li>
|
|
1925
1947
|
<li>If a deal you expect is missing, it may live on a different pipeline in the same account. Ask "which pipelines exist here" first.</li>
|
|
1926
1948
|
<li>Needs the full license. The Free plan can read the board but not move deals.</li>
|
|
1949
|
+
<li><b>Moving a deal to a stage from another pipeline is refused by GHL</b>, and it names the stages that are valid. Checked on 31 August, this one was already safe.</li>
|
|
1927
1950
|
</ul>
|
|
1928
1951
|
</div>
|
|
1929
1952
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
@@ -2113,6 +2136,61 @@ Then give me the three things you would look at first if this were your account.
|
|
|
2113
2136
|
<p class="gfoot">Works in Claude Desktop and Claude Code. Stuck? Email support@ghlcommand.com and a human answers.</p>
|
|
2114
2137
|
</main></div>
|
|
2115
2138
|
</section>
|
|
2139
|
+
|
|
2140
|
+
<section class="gpage" id="g-workflows-that-will-not-save">
|
|
2141
|
+
<div class="hero"><div class="hero-in">
|
|
2142
|
+
<p class="eyebrow">GHL Command User Guide</p>
|
|
2143
|
+
<h1>When a workflow runs fine but will not save</h1>
|
|
2144
|
+
<p class="sub">Understand the error that names steps you never touched, and fix it without dropping anyone mid-sequence.</p>
|
|
2145
|
+
<div class="badges"><span class="badge on">Free plan</span><span class="badge">~3 minutes</span><span class="badge">Automations</span></div>
|
|
2146
|
+
</div></div>
|
|
2147
|
+
<div class="shell"><main class="gview">
|
|
2148
|
+
<a class="back" href="#top">← All guides</a>
|
|
2149
|
+
<div class="gsec"><h2>What you'll get</h2>
|
|
2150
|
+
<ul>
|
|
2151
|
+
<li>Plain English for the error that says <code>Action validation failed</code> and then lists steps you did not touch.</li>
|
|
2152
|
+
<li>The reason your workflow runs perfectly and still refuses to save.</li>
|
|
2153
|
+
<li>What GHL Command does about it automatically, what it refuses to do, and why refusing is the right answer.</li>
|
|
2154
|
+
</ul>
|
|
2155
|
+
</div>
|
|
2156
|
+
<div class="gsec"><h2>The short version</h2>
|
|
2157
|
+
<p class="gpara">Your workflow is not broken. It runs. Contacts move through it and messages go out exactly as they should.</p>
|
|
2158
|
+
<p class="gpara">What is broken is your ability to <b>edit</b> it. GoHighLevel tightened what it accepts when a workflow is saved, and older workflows store shapes that no longer pass. Change one step, hit save, and GHL rejects the whole thing and names three other steps as the problem. That is why the error looks unrelated to what you just did.</p>
|
|
2159
|
+
<p class="gpara">This affects workflows built from older snapshots and templates. On one real account, 20 of 43 workflows were in this state and the account looked completely healthy from inside GHL.</p>
|
|
2160
|
+
</div>
|
|
2161
|
+
<div class="gsec"><h2>Say this</h2>
|
|
2162
|
+
<div class="prompt"><q>Audit my workflows and tell me which ones cannot be saved.</q><button class="copy" type="button">Copy</button></div>
|
|
2163
|
+
<div class="prompt"><q>Why does this workflow fail with "Action validation failed" when I try to edit it?</q><button class="copy" type="button">Copy</button></div>
|
|
2164
|
+
<div class="prompt"><q>Is anyone part-way through this workflow right now?</q><button class="copy" type="button">Copy</button></div>
|
|
2165
|
+
</div>
|
|
2166
|
+
<div class="gsec"><h2>What the audit tells you now</h2>
|
|
2167
|
+
<p class="gpara">Run an audit and you may see warnings that did not exist before. They are <b>warnings, not errors</b>, and the difference matters:</p>
|
|
2168
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>Warning</th><th>What it means</th><th>What to do</th></tr><tr><td>Step id that GHL now rejects</td><td>The workflow <b>runs fine</b>. You cannot edit it until the ids are renewed.</td><td>See "Renewing the ids" below. Do not rush it.</td></tr><tr><td>Singular wait unit ("day" or "minute")</td><td>Same: runs fine, blocks saving.</td><td>Nothing. This is corrected automatically the next time the workflow is saved.</td></tr><tr><td>Notification with no recipient</td><td>The opposite problem: it <b>saves fine and runs</b>, and quietly notifies nobody.</td><td>Pick a person to notify, or set it to notify everyone.</td></tr><tr><td>Social step with no connected account</td><td>Also runs and quietly does nothing.</td><td>Connect the account in Settings → Integrations.</td></tr></table></div>
|
|
2169
|
+
<p class="gpara">Read those two groups carefully, because the advice is opposite. The first two mean *"it works, you just cannot change it."* The last two mean *"it looks fine and is doing nothing."*</p>
|
|
2170
|
+
</div>
|
|
2171
|
+
<div class="gsec"><h2>Renewing the ids, and the one thing that can go wrong</h2>
|
|
2172
|
+
<p class="gpara">Fixing the id problem means giving every step a new identifier. Here is the part nobody tells you:</p>
|
|
2173
|
+
<p class="gpara"><b>A contact part-way through a workflow is attached to the step they are waiting on.</b> Somebody sitting at "wait 3 days" is held there by that step's id. Renew the id and that contact is dropped out of the sequence, silently and permanently, with no way to put them back. GoHighLevel has no way to place a contact back at step seven.</p>
|
|
2174
|
+
<p class="gpara">So GHL Command will not do it while anyone is waiting. If you ask it to change a step that has someone parked on it, it refuses, tells you how many people are affected, and writes nothing.</p>
|
|
2175
|
+
<p class="gpara">That is deliberate. A refused edit costs you a wait. A dropped lead costs you the lead.</p>
|
|
2176
|
+
<p class="gpara"><b>What it will still do:</b> every other step in that workflow can be edited, renewed, added or removed. You can repair the whole workflow around the person who is waiting.</p>
|
|
2177
|
+
<p class="gpara"><b>What counts as "their step":</b> the step they are standing on, and any step it depends on. Some steps wait on another step rather than containing it: a goal that waits for a particular email to be opened is holding a reference to that email step. Change the email and the person waiting on the goal is affected, even though you never touched the goal. Those steps are protected too.</p>
|
|
2178
|
+
<p class="gpara"><b>When to do it:</b> when nobody is mid-sequence. For a nurture, that is usually after the last person has finished it. For a template or a brand-new account, it is safe immediately, because nobody is in it yet.</p>
|
|
2179
|
+
</div>
|
|
2180
|
+
<div class="gsec"><h2>Good to know</h2>
|
|
2181
|
+
<ul>
|
|
2182
|
+
<li>Running the workflow is never affected. If you change nothing, nothing breaks. There is no rush.</li>
|
|
2183
|
+
<li>A workflow can show enrolments and still have nobody waiting: those are people who have already finished. Only people mid-sequence matter.</li>
|
|
2184
|
+
<li>This works fully on the Free plan. Making the repairs needs the full license.</li>
|
|
2185
|
+
<li>If a workflow was built from a snapshot or a template, assume it is affected until the audit says otherwise. That is where these come from.</li>
|
|
2186
|
+
</ul>
|
|
2187
|
+
</div>
|
|
2188
|
+
<div class="gsec"><h2>Where people go wrong</h2>
|
|
2189
|
+
<div style="overflow-x:auto"><table class="wrongtbl"><tr><th>What happened</th><th>The fix</th></tr><tr><td>"The error named three steps I never touched, so I assumed I broke something else."</td><td>You did not. GoHighLevel rejects the whole workflow at once and reports every step it does not like, including the ones you left alone.</td></tr><tr><td>"The audit said 'ok' before, so I thought the account was clean."</td><td>Older versions could not see this at all. Re-run the audit: these warnings are new.</td></tr><tr><td>"I renewed the ids on a live nurture and people stopped receiving messages."</td><td>They were dropped at the step they were waiting on. This is exactly why the product now refuses. Check who is waiting before you repair.</td></tr><tr><td>"It refused to let me rename a step."</td><td>If someone is parked on that step, even a rename is refused. It is cautious on purpose. Wait until they have moved on.</td></tr><tr><td>"I want to force it through anyway."</td><td>For an EDIT there is no override, and that is intentional. There is no way to put a dropped contact back, so the product will not offer you a button that loses them.</td></tr><tr><td>"I need to delete the whole workflow and people are in it."</td><td>Deleting is different: you cannot delete a workflow and keep the people inside it, so this one is your call rather than a refusal. The first attempt tells you how many are part-way through; run it again naming that number and it proceeds. Nothing is deleted until you do.</td></tr></table></div>
|
|
2190
|
+
</div>
|
|
2191
|
+
<p class="gfoot">Works in Claude Desktop and Claude Code. Stuck? Email support@ghlcommand.com and a human answers.</p>
|
|
2192
|
+
</main></div>
|
|
2193
|
+
</section>
|
|
2116
2194
|
<footer class="foot"><div class="foot-in">
|
|
2117
2195
|
<span>GHL Command runs your GoHighLevel account from Claude. This guide library ships with every install, free or paid, and grows with the product.</span>
|
|
2118
2196
|
<a href="https://ghlcommand.com/skills/">Web version</a><a href="https://ghlcommand.com">ghlcommand.com</a>
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.76.0",
|
|
4
4
|
"mcpName": "io.github.drjerryrelth/ghl-command",
|
|
5
|
-
"description": "GoHighLevel MCP Server for Claude.
|
|
5
|
+
"description": "GoHighLevel MCP Server for Claude. 248 tools — full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"ghl-mcp": "dist/index.js"
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist/index.js",
|
|
12
12
|
"dist/capture-helper.js",
|
|
13
|
-
"dist/assessment.html",
|
|
14
13
|
"templates/action-schemas.json",
|
|
15
14
|
"templates/clinic-medspa.json",
|
|
16
15
|
"templates/trigger-schemas.json",
|
|
@@ -28,6 +27,7 @@
|
|
|
28
27
|
"build": "esbuild src/index.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/index.js --packages=external && esbuild src/capture-helper.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/capture-helper.js --packages=external && node src/command-os/assessment/build-app.mjs && cp src/command-os/assessment/app.html dist/assessment.html",
|
|
29
28
|
"setup": "node setup-wizard.mjs",
|
|
30
29
|
"catalogue": "node scripts/export-command-os-catalogue.mjs",
|
|
30
|
+
"manifest:write": "node scripts/write-package-manifest.mjs",
|
|
31
31
|
"start": "node dist/index.js",
|
|
32
32
|
"dev": "tsc --watch",
|
|
33
33
|
"test": "vitest run",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"bugs": {
|
|
61
61
|
"url": "https://github.com/drjerryrelth/ghl-command-feedback/issues",
|
|
62
|
-
"email": "support@
|
|
62
|
+
"email": "support@ghlcommand.com"
|
|
63
63
|
},
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copy Guide — every email and text the Blueprint sends
|
|
2
2
|
|
|
3
|
-
STATUS: v1, 2026-08-26.
|
|
3
|
+
STATUS: v1, 2026-08-26. Read by the build stage before it writes a single template, and by anyone editing a preset.
|
|
4
4
|
|
|
5
5
|
Why this exists, in the owner's words after inspecting a real build: "If we provide everything generic, our users will not be impressed and will not stay with us long." The workflows are only as good as the words inside them. This guide is the standard every message is written to and rewritten to.
|
|
6
6
|
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"convertToMultipath": false,
|
|
93
93
|
"transitions": []
|
|
94
94
|
},
|
|
95
|
-
"notes": "startAfter.type: 'minutes', 'hour', or 'days'
|
|
95
|
+
"notes": "startAfter.type: 'minutes', 'hour', or 'days' \u2014 NOT consistently singular, and 'day' is rejected with 400 INVALID_FIELD_VALUE on a workflow that has a real action before the wait (live-verified 2026-08-29). ALL 5 fields required (type, startAfter, isHybridAction, hybridActionType, transitions). Derived from working GHL UI-built workflows."
|
|
96
96
|
},
|
|
97
97
|
"internal_notification": {
|
|
98
98
|
"example": {
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"selectedUser": "USER_ID"
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
|
-
"notes": "Nested 'notification' object REQUIRED. selectedUser MUST be a real user ID
|
|
109
|
+
"notes": "Nested 'notification' object REQUIRED. \u26a0\ufe0f READ THE userType FIRST \u2014 the empty-string rule is SCOPED TO IT, and reading it unscoped makes this entry look like it contradicts intake-to-build/executor.ts. It does not. (a) userType:'user' \u2192 selectedUser MUST be a real user ID; an EMPTY STRING IS REJECTED (live-verified 2026-08-06; the old 'empty = all users' behaviour is gone). Use get_users. (b) userType:'all' \u2192 selectedUser:'' is the CORRECT and live-proven placeholder shape, not a defect; executor.ts:660-688 emits it deliberately when no staff member is resolvable yet, and executor.test.ts:1281-1289 pins it. Never flag (b) as missing a recipient. The ONLY broken combination is userType:'user' with a blank selectedUser. Use get_users to find IDs. EMAIL CHANNEL (verified live 2026-07-20, PWDJ workflow e91f28da): attributes.type is 'email' (NOT 'notification'), nested key is 'email' (NOT 'notification'), body field is 'html' (NOT 'body'), selectedUser is an ARRAY of user IDs, include attachments:[] and isCloned:false. A 'send_email' discriminator inside a 'notification' object saves but silently never sends.",
|
|
110
110
|
"emailChannelExample": {
|
|
111
111
|
"type": "email",
|
|
112
112
|
"email": {
|
|
@@ -153,19 +153,30 @@
|
|
|
153
153
|
"type": "task-notification",
|
|
154
154
|
"__customInputs__": {}
|
|
155
155
|
},
|
|
156
|
-
"notes": "dueDate is days from now as string. assignedTo is a user ID."
|
|
156
|
+
"notes": "dueDate is days from now as string. assignedTo is a user ID. \u26a0\ufe0f THE TYPE MUST BE HYPHENATED. The underscore form `task_notification` SAVES, VALIDATES and PUBLISHES and is then SILENTLY SKIPPED AT RUNTIME \u2014 no task is ever created and no error is shown anywhere (live-verified 2026-06-12 on the GHL Command sale alert). If you searched this file for `task_notification` and found nothing, that empty result IS the bug: the key here is `task-notification`."
|
|
157
157
|
},
|
|
158
158
|
"assign_user": {
|
|
159
159
|
"example": {
|
|
160
160
|
"type": "assign_user",
|
|
161
|
-
"user_list": [
|
|
161
|
+
"user_list": [
|
|
162
|
+
"USER_ID"
|
|
163
|
+
],
|
|
162
164
|
"only_unassigned_contact": false,
|
|
163
165
|
"traffic_split": "equally",
|
|
164
|
-
"traffic_weightage": {
|
|
165
|
-
|
|
166
|
+
"traffic_weightage": {
|
|
167
|
+
"USER_ID": 1
|
|
168
|
+
},
|
|
169
|
+
"traffic_index": [
|
|
170
|
+
{
|
|
171
|
+
"id": "USER_ID",
|
|
172
|
+
"indexes": [
|
|
173
|
+
1
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
],
|
|
166
177
|
"total_index": 1
|
|
167
178
|
},
|
|
168
|
-
"notes": "[PROVEN LIVE 2026-08-27 on the MCP Testing sandbox: a scratch workflow carrying both a single-user and a two-user round-robin assign_user node saved, read back with every attribute intact (user_list, only_unassigned_contact, traffic_split, traffic_weightage, traffic_index, total_index) and both real user ids present, and PUBLISHED
|
|
179
|
+
"notes": "[PROVEN LIVE 2026-08-27 on the MCP Testing sandbox: a scratch workflow carrying both a single-user and a two-user round-robin assign_user node saved, read back with every attribute intact (user_list, only_unassigned_contact, traffic_split, traffic_weightage, traffic_index, total_index) and both real user ids present, and PUBLISHED \u2014 GHL's own builder validator accepted it, which is the check that requires a non-empty user_list and verifies each id against the location's users. Scratch workflow deleted; the account was left byte-identical.] 'Assign to user' \u2014 the listed users become the contact owner. Linear actions-category node like add_contact_tag. user_list is REQUIRED and non-empty (GHL's builder validator: 'user_list_required'; every id is checked against the location's users \u2014 a dead id silently never assigns). Multiple users = round-robin; the equal-split bookkeeping the builder saves is weightage {id:1 each}, traffic_index [{id, indexes:[1..weight]}] with globally sequential indexes, total_index = sum of weights \u2014 single user: weightage {id:1}, index [{id, indexes:[1]}], total 1. only_unassigned_contact false always (re)assigns; true skips contacts that already have an owner. traffic_split 'unevenly' + custom weights and customUserList (custom-value mode) exist in the builder but are NOT built by us. LIVE TEST TO CLOSE: build one workflow with this node on a sandbox (MCP Testing), publish, run a test contact through, read back with get_workflow_full + get_contact \u2014 confirm the node persists byte-for-byte and the contact's assignedTo/owner becomes USER_ID; then remove this UNVERIFIED label."
|
|
169
180
|
},
|
|
170
181
|
"remove_from_workflow": {
|
|
171
182
|
"example": {
|
|
@@ -426,5 +437,17 @@
|
|
|
426
437
|
"nurture_sequence": "Use linear workflow with stopOnResponse:true. Create separate 'exit workflows' triggered by tags (appointment-booked, do-not-contact) that use remove_from_workflow to pull contacts out. Do NOT use inline if/else gates at every step \u2014 this creates too many actions and can freeze GHL.",
|
|
427
438
|
"exit_workflow": "Small 3-4 step workflow: remove_from_workflow \u2192 note \u2192 tag \u2192 notify. Triggered by a tag being added to the contact.",
|
|
428
439
|
"max_actions": "Keep workflows under 40 actions. GHL's UI renderer struggles with larger workflows. Split into multiple connected workflows if needed."
|
|
440
|
+
},
|
|
441
|
+
"add_to_workflow": {
|
|
442
|
+
"example": {
|
|
443
|
+
"type": "add_to_workflow",
|
|
444
|
+
"name": "Add to: <Target Workflow Name>",
|
|
445
|
+
"attributes": {
|
|
446
|
+
"input_trigger_params": false,
|
|
447
|
+
"type": "add_to_workflow",
|
|
448
|
+
"workflow_id": "TARGET_WORKFLOW_ID"
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
"notes": "COPIED FROM A LIVE PUBLISHED NODE on a real account (read-only, 2026-09-01) \u2014 not derived from docs. \u26a0\ufe0f THIS IS NOT THE SAME SHAPE AS remove_from_workflow, which is the adjacent action and the easy mistake: remove needs BOTH `workflowId` (camelCase string) AND `workflow_id` (ARRAY). add needs NEITHER \u2014 `workflow_id` is snake_case and a SINGULAR STRING, there is no `workflowId` and no `workflowName`. `input_trigger_params: false` is present in the working node; purpose unknown, carry it. \u26a0\ufe0f KNOWN DIVERGENCE, UNRESOLVED: src/intake-to-build/executor.ts:806 emits the REMOVE shape under the ADD type (camelCase workflowId + workflowName + workflow_id as an ARRAY, no input_trigger_params). Whether GHL accepts and FIRES that variant is [UNVERIFIED] \u2014 a shape that saves and validates is not evidence it runs (cf. task_notification, wait unit \"day\", internal_notification \"inapp\"). Prove it on a sandbox before trusting either form."
|
|
429
452
|
}
|
|
430
|
-
}
|
|
453
|
+
}
|