@elitedcs/ghl-mcp 3.71.0 → 3.72.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +4 -4
  3. package/dist/capture-helper.js +10 -1
  4. package/dist/index.js +9078 -3211
  5. package/guide/guide.html +2 -1
  6. package/package.json +2 -2
  7. package/skills/blueprint/SKILL.md +2 -0
  8. package/skills/blueprint/examples/medspa-approval-view.md +58 -53
  9. package/skills/blueprint/examples/medspa-brief.json +70 -8
  10. package/skills/blueprint/examples/medspa-build-plan.json +1435 -123
  11. package/skills/blueprint/examples/medspa-dry-run-report.md +2 -0
  12. package/skills/blueprint/examples/sample-approval-view.md +20 -61
  13. package/skills/blueprint/examples/sample-brief.json +95 -7
  14. package/skills/blueprint/examples/sample-build-plan.json +1448 -119
  15. package/skills/blueprint/examples/validate-plan.cjs +195 -13
  16. package/skills/blueprint/presets/clinic-launch-a2p.preset.json +1 -0
  17. package/skills/blueprint/presets/clinic.md +60 -0
  18. package/skills/blueprint/presets/clinic.preset.json +1737 -0
  19. package/skills/blueprint/presets/coach.md +58 -0
  20. package/skills/blueprint/presets/coach.preset.json +1723 -0
  21. package/skills/blueprint/presets/ecommerce.md +54 -0
  22. package/skills/blueprint/presets/ecommerce.preset.json +1287 -0
  23. package/skills/blueprint/presets/generic-client.md +49 -27
  24. package/skills/blueprint/presets/generic-client.preset.json +1552 -122
  25. package/skills/blueprint/presets/local-service.md +58 -0
  26. package/skills/blueprint/presets/local-service.preset.json +1733 -0
  27. package/skills/blueprint/presets/med-spa.md +47 -48
  28. package/skills/blueprint/presets/med-spa.preset.json +1557 -111
  29. package/skills/blueprint/references/brief-schema.md +48 -1
  30. package/skills/blueprint/references/build-plan-schema.md +66 -5
  31. package/skills/blueprint/references/copy-guide.md +167 -0
  32. package/skills/blueprint/references/intake-question-set.md +64 -3
  33. package/skills/blueprint/references/preset-format.md +97 -51
  34. package/templates/action-schemas.json +12 -0
@@ -1,59 +1,58 @@
1
1
  # Preset: Med Spa (default)
2
2
 
3
- **File:** `med-spa.preset.json` · **id:** `med_spa` · **version:** 1.0.0 · **default:** yes
4
- **Source:** ghl-command showcase Modules 0-7 + the proven Bliss Med Spa / Lux Bio Therapy builds.
5
- **Status:** Live-validated 2026-06-25 — `validate_build_plan` valid (48 refs, 0 dead) and
6
- `apply_build_plan` dry_run clean (40 objects, 28 actions auto-built, 0 need-content,
7
- 0 manual action steps, every trigger auto-built). See `examples/medspa-dry-run-report.md`.
3
+ **File:** `med-spa.preset.json` · **id:** `med_spa` · **version:** 2.0.0 · **default:** yes
4
+ **Source:** ghl-command showcase Modules 0-7 + the proven Bliss Med Spa / Lux Bio Therapy builds; v2 depth per the owner review of 2026-08-26 (every workflow must do real work; nurture never under 30 days; copy to the Gary V / Hormozi standard in references/copy-guide.md).
8
5
 
9
6
  ## When it is selected
10
- The default reference preset, and the routing target for med-spa / aesthetics business
11
- types (`selectors.businessTypes`) and the `med_spa` / `medspa` / `aesthetics` aliases. It
12
- is also the library default: a brief whose `business_type` matches no preset resolves here.
13
- (The med-spa business type and `med_spa` alias moved here from the generic preset, which is
14
- now the neutral, non-default fallback for clinics/coaches/ecom/etc.)
15
-
16
- ## What it builds (skeleton)
17
- - **1 pipeline** — "Patient Journey", default 7 stages (New Lead Contacted Consult Booked* Showed* Treated Member / Rebooked Lost). Overridden by `goal.salesStages` when supplied.
18
- - **5 custom fields** — Lead Source (dropdown), Service Interest (multi-select, options mirrored by the interest-* tags), Appointment Date*, Consult Deposit Paid* (checkbox), Estimated Lifetime Value (`MONETORY`).
19
- - **13 tags + derived interest tags** — 5 lead-source + 8 lifecycle; the skill also derives `interest-<x>` tags (injectables / filler / facials / membership) from the offer and mirrors them onto the Service Interest field options.
20
- - **1 custom value** — Booking Link (filled by the calendar-connect handoff).*
21
- - **1 calendar** — round-robin Consultation, Mon-Fri 9-5 default. Auto-assigned when the operator is the sole user; otherwise the add-staff handoff applies.*
22
- - **1 intake form** — first/last/email/phone (phone required) + Service Interest (mapped to the custom field).
23
- - **1 funnel** — Free Assessment opt-in (→ form, with the A2P-compliant consent block) + Thank You (booking CTA).* Page content filled from `funnel-page-content-template.md`.
24
- - **5 emails + 3 SMS** — welcome, education nurture, consult reminder*, no-show*, win-back; speed-to-lead / consult-reminder / no-show texts (SMS only when `channels.sms`).
25
- - **5 workflows** — Speed-to-Lead (form_submission), Lead Nurture (contact_tag), Replied → Stop & Route (customer_reply), New Patient Onboarding* (appointment confirmed; appointment-relative reminder via `wait_appointment`), No-Show Win-back* (appointment noshow; `find_opportunity` branch → found: move opp back + text; notFound: win-back email).
26
- - **Handoffs (conditional)** — add-staff* (team only), calendar-connect, A2P, Stripe, email-domain.
7
+ The default reference preset, and the routing target for med-spa / aesthetics business types (`selectors.businessTypes`) and the `med_spa` / `medspa` / `aesthetics` / `injectables` aliases. A brief whose `business_type` matches no preset resolves here.
8
+
9
+ ## What it builds (skeleton, v2 depth)
10
+ - **Users** one per `brief.team.staff[]` entry. Every alert, task and assignment step points at a `userRef`; in the skeleton that is the role placeholder `user.owner`, resolved at fill time from `team.notifyName` (alerts) and `team.callsName` (tasks, assignment). No staff yet → the steps stay, pointed at `user.__pending__`, and the build reports them as waiting.
11
+ - **1 pipeline** "Patient Journey": New Lead → Contacted → Consult Booked* → Showed* → Treated → Member / Rebooked → Lost. Overridden by `goal.salesStages` when the brief supplies them.
12
+ - **6 custom fields** — Lead Source, Service Interest, Top Concern, Appointment Date*, Consult Deposit Paid*, Estimated Lifetime Value.
13
+ - **24 tags** source, lifecycle, the hand-off trigger tags (`nurture-start`, `winback-start`, `missed-call`, `no-show`), and interest tags mirrored from the interest field.
14
+ - **4 custom values** — business_name, business_phone, owner_first_name, booking_link. Every message reads business name / phone / signature / links from these, so the copy stays right when details change.
15
+ - **1 calendar** — Consultation (round_robin, Mon-Fri 9-17 default, 30-minute slots, `teamMemberRefs` the plan users).*
16
+ - **1 intake form + 1 funnel** — "New Client Inquiry" (first/last/email/phone required + Service Interest) and a Free Skin Assessment opt-in page with the A2P consent block, plus a Thank You page with the booking widget.
17
+ - **15 email + 17 SMS templates** — complete, send-ready copy written to `references/copy-guide.md`. The build stage rewrites every one from the real brief (offer, pain points, objections, prices, lead magnet) and keeps the cadence, the single CTA and the merge fields.
18
+ - **8 workflows, 32 customer touches** see the table.
27
19
 
28
20
  \* conditional on `goal.bookingNeeded == true`.
29
21
 
30
- ## What this preset gets right (the contract corrections)
31
- - **Canonical trigger tokens only.** Every trigger uses a type the executor builds natively
32
- (`form_submission`, `contact_tag`, `appointment` + `appointmentStatus`, `customer_reply`),
33
- so triggers auto-build instead of falling through to a manual GHL-UI step. (The older
34
- generic preset used `tag_added` / `appointment_status` / `appointment_booked`, which are
35
- NOT recognized and surface as manual steps.)
36
- - **A2P gates the workflows, not just the assets.** `handoff.a2p.blocks` lists each
37
- SMS-bearing **workflow** ref (Speed-to-Lead, Onboarding, No-Show) so they stay DRAFT until
38
- A2P is approved a bare `sms.*` wildcard gates only the asset surface, not the workflow's
39
- publish state.
40
- - **Publishable internal notifications.** `internal_notification.to` uses the
41
- `{{operator.userId}}` token, which the skill resolves to a real GHL user id from
42
- `get_users` at fill time (a non-user value builds a notify-all that GHL will not publish).
43
- - **Customer-safe handoff owners.** `OPERATOR-UI` / `OPERATOR-EXT` / `TEAM` never internal
44
- names.
22
+ ## Workflows
23
+
24
+ | Workflow | Trigger | Actions | Touches | Span of waits | Stops on reply |
25
+ |---|---|---|---|---|---|
26
+ | Speed to Lead | form_submission | 15 | 5 | 1.1 days | yes |
27
+ | Missed Call Text-Back | call_status (missed: no-answer/busy/voicemail) | 7 | 2 | 1 h | yes |
28
+ | Lead Nurture (30 days) | contact_tag (tag.nurture_start) | 28 | 11 | 31 days | yes |
29
+ | Replied - Stop & Route | customer_reply | 9 | 0 | instant | no |
30
+ | Win-back (30 days) | contact_tag (tag.winback_start) | 13 | 5 | 31 days | yes |
31
+ | Consult Booked - Confirm & Move | appointment (confirmed) | 8 | 2 | instant | no |
32
+ | Consult Reminders | appointment (confirmed) | 5 | 3 | instant | no |
33
+ | No-Show Rescue | appointment (noshow) | 14 | 4 | 7 days | yes |
34
+
35
+ - **Speed to Lead** (15 actions): instant text + email, opportunity card, the contact assigned to whoever takes calls, alert to a real person, a call task due today, a 2nd touch at 20 minutes, a 3rd at 3 hours, a 4th and 5th by the next day, then the hand-off tag `nurture-start` as the last action.
36
+ - **Lead Nurture** (28 actions, 11 touches, 31 days of waits): give, give, ask. Ends with `lifecycle-lapsed` + the `winback-start` hand-off.
37
+ - **Win-back** (13 actions, 5 touches, 31 days of waits): one reason to come back per message, then `lifecycle-lost`.
38
+ - **Replied - Stop & Route**: the exit workflow. Pulls the contact out of every sequence, notes it, marks contacted, alerts a person and creates a 15-minute reply task.
39
+ - **Missed Call Text-Back**: `call_status` trigger scoped to no-answer / busy / voicemail, inbound. Text within seconds, tag, alert, call-back task, one more text an hour later.
40
+ - **Consultation → Confirm & Move, Reminders, No-Show Rescue**: booking stops every sequence and moves (or creates) the opportunity; reminders at 24 h and 2 h; a no-show gets a same-day call task, text and email, two more touches, then hands off to Win-back and moves the card back to Contacted.
41
+
42
+ ### Why sequences hand off with a tag, not add_to_workflow
43
+ Every hand-off is `add_contact_tag` + a `contact_tag` trigger. Both halves are live-proven shapes captured from working GHL workflows (`templates/action-schemas.json`). `add_to_workflow` has no captured native shape there and has not been proven at runtime, so a preset may not use it. Each sequence removes its own trigger tag as its first action so a later hand-off can start it again.
45
44
 
46
45
  ## How the brief shapes it
47
46
  | Brief signal | Effect |
48
47
  |---|---|
49
- | `goal.salesStages` present | replaces the default pipeline stages |
50
- | `goal.bookingNeeded == false` | drops the calendar, appointment field/tag/stage, onboarding + no-show workflows, and the add-staff/connect handoffs |
51
- | `channels.sms == true` | keeps SMS assets + the send_sms actions + the A2P handoff/gating; otherwise they drop |
52
- | `flags: needs_a2p` | adds the A2P handoff and holds the SMS-bearing workflows DRAFT |
53
- | `flags: stripe_not_connected` / `calendar_oauth_needed` / `email_domain_needed` | adds the matching handoff |
54
- | `business.teamSize != "Just me"` | adds the add-staff handoff (a team needs an assigned provider) |
55
- | `business.name`, `offer.*`, `audience.*`, `extended.*` | fill object names + ground all copy |
56
-
57
- ## Worked example
58
- `examples/medspa-brief.json` `examples/medspa-build-plan.json` →
59
- `examples/medspa-approval-view.md`, proven by `examples/medspa-dry-run-report.md`.
48
+ | `goal.salesStages` present | replaces the default pipeline stages (workflow stage refs are mapped to the nearest equivalent) |
49
+ | `goal.bookingNeeded == false` | drops the calendar, booking stage/tag/fields, the three appointment workflows and the calendar handoffs |
50
+ | `channels.sms == true` | keeps SMS templates, the send_sms actions, Missed Call Text-Back and the A2P gating; otherwise they drop (the email-only nurture still spans 31 days) |
51
+ | staff answers present | fills `users`; every `userRef` resolves to a real person |
52
+ | staff empty | every `userRef` `user.__pending__`; the steps stay; `handoff.add_staff` holds those workflows DRAFT |
53
+ | `flags` | `needs_a2p` / `stripe_not_connected` / `calendar_oauth_needed` / `email_domain_needed` add the matching handoff |
54
+ | `business.name`, `offer.*`, `audience.*`, `extended.*` | fill object names, custom values and ground every template rewrite |
55
+
56
+
57
+ ## Copy notes
58
+ Written for the fear that drives every med-spa lead: looking "done". The through-line is "refreshed, not overdone": treat less first, adjust at two weeks, written plan with prices before anything happens. Texts ask one-word questions (lines / volume / texture; mornings / afternoons; YES / later). Price is handled head-on on day 14, cost of waiting on day 20, and the decision sheet on day 27. No client results are claimed; the build stage adds real ones only if the brief supplies them.