@elitedcs/ghl-mcp 3.88.3 → 3.89.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +262 -2
- package/README.md +8 -6
- package/dist/index.js +33142 -16120
- package/guide/guide.html +50 -13
- package/package.json +1 -1
- package/skills/blueprint/SKILL.md +1 -1
- package/skills/blueprint/examples/medspa-build-plan.json +4 -4
- package/skills/blueprint/examples/sample-build-plan.json +4 -4
- package/skills/blueprint/examples/validate-plan.cjs +15 -9
- package/skills/blueprint/presets/clinic.preset.json +73 -12
- package/skills/blueprint/presets/coach.preset.json +33 -5
- package/skills/blueprint/presets/ecommerce.preset.json +17 -5
- package/skills/blueprint/presets/generic-client.preset.json +32 -4
- package/skills/blueprint/presets/local-service.preset.json +33 -5
- package/skills/blueprint/presets/med-spa.preset.json +32 -5
- package/skills/blueprint/presets/wellness-clinic.md +55 -0
- package/skills/blueprint/presets/wellness-clinic.preset.json +3907 -0
- package/skills/blueprint/references/build-plan-schema.md +1 -1
- package/skills/blueprint/references/preset-format.md +5 -1
|
@@ -49,32 +49,39 @@
|
|
|
49
49
|
"default": [
|
|
50
50
|
{
|
|
51
51
|
"ref": "stage.new_lead",
|
|
52
|
+
"aliases": ["new lead", "new inquiry", "inquiry", "new", "lead", "prospect"],
|
|
52
53
|
"name": "New Lead"
|
|
53
54
|
},
|
|
54
55
|
{
|
|
55
56
|
"ref": "stage.contacted",
|
|
57
|
+
"aliases": ["contacted", "engaged", "in conversation", "qualified", "follow up", "working"],
|
|
56
58
|
"name": "Contacted"
|
|
57
59
|
},
|
|
58
60
|
{
|
|
59
61
|
"ref": "stage.consult_booked",
|
|
62
|
+
"aliases": ["consult booked", "consultation booked", "trial booked", "appointment booked", "booked", "scheduled", "=consultation"],
|
|
60
63
|
"name": "Consult Booked",
|
|
61
64
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
62
65
|
},
|
|
63
66
|
{
|
|
64
67
|
"ref": "stage.showed",
|
|
68
|
+
"aliases": ["showed", "trial showed", "consult completed", "attended", "consultation completed", "consultation done", "consultation attended", "consultation showed", "consultation complete", "consultation held"],
|
|
65
69
|
"name": "Showed",
|
|
66
70
|
"conditionalOn": "goal.bookingNeeded == true"
|
|
67
71
|
},
|
|
68
72
|
{
|
|
69
73
|
"ref": "stage.treated",
|
|
74
|
+
"aliases": ["treated", "package sold", "sold", "purchased"],
|
|
70
75
|
"name": "Treated"
|
|
71
76
|
},
|
|
72
77
|
{
|
|
73
78
|
"ref": "stage.member",
|
|
79
|
+
"aliases": ["member", "membership", "rebooked"],
|
|
74
80
|
"name": "Member / Rebooked"
|
|
75
81
|
},
|
|
76
82
|
{
|
|
77
83
|
"ref": "stage.lost",
|
|
84
|
+
"aliases": ["lost", "closed lost", "not interested"],
|
|
78
85
|
"name": "Lost"
|
|
79
86
|
}
|
|
80
87
|
]
|
|
@@ -262,7 +269,7 @@
|
|
|
262
269
|
{
|
|
263
270
|
"ref": "tag.service_done",
|
|
264
271
|
"name": "service-complete",
|
|
265
|
-
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it
|
|
272
|
+
"_note": "Added when the work is done and paid for. Starts Review Request; removed by it. Each contact is asked for a review once."
|
|
266
273
|
}
|
|
267
274
|
],
|
|
268
275
|
"_tagNote": "The skill derives interest-<x> tags from offer.summary at fill time (injectables / filler / facials / membership for a med spa) and mirrors them onto the Service Interest field options. Declared here so they are reviewable.",
|
|
@@ -506,7 +513,7 @@
|
|
|
506
513
|
{
|
|
507
514
|
"ref": "sms_template.n_sms_1",
|
|
508
515
|
"name": "Nurture Text 1 - One Word",
|
|
509
|
-
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough
|
|
516
|
+
"body": "{{contact.first_name}}, quick one from {{custom_values.owner_first_name}} at {{custom_values.business_name}}: is it lines, volume, or skin texture you'd most like to fix first? One word is enough.\nReply STOP to opt out."
|
|
510
517
|
},
|
|
511
518
|
{
|
|
512
519
|
"ref": "sms_template.n_sms_2",
|
|
@@ -531,7 +538,7 @@
|
|
|
531
538
|
{
|
|
532
539
|
"ref": "sms_template.w_sms_1",
|
|
533
540
|
"name": "Win-back Text 1",
|
|
534
|
-
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now
|
|
541
|
+
"body": "Hi {{contact.first_name}}, it's {{custom_values.owner_first_name}} at {{custom_values.business_name}}. Is your skin still on the list this season, or should I close your file for now?\nReply STOP to opt out."
|
|
535
542
|
},
|
|
536
543
|
{
|
|
537
544
|
"ref": "sms_template.w_sms_2",
|
|
@@ -1052,6 +1059,7 @@
|
|
|
1052
1059
|
"workflows": [
|
|
1053
1060
|
{
|
|
1054
1061
|
"ref": "workflow.speed_to_lead",
|
|
1062
|
+
"allowMultiple": false,
|
|
1055
1063
|
"name": "Speed to Lead",
|
|
1056
1064
|
"trigger": {
|
|
1057
1065
|
"type": "form_submission",
|
|
@@ -1137,6 +1145,7 @@
|
|
|
1137
1145
|
},
|
|
1138
1146
|
{
|
|
1139
1147
|
"ref": "workflow.missed_call",
|
|
1148
|
+
"allowMultiple": true,
|
|
1140
1149
|
"name": "Missed Call Text-Back",
|
|
1141
1150
|
"conditionalOn": "channels.sms == true",
|
|
1142
1151
|
"trigger": {
|
|
@@ -1191,13 +1200,14 @@
|
|
|
1191
1200
|
},
|
|
1192
1201
|
{
|
|
1193
1202
|
"ref": "workflow.lead_nurture",
|
|
1203
|
+
"allowMultiple": false,
|
|
1194
1204
|
"name": "Lead Nurture (30 days)",
|
|
1195
1205
|
"trigger": {
|
|
1196
1206
|
"type": "contact_tag",
|
|
1197
1207
|
"tagRef": "tag.nurture_start"
|
|
1198
1208
|
},
|
|
1199
1209
|
"stopOnResponse": true,
|
|
1200
|
-
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first
|
|
1210
|
+
"_design": "Starts from the Speed to Lead hand-off tag. 11 touches (6 emails + 5 texts) across 31 days of waits: give, give, ask. Removes its own trigger tag first; each contact goes through it once (re-entry off). Ends by tagging lapsed and handing off to Win-back. Any reply stops it (stopOnResponse) and Replied - Stop & Route takes over.",
|
|
1201
1211
|
"actions": [
|
|
1202
1212
|
{
|
|
1203
1213
|
"type": "remove_contact_tag",
|
|
@@ -1332,6 +1342,7 @@
|
|
|
1332
1342
|
},
|
|
1333
1343
|
{
|
|
1334
1344
|
"ref": "workflow.reply_route",
|
|
1345
|
+
"allowMultiple": true,
|
|
1335
1346
|
"name": "Replied - Stop & Route",
|
|
1336
1347
|
"trigger": {
|
|
1337
1348
|
"type": "customer_reply"
|
|
@@ -1386,6 +1397,7 @@
|
|
|
1386
1397
|
},
|
|
1387
1398
|
{
|
|
1388
1399
|
"ref": "workflow.win_back",
|
|
1400
|
+
"allowMultiple": false,
|
|
1389
1401
|
"name": "Win-back (30 days)",
|
|
1390
1402
|
"trigger": {
|
|
1391
1403
|
"type": "contact_tag",
|
|
@@ -1457,6 +1469,7 @@
|
|
|
1457
1469
|
},
|
|
1458
1470
|
{
|
|
1459
1471
|
"ref": "workflow.appointment_booked",
|
|
1472
|
+
"allowMultiple": true,
|
|
1460
1473
|
"name": "Consult Booked - Confirm & Move",
|
|
1461
1474
|
"trigger": {
|
|
1462
1475
|
"type": "appointment",
|
|
@@ -1478,6 +1491,15 @@
|
|
|
1478
1491
|
"type": "remove_from_workflow",
|
|
1479
1492
|
"workflowRef": "workflow.win_back"
|
|
1480
1493
|
},
|
|
1494
|
+
{
|
|
1495
|
+
"type": "remove_from_workflow",
|
|
1496
|
+
"workflowRef": "workflow.no_show"
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"type": "remove_from_workflow",
|
|
1500
|
+
"workflowRef": "workflow.missed_call",
|
|
1501
|
+
"conditionalOn": "channels.sms == true"
|
|
1502
|
+
},
|
|
1481
1503
|
{
|
|
1482
1504
|
"type": "add_contact_tag",
|
|
1483
1505
|
"tagRef": "tag.lc_booked"
|
|
@@ -1521,6 +1543,7 @@
|
|
|
1521
1543
|
},
|
|
1522
1544
|
{
|
|
1523
1545
|
"ref": "workflow.appointment_reminders",
|
|
1546
|
+
"allowMultiple": true,
|
|
1524
1547
|
"name": "Consult Reminders",
|
|
1525
1548
|
"trigger": {
|
|
1526
1549
|
"type": "appointment",
|
|
@@ -1559,6 +1582,8 @@
|
|
|
1559
1582
|
},
|
|
1560
1583
|
{
|
|
1561
1584
|
"ref": "workflow.no_show",
|
|
1585
|
+
"allowMultiple": true,
|
|
1586
|
+
"stagePreference": { "stage.contacted": ["no show", "noshow", "missed appointment", "did not show"] },
|
|
1562
1587
|
"name": "No-Show Rescue",
|
|
1563
1588
|
"trigger": {
|
|
1564
1589
|
"type": "appointment",
|
|
@@ -1647,6 +1672,7 @@
|
|
|
1647
1672
|
},
|
|
1648
1673
|
{
|
|
1649
1674
|
"ref": "workflow.quote_follow_up",
|
|
1675
|
+
"allowMultiple": true,
|
|
1650
1676
|
"name": "Quote Follow-up",
|
|
1651
1677
|
"trigger": {
|
|
1652
1678
|
"type": "contact_tag",
|
|
@@ -1708,6 +1734,7 @@
|
|
|
1708
1734
|
},
|
|
1709
1735
|
{
|
|
1710
1736
|
"ref": "workflow.review_request",
|
|
1737
|
+
"allowMultiple": false,
|
|
1711
1738
|
"name": "Review Request",
|
|
1712
1739
|
"trigger": {
|
|
1713
1740
|
"type": "contact_tag",
|
|
@@ -1753,7 +1780,7 @@
|
|
|
1753
1780
|
"owner": "OPERATOR-UI",
|
|
1754
1781
|
"title": "Add the people who get lead alerts and call tasks",
|
|
1755
1782
|
"trigger": "the brief listed no staff",
|
|
1756
|
-
"instruction": "In the sub-account go to Settings
|
|
1783
|
+
"instruction": "In the sub-account go to Settings → My Staff (called Users in newer accounts) → + Add User and add at least one person (yourself is fine): enter their name and the same email address listed in the intake. Every \"alert a real person\" and \"call task\" step in the workflows is already built and waiting; the moment a user exists, open each workflow and pick them in the Notify and Task steps (or re-run the build with useSavedPlan:true so the pending steps are re-pointed).",
|
|
1757
1784
|
"produces": null,
|
|
1758
1785
|
"successCheck": "At least one user exists and no workflow step still shows \"user pending\"",
|
|
1759
1786
|
"blocks": [
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Preset: Wellness Clinic
|
|
2
|
+
|
|
3
|
+
**File:** `wellness-clinic.preset.json` · **id:** `wellness_clinic` · **version:** 1.0.0 · **default:** no
|
|
4
|
+
**Source:** built 2026-09-29 from live wellness trial accounts (a red-light trial clinic's published workflows, pipeline, calendar, products and custom values, read-only, plus two sister accounts running the same paid-trial-with-deposit offer) and the agency's own texting lessons. The messages follow the patterns that work in those accounts (who is texting and why, a clear YES / N ask, the deposit framing, the 72-hour close) in new wording: no message here copies the live text. Every template carries a `_source` note: `PATTERN:` (the live pattern it follows, described, never quoted) or `[NO REAL SOURCE: proposed]`.
|
|
5
|
+
|
|
6
|
+
## When it is selected
|
|
7
|
+
The cockpit industry **Wellness clinic** (`wellness-clinic`), the business types Wellness clinic, Red light therapy, Body contouring, IV therapy, IV hydration, Peptide clinic, Longevity clinic and Recovery studio, and the aliases `wellness`, `wellness_clinic`, `red_light`, `rlt`, `body_contouring`, `iv_therapy`, `peptides`. It never takes `cll` / `dbr` / `launch_event`: time-boxed launch events stay in the launch-event preset.
|
|
8
|
+
|
|
9
|
+
## What it builds
|
|
10
|
+
- **1 pipeline, 10 stages:** New Lead, Replied / Engaged, Booking Link Sent, Trial Booked, Trial Completed, Program Sold, No Program Yet - Follow Up, No Show, Not Interested, Lost / DND. A client's own stage list replaces it; every automation is mapped onto the client's stages (the follow-up workflow carries a `stagePreference` so a "No sale" stage is used).
|
|
11
|
+
- **13 custom fields:** lead source, service interest, body focus areas, goal timeline, screening confirmed, results vary understood, program recommended (names only, no prices), visit outcome, payment method (no text-to-pay), program value, appointment date, and the two SMS consent boxes (transactional and marketing, separate, unchecked).
|
|
12
|
+
- **36 tags, 17 custom values** (trial name, price, deposit, balance, balance link, address, programs; spots left and capacity only with the `launch_event` flag).
|
|
13
|
+
- **Trial calendar:** the calendar answer's length, else the intake's visit length, else 90 minutes; 24 hours' minimum notice, 1 per slot, the daily cap from the intake, and the clinic's screening text as its description. The deposit is a calendar payment product set in the UI (`handoff.deposit_product`). An optional 30-minute Program Consult calendar is built only when `goal.programConsult` is true.
|
|
14
|
+
- **Trial Request form:** name, email, optional phone, service interest, body focus, two consent boxes.
|
|
15
|
+
- **13 emails, 50 texts, 19 workflows.** A trial price of 0 or Free uses free-trial wording with no price, deposit or balance. A deposit or balance of 0, none or blank counts as none: the deposit-free texts and emails go instead, and the balance workflows, tags and hand-offs are not built. Scarcity or exclusivity wording ("a set number of trial visits a week", "fill up most weeks", "a small number of spots", "before anyone else") is said only when the intake answers Yes to "Do trial spots really run out most weeks?". A No or a blank answer gets the plain version of each of those texts, including the first win-back text. The day-before reminder already asks the client to come 10 minutes early, so the intake's prep question asks only for anything besides that.
|
|
16
|
+
|
|
17
|
+
## Workflows
|
|
18
|
+
|
|
19
|
+
| Workflow | Feature | Trigger | Pattern from |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| Speed to Lead | speed_to_lead | form_submission | ad-lead text + link follow-up |
|
|
22
|
+
| Missed Call Text-Back | missed_call | call_status (missed, inbound) | proposed |
|
|
23
|
+
| Lead Nurture (30 days) | nurture | contact_tag nurture-start | 9-text drip + proposed FAQ texts and emails |
|
|
24
|
+
| Win-back (30 days) | winback | contact_tag winback-start | reactivation drip, led by its best first text |
|
|
25
|
+
| Trial Booked - Confirm & Move | booking | appointment confirmed | booking confirmation |
|
|
26
|
+
| Trial Reminders | booking | appointment confirmed | appointment reminders |
|
|
27
|
+
| Trial Completed - Balance | booking | appointment showed (only with a balance) | balance on arrival |
|
|
28
|
+
| Trial Completed - Outcome | booking | appointment showed | visit showed |
|
|
29
|
+
| Trial Balance Paid | booking | payment_received (only with a balance; held DRAFT until scoped) | balance paid |
|
|
30
|
+
| Trial Canceled | booking | appointment cancelled | cancellation |
|
|
31
|
+
| No-Show Rescue | booking | appointment noshow | no-show text + proposed rescue |
|
|
32
|
+
| Reply BOOK - Send Booking Link | booking | exact reply BOOK | BOOK keyword |
|
|
33
|
+
| Program Follow-up (72 hours) | quote_followup | stage No Program Yet | 72-hour close |
|
|
34
|
+
| Review Request | review_requests | contact_tag service-complete | proposed |
|
|
35
|
+
| Replied - Stop & Route | foundation | any reply | any reply |
|
|
36
|
+
| Replied N - Not Interested | foundation | exact reply N list | soft opt-out |
|
|
37
|
+
| Replied STOP - Opt Out | foundation | exact reply STOP list | hard opt-out |
|
|
38
|
+
| Replied TEAM - Human Help | foundation | exact reply TEAM list | TEAM keyword |
|
|
39
|
+
| Program Sold - Confirm | foundation | stage Program Sold | program sale |
|
|
40
|
+
|
|
41
|
+
## The rules this preset keeps
|
|
42
|
+
- **Claims:** no outcome claim in the preset copy, never pain, inflammation, sleep, weight-loss or fat-loss. The live drip's health-claim text and its named testimonial are not carried. A client quote is never put into a message by the build, even with written permission: a consented quote is shown on the claims review hand-off for a person to read and add by hand.
|
|
43
|
+
- **GSM-7:** no em dashes, en dashes or curly quotes in any text; intake answers filled into texts are straightened too (`conventions.gsm7`).
|
|
44
|
+
- **Opt-out:** every marketing text carries its own line starting "Reply N"; the first text of a sequence puts N on its own line.
|
|
45
|
+
- **Keywords:** N, STOP, TEAM and BOOK are exact-match lists (the live account's own), never "contains".
|
|
46
|
+
- **Links:** booking links only through `{{custom_values.booking_link}}`, on a domain at least 30 days old (`handoff.link_domain`).
|
|
47
|
+
- **No text-to-pay for programs:** the only payment link any text carries is the trial balance.
|
|
48
|
+
- **Hand-offs are tags,** never `add_to_workflow`. A booking removes the lead from Speed to Lead, Lead Nurture, Win-back and No-Show Rescue (med-spa's shape), and Program Sold removes the 72-hour follow-up.
|
|
49
|
+
- **N and STOP never move a card.** N (exact: N, No thanks, Not interested; never a bare "No") tags and notes; STOP tags and turns on Do Not Disturb.
|
|
50
|
+
- **A consented client quote goes to a person, never straight into a text.** The claims review hand-off carries it, with anything obvious (a result or health claim, a name) already flagged.
|
|
51
|
+
|
|
52
|
+
## Known limits
|
|
53
|
+
- The Trial Balance Paid workflow cannot be limited to the balance product by the build; it stays DRAFT behind `handoff.balance_trigger`.
|
|
54
|
+
- The build cannot limit a card move to cards still before booking, so N and STOP leave the card where it is; the note asks staff to move a pre-booking card.
|
|
55
|
+
- Hand-off and task wording names the preset's stages (Program Sold, No Program Yet); on a client's own stage list the composer's mapping notes say which of their stages those are.
|