@elitedcs/ghl-mcp 3.97.0 → 3.97.2
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 +62 -0
- package/README.md +1 -1
- package/dist/brain-function.js +167 -16
- package/dist/index.js +6612 -3849
- package/guide/guide.html +29 -4
- package/package.json +1 -1
- package/skills/blueprint/examples/sample-build-plan.json +1 -1
- package/skills/blueprint/presets/clinic.preset.json +29 -29
- package/skills/blueprint/presets/coach.preset.json +28 -28
- package/skills/blueprint/presets/ecommerce.preset.json +21 -21
- package/skills/blueprint/presets/generic-client.preset.json +32 -31
- package/skills/blueprint/presets/local-service.md +1 -1
- package/skills/blueprint/presets/local-service.preset.json +45 -45
- package/skills/blueprint/presets/med-spa.md +1 -1
- package/skills/blueprint/presets/med-spa.preset.json +27 -27
- package/skills/blueprint/presets/wellness-clinic.md +2 -2
- package/skills/blueprint/presets/wellness-clinic.preset.json +36 -36
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: f56d1be300fe9f07 -->
|
|
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
|
|
@@ -1714,7 +1714,8 @@ Show me the first ten rows in the chat so I can sanity check them before you wri
|
|
|
1714
1714
|
<ul>
|
|
1715
1715
|
<li><b>Done means:</b> you asked "Which account am I in?" and Claude answered with the right account name. That is the whole test.</li>
|
|
1716
1716
|
<li>Step 2 is part of the install, not an extra. Until it is done, Claude will keep reminding you the install is one step from finished. Nothing will pretend to be complete when it is not.</li>
|
|
1717
|
-
<li>If anything says "not working" afterward, say "run a health check": it tests every connection and tells you in plain English what, if anything, needs attention.</li>
|
|
1717
|
+
<li>If anything says "not working" afterward, say "run a health check": it tests every connection and tells you in plain English what, if anything, needs attention. Its first check, Host, names the assistant GHL Command is running in, and its License plan line says which plan this session runs on.</li>
|
|
1718
|
+
<li>You can have GHL Command open in more than one assistant window on the same computer. Each window saves your registered accounts, connections and cockpit board under a shared lock and adds its change to what the other saved. Saves keep unrelated changes made by another window. Editing the same details in both windows at once can still replace the earlier change. If the other window still holds the save after 5 seconds, the waiting save does not happen; if your plan includes the cockpit, some of a cockpit run's own saves try up to three times over a few seconds instead. When a tool, a run or the cockpit says something was not saved, follow what it tells you to do, such as running it again or checking the account and refreshing. A few background notes are skipped without a message. A sub-account that was created is still reported as created, even if its key or its card could not be saved yet. Do not create it again; register it with its key. If neither its key nor its card was saved and your plan includes the cockpit, its New Client page may show it as "Created:" followed by its name when no client is selected, and while it shows, the cockpit and chat refuse to create that name again. To clear it, register it with its key or, if you already removed it in GoHighLevel, press "Dismiss: I removed this sub-account". Dismiss does not delete the sub-account or check that you removed it. If nothing shows, check GoHighLevel before you create it again.</li>
|
|
1718
1719
|
<li>Stuck at any point? Email support@ghlcommand.com and a human answers.</li>
|
|
1719
1720
|
</ul>
|
|
1720
1721
|
</div>
|
|
@@ -2256,7 +2257,7 @@ Before you send: confirm the exact contact you matched, show me their phone numb
|
|
|
2256
2257
|
<ol class="steps">
|
|
2257
2258
|
<li>Claude finds the contact and shows you the match, including the number or address the message would go to.</li>
|
|
2258
2259
|
<li>It shows you the message exactly as written.</li>
|
|
2259
|
-
<li>It sends only when you say so, then
|
|
2260
|
+
<li>It sends only when you say so, then reports the result and any conversation details GoHighLevel gives back.</li>
|
|
2260
2261
|
</ol>
|
|
2261
2262
|
</div>
|
|
2262
2263
|
<div class="gsec"><h2>Good to know</h2>
|
|
@@ -2266,13 +2267,37 @@ Before you send: confirm the exact contact you matched, show me their phone numb
|
|
|
2266
2267
|
<li>One-off messages are for one person. For a sequence to many people, build a nurture instead so replies stop it automatically.</li>
|
|
2267
2268
|
<li>Compliance stays yours. Business hours, opt-out language, and consent are your responsibility, not the tool's.</li>
|
|
2268
2269
|
<li>Needs the full license.</li>
|
|
2269
|
-
<li><b>
|
|
2270
|
+
<li><b>GHL Command checks each send's status when GoHighLevel gives it a message to look up.</b> The answer can show a status such as sent, delivered, queued or failed, or say that the status could not be read. If GoHighLevel gives no message to look up, GHL Command cannot do its follow-up check: treat that send as unconfirmed. GoHighLevel accepting a message does not prove it was delivered. On an account whose text registration is not approved, messages can sit queued with nothing looking wrong in GoHighLevel. Confirm anything important with the person.</li>
|
|
2270
2271
|
<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>
|
|
2271
2272
|
</ul>
|
|
2272
2273
|
</div>
|
|
2273
2274
|
<div class="gsec"><h2>Where people go wrong</h2>
|
|
2274
2275
|
<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>
|
|
2275
2276
|
</div>
|
|
2277
|
+
<div class="gsec"><h2>Choose the number a text goes out from</h2>
|
|
2278
|
+
<p class="gpara">If an account has more than one phone number, you can say which one a text goes out from.</p>
|
|
2279
|
+
<div class="prompt"><q>Text Dana Miller from +15555550100 that we have a 2pm slot open tomorrow.</q><button class="copy" type="button">Copy</button></div>
|
|
2280
|
+
<ul>
|
|
2281
|
+
<li>GHL Command checks the number first. It must be one of that account's own numbers. If it is not, nothing is sent and you see the account's real numbers. If the check cannot run, nothing is sent either, and you are told why.</li>
|
|
2282
|
+
<li>After GoHighLevel accepts the text, GHL Command checks which number GoHighLevel says it used. You are told whether it matches the one you asked for.</li>
|
|
2283
|
+
<li>If GoHighLevel reports a different number, you are told plainly. Do not tell anyone it came from the number you named. Check the delivery result and the contact's conversation before you think about sending it again.</li>
|
|
2284
|
+
<li>Sometimes GoHighLevel does not say which number it used: it shows only the account's name, shows nothing, or the check cannot be read. Then you are told the sender could not be confirmed.</li>
|
|
2285
|
+
<li>You can pick a number for SMS texts only, not for an email, WhatsApp or social message.</li>
|
|
2286
|
+
<li>Write the number in full with the plus sign and country code, and no spaces or dashes, like +15555550100.</li>
|
|
2287
|
+
</ul>
|
|
2288
|
+
</div>
|
|
2289
|
+
<div class="gsec"><h2>Turn off automatic resend attempts</h2>
|
|
2290
|
+
<div class="prompt"><q>Text Dana Miller that we have a 2pm slot open tomorrow. Send it once only, no resend.</q><button class="copy" type="button">Copy</button></div>
|
|
2291
|
+
<p class="gpara">Normally, after some failures GHL Command makes up to three more attempts: when the connection drops while it waits for an answer, when GoHighLevel says you are sending too many requests at once, or when GoHighLevel has an error of its own. For a text that is a risk: the first try may already have gone out, and the person gets it twice. Ask for a single attempt and GHL Command makes no automatic retries for that send. Asking Claude to send it again is a new send, and it can go out a second time. Without a single attempt, a failed send shows the error as it came, which may not say whether the text went out. Check the contact's conversation before you send again.</p>
|
|
2292
|
+
<p class="gpara">If the single attempt fails while sending, you are told which of two things happened:</p>
|
|
2293
|
+
<ul>
|
|
2294
|
+
<li>Not sent: GoHighLevel refused it (including when it says you are sending too many requests at once), or GHL Command stopped it before it left. Sending again will not double it, but fix the reason first or it will be refused again.</li>
|
|
2295
|
+
<li>May have gone out: the connection dropped, the try timed out, or GoHighLevel had an error of its own. Check the contact's conversation before you send again.</li>
|
|
2296
|
+
</ul>
|
|
2297
|
+
<p class="gpara">A check that runs before the send, such as an account lock or a missing license, can stop it earlier with its own message.</p>
|
|
2298
|
+
<p class="gpara">Use it for anything a person should never get twice, such as a payment reminder, or a text you have Claude send on a schedule while nobody is watching. The single-attempt option works for any one-off message Claude sends this way: a text, an email, a WhatsApp or a social message. It does not cover invoices, estimates, documents or email campaigns, and it does not change messages your GoHighLevel workflows send.</p>
|
|
2299
|
+
<p class="gpara">Both options are optional. Leave them out and the number GoHighLevel picks and the automatic retries stay as they were.</p>
|
|
2300
|
+
</div>
|
|
2276
2301
|
<div class="gsec"><h2>Bulk campaigns</h2>
|
|
2277
2302
|
<p class="gpara">Individual messages are one thing; a campaign is the older bulk-send layer sitting alongside your workflows.</p>
|
|
2278
2303
|
<div class="prompt"><q>What campaigns are running in this account?</q><button class="copy" type="button">Copy</button></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elitedcs/ghl-mcp",
|
|
3
|
-
"version": "3.97.
|
|
3
|
+
"version": "3.97.2",
|
|
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",
|
|
@@ -1510,7 +1510,7 @@
|
|
|
1510
1510
|
"owner": "OPERATOR-EXT",
|
|
1511
1511
|
"title": "Connect Stripe (to take payment)",
|
|
1512
1512
|
"trigger": "channels.payment != 'Stripe connected'",
|
|
1513
|
-
"instruction": "Connect Stripe in Payments > Integrations and create your products / prices.
|
|
1513
|
+
"instruction": "Connect Stripe in Payments > Integrations and create your products / prices. Authorize the payment connection in GoHighLevel.",
|
|
1514
1514
|
"produces": null,
|
|
1515
1515
|
"successCheck": "Stripe shows connected and products exist",
|
|
1516
1516
|
"blocks": []
|
|
@@ -406,13 +406,13 @@
|
|
|
406
406
|
"ref": "email_template.stl_email_1",
|
|
407
407
|
"name": "Speed to Lead - Instant Email",
|
|
408
408
|
"subject": "Got your request, {{contact.first_name}}",
|
|
409
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">You just asked {{custom_values.business_name}} about {{offer.leadMagnet || a new-patient visit}}. I'm {{custom_values.owner_first_name}}
|
|
409
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">You just asked {{custom_values.business_name}} about {{offer.leadMagnet || a new-patient visit}}. I'm {{custom_values.owner_first_name}}.</p><p style=\"margin:0 0 14px;\">Here's what happens next: reply with one word, whether this is something new, something ongoing, or a check-up, and we'll make sure the right person calls you back.</p><p style=\"margin:0 0 14px;\">If you'd rather pick your own time, the calendar is here:</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my first visit</a></p><p style=\"margin:0 0 14px;\">The first visit is mostly listening. You talk, we ask questions, and you leave knowing your options. Nothing more is decided that day unless you want it to be.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
410
410
|
},
|
|
411
411
|
{
|
|
412
412
|
"ref": "email_template.stl_email_2",
|
|
413
413
|
"name": "Speed to Lead - 3 Hour Email",
|
|
414
414
|
"subject": "What the first visit is (and isn't)",
|
|
415
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">People put off a first visit because they think it commits them to something. It doesn't.</p><p style=\"margin:0 0 14px;\">At {{custom_values.business_name}} the first visit is a conversation and an assessment. We ask what brought you in, what you've already tried, and what \"better\" would look like for you. Then we explain your options in plain words,
|
|
415
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">People put off a first visit because they think it commits them to something. It doesn't.</p><p style=\"margin:0 0 14px;\">At {{custom_values.business_name}} the first visit is a conversation and an assessment. We ask what brought you in, what you've already tried, and what \"better\" would look like for you. Then we explain your options in plain words, and you can ask what each one costs before anything happens.</p><p style=\"margin:0 0 14px;\">You leave with a plan you can think about at home. That's the whole first visit.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Pick my time</a></p><p style=\"margin:0 0 14px;\">Have a question first, about insurance, cost or anything else? Reply to this email. A person answers, not a bot.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
416
416
|
},
|
|
417
417
|
{
|
|
418
418
|
"ref": "email_template.n_email_1",
|
|
@@ -424,7 +424,7 @@
|
|
|
424
424
|
"ref": "email_template.n_email_2",
|
|
425
425
|
"name": "Nurture 2 - Insurance and Cost, Plainly",
|
|
426
426
|
"subject": "Insurance and cost, in plain words",
|
|
427
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The question most people are nervous to ask first: what is this going to cost me?</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">If you have insurance:
|
|
427
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">The question most people are nervous to ask first: what is this going to cost me?</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">If you have insurance: ask us how it works with your plan before you come in.</li><li style=\"margin:0 0 6px;\">If you're cash-pay: ask us the price of the first visit, and of any option after it, before you decide.</li></ul><p style=\"margin:0 0 14px;\">The objection we hear most is {{audience.objections[0] || cost}}. That's why you can ask about cost before the visit, not after.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my first visit</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
428
428
|
},
|
|
429
429
|
{
|
|
430
430
|
"ref": "email_template.n_email_3",
|
|
@@ -436,31 +436,31 @@
|
|
|
436
436
|
"ref": "email_template.n_email_4",
|
|
437
437
|
"name": "Nurture 4 - The Three Questions",
|
|
438
438
|
"subject": "Three questions to ask any provider",
|
|
439
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Whether you come to us or go somewhere else, ask these three questions before you book anywhere:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">How do you decide what I need? (Look for: an assessment and a conversation, not a package.)</li><li style=\"margin:0 0 6px;\">What will it cost, and when will I know? (Look for:
|
|
439
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Whether you come to us or go somewhere else, ask these three questions before you book anywhere:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">How do you decide what I need? (Look for: an assessment and a conversation, not a package.)</li><li style=\"margin:0 0 6px;\">What will it cost, and when will I know? (Look for: a straight answer before the visit.)</li><li style=\"margin:0 0 6px;\">What happens if it isn't working? (Look for: a plan to change course, not \"keep coming.\")</li></ul><p style=\"margin:0 0 14px;\">Our answers: an assessment first, a straight answer on cost when you ask, and a check-in where we change the plan if it isn't doing what we said it would.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my first visit</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
440
440
|
},
|
|
441
441
|
{
|
|
442
442
|
"ref": "email_template.n_email_5",
|
|
443
443
|
"name": "Nurture 5 - The Easy Stage Is the Cheap Stage",
|
|
444
444
|
"subject": "The easy stage is the cheap stage",
|
|
445
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">There's a comfortable idea that it makes sense to wait and see. Sometimes it does. Often the thing that would have been simple to address early takes longer, costs more, and leaves fewer options later.</p><p style=\"margin:0 0 14px;\">We're not going to tell you what your situation is from an email. We can tell you that the first visit
|
|
445
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">There's a comfortable idea that it makes sense to wait and see. Sometimes it does. Often the thing that would have been simple to address early takes longer, costs more, and leaves fewer options later.</p><p style=\"margin:0 0 14px;\">We're not going to tell you what your situation is from an email. We can tell you that the first visit gives you a clear picture of where you stand, and that a clear picture is cheaper than a guess.</p><p style=\"margin:0 0 14px;\">You don't have to decide anything today. The visit just keeps the simple options on the table.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Keep my options open</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
446
446
|
},
|
|
447
447
|
{
|
|
448
448
|
"ref": "email_template.n_email_6",
|
|
449
449
|
"name": "Nurture 6 - Everything in One Place",
|
|
450
450
|
"subject": "Everything you need to decide, in one place",
|
|
451
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">If you're still weighing it up, here is everything in one place:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What: {{offer.leadMagnet || a new-patient visit}} at {{custom_values.business_name}}. Mostly listening, then an assessment, then options in plain words.</li><li style=\"margin:0 0 6px;\">Where: {{business.location || our office}}.</li><li style=\"margin:0 0 6px;\">Cost:
|
|
451
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">If you're still weighing it up, here is everything in one place:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What: {{offer.leadMagnet || a new-patient visit}} at {{custom_values.business_name}}. Mostly listening, then an assessment, then options in plain words.</li><li style=\"margin:0 0 6px;\">Where: {{business.location || our office}}.</li><li style=\"margin:0 0 6px;\">Cost: ask us about insurance or the cash price before you come in.</li><li style=\"margin:0 0 6px;\">Our rule: nothing recommended that we can't explain to you, with the alternatives.</li><li style=\"margin:0 0 6px;\">Book, cancel or move your time any time: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">your booking link</a>.</li></ul><p style=\"margin:0 0 14px;\">If the answer is \"not now\", that's fine. Reply with the word later and I'll stop the emails.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book my first visit</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
452
452
|
},
|
|
453
453
|
{
|
|
454
454
|
"ref": "email_template.w_email_1",
|
|
455
455
|
"name": "Win-back 1 - One Question",
|
|
456
456
|
"subject": "One question, {{contact.first_name}}",
|
|
457
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">A while back you asked {{custom_values.business_name}} about a first visit, and then life got busy. That's normal.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, cost, insurance, nerves, or something we said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something we can fix,
|
|
457
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">A while back you asked {{custom_values.business_name}} about a first visit, and then life got busy. That's normal.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, cost, insurance, nerves, or something we said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something we can fix, tell me. If it's not the right time, say so and I'll stop here.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
458
458
|
},
|
|
459
459
|
{
|
|
460
460
|
"ref": "email_template.w_email_2",
|
|
461
461
|
"name": "Win-back 2 - What Changed",
|
|
462
462
|
"subject": "What's changed since you last looked",
|
|
463
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">
|
|
463
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">It has been a while since you first reached out to {{custom_values.business_name}}, and the calendar is open if the timing is better now.</p><p style=\"margin:0 0 14px;\">What hasn't changed: the first visit is still mostly listening, you can still ask about costs before you walk in, and nothing is decided that day unless you want it to be.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">See the calendar</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
464
464
|
},
|
|
465
465
|
{
|
|
466
466
|
"ref": "email_template.w_email_3",
|
|
@@ -472,7 +472,7 @@
|
|
|
472
472
|
"ref": "email_template.appt_confirm_email",
|
|
473
473
|
"name": "Visit Confirmed",
|
|
474
474
|
"subject": "Confirmed, {{contact.first_name}}: your visit details",
|
|
475
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your visit at {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Bring: a photo ID, your insurance card if you have one, and any questions you want answered.</li><li style=\"margin:0 0 6px;\">
|
|
475
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Your visit at {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Bring: a photo ID, your insurance card if you have one, and any questions you want answered.</li><li style=\"margin:0 0 6px;\">Comfortable clothing is a good idea.</li></ul><p style=\"margin:0 0 14px;\">Need to move it? Use your booking link: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">reschedule</a>, or reply to this email.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
476
476
|
},
|
|
477
477
|
{
|
|
478
478
|
"ref": "email_template.appt_prep_email",
|
|
@@ -496,13 +496,13 @@
|
|
|
496
496
|
"ref": "email_template.quote_email_1",
|
|
497
497
|
"name": "Quote Follow-up - Day 3 Email",
|
|
498
498
|
"subject": "Any questions on your treatment plan, {{contact.first_name}}?",
|
|
499
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">You have had the treatment plan from {{custom_values.business_name}} for a few days, so this is a short check-in rather than a push.</p><p style=\"margin:0 0 14px;\">Three things people usually ask at this point: what is included, what can wait, and how payment works. Reply with any of those and I will answer plainly.</p><p style=\"margin:0 0 14px;\">If you would rather talk it through, pick a time here:</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book a quick call</a></p><p style=\"margin:0 0 14px;\">No pressure either way
|
|
499
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">You have had the treatment plan from {{custom_values.business_name}} for a few days, so this is a short check-in rather than a push.</p><p style=\"margin:0 0 14px;\">Three things people usually ask at this point: what is included, what can wait, and how payment works. Reply with any of those and I will answer plainly.</p><p style=\"margin:0 0 14px;\">If you would rather talk it through, pick a time here:</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.booking_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Book a quick call</a></p><p style=\"margin:0 0 14px;\">No pressure either way.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
500
500
|
},
|
|
501
501
|
{
|
|
502
502
|
"ref": "email_template.review_email_1",
|
|
503
503
|
"name": "Review Request - Email",
|
|
504
504
|
"subject": "One minute for a review, {{contact.first_name}}?",
|
|
505
|
-
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your visit with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and
|
|
505
|
+
"html": "<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:1.5;color:#1f2937;max-width:600px;\"><p style=\"margin:0 0 14px;\">Hi {{contact.first_name}},</p><p style=\"margin:0 0 14px;\">Thank you again for your visit with {{custom_values.business_name}} this week.</p><p style=\"margin:0 0 14px;\">If it went well, a short review is the most useful thing you could do for us. It takes about a minute and it is how the next person decides to trust us.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\" style=\"display:inline-block;background:#1a56db;color:#ffffff;padding:12px 20px;border-radius:6px;text-decoration:none;font-weight:600;\">Leave a review</a></p><p style=\"margin:0 0 14px;\">If anything was not right, reply to this email instead and tell us.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>",
|
|
506
506
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
507
507
|
}
|
|
508
508
|
],
|
|
@@ -515,7 +515,7 @@
|
|
|
515
515
|
{
|
|
516
516
|
"ref": "sms_template.stl_sms_2",
|
|
517
517
|
"name": "Speed to Lead - 20 Minute Text",
|
|
518
|
-
"body": "{{contact.first_name}},
|
|
518
|
+
"body": "{{contact.first_name}}, Want me to hold a new-patient time for you? Mornings or afternoons? Or pick one here: {{custom_values.booking_link}}"
|
|
519
519
|
},
|
|
520
520
|
{
|
|
521
521
|
"ref": "sms_template.stl_sms_3",
|
|
@@ -535,22 +535,22 @@
|
|
|
535
535
|
{
|
|
536
536
|
"ref": "sms_template.n_sms_1",
|
|
537
537
|
"name": "Nurture Text 1 - Insurance or Cash",
|
|
538
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: will this be insurance or cash-pay? One word
|
|
538
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: will this be insurance or cash-pay? One word helps us answer your cost questions.\nReply STOP to opt out."
|
|
539
539
|
},
|
|
540
540
|
{
|
|
541
541
|
"ref": "sms_template.n_sms_2",
|
|
542
542
|
"name": "Nurture Text 2 - Free Tip",
|
|
543
|
-
"body": "Tip from {{custom_values.business_name}}: before any first visit, anywhere, write down what you've already tried and roughly when. It
|
|
543
|
+
"body": "Tip from {{custom_values.business_name}}: before any first visit, anywhere, write down what you've already tried and roughly when. It makes any first visit more useful. Questions? Reply here."
|
|
544
544
|
},
|
|
545
545
|
{
|
|
546
546
|
"ref": "sms_template.n_sms_3",
|
|
547
547
|
"name": "Nurture Text 3 - Midpoint",
|
|
548
|
-
"body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about coming in?
|
|
548
|
+
"body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about coming in? Want me to find you a time this week, or should I check back next month?"
|
|
549
549
|
},
|
|
550
550
|
{
|
|
551
551
|
"ref": "sms_template.n_sms_4",
|
|
552
552
|
"name": "Nurture Text 4 - Any Question",
|
|
553
|
-
"body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you get your question answered, about cost, insurance, or what to expect? If not, ask it here and I'll reply
|
|
553
|
+
"body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you get your question answered, about cost, insurance, or what to expect? If not, ask it here and I'll reply."
|
|
554
554
|
},
|
|
555
555
|
{
|
|
556
556
|
"ref": "sms_template.n_sms_5",
|
|
@@ -565,12 +565,12 @@
|
|
|
565
565
|
{
|
|
566
566
|
"ref": "sms_template.w_sms_2",
|
|
567
567
|
"name": "Win-back Text 2",
|
|
568
|
-
"body": "{{contact.first_name}},
|
|
568
|
+
"body": "{{contact.first_name}}, want to pick a new-patient visit time at {{custom_values.business_name}}? Reply YES and I'll find you one."
|
|
569
569
|
},
|
|
570
570
|
{
|
|
571
571
|
"ref": "sms_template.appt_confirm_sms",
|
|
572
572
|
"name": "Visit Confirmed Text",
|
|
573
|
-
"body": "{{contact.first_name}}, you're confirmed at {{custom_values.business_name}} for {{appointment.start_time}}.
|
|
573
|
+
"body": "{{contact.first_name}}, you're confirmed at {{custom_values.business_name}} for {{appointment.start_time}}. Need to change it? Reply here. Reply STOP to opt out."
|
|
574
574
|
},
|
|
575
575
|
{
|
|
576
576
|
"ref": "sms_template.appt_24h_sms",
|
|
@@ -590,7 +590,7 @@
|
|
|
590
590
|
{
|
|
591
591
|
"ref": "sms_template.ns_sms_2",
|
|
592
592
|
"name": "No-Show Text 2",
|
|
593
|
-
"body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here.
|
|
593
|
+
"body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. We'd be glad to find you another new-patient time. Want one? Reply with a day that works."
|
|
594
594
|
},
|
|
595
595
|
{
|
|
596
596
|
"ref": "sms_template.quote_sms_1",
|
|
@@ -617,7 +617,7 @@
|
|
|
617
617
|
"name": "Speed to Lead - Instant Email",
|
|
618
618
|
"subject": "Got your request, {{contact.first_name}}",
|
|
619
619
|
"templateRef": "email_template.stl_email_1",
|
|
620
|
-
"copyDirection": "Instant. Who I am, what they asked for (the new-patient visit), what happens next (a text), the one-question ask (new / ongoing / check-up), the booking CTA, the \"mostly listening\" promise. No clinical detail. Tone: brief.voice.threeWords. If brief.voice.signatureLine exists, insert it verbatim as its own paragraph right after the greeting.",
|
|
620
|
+
"copyDirection": "Instant. Who I am, what they asked for (the new-patient visit), what happens next (a reply invitation; never promise a text, since texting may be off), the one-question ask (new / ongoing / check-up), the booking CTA, the \"mostly listening\" promise. No clinical detail. Tone: brief.voice.threeWords. If brief.voice.signatureLine exists, insert it verbatim as its own paragraph right after the greeting.",
|
|
621
621
|
"mergeTags": [
|
|
622
622
|
"contact.first_name",
|
|
623
623
|
"custom_values.business_name",
|
|
@@ -659,7 +659,7 @@
|
|
|
659
659
|
"name": "Nurture 2 - Insurance and Cost, Plainly",
|
|
660
660
|
"subject": "Insurance and cost, in plain words",
|
|
661
661
|
"templateRef": "email_template.n_email_2",
|
|
662
|
-
"copyDirection": "Day 5. Remove the biggest unknown for a clinic lead: how insurance and cash-pay work here, benefits checked before the visit
|
|
662
|
+
"copyDirection": "Day 5. Remove the biggest unknown for a clinic lead: how insurance and cash-pay work here, benefits checked before the visit only if the brief says the clinic does it; promise no written prices or bills. Top objection named and answered. One CTA.",
|
|
663
663
|
"mergeTags": [
|
|
664
664
|
"contact.first_name",
|
|
665
665
|
"custom_values.booking_link",
|
|
@@ -673,7 +673,7 @@
|
|
|
673
673
|
"name": "Nurture 3 - How We Decide",
|
|
674
674
|
"subject": "How we decide what to recommend",
|
|
675
675
|
"templateRef": "email_template.n_email_3",
|
|
676
|
-
"copyDirection": "Day 10. The method as proof: assess, explain,
|
|
676
|
+
"copyDirection": "Day 10. The method as proof: assess, explain, talk through the options, you decide. Real patient stories ONLY if the brief supplies them with consent; otherwise the method is the proof. CTA + reply invite. No clinical detail.",
|
|
677
677
|
"mergeTags": [
|
|
678
678
|
"contact.first_name",
|
|
679
679
|
"custom_values.business_name",
|
|
@@ -729,7 +729,7 @@
|
|
|
729
729
|
"name": "Win-back 1 - One Question",
|
|
730
730
|
"subject": "One question, {{contact.first_name}}",
|
|
731
731
|
"templateRef": "email_template.w_email_1",
|
|
732
|
-
"copyDirection": "Win-back day 0. Acknowledge the gap without guilt; ask what stopped them (timing, cost, insurance, nerves);
|
|
732
|
+
"copyDirection": "Win-back day 0. Acknowledge the gap without guilt; ask what stopped them (timing, cost, insurance, nerves); invite them to say what would help. A reply is the CTA.",
|
|
733
733
|
"mergeTags": [
|
|
734
734
|
"contact.first_name",
|
|
735
735
|
"custom_values.business_name",
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"name": "Visit Confirmed",
|
|
771
771
|
"subject": "Confirmed, {{contact.first_name}}: your visit details",
|
|
772
772
|
"templateRef": "email_template.appt_confirm_email",
|
|
773
|
-
"copyDirection": "On booking. Date/time via {{appointment.start_time}}, what to bring (ID, insurance card, list of questions),
|
|
773
|
+
"copyDirection": "On booking. Date/time via {{appointment.start_time}}, what to bring (ID, insurance card, list of questions), how to move it. Arrival time, forms or visit length only if the brief gives them. No clinical detail.",
|
|
774
774
|
"mergeTags": [
|
|
775
775
|
"contact.first_name",
|
|
776
776
|
"custom_values.business_name",
|
|
@@ -785,7 +785,7 @@
|
|
|
785
785
|
"name": "Visit Prep (day before)",
|
|
786
786
|
"subject": "Tomorrow: 3 things that make your visit better",
|
|
787
787
|
"templateRef": "email_template.appt_prep_email",
|
|
788
|
-
"copyDirection": "Day before. Three concrete prep items (list of what you have tried, your one question,
|
|
788
|
+
"copyDirection": "Day before. Three concrete prep items (list of what you have tried, your one question, insurance card if any), the time, how to reach us. No clinical advice.",
|
|
789
789
|
"mergeTags": [
|
|
790
790
|
"contact.first_name",
|
|
791
791
|
"appointment.start_time",
|
|
@@ -913,7 +913,7 @@
|
|
|
913
913
|
"ref": "sms.n_sms_1",
|
|
914
914
|
"name": "Nurture Text 1 - Insurance or Cash",
|
|
915
915
|
"templateRef": "sms_template.n_sms_1",
|
|
916
|
-
"copyDirection": "Day 3. One-word question that unblocks the visit: insurance or cash-pay, so
|
|
916
|
+
"copyDirection": "Day 3. One-word question that unblocks the visit: insurance or cash-pay, so cost questions can be answered first (no benefits check promised). STOP line.",
|
|
917
917
|
"mergeTags": [
|
|
918
918
|
"contact.first_name",
|
|
919
919
|
"custom_values.owner_first_name",
|
|
@@ -980,7 +980,7 @@
|
|
|
980
980
|
"ref": "sms.w_sms_2",
|
|
981
981
|
"name": "Win-back Text 2",
|
|
982
982
|
"templateRef": "sms_template.w_sms_2",
|
|
983
|
-
"copyDirection": "Win-back day 22. A
|
|
983
|
+
"copyDirection": "Win-back day 22. A YES ask to find a time. No availability claim unless the brief gives one.",
|
|
984
984
|
"mergeTags": [
|
|
985
985
|
"contact.first_name",
|
|
986
986
|
"custom_values.business_name"
|
|
@@ -991,7 +991,7 @@
|
|
|
991
991
|
"ref": "sms.appt_confirm_sms",
|
|
992
992
|
"name": "Visit Confirmed Text",
|
|
993
993
|
"templateRef": "sms_template.appt_confirm_sms",
|
|
994
|
-
"copyDirection": "On booking. Confirm date/time,
|
|
994
|
+
"copyDirection": "On booking. Confirm date/time, how to change it, STOP line.",
|
|
995
995
|
"mergeTags": [
|
|
996
996
|
"contact.first_name",
|
|
997
997
|
"custom_values.business_name",
|
|
@@ -1037,7 +1037,7 @@
|
|
|
1037
1037
|
"ref": "sms.ns_sms_2",
|
|
1038
1038
|
"name": "No-Show Text 2",
|
|
1039
1039
|
"templateRef": "sms_template.ns_sms_2",
|
|
1040
|
-
"copyDirection": "Next day.
|
|
1040
|
+
"copyDirection": "Next day. Offer to find another time; ask for a day. Never claim times were kept open.",
|
|
1041
1041
|
"mergeTags": [
|
|
1042
1042
|
"contact.first_name",
|
|
1043
1043
|
"custom_values.owner_first_name"
|