@elitedcs/ghl-mcp 3.93.1 → 3.94.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +15 -10
- package/dist/index.js +563 -66
- package/guide/guide.html +3 -8
- package/package.json +1 -1
- package/skills/blueprint/examples/validate-plan.cjs +9 -0
- package/skills/blueprint/presets/clinic.preset.json +49 -5
- package/skills/blueprint/presets/coach.preset.json +48 -4
- package/skills/blueprint/presets/ecommerce.preset.json +46 -2
- package/skills/blueprint/presets/generic-client.preset.json +47 -3
- package/skills/blueprint/presets/local-service.preset.json +48 -4
- package/skills/blueprint/presets/med-spa.preset.json +48 -4
- package/skills/blueprint/presets/wellness-clinic.preset.json +122 -12
|
@@ -458,6 +458,11 @@
|
|
|
458
458
|
"name": "missed-call",
|
|
459
459
|
"conditionalOn": "channels.sms == true"
|
|
460
460
|
},
|
|
461
|
+
{
|
|
462
|
+
"ref": "tag.returning_caller",
|
|
463
|
+
"name": "returning-caller",
|
|
464
|
+
"conditionalOn": "channels.sms == true"
|
|
465
|
+
},
|
|
461
466
|
{
|
|
462
467
|
"ref": "tag.service_done",
|
|
463
468
|
"name": "service-complete"
|
|
@@ -2380,6 +2385,45 @@
|
|
|
2380
2385
|
}
|
|
2381
2386
|
]
|
|
2382
2387
|
},
|
|
2388
|
+
{
|
|
2389
|
+
"ref": "workflow.missed_call_card",
|
|
2390
|
+
"allowMultiple": false,
|
|
2391
|
+
"name": "Missed Call - Pipeline Card",
|
|
2392
|
+
"conditionalOn": "channels.sms == true",
|
|
2393
|
+
"trigger": {
|
|
2394
|
+
"type": "contact_tag",
|
|
2395
|
+
"tagRef": "tag.missed_call"
|
|
2396
|
+
},
|
|
2397
|
+
"_design": "F6 (2026-10-29): a caller Missed Call Text-Back tagged missed-call, with no open card in this pipeline, gets one at the first stage, an owner and the new-lead tag, as a form lead does in Speed to Lead. A caller who already has a card keeps it. Its own workflow because find_opportunity must be the last step and cannot sit inside a shared account's If/Else gate.",
|
|
2398
|
+
"actions": [
|
|
2399
|
+
{
|
|
2400
|
+
"type": "find_opportunity",
|
|
2401
|
+
"pipelineRef": "pipeline.patient_journey",
|
|
2402
|
+
"found": [
|
|
2403
|
+
{
|
|
2404
|
+
"type": "add_contact_tag",
|
|
2405
|
+
"tagRef": "tag.returning_caller"
|
|
2406
|
+
}
|
|
2407
|
+
],
|
|
2408
|
+
"notFound": [
|
|
2409
|
+
{
|
|
2410
|
+
"type": "add_contact_tag",
|
|
2411
|
+
"tagRef": "tag.lc_new_lead"
|
|
2412
|
+
},
|
|
2413
|
+
{
|
|
2414
|
+
"type": "create_opportunity",
|
|
2415
|
+
"pipelineRef": "pipeline.patient_journey",
|
|
2416
|
+
"stageRef": "stage.new_lead",
|
|
2417
|
+
"name": "{{contact.name}} - Missed Call"
|
|
2418
|
+
},
|
|
2419
|
+
{
|
|
2420
|
+
"type": "assign_user",
|
|
2421
|
+
"userRef": "user.owner"
|
|
2422
|
+
}
|
|
2423
|
+
]
|
|
2424
|
+
}
|
|
2425
|
+
]
|
|
2426
|
+
},
|
|
2383
2427
|
{
|
|
2384
2428
|
"ref": "workflow.lead_nurture",
|
|
2385
2429
|
"allowMultiple": false,
|
|
@@ -3630,7 +3674,22 @@
|
|
|
3630
3674
|
"blocks": [
|
|
3631
3675
|
"cv.owner_first_name",
|
|
3632
3676
|
"cv.business_address"
|
|
3633
|
-
]
|
|
3677
|
+
],
|
|
3678
|
+
"conditionalOn": "channels.sms == true"
|
|
3679
|
+
},
|
|
3680
|
+
{
|
|
3681
|
+
"ref": "handoff.business_details",
|
|
3682
|
+
"owner": "OPERATOR-UI",
|
|
3683
|
+
"title": "Confirm your business phone, address and the name emails are signed with",
|
|
3684
|
+
"trigger": "always (1 minute)",
|
|
3685
|
+
"instruction": "Settings > Custom Values: set business_phone, business_address (the street address patients drive to; the trial confirmation email sends it) and owner_first_name (the first name every email is signed with).",
|
|
3686
|
+
"produces": "cv.owner_first_name",
|
|
3687
|
+
"successCheck": "business_phone, business_address and owner_first_name show real values, not blanks",
|
|
3688
|
+
"blocks": [
|
|
3689
|
+
"cv.owner_first_name",
|
|
3690
|
+
"cv.business_address"
|
|
3691
|
+
],
|
|
3692
|
+
"conditionalOn": "channels.sms != true"
|
|
3634
3693
|
},
|
|
3635
3694
|
{
|
|
3636
3695
|
"ref": "handoff.trial_offer",
|
|
@@ -3644,7 +3703,23 @@
|
|
|
3644
3703
|
"cv.trial_price",
|
|
3645
3704
|
"cv.deposit_amount",
|
|
3646
3705
|
"cv.balance_amount"
|
|
3647
|
-
]
|
|
3706
|
+
],
|
|
3707
|
+
"conditionalOn": "channels.sms == true"
|
|
3708
|
+
},
|
|
3709
|
+
{
|
|
3710
|
+
"ref": "handoff.trial_offer",
|
|
3711
|
+
"owner": "OPERATOR-UI",
|
|
3712
|
+
"title": "Check the trial price, deposit and balance",
|
|
3713
|
+
"trigger": "always (1 minute)",
|
|
3714
|
+
"instruction": "Settings > Custom Values: trial_price, deposit_amount and balance_amount are numbers without a dollar sign (the emails add it). The deposit plus the balance should equal the trial price. The build fills them from the intake when it can.",
|
|
3715
|
+
"produces": "cv.trial_price",
|
|
3716
|
+
"successCheck": "trial_price, deposit_amount and balance_amount are numbers and deposit + balance = trial price",
|
|
3717
|
+
"blocks": [
|
|
3718
|
+
"cv.trial_price",
|
|
3719
|
+
"cv.deposit_amount",
|
|
3720
|
+
"cv.balance_amount"
|
|
3721
|
+
],
|
|
3722
|
+
"conditionalOn": "channels.sms != true"
|
|
3648
3723
|
},
|
|
3649
3724
|
{
|
|
3650
3725
|
"ref": "handoff.calendar_oauth",
|
|
@@ -3671,7 +3746,7 @@
|
|
|
3671
3746
|
},
|
|
3672
3747
|
{
|
|
3673
3748
|
"ref": "handoff.link_domain",
|
|
3674
|
-
"conditionalOn": "goal.bookingNeeded == true",
|
|
3749
|
+
"conditionalOn": "goal.bookingNeeded == true && channels.sms == true",
|
|
3675
3750
|
"owner": "OPERATOR-UI",
|
|
3676
3751
|
"title": "Paste a booking link on a domain at least 30 days old",
|
|
3677
3752
|
"trigger": "always (2 minutes)",
|
|
@@ -3682,6 +3757,19 @@
|
|
|
3682
3757
|
"cv.booking_link"
|
|
3683
3758
|
]
|
|
3684
3759
|
},
|
|
3760
|
+
{
|
|
3761
|
+
"ref": "handoff.link_domain",
|
|
3762
|
+
"conditionalOn": "goal.bookingNeeded == true && channels.sms != true",
|
|
3763
|
+
"owner": "OPERATOR-UI",
|
|
3764
|
+
"title": "Paste the booking link",
|
|
3765
|
+
"trigger": "always (2 minutes)",
|
|
3766
|
+
"instruction": "Copy the Trial Session calendar's booking link and paste it into the booking_link custom value (Settings > Custom Values). The emails send it.",
|
|
3767
|
+
"produces": "cv.booking_link",
|
|
3768
|
+
"successCheck": "booking_link opens the booking page",
|
|
3769
|
+
"blocks": [
|
|
3770
|
+
"cv.booking_link"
|
|
3771
|
+
]
|
|
3772
|
+
},
|
|
3685
3773
|
{
|
|
3686
3774
|
"ref": "handoff.deposit_product",
|
|
3687
3775
|
"conditionalOn": "goal.bookingNeeded == true && offer.depositAmount is set && channels.payment != 'None'",
|
|
@@ -3723,9 +3811,9 @@
|
|
|
3723
3811
|
"owner": "TEAM",
|
|
3724
3812
|
"title": "Confirm your screening list matches everywhere",
|
|
3725
3813
|
"trigger": "always",
|
|
3726
|
-
"instruction": "Read the screening
|
|
3814
|
+
"instruction": "Read the screening wording on the Trial Session calendar. It must list the same conditions as your intake paperwork and anything a chat assistant tells people. Fix any difference before the first booking.",
|
|
3727
3815
|
"produces": null,
|
|
3728
|
-
"successCheck": "The calendar
|
|
3816
|
+
"successCheck": "The calendar's screening wording, the intake paperwork and any assistant list the same conditions"
|
|
3729
3817
|
},
|
|
3730
3818
|
{
|
|
3731
3819
|
"ref": "handoff.claims_review",
|
|
@@ -3734,7 +3822,18 @@
|
|
|
3734
3822
|
"trigger": "always",
|
|
3735
3823
|
"instruction": "The texts make no result claims unless you add them. If you add one, it must be a number you can source, followed by 'results vary', and never about pain, inflammation, sleep, weight or fat loss. A client quote is used only with that client's written consent and never with their name.",
|
|
3736
3824
|
"produces": null,
|
|
3737
|
-
"successCheck": "Every result in the texts has a source and 'results vary'"
|
|
3825
|
+
"successCheck": "Every result in the texts has a source and 'results vary'",
|
|
3826
|
+
"conditionalOn": "channels.sms == true"
|
|
3827
|
+
},
|
|
3828
|
+
{
|
|
3829
|
+
"ref": "handoff.claims_review",
|
|
3830
|
+
"owner": "TEAM",
|
|
3831
|
+
"title": "Approve every result the emails mention",
|
|
3832
|
+
"trigger": "always",
|
|
3833
|
+
"instruction": "The emails make no result claims unless you add them. If you add one, it must be a number you can source, followed by 'results vary', and never about pain, inflammation, sleep, weight or fat loss. A client quote is used only with that client's written consent and never with their name.",
|
|
3834
|
+
"produces": null,
|
|
3835
|
+
"successCheck": "Every result in the emails has a source and 'results vary'",
|
|
3836
|
+
"conditionalOn": "channels.sms != true"
|
|
3738
3837
|
},
|
|
3739
3838
|
{
|
|
3740
3839
|
"ref": "handoff.visit_outcome",
|
|
@@ -3743,7 +3842,18 @@
|
|
|
3743
3842
|
"trigger": "after every trial visit",
|
|
3744
3843
|
"instruction": "After a trial visit, move the card to {{stage.program_sold}} or to {{stage.no_sale}}. The first sends the program confirmation text and alert; the second starts the 3-day follow-up texts. A task reminds whoever takes calls.",
|
|
3745
3844
|
"produces": null,
|
|
3746
|
-
"successCheck": "Every showed trial card sits in {{stage.program_sold}} or {{stage.no_sale}} within a day"
|
|
3845
|
+
"successCheck": "Every showed trial card sits in {{stage.program_sold}} or {{stage.no_sale}} within a day",
|
|
3846
|
+
"conditionalOn": "channels.sms == true"
|
|
3847
|
+
},
|
|
3848
|
+
{
|
|
3849
|
+
"ref": "handoff.visit_outcome",
|
|
3850
|
+
"owner": "TEAM",
|
|
3851
|
+
"title": "Move each card after the visit",
|
|
3852
|
+
"trigger": "after every trial visit",
|
|
3853
|
+
"instruction": "After a trial visit, move the card to {{stage.program_sold}} or to {{stage.no_sale}}. The first alerts the team; neither sends the patient a message in this build. A task reminds whoever takes calls.",
|
|
3854
|
+
"produces": null,
|
|
3855
|
+
"successCheck": "Every showed trial card sits in {{stage.program_sold}} or {{stage.no_sale}} within a day",
|
|
3856
|
+
"conditionalOn": "channels.sms != true"
|
|
3747
3857
|
},
|
|
3748
3858
|
{
|
|
3749
3859
|
"ref": "handoff.sms_warming",
|
|
@@ -3861,7 +3971,7 @@
|
|
|
3861
3971
|
"owner": "OPERATOR-UI",
|
|
3862
3972
|
"title": "Paste the Google review link",
|
|
3863
3973
|
"trigger": "always (2 minutes)",
|
|
3864
|
-
"instruction": "In Google Business Profile choose Ask for reviews and copy the short link, then set review_link in Settings > Custom Values. Review Request
|
|
3974
|
+
"instruction": "In Google Business Profile choose Ask for reviews and copy the short link, then set review_link in Settings > Custom Values. Review Request sends it to clients.",
|
|
3865
3975
|
"produces": "cv.review_link",
|
|
3866
3976
|
"successCheck": "review_link shows a real https link",
|
|
3867
3977
|
"blocks": [
|
|
@@ -3874,7 +3984,7 @@
|
|
|
3874
3984
|
"title": "How Review Request starts",
|
|
3875
3985
|
"trigger": "always (1 minute to read)",
|
|
3876
3986
|
"instruction": "Review Request starts from the tag service-complete. Program Sold adds it two weeks after the sale; you can also add it by hand. It never starts after a trial alone, and nothing is offered in return for a review.",
|
|
3877
|
-
"successCheck": "A contact tagged service-complete gets the review
|
|
3987
|
+
"successCheck": "A contact tagged service-complete gets the review request two hours later",
|
|
3878
3988
|
"conditionalOn": "goal.reviewTiming != 'A few hours after a visit marked showed' && goal.reviewTiming != 'The day after a visit marked showed' && goal.reviewTiming != 'When you mark the work done' || goal.bookingNeeded != true && goal.reviewTiming != 'When you mark the work done'"
|
|
3879
3989
|
},
|
|
3880
3990
|
{
|
|
@@ -3884,7 +3994,7 @@
|
|
|
3884
3994
|
"title": "How Review Request starts",
|
|
3885
3995
|
"trigger": "always (1 minute to read)",
|
|
3886
3996
|
"instruction": "Review Request starts when a trial visit is marked showed on the calendar, and texts the review link a few hours later. Mark a visit showed only once it has happened. Nothing is offered in return for a review.",
|
|
3887
|
-
"successCheck": "A trial visit marked showed gets the review
|
|
3997
|
+
"successCheck": "A trial visit marked showed gets the review request two hours later"
|
|
3888
3998
|
},
|
|
3889
3999
|
{
|
|
3890
4000
|
"ref": "handoff.review_tag_next_day",
|
|
@@ -3893,7 +4003,7 @@
|
|
|
3893
4003
|
"title": "How Review Request starts",
|
|
3894
4004
|
"trigger": "always (1 minute to read)",
|
|
3895
4005
|
"instruction": "Review Request starts when a trial visit is marked showed on the calendar, and texts the review link the next day. Mark a visit showed only once it has happened. Nothing is offered in return for a review.",
|
|
3896
|
-
"successCheck": "A trial visit marked showed gets the review
|
|
4006
|
+
"successCheck": "A trial visit marked showed gets the review request the next day"
|
|
3897
4007
|
},
|
|
3898
4008
|
{
|
|
3899
4009
|
"ref": "handoff.review_tag_marked",
|
|
@@ -3902,7 +4012,7 @@
|
|
|
3902
4012
|
"title": "Start Review Request by tagging service-complete when the work is done",
|
|
3903
4013
|
"trigger": "always (1 minute to read)",
|
|
3904
4014
|
"instruction": "Review Request starts from the tag service-complete, and nothing adds it for you. Add it on the contact when their program or visit is finished. Each contact is asked for a review once. Nothing is offered in return for a review.",
|
|
3905
|
-
"successCheck": "A contact tagged service-complete gets the review
|
|
4015
|
+
"successCheck": "A contact tagged service-complete gets the review request two hours later"
|
|
3906
4016
|
}
|
|
3907
4017
|
]
|
|
3908
4018
|
}
|