@elitedcs/ghl-mcp 3.96.0 → 3.97.1
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 +64 -0
- package/README.md +1 -1
- package/dist/brain-function.js +2 -2
- package/dist/index.js +84130 -81630
- package/guide/guide.html +27 -3
- package/package.json +1 -1
- package/skills/blueprint/examples/sample-build-plan.json +1 -1
- package/skills/blueprint/examples/validate-plan.cjs +2 -1
- package/skills/blueprint/presets/clinic.preset.json +91 -39
- package/skills/blueprint/presets/coach.preset.json +90 -38
- package/skills/blueprint/presets/ecommerce.preset.json +78 -31
- package/skills/blueprint/presets/generic-client.preset.json +94 -41
- package/skills/blueprint/presets/local-service.md +1 -1
- package/skills/blueprint/presets/local-service.preset.json +107 -55
- package/skills/blueprint/presets/med-spa.md +1 -1
- package/skills/blueprint/presets/med-spa.preset.json +89 -37
- package/skills/blueprint/presets/wellness-clinic.md +2 -2
- package/skills/blueprint/presets/wellness-clinic.preset.json +98 -46
- package/skills/blueprint/references/copy-guide.md +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"presetVersion": "2.1.0",
|
|
4
4
|
"schemaVersion": "0.1",
|
|
5
5
|
"title": "Generic Client",
|
|
6
|
-
"description": "The neutral lead-to-customer fallback build at v2 depth (agency, \"other\", and any unmatched type; clinic / coach / ecommerce / local service now have their own presets). Sales pipeline, core fields, tag system, booking calendar, intake form
|
|
6
|
+
"description": "The neutral lead-to-customer fallback build at v2 depth (agency, \"other\", and any unmatched type; clinic / coach / ecommerce / local service now have their own presets). Sales pipeline, core fields, tag system, booking calendar, intake form, 15 email + 17 SMS send-ready templates, and 10 workflows: Speed to Lead (15 actions, 5 touches in 24 h, then a hand-off), Missed Call Text-Back, Lead Nurture (31 days, 11 touches), Replied - Stop & Route, Win-back (31 days, 5 touches), Appointment Booked - Confirm & Move, Appointment Reminders, No-Show Rescue. Industry-neutral copy that still reads like a person wrote it; the build stage rewrites every template from the brief, plus Quote Follow-up and Review Request (v2.1.0).",
|
|
7
7
|
"default": false,
|
|
8
8
|
"selectors": {
|
|
9
9
|
"businessTypes": [
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"ref": "stage.proposal_sent",
|
|
68
|
+
"feature": "quote_followup",
|
|
68
69
|
"aliases": ["proposal sent", "quote sent", "estimate sent", "proposal", "quote"],
|
|
69
70
|
"name": "Proposal / Quote Sent"
|
|
70
71
|
},
|
|
@@ -365,37 +366,37 @@
|
|
|
365
366
|
"ref": "email_template.stl_email_1",
|
|
366
367
|
"name": "Speed to Lead - Instant Email",
|
|
367
368
|
"subject": "Got it, {{contact.first_name}}. Here's what happens next",
|
|
368
|
-
"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;\">Thanks for reaching out to {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}
|
|
369
|
+
"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;\">Thanks for reaching out to {{custom_values.business_name}}. I'm {{custom_values.owner_first_name}}.</p><p style=\"margin:0 0 14px;\">Here's what happens next: reply with one line about what you're trying to sort out, and I'll tell you straight whether we're the right fit, and what it would take.</p><p style=\"margin:0 0 14px;\">If you'd rather just talk, grab {{offer.leadMagnet || a quick call}}:</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 a time that suits me</a></p><p style=\"margin:0 0 14px;\">No pitch, no pressure. You'll leave the call knowing exactly what your options are.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
369
370
|
},
|
|
370
371
|
{
|
|
371
372
|
"ref": "email_template.stl_email_2",
|
|
372
373
|
"name": "Speed to Lead - 3 Hour Email",
|
|
373
374
|
"subject": "The three questions we ask first",
|
|
374
|
-
"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;\">Before anyone at {{custom_values.business_name}} recommends anything, we ask three questions:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What does \"fixed\" look like to you, in one sentence?</li><li style=\"margin:0 0 6px;\">What have you already tried, and what happened?</li><li style=\"margin:0 0 6px;\">What's the cost of leaving it as it is for another six months?</li></ul><p style=\"margin:0 0 14px;\">Your answers decide what we'd suggest and what we'd tell you not to bother with. That's the whole point of the first conversation.</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 the conversation</a></p><p style=\"margin:0 0 14px;\">Or reply to this email with your answer to the first question
|
|
375
|
+
"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;\">Before anyone at {{custom_values.business_name}} recommends anything, we ask three questions:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">What does \"fixed\" look like to you, in one sentence?</li><li style=\"margin:0 0 6px;\">What have you already tried, and what happened?</li><li style=\"margin:0 0 6px;\">What's the cost of leaving it as it is for another six months?</li></ul><p style=\"margin:0 0 14px;\">Your answers decide what we'd suggest and what we'd tell you not to bother with. That's the whole point of the first conversation.</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 the conversation</a></p><p style=\"margin:0 0 14px;\">Or reply to this email with your answer to the first question.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
375
376
|
},
|
|
376
377
|
{
|
|
377
378
|
"ref": "email_template.n_email_1",
|
|
378
379
|
"name": "Nurture 1 - The Mistake Most People Make",
|
|
379
380
|
"subject": "The mistake most people make with {{audience.painPoints[0] || the problem you reached out about}}",
|
|
380
|
-
"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;\">
|
|
381
|
+
"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 common mistake with {{audience.painPoints[0] || the problem you reached out about}}: they've waited until it was urgent, then picked whoever answered the phone first.</p><p style=\"margin:0 0 14px;\">Urgent decisions are expensive decisions. The better first move is boring: get the problem described properly, get two or three options with real prices, and pick the one that solves the actual problem instead of the loudest symptom.</p><p style=\"margin:0 0 14px;\">That's what our first conversation is for. It's short, and you can take what you learn anywhere you like.</p><p style=\"margin:0 0 14px;\">When you're ready: <a href=\"{{custom_values.booking_link}}\" style=\"color:#1a56db;text-decoration:underline;\">pick a time</a>.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
381
382
|
},
|
|
382
383
|
{
|
|
383
384
|
"ref": "email_template.n_email_2",
|
|
384
385
|
"name": "Nurture 2 - How Working With Us Goes",
|
|
385
386
|
"subject": "How working with us actually goes",
|
|
386
|
-
"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 hesitate because they don't know what happens after they say yes. So here it is:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Step 1: a short conversation. You describe the problem; we ask the three questions; you get honest options.</li><li style=\"margin:0 0 6px;\">Step 2:
|
|
387
|
+
"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 hesitate because they don't know what happens after they say yes. So here it is:</p><ul style=\"margin:0 0 14px 20px;padding:0;\"><li style=\"margin:0 0 6px;\">Step 1: a short conversation. You describe the problem; we ask the three questions; you get honest options.</li><li style=\"margin:0 0 6px;\">Step 2: clear options. Ask what each one includes, what it costs, and what to expect by when. You take your time.</li><li style=\"margin:0 0 6px;\">Step 3: we do the work you chose.</li></ul><p style=\"margin:0 0 14px;\">The objection we hear most is {{audience.objections[0] || cost}}. That's why step 2 is about options, so you choose, not us.</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;\">Start with step 1</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
387
388
|
},
|
|
388
389
|
{
|
|
389
390
|
"ref": "email_template.n_email_3",
|
|
390
391
|
"name": "Nurture 3 - Why We Do It This Way",
|
|
391
392
|
"subject": "Why we do it this way",
|
|
392
|
-
"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 best thing a client can say about {{custom_values.business_name}} is \"there were no surprises.\" Not the most exciting compliment
|
|
393
|
+
"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 best thing a client can say about {{custom_values.business_name}} is \"there were no surprises.\" Not the most exciting compliment, but a good one to aim for.</p><p style=\"margin:0 0 14px;\">If that matters to you, ask us how we keep you in the loop.</p><p style=\"margin:0 0 14px;\">If you want to see what that looks like for your situation, that's what the first conversation is for.</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 my options</a></p><p style=\"margin:0 0 14px;\">Have a question first? Reply to this email. I'll answer it.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
393
394
|
},
|
|
394
395
|
{
|
|
395
396
|
"ref": "email_template.n_email_4",
|
|
396
397
|
"name": "Nurture 4 - About the Cost",
|
|
397
398
|
"subject": "About the cost",
|
|
398
|
-
"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;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">{{offer.summary ||
|
|
399
|
+
"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;\">Let's talk about the thing most people are too polite to ask: what does it cost?</p><p style=\"margin:0 0 14px;\">The price of {{offer.summary || what we do}} depends on what you need, and you choose what that is. Before anything starts, ask us what each option costs.</p><p style=\"margin:0 0 14px;\">One honest warning: the cheapest price is rarely the best value. If a price looks too good, ask what has been left out. Ask us what is in ours and we will tell you.</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;\">Talk through the options</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
399
400
|
},
|
|
400
401
|
{
|
|
401
402
|
"ref": "email_template.n_email_5",
|
|
@@ -407,31 +408,31 @@
|
|
|
407
408
|
"ref": "email_template.n_email_6",
|
|
408
409
|
"name": "Nurture 6 - Everything in One Place",
|
|
409
410
|
"subject": "Everything you need to decide, in one place",
|
|
410
|
-
"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 quick call}} with {{custom_values.business_name}}, and
|
|
411
|
+
"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 quick call}} with {{custom_values.business_name}}, and clear options to think over.</li><li style=\"margin:0 0 6px;\">Where: {{business.location || to be agreed when we talk}}.</li><li style=\"margin:0 0 6px;\">Cost: ask us what each option costs before anything starts.</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 the conversation</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
411
412
|
},
|
|
412
413
|
{
|
|
413
414
|
"ref": "email_template.w_email_1",
|
|
414
415
|
"name": "Win-back 1 - One Question",
|
|
415
416
|
"subject": "One question, {{contact.first_name}}",
|
|
416
|
-
"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 reached out to {{custom_values.business_name}} about {{audience.painPoints[0] || the problem you reached out about}}, and then things went quiet. That's normal; it's what happens when something isn't urgent yet.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, price, trust, or something we said?</p><p style=\"margin:0 0 14px;\">Reply with a word or two. If it's something we can fix,
|
|
417
|
+
"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 reached out to {{custom_values.business_name}} about {{audience.painPoints[0] || the problem you reached out about}}, and then things went quiet. That's normal; it's what happens when something isn't urgent yet.</p><p style=\"margin:0 0 14px;\">One question, and an honest answer is all I need: what stopped you? Timing, price, trust, 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>"
|
|
417
418
|
},
|
|
418
419
|
{
|
|
419
420
|
"ref": "email_template.w_email_2",
|
|
420
421
|
"name": "Win-back 2 - What Changed",
|
|
421
|
-
"subject": "
|
|
422
|
-
"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;\">
|
|
422
|
+
"subject": "When the timing is right",
|
|
423
|
+
"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}}. If the timing was wrong then, the calendar is open now, and you can start with one short conversation.</p><p style=\"margin:0 0 14px;\">That conversation ends with options you take away, not a decision on the spot.</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>"
|
|
423
424
|
},
|
|
424
425
|
{
|
|
425
426
|
"ref": "email_template.w_email_3",
|
|
426
427
|
"name": "Win-back 3 - The Door Stays Open",
|
|
427
428
|
"subject": "The door stays open",
|
|
428
|
-
"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;\">This is the last automatic email you'll get from me. I'd rather you hear from a person when the time is right than from a sequence.</p><p style=\"margin:0 0 14px;\">Your first conversation doesn't expire. When you're ready, the link below works, and so does replying to this email.</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 when you're ready</a></p><p style=\"margin:0 0 14px;\">Thanks for considering us. And whatever you do about {{audience.painPoints[0] || the problem you reached out about}},
|
|
429
|
+
"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;\">This is the last automatic email you'll get from me. I'd rather you hear from a person when the time is right than from a sequence.</p><p style=\"margin:0 0 14px;\">Your first conversation doesn't expire. When you're ready, the link below works, and so does replying to this email.</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 when you're ready</a></p><p style=\"margin:0 0 14px;\">Thanks for considering us. And whatever you do about {{audience.painPoints[0] || the problem you reached out about}}, ask what is included before you start.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
429
430
|
},
|
|
430
431
|
{
|
|
431
432
|
"ref": "email_template.appt_confirm_email",
|
|
432
433
|
"name": "Appointment Confirmed",
|
|
433
434
|
"subject": "Confirmed, {{contact.first_name}}: your appointment details",
|
|
434
|
-
"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 appointment with {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><p style=\"margin:0 0 14px;\">What to have ready: a one-line description of the problem and anything you've already tried. That's it.</p><p style=\"margin:0 0 14px;\">What you'll leave with: honest options and
|
|
435
|
+
"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 appointment with {{custom_values.business_name}} is confirmed for {{appointment.start_time}}.</p><p style=\"margin:0 0 14px;\">What to have ready: a one-line description of the problem and anything you've already tried. That's it.</p><p style=\"margin:0 0 14px;\">What you'll leave with: honest options, and you can ask what each one costs.</p><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>"
|
|
435
436
|
},
|
|
436
437
|
{
|
|
437
438
|
"ref": "email_template.appt_prep_email",
|
|
@@ -455,7 +456,7 @@
|
|
|
455
456
|
"ref": "email_template.r_email_1",
|
|
456
457
|
"name": "Review Request - Email",
|
|
457
458
|
"subject": "A minute of your time, {{contact.first_name}}?",
|
|
458
|
-
"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 for choosing {{custom_values.business_name}}. I hope everything went the way you wanted; if it did not, reply to this and
|
|
459
|
+
"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 for choosing {{custom_values.business_name}}. I hope everything went the way you wanted; if it did not, reply to this and tell us.</p><p style=\"margin:0 0 14px;\">If it did, would you leave us a short Google review? A line or two about what we did and how it went is all it takes, and it is genuinely how the next person decides to call.</p><p style=\"margin:0 0 14px;\"><a href=\"{{custom_values.review_link}}\">Leave a review here</a></p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
459
460
|
},
|
|
460
461
|
{
|
|
461
462
|
"ref": "email_template.q_email_1",
|
|
@@ -467,7 +468,7 @@
|
|
|
467
468
|
"ref": "email_template.q_email_2",
|
|
468
469
|
"name": "Quote Follow-up - Email 2",
|
|
469
470
|
"subject": "Last note on the quote, {{contact.first_name}}",
|
|
470
|
-
"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;\">This is the last note from me on the quote for the work you asked about. I would rather ask once more than assume.</p><p style=\"margin:0 0 14px;\">If the timing is off, tell me when would suit and I will
|
|
471
|
+
"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;\">This is the last note from me on the quote for the work you asked about. I would rather ask once more than assume.</p><p style=\"margin:0 0 14px;\">If the timing is off, tell me when would suit and I will check in then. If it is a no, a one-word reply is welcome and I will stop here.</p><p style=\"margin:0 0 14px;\">Either way, thank you for considering {{custom_values.business_name}}.</p><p style=\"margin:0;\">{{custom_values.owner_first_name}}<br>{{custom_values.business_name}} · {{custom_values.business_phone}}</p></div>"
|
|
471
472
|
}
|
|
472
473
|
],
|
|
473
474
|
"sms": [
|
|
@@ -479,7 +480,7 @@
|
|
|
479
480
|
{
|
|
480
481
|
"ref": "sms_template.stl_sms_2",
|
|
481
482
|
"name": "Speed to Lead - 20 Minute Text",
|
|
482
|
-
"body": "{{contact.first_name}},
|
|
483
|
+
"body": "{{contact.first_name}}, Want me to hold a time for you? Mornings or afternoons? Or grab one here: {{custom_values.booking_link}}"
|
|
483
484
|
},
|
|
484
485
|
{
|
|
485
486
|
"ref": "sms_template.stl_sms_3",
|
|
@@ -509,12 +510,12 @@
|
|
|
509
510
|
{
|
|
510
511
|
"ref": "sms_template.n_sms_3",
|
|
511
512
|
"name": "Nurture Text 3 - Midpoint",
|
|
512
|
-
"body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about {{audience.painPoints[0] || the problem you reached out about}}?
|
|
513
|
+
"body": "{{contact.first_name}}, it's {{custom_values.owner_first_name}}. Still thinking about {{audience.painPoints[0] || the problem you reached out about}}? Want me to find you a time this week, or should I check back next month?"
|
|
513
514
|
},
|
|
514
515
|
{
|
|
515
516
|
"ref": "sms_template.n_sms_4",
|
|
516
517
|
"name": "Nurture Text 4 - Any Question",
|
|
517
|
-
"body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you ever get your question answered? If not, ask it here and I'll reply
|
|
518
|
+
"body": "Hi {{contact.first_name}}, {{custom_values.owner_first_name}} here. No pitch, just checking: did you ever get your question answered? If not, ask it here and I'll reply."
|
|
518
519
|
},
|
|
519
520
|
{
|
|
520
521
|
"ref": "sms_template.n_sms_5",
|
|
@@ -529,7 +530,7 @@
|
|
|
529
530
|
{
|
|
530
531
|
"ref": "sms_template.w_sms_2",
|
|
531
532
|
"name": "Win-back Text 2",
|
|
532
|
-
"body": "{{contact.first_name}},
|
|
533
|
+
"body": "{{contact.first_name}}, want a time for a quick conversation with {{custom_values.business_name}}? Reply YES and I'll find you one."
|
|
533
534
|
},
|
|
534
535
|
{
|
|
535
536
|
"ref": "sms_template.appt_confirm_sms",
|
|
@@ -554,7 +555,7 @@
|
|
|
554
555
|
{
|
|
555
556
|
"ref": "sms_template.ns_sms_2",
|
|
556
557
|
"name": "No-Show Text 2",
|
|
557
|
-
"body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here.
|
|
558
|
+
"body": "{{contact.first_name}}, {{custom_values.owner_first_name}} here. We'd be glad to find you another time. Want one? Reply with a day that works."
|
|
558
559
|
},
|
|
559
560
|
{
|
|
560
561
|
"ref": "sms_template.r_sms_1",
|
|
@@ -585,7 +586,7 @@
|
|
|
585
586
|
"name": "Speed to Lead - Instant Email",
|
|
586
587
|
"subject": "Got it, {{contact.first_name}}. Here's what happens next",
|
|
587
588
|
"templateRef": "email_template.stl_email_1",
|
|
588
|
-
"copyDirection": "Instant. Who I am, what they asked for,
|
|
589
|
+
"copyDirection": "Instant. Who I am, what they asked for, what happens next (a reply invitation; never promise a text, since texting may be off), the one-question ask, the booking CTA, the no-pressure promise. Tone: brief.voice.threeWords. If brief.voice.signatureLine exists, insert it verbatim as its own paragraph right after the greeting.",
|
|
589
590
|
"mergeTags": [
|
|
590
591
|
"contact.first_name",
|
|
591
592
|
"custom_values.business_name",
|
|
@@ -641,7 +642,7 @@
|
|
|
641
642
|
"name": "Nurture 3 - Why We Do It This Way",
|
|
642
643
|
"subject": "Why we do it this way",
|
|
643
644
|
"templateRef": "email_template.n_email_3",
|
|
644
|
-
"copyDirection": "Day 10. The method as proof:
|
|
645
|
+
"copyDirection": "Day 10. The method as proof: clear expectations, no surprises, updates unasked. Client results ONLY if the brief supplies them; otherwise the method is the proof. CTA + reply invite.",
|
|
645
646
|
"mergeTags": [
|
|
646
647
|
"contact.first_name",
|
|
647
648
|
"custom_values.business_name",
|
|
@@ -655,7 +656,7 @@
|
|
|
655
656
|
"name": "Nurture 4 - About the Cost",
|
|
656
657
|
"subject": "About the cost",
|
|
657
658
|
"templateRef": "email_template.n_email_4",
|
|
658
|
-
"copyDirection": "Day 14. Handle cost head-on: how pricing works (from offer.pricePoints if present),
|
|
659
|
+
"copyDirection": "Day 14. Handle cost head-on: how pricing works (from offer.pricePoints if present), an invitation to ask what each option costs (never a promise about the business's pricing practice), the cheapest price is rarely the best value. No numbers unless the brief has them. Never promise a written proposal or an invoice: the build makes neither.",
|
|
659
660
|
"mergeTags": [
|
|
660
661
|
"contact.first_name",
|
|
661
662
|
"custom_values.booking_link",
|
|
@@ -697,7 +698,7 @@
|
|
|
697
698
|
"name": "Win-back 1 - One Question",
|
|
698
699
|
"subject": "One question, {{contact.first_name}}",
|
|
699
700
|
"templateRef": "email_template.w_email_1",
|
|
700
|
-
"copyDirection": "Win-back day 0. Acknowledge the gap without guilt; ask what stopped them;
|
|
701
|
+
"copyDirection": "Win-back day 0. Acknowledge the gap without guilt; ask what stopped them; invite them to say what would help. A reply is the CTA.",
|
|
701
702
|
"mergeTags": [
|
|
702
703
|
"contact.first_name",
|
|
703
704
|
"custom_values.business_name",
|
|
@@ -708,9 +709,9 @@
|
|
|
708
709
|
{
|
|
709
710
|
"ref": "email.w_email_2",
|
|
710
711
|
"name": "Win-back 2 - What Changed",
|
|
711
|
-
"subject": "
|
|
712
|
+
"subject": "When the timing is right",
|
|
712
713
|
"templateRef": "email_template.w_email_2",
|
|
713
|
-
"copyDirection": "Win-back day 14.
|
|
714
|
+
"copyDirection": "Win-back day 14. An invitation back. Say something changed only when the brief says what (new availability, a new option, a seasonal fit); never invent one, and never call a first step free unless the brief does. One CTA.",
|
|
714
715
|
"mergeTags": [
|
|
715
716
|
"contact.first_name",
|
|
716
717
|
"custom_values.business_name",
|
|
@@ -795,7 +796,7 @@
|
|
|
795
796
|
"name": "Review Request - Email",
|
|
796
797
|
"subject": "A minute of your time, {{contact.first_name}}?",
|
|
797
798
|
"templateRef": "email_template.r_email_1",
|
|
798
|
-
"copyDirection": "Three days after the tag. Thank them, invite the complaint first (reply and
|
|
799
|
+
"copyDirection": "Three days after the tag. Thank them, invite the complaint first (reply and tell us; promise no fix), then the ask with the link. Tone: brief.voice.threeWords.",
|
|
799
800
|
"mergeTags": [
|
|
800
801
|
"contact.first_name",
|
|
801
802
|
"custom_values.business_name",
|
|
@@ -822,7 +823,7 @@
|
|
|
822
823
|
"name": "Quote Follow-up - Email 2",
|
|
823
824
|
"subject": "Last note on the quote, {{contact.first_name}}",
|
|
824
825
|
"templateRef": "email_template.q_email_2",
|
|
825
|
-
"copyDirection": "Day ten, the last one. Say it is the last, offer to
|
|
826
|
+
"copyDirection": "Day ten, the last one. Say it is the last, offer to check in at a better time (never offer to hold a price), make a no easy.",
|
|
826
827
|
"mergeTags": [
|
|
827
828
|
"contact.first_name",
|
|
828
829
|
"custom_values.business_name",
|
|
@@ -959,7 +960,7 @@
|
|
|
959
960
|
"ref": "sms.w_sms_2",
|
|
960
961
|
"name": "Win-back Text 2",
|
|
961
962
|
"templateRef": "sms_template.w_sms_2",
|
|
962
|
-
"copyDirection": "Win-back day 22. A
|
|
963
|
+
"copyDirection": "Win-back day 22. A YES ask to find a time. No availability claim unless the brief gives one.",
|
|
963
964
|
"mergeTags": [
|
|
964
965
|
"contact.first_name",
|
|
965
966
|
"custom_values.business_name"
|
|
@@ -1016,7 +1017,7 @@
|
|
|
1016
1017
|
"ref": "sms.ns_sms_2",
|
|
1017
1018
|
"name": "No-Show Text 2",
|
|
1018
1019
|
"templateRef": "sms_template.ns_sms_2",
|
|
1019
|
-
"copyDirection": "Next day.
|
|
1020
|
+
"copyDirection": "Next day. Offer to find another time; ask for a day. Never claim times were kept open.",
|
|
1020
1021
|
"mergeTags": [
|
|
1021
1022
|
"contact.first_name",
|
|
1022
1023
|
"custom_values.owner_first_name"
|
|
@@ -1174,13 +1175,17 @@
|
|
|
1174
1175
|
"callDirection": "inbound"
|
|
1175
1176
|
},
|
|
1176
1177
|
"stopOnResponse": true,
|
|
1177
|
-
"_design": "Fires on an inbound call that was not answered (no-answer / busy / voicemail). Texts back within seconds, tags the contact, alerts a real person and creates a call-back task,
|
|
1178
|
+
"_design": "Fires on an inbound call that was not answered (no-answer / busy / voicemail). Texts back within seconds, takes the missed-call tag off and puts it back on (so Missed Call - Pipeline Card starts on every missed call, W47), tags the contact, alerts a real person and creates a call-back task. W48 (2026-10-29): allowed to run again on every missed call; the closing 10-minute wait keeps the contact inside it, and GoHighLevel did not start it again for a contact still inside it (live call proof 2026-10-29), so a redial within 10 minutes gets no second text. The hour-later text is its own workflow, Missed Call - Follow-Up.",
|
|
1178
1179
|
"actions": [
|
|
1179
1180
|
{
|
|
1180
1181
|
"type": "send_sms",
|
|
1181
1182
|
"smsRef": "sms.mc_sms_1",
|
|
1182
1183
|
"conditionalOn": "channels.sms == true"
|
|
1183
1184
|
},
|
|
1185
|
+
{
|
|
1186
|
+
"type": "remove_contact_tag",
|
|
1187
|
+
"tagRef": "tag.missed_call"
|
|
1188
|
+
},
|
|
1184
1189
|
{
|
|
1185
1190
|
"type": "add_contact_tag",
|
|
1186
1191
|
"tagRef": "tag.missed_call"
|
|
@@ -1204,26 +1209,21 @@
|
|
|
1204
1209
|
},
|
|
1205
1210
|
{
|
|
1206
1211
|
"type": "wait",
|
|
1207
|
-
"value":
|
|
1208
|
-
"unit": "
|
|
1209
|
-
},
|
|
1210
|
-
{
|
|
1211
|
-
"type": "send_sms",
|
|
1212
|
-
"smsRef": "sms.mc_sms_2",
|
|
1213
|
-
"conditionalOn": "channels.sms == true"
|
|
1212
|
+
"value": 10,
|
|
1213
|
+
"unit": "minutes"
|
|
1214
1214
|
}
|
|
1215
1215
|
]
|
|
1216
1216
|
},
|
|
1217
1217
|
{
|
|
1218
1218
|
"ref": "workflow.missed_call_card",
|
|
1219
|
-
"allowMultiple":
|
|
1219
|
+
"allowMultiple": true,
|
|
1220
1220
|
"name": "Missed Call - Pipeline Card",
|
|
1221
1221
|
"conditionalOn": "channels.sms == true",
|
|
1222
1222
|
"trigger": {
|
|
1223
1223
|
"type": "contact_tag",
|
|
1224
1224
|
"tagRef": "tag.missed_call"
|
|
1225
1225
|
},
|
|
1226
|
-
"_design": "
|
|
1226
|
+
"_design": "W47 (2026-10-29 live call proof): started by the missed-call tag being added, and allowed to run again. The text-back takes the tag off and puts it straight back on every missed call, so the tag is newly added each time and a repeat caller is checked again (a contact who already had the tag, with re-entry off, never reached this workflow). A caller with no 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 in this pipeline keeps it and is tagged returning-caller. Not yet proven live: whether a closed (won or lost) card counts as found; Find Opportunity reads the latest card in the pipeline and the build sets no status filter. Started by the tag, not the call, because a shared account gates call-started workflows with an If/Else, and find_opportunity must be the last step and cannot sit inside one.",
|
|
1227
1227
|
"actions": [
|
|
1228
1228
|
{
|
|
1229
1229
|
"type": "find_opportunity",
|
|
@@ -1253,6 +1253,35 @@
|
|
|
1253
1253
|
}
|
|
1254
1254
|
]
|
|
1255
1255
|
},
|
|
1256
|
+
{
|
|
1257
|
+
"ref": "workflow.missed_call_follow_up",
|
|
1258
|
+
"allowMultiple": true,
|
|
1259
|
+
"name": "Missed Call - Follow-Up",
|
|
1260
|
+
"conditionalOn": "channels.sms == true",
|
|
1261
|
+
"trigger": {
|
|
1262
|
+
"type": "call_status",
|
|
1263
|
+
"callStatuses": [
|
|
1264
|
+
"no-answer",
|
|
1265
|
+
"busy",
|
|
1266
|
+
"voicemail"
|
|
1267
|
+
],
|
|
1268
|
+
"callDirection": "inbound"
|
|
1269
|
+
},
|
|
1270
|
+
"stopOnResponse": true,
|
|
1271
|
+
"_design": "W48 (2026-10-29): the hour-later text, split from the instant text-back so a second missed call inside the hour still gets an instant reply. Started by the same missed call; a redial while a contact is still waiting here gets no second follow-up. Stops the moment they reply.",
|
|
1272
|
+
"actions": [
|
|
1273
|
+
{
|
|
1274
|
+
"type": "wait",
|
|
1275
|
+
"value": 1,
|
|
1276
|
+
"unit": "hours"
|
|
1277
|
+
},
|
|
1278
|
+
{
|
|
1279
|
+
"type": "send_sms",
|
|
1280
|
+
"smsRef": "sms.mc_sms_2",
|
|
1281
|
+
"conditionalOn": "channels.sms == true"
|
|
1282
|
+
}
|
|
1283
|
+
]
|
|
1284
|
+
},
|
|
1256
1285
|
{
|
|
1257
1286
|
"ref": "workflow.lead_nurture",
|
|
1258
1287
|
"allowMultiple": false,
|
|
@@ -1414,6 +1443,11 @@
|
|
|
1414
1443
|
"workflowRef": "workflow.missed_call",
|
|
1415
1444
|
"conditionalOn": "channels.sms == true"
|
|
1416
1445
|
},
|
|
1446
|
+
{
|
|
1447
|
+
"type": "remove_from_workflow",
|
|
1448
|
+
"workflowRef": "workflow.missed_call_follow_up",
|
|
1449
|
+
"conditionalOn": "channels.sms == true"
|
|
1450
|
+
},
|
|
1417
1451
|
{
|
|
1418
1452
|
"type": "remove_from_workflow",
|
|
1419
1453
|
"workflowRef": "workflow.lead_nurture"
|
|
@@ -1555,6 +1589,11 @@
|
|
|
1555
1589
|
"workflowRef": "workflow.missed_call",
|
|
1556
1590
|
"conditionalOn": "channels.sms == true"
|
|
1557
1591
|
},
|
|
1592
|
+
{
|
|
1593
|
+
"type": "remove_from_workflow",
|
|
1594
|
+
"workflowRef": "workflow.missed_call_follow_up",
|
|
1595
|
+
"conditionalOn": "channels.sms == true"
|
|
1596
|
+
},
|
|
1558
1597
|
{
|
|
1559
1598
|
"type": "add_contact_tag",
|
|
1560
1599
|
"tagRef": "tag.lc_booked"
|
|
@@ -1888,6 +1927,7 @@
|
|
|
1888
1927
|
"blocks": [
|
|
1889
1928
|
"workflow.speed_to_lead",
|
|
1890
1929
|
"workflow.missed_call",
|
|
1930
|
+
"workflow.missed_call_follow_up",
|
|
1891
1931
|
"workflow.lead_nurture",
|
|
1892
1932
|
"workflow.win_back",
|
|
1893
1933
|
"workflow.appointment_booked",
|
|
@@ -1945,6 +1985,7 @@
|
|
|
1945
1985
|
"blocks": [
|
|
1946
1986
|
"workflow.speed_to_lead",
|
|
1947
1987
|
"workflow.missed_call",
|
|
1988
|
+
"workflow.missed_call_follow_up",
|
|
1948
1989
|
"workflow.lead_nurture",
|
|
1949
1990
|
"workflow.win_back",
|
|
1950
1991
|
"workflow.appointment_booked",
|
|
@@ -1976,13 +2017,25 @@
|
|
|
1976
2017
|
],
|
|
1977
2018
|
"_blocksNote": "Lists every SMS-bearing WORKFLOW ref (so they stay DRAFT) plus the sms.* asset refs. After conditional pruning, drop any entry whose workflow/asset was removed."
|
|
1978
2019
|
},
|
|
2020
|
+
{
|
|
2021
|
+
"ref": "handoff.stop_line_check",
|
|
2022
|
+
"conditionalOn": "channels.sms == true",
|
|
2023
|
+
"owner": "OPERATOR-UI",
|
|
2024
|
+
"title": "Check whether the account adds its own Reply STOP line",
|
|
2025
|
+
"trigger": "channels.sms == true",
|
|
2026
|
+
"instruction": "Your GoHighLevel account may already add its own 'Reply STOP' line to the first text each contact gets. If it does, a contact may see the opt-out line twice on that first text. That is safe. Remove the build's own line from a text only if you are sure the account's own line is switched on.",
|
|
2027
|
+
"produces": null,
|
|
2028
|
+
"successCheck": "You know whether the account adds its own Reply STOP line to first texts",
|
|
2029
|
+
"blocks": [],
|
|
2030
|
+
"_design": "W49 (command-center ruling 2026-10-30): a doubled opt-out line is cosmetic, a missing one is a compliance failure, so the build keeps its own STOP line and says so. No settings path is named because none has been seen on screen; the setting is to be checked live later."
|
|
2031
|
+
},
|
|
1979
2032
|
{
|
|
1980
2033
|
"ref": "handoff.stripe",
|
|
1981
2034
|
"conditionalOn": "flags includes stripe_not_connected",
|
|
1982
2035
|
"owner": "OPERATOR-EXT",
|
|
1983
2036
|
"title": "Connect Stripe (to take payment)",
|
|
1984
2037
|
"trigger": "channels.payment != 'Stripe connected'",
|
|
1985
|
-
"instruction": "Connect Stripe in Payments > Integrations and create your products / prices.
|
|
2038
|
+
"instruction": "Connect Stripe in Payments > Integrations and create your products / prices. Authorize the payment connection in GoHighLevel.",
|
|
1986
2039
|
"produces": null,
|
|
1987
2040
|
"successCheck": "Stripe shows connected and products exist",
|
|
1988
2041
|
"blocks": []
|
|
@@ -64,7 +64,7 @@ Every hand-off is `add_contact_tag` + a `contact_tag` trigger. Both halves are l
|
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
## Copy notes
|
|
67
|
-
Built for a lead who is comparing three quotes on their phone. The instant text asks the only question that matters first (is it urgent?), the second asks for a photo, and every email answers a comparison question: what
|
|
67
|
+
Built for a lead who is comparing three quotes on their phone. The instant text asks the only question that matters first (is it urgent?), the second asks for a photo, and every email answers a comparison question: what to ask any company before hiring, why the cheapest quote costs more, the three questions to ask any contractor, what a small problem turns into. Win-back is seasonal (maintenance before the season turns). No before/after claims unless the brief supplies real ones.
|
|
68
68
|
|
|
69
69
|
## v2.1.0 (2026-09-15)
|
|
70
70
|
|