@elitedcs/ghl-mcp 3.71.0 → 3.72.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 +70 -2
- package/README.md +4 -4
- package/dist/capture-helper.js +10 -1
- package/dist/index.js +8052 -2156
- package/guide/guide.html +2 -1
- package/package.json +5 -8
- package/skills/blueprint/SKILL.md +2 -0
- package/skills/blueprint/examples/medspa-approval-view.md +58 -53
- package/skills/blueprint/examples/medspa-brief.json +70 -8
- package/skills/blueprint/examples/medspa-build-plan.json +1435 -123
- package/skills/blueprint/examples/medspa-dry-run-report.md +3 -1
- package/skills/blueprint/examples/sample-approval-view.md +20 -61
- package/skills/blueprint/examples/sample-brief.json +95 -7
- package/skills/blueprint/examples/sample-build-plan.json +1448 -119
- package/skills/blueprint/examples/validate-plan.cjs +195 -13
- package/skills/blueprint/presets/clinic.md +60 -0
- package/skills/blueprint/presets/clinic.preset.json +1737 -0
- package/skills/blueprint/presets/coach.md +58 -0
- package/skills/blueprint/presets/coach.preset.json +1723 -0
- package/skills/blueprint/presets/ecommerce.md +54 -0
- package/skills/blueprint/presets/ecommerce.preset.json +1287 -0
- package/skills/blueprint/presets/generic-client.md +49 -27
- package/skills/blueprint/presets/generic-client.preset.json +1552 -122
- package/skills/blueprint/presets/local-service.md +58 -0
- package/skills/blueprint/presets/local-service.preset.json +1733 -0
- package/skills/blueprint/presets/med-spa.md +47 -48
- package/skills/blueprint/presets/med-spa.preset.json +1557 -111
- package/skills/blueprint/references/agency-os-detection.md +1 -1
- package/skills/blueprint/references/brief-schema.md +48 -1
- package/skills/blueprint/references/build-plan-schema.md +66 -5
- package/skills/blueprint/references/copy-guide.md +167 -0
- package/skills/blueprint/references/intake-question-set.md +64 -3
- package/skills/blueprint/references/preset-format.md +97 -51
- package/templates/action-schemas.json +12 -0
- package/templates/clinic-medspa.json +1 -1
- package/skills/blueprint/presets/clinic-launch-a2p.md +0 -39
- package/skills/blueprint/presets/clinic-launch-a2p.preset.json +0 -337
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"presetId": "clinic_launch_a2p",
|
|
3
|
-
"presetVersion": "1.0.0",
|
|
4
|
-
"schemaVersion": "0.1",
|
|
5
|
-
"title": "Clinic Launch Event + A2P",
|
|
6
|
-
"description": "The database-reactivation launch-event build (clinic / med spa on-site events): a 15-stage DBR pipeline, intake/consent fields, the launch custom-value set, the DBR SMS line + booking + sale workflow system, an event calendar with deposit, and the full compliance handoff chain (A2P site, A2P brand + campaign, Stripe products + links, phone purchase, Conversation AI prompts, SMS warming). NOT the default; selected explicitly for a launch-event / database-reactivation engagement. Heavy on operator handoffs by design.",
|
|
7
|
-
"default": false,
|
|
8
|
-
"selectors": {
|
|
9
|
-
"businessTypes": [],
|
|
10
|
-
"aliases": ["clinic_launch_a2p", "cll", "dbr", "launch_event"],
|
|
11
|
-
"selectBy": "Chosen explicitly, or when the brief describes a time-boxed on-site event / database-reactivation model (event_start/end dates, deposit + balance, package tiers, SMS reactivation of an existing list). Not auto-selected by business_type."
|
|
12
|
-
},
|
|
13
|
-
"source": "command-center/shared/client-provisioning-spec.md + clinic-launch-lab CLIENT_BUILD_AUTOMATION_BLUEPRINT.md + A2P_Client_Playbook.md + QA v3 snapshot",
|
|
14
|
-
"skeleton": {
|
|
15
|
-
"pipelines": [
|
|
16
|
-
{
|
|
17
|
-
"ref": "pipeline.launch",
|
|
18
|
-
"name": "{{business.name}} Launch Events || Launch Events",
|
|
19
|
-
"stages": {
|
|
20
|
-
"fillFrom": "goal.salesStages",
|
|
21
|
-
"transform": "stageList",
|
|
22
|
-
"default": [
|
|
23
|
-
{ "ref": "stage.dbr_lead", "name": "DBR Lead", "position": 0 },
|
|
24
|
-
{ "ref": "stage.active_dbr", "name": "Active In DBR", "position": 1 },
|
|
25
|
-
{ "ref": "stage.replied_dbr", "name": "Replied To DBR", "position": 2 },
|
|
26
|
-
{ "ref": "stage.completed_dbr", "name": "Completed DBR", "position": 3 },
|
|
27
|
-
{ "ref": "stage.booking_link_sent", "name": "Interested - Booking Link Sent", "position": 4 },
|
|
28
|
-
{ "ref": "stage.deposit_paid", "name": "Booked - Deposit Paid", "position": 5 },
|
|
29
|
-
{ "ref": "stage.showed", "name": "Appointment Showed", "position": 6 },
|
|
30
|
-
{ "ref": "stage.package_sold", "name": "Package Sold", "position": 7 },
|
|
31
|
-
{ "ref": "stage.no_sale", "name": "No Package Sold - Follow Up", "position": 8 },
|
|
32
|
-
{ "ref": "stage.no_show", "name": "Appointment No Show", "position": 9 },
|
|
33
|
-
{ "ref": "stage.canceled", "name": "Appointment Canceled", "position": 10 },
|
|
34
|
-
{ "ref": "stage.rescheduled", "name": "Rescheduled", "position": 11 },
|
|
35
|
-
{ "ref": "stage.not_interested", "name": "Not Interested", "position": 12 },
|
|
36
|
-
{ "ref": "stage.dnd", "name": "DND", "position": 13 },
|
|
37
|
-
{ "ref": "stage.lost", "name": "Lost", "position": 14 }
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
"customFields": [
|
|
43
|
-
{ "ref": "field.package_recommended", "name": "Package Recommended", "dataType": "SINGLE_OPTIONS", "model": "contact", "notes": "Generic Tier 1-4 options; the dollar amount lives in the package_tier_*_price custom values, NOT in the option label (avoids the Lux-specific hardcoding)." },
|
|
44
|
-
{ "ref": "field.intake_height", "name": "Intake - Height", "dataType": "TEXT", "model": "contact" },
|
|
45
|
-
{ "ref": "field.intake_weight", "name": "Intake - Weight", "dataType": "TEXT", "model": "contact" },
|
|
46
|
-
{ "ref": "field.intake_sex", "name": "Intake - Sex", "dataType": "SINGLE_OPTIONS", "model": "contact" },
|
|
47
|
-
{ "ref": "field.intake_physician_care", "name": "Intake - Under Physician Care", "dataType": "CHECKBOX", "model": "contact" },
|
|
48
|
-
{ "ref": "field.deposit_paid", "name": "Deposit Paid", "dataType": "CHECKBOX", "model": "contact" },
|
|
49
|
-
{ "ref": "field.balance_due", "name": "Balance Due At Appointment", "dataType": "MONETORY", "model": "contact" },
|
|
50
|
-
{ "ref": "field.lead_source", "name": "Lead Source", "dataType": "SINGLE_OPTIONS", "model": "contact" },
|
|
51
|
-
{ "ref": "field.ltv", "name": "Estimated Lifetime Value", "dataType": "MONETORY", "model": "contact" }
|
|
52
|
-
],
|
|
53
|
-
"_fieldNote": "The full launch intake captures ~49 fields (the CLL onboarding form nI5dPig1RIJvd6vQNcEf + patient intake/consent). The skill ingests the operator's onboarding answers and creates the subset the workflows actually use; the consent/health fields above are representative. The full field list is in the CLL onboarding spec.",
|
|
54
|
-
"tags": [
|
|
55
|
-
{ "ref": "tag.dbr_line_1", "name": "dbr-line-1" },
|
|
56
|
-
{ "ref": "tag.dbr_line_2", "name": "dbr-line-2" },
|
|
57
|
-
{ "ref": "tag.dbr_line_3", "name": "dbr-line-3" },
|
|
58
|
-
{ "ref": "tag.dbr_line_4", "name": "dbr-line-4" },
|
|
59
|
-
{ "ref": "tag.dbr_import", "name": "dbr-import" },
|
|
60
|
-
{ "ref": "tag.active_in_dbr", "name": "active-in-dbr" },
|
|
61
|
-
{ "ref": "tag.interested_in_dbr", "name": "interested-in-dbr" },
|
|
62
|
-
{ "ref": "tag.completed_dbr", "name": "completed-dbr" },
|
|
63
|
-
{ "ref": "tag.completed_dbr_appt", "name": "completed-dbr-appointment" },
|
|
64
|
-
{ "ref": "tag.dbr_waitlist", "name": "dbr-waitlist" },
|
|
65
|
-
{ "ref": "tag.event_sold_out", "name": "event-sold-out" },
|
|
66
|
-
{ "ref": "tag.link_sent_no_book", "name": "link-sent-no-book" },
|
|
67
|
-
{ "ref": "tag.balance_paid", "name": "balance-paid" },
|
|
68
|
-
{ "ref": "tag.intake_form_submitted", "name": "intake-form-submitted" },
|
|
69
|
-
{ "ref": "tag.package_purchased", "name": "package-purchased" },
|
|
70
|
-
{ "ref": "tag.patient_no_show", "name": "patient-no-show" },
|
|
71
|
-
{ "ref": "tag.patient_rescheduled", "name": "patient-rescheduled" }
|
|
72
|
-
],
|
|
73
|
-
"customValues": [
|
|
74
|
-
{ "ref": "cv.business_name", "name": "business_name", "value": "{{business.name}}" },
|
|
75
|
-
{ "ref": "cv.clinic_name", "name": "clinic_name", "value": "{{business.name}}" },
|
|
76
|
-
{ "ref": "cv.clinic_director_name", "name": "clinic_director_name", "value": "" },
|
|
77
|
-
{ "ref": "cv.clinic_phone", "name": "clinic_phone", "value": "" },
|
|
78
|
-
{ "ref": "cv.clinic_address", "name": "clinic_address", "value": "{{business.location}}" },
|
|
79
|
-
{ "ref": "cv.event_start_date", "name": "event_start_date", "value": "" },
|
|
80
|
-
{ "ref": "cv.event_end_date", "name": "event_end_date", "value": "" },
|
|
81
|
-
{ "ref": "cv.event_capacity", "name": "event_capacity", "value": "" },
|
|
82
|
-
{ "ref": "cv.spots_left", "name": "spots_left", "value": "", "notes": "= event_capacity at launch" },
|
|
83
|
-
{ "ref": "cv.deposit_amount", "name": "deposit_amount", "value": "" },
|
|
84
|
-
{ "ref": "cv.trial_price", "name": "trial_price", "value": "" },
|
|
85
|
-
{ "ref": "cv.balance_amount", "name": "balance_amount", "value": "" },
|
|
86
|
-
{ "ref": "cv.package_tier_1_name", "name": "package_tier_1_name", "value": "" },
|
|
87
|
-
{ "ref": "cv.package_tier_1_price", "name": "package_tier_1_price", "value": "" },
|
|
88
|
-
{ "ref": "cv.package_tier_2_name", "name": "package_tier_2_name", "value": "" },
|
|
89
|
-
{ "ref": "cv.package_tier_2_price", "name": "package_tier_2_price", "value": "" },
|
|
90
|
-
{ "ref": "cv.package_tier_3_name", "name": "package_tier_3_name", "value": "" },
|
|
91
|
-
{ "ref": "cv.package_tier_3_price", "name": "package_tier_3_price", "value": "" },
|
|
92
|
-
{ "ref": "cv.booking_link", "name": "booking_link", "value": "", "filledBy": "handoff.calendar_config" },
|
|
93
|
-
{ "ref": "cv.deposit_link", "name": "deposit_link", "value": "", "filledBy": "handoff.stripe_products" },
|
|
94
|
-
{ "ref": "cv.balance_payment_link", "name": "balance_payment_link", "value": "", "filledBy": "handoff.stripe_products" },
|
|
95
|
-
{ "ref": "cv.package_tier_1_link", "name": "package_tier_1_link", "value": "", "filledBy": "handoff.stripe_products" },
|
|
96
|
-
{ "ref": "cv.package_tier_2_link", "name": "package_tier_2_link", "value": "", "filledBy": "handoff.stripe_products" },
|
|
97
|
-
{ "ref": "cv.package_tier_3_link", "name": "package_tier_3_link", "value": "", "filledBy": "handoff.stripe_products" },
|
|
98
|
-
{ "ref": "cv.intake_form_url", "name": "intake_form_url", "value": "", "filledBy": "form.intake" }
|
|
99
|
-
],
|
|
100
|
-
"calendars": [
|
|
101
|
-
{
|
|
102
|
-
"ref": "calendar.event",
|
|
103
|
-
"name": "{{business.name}} Launch Event || Launch Event",
|
|
104
|
-
"calendarType": "event",
|
|
105
|
-
"openHours": [{ "daysOfTheWeek": [1, 2, 3, 4, 5], "hours": [{ "openHour": 9, "openMinute": 0, "closeHour": 18, "closeMinute": 0 }] }],
|
|
106
|
-
"availabilityType": 0,
|
|
107
|
-
"slotDuration": 30,
|
|
108
|
-
"requiresStaff": true,
|
|
109
|
-
"notes": "Event-type calendar scoped to the event window (event_start_date..event_end_date) with a deposit (deposit_amount, e.g. $19). Dates/hours/deposit set at handoff.calendar_config."
|
|
110
|
-
}
|
|
111
|
-
],
|
|
112
|
-
"forms": [
|
|
113
|
-
{
|
|
114
|
-
"ref": "form.intake",
|
|
115
|
-
"name": "{{business.name}} Patient Intake & Consent",
|
|
116
|
-
"fields": [
|
|
117
|
-
{ "type": "standard", "key": "first_name", "required": true },
|
|
118
|
-
{ "type": "standard", "key": "last_name", "required": true },
|
|
119
|
-
{ "type": "standard", "key": "email", "required": true },
|
|
120
|
-
{ "type": "standard", "key": "phone", "required": false },
|
|
121
|
-
{ "type": "custom", "fieldRef": "field.intake_height", "required": false },
|
|
122
|
-
{ "type": "custom", "fieldRef": "field.intake_weight", "required": false },
|
|
123
|
-
{ "type": "custom", "fieldRef": "field.intake_sex", "required": false },
|
|
124
|
-
{ "type": "custom", "fieldRef": "field.intake_physician_care", "required": false }
|
|
125
|
-
],
|
|
126
|
-
"notes": "Phone is NOT required and carries no asterisk (A2P opt-in rule). Full intake mirrors the CLL onboarding/consent field set."
|
|
127
|
-
}
|
|
128
|
-
],
|
|
129
|
-
"funnels": [],
|
|
130
|
-
"_funnelNote": "The launch preset does NOT build a GHL funnel. The opt-in / compliance presence is the dedicated A2P compliance SITE (6-page template: index/about/services/contact/privacy/terms), deployed at handoff.a2p_site — its consent HTML is what A2P approval depends on, and it must be a real hosted site, not a GHL preview.",
|
|
131
|
-
"emails": [
|
|
132
|
-
{ "ref": "email.deposit_confirm", "name": "Deposit Confirmation", "subject": "You're booked — deposit received", "copyDirection": "Confirm deposit + appointment date/time + location from custom values; what to bring; reassurance.", "mergeTags": ["contact.first_name"] },
|
|
133
|
-
{ "ref": "email.post_event_non_buyer", "name": "Post-Event Follow-up (non-buyer)", "subject": "Following up from your visit", "copyDirection": "72-hour close for non-buyers; restate the package value; CTA to a tier link; no health/income claims.", "mergeTags": ["contact.first_name"] }
|
|
134
|
-
],
|
|
135
|
-
"sms": [
|
|
136
|
-
{ "ref": "sms.dbr_line_1", "name": "Main DBR SMS - Line 1", "copyDirection": "Reactivation opener to an opted-in list. Clinic name (not legal entity); one line; offer the booking step; include opt-out (Reply STOP). A2P-safe wording — NO weight-loss / health-claim / income language.", "mergeTags": ["contact.first_name"] },
|
|
137
|
-
{ "ref": "sms.booking_link", "name": "Send Booking Link", "copyDirection": "Send the booking link (cv.booking_link) on interest/keyword; one line; opt-out.", "mergeTags": ["contact.first_name"] },
|
|
138
|
-
{ "ref": "sms.balance_collect", "name": "Balance Collection", "copyDirection": "Request balance via balance_payment_link before/at appointment; opt-out.", "mergeTags": ["contact.first_name"] },
|
|
139
|
-
{ "ref": "sms.sold_out_waitlist", "name": "Sold-Out Waitlist", "copyDirection": "When event-sold-out: offer waitlist (Reply WAIT); set expectation; opt-out.", "mergeTags": ["contact.first_name"] }
|
|
140
|
-
],
|
|
141
|
-
"workflows": [
|
|
142
|
-
{
|
|
143
|
-
"ref": "workflow.dbr_line_1",
|
|
144
|
-
"name": "Main DBR SMS - Line 1",
|
|
145
|
-
"trigger": { "type": "contact_tag", "tagRef": "tag.dbr_line_1" },
|
|
146
|
-
"stopOnResponse": true,
|
|
147
|
-
"sendWindow": "8am-10pm local",
|
|
148
|
-
"actions": [
|
|
149
|
-
{ "type": "add_contact_tag", "tagRef": "tag.active_in_dbr" },
|
|
150
|
-
{ "type": "create_opportunity", "pipelineRef": "pipeline.launch", "stageRef": "stage.active_dbr", "name": "{{contact.name}} - DBR" },
|
|
151
|
-
{ "type": "send_sms", "smsRef": "sms.dbr_line_1" }
|
|
152
|
-
]
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
"ref": "workflow.auto_tag_reply",
|
|
156
|
-
"name": "Auto-Tag DBR Reply",
|
|
157
|
-
"trigger": { "type": "customer_reply" },
|
|
158
|
-
"stopOnResponse": false,
|
|
159
|
-
"actions": [
|
|
160
|
-
{ "type": "add_contact_tag", "tagRef": "tag.interested_in_dbr" },
|
|
161
|
-
{ "type": "internal_notification", "to": "{{operator.userId}}", "title": "DBR reply", "body": "{{contact.first_name}} replied to the launch campaign" }
|
|
162
|
-
]
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
"ref": "workflow.send_booking_link",
|
|
166
|
-
"name": "Reply BOOK - Send Booking Link",
|
|
167
|
-
"trigger": { "type": "inbound_keyword", "keyword": "BOOK" },
|
|
168
|
-
"stopOnResponse": false,
|
|
169
|
-
"actions": [
|
|
170
|
-
{ "type": "add_contact_tag", "tagRef": "tag.link_sent_no_book" },
|
|
171
|
-
{ "type": "send_sms", "smsRef": "sms.booking_link" }
|
|
172
|
-
]
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
"ref": "workflow.deposit_paid",
|
|
176
|
-
"name": "Deposit Paid - Confirm Appointment",
|
|
177
|
-
"trigger": { "type": "appointment", "appointmentStatus": "confirmed", "calendarRef": "calendar.event" },
|
|
178
|
-
"stopOnResponse": false,
|
|
179
|
-
"actions": [
|
|
180
|
-
{ "type": "add_contact_tag", "tagRef": "tag.balance_paid" },
|
|
181
|
-
{ "type": "send_email", "emailRef": "email.deposit_confirm" },
|
|
182
|
-
{ "type": "internal_notification", "to": "{{operator.userId}}", "title": "Deposit paid", "body": "{{contact.first_name}} paid deposit + booked" }
|
|
183
|
-
]
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"ref": "workflow.no_show",
|
|
187
|
-
"name": "Appointment No-Show - Alert + Status",
|
|
188
|
-
"trigger": { "type": "appointment", "appointmentStatus": "noshow", "calendarRef": "calendar.event" },
|
|
189
|
-
"stopOnResponse": false,
|
|
190
|
-
"actions": [
|
|
191
|
-
{ "type": "add_contact_tag", "tagRef": "tag.patient_no_show" },
|
|
192
|
-
{ "type": "internal_notification", "to": "{{operator.userId}}", "title": "No-show", "body": "{{contact.first_name}} did not show" }
|
|
193
|
-
]
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
"ref": "workflow.balance_collection",
|
|
197
|
-
"name": "Balance Collection - Auto-Send",
|
|
198
|
-
"trigger": { "type": "appointment", "appointmentStatus": "confirmed", "calendarRef": "calendar.event" },
|
|
199
|
-
"stopOnResponse": false,
|
|
200
|
-
"actions": [
|
|
201
|
-
{ "type": "wait", "value": 1, "unit": "days" },
|
|
202
|
-
{ "type": "send_sms", "smsRef": "sms.balance_collect" }
|
|
203
|
-
]
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
"ref": "workflow.package_sold",
|
|
207
|
-
"name": "Package Sold - Confirmation",
|
|
208
|
-
"trigger": { "type": "contact_tag", "tagRef": "tag.package_purchased" },
|
|
209
|
-
"stopOnResponse": false,
|
|
210
|
-
"actions": [
|
|
211
|
-
{ "type": "internal_notification", "to": "{{operator.userId}}", "title": "Package sold", "body": "{{contact.first_name}} purchased a package" }
|
|
212
|
-
]
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"ref": "workflow.post_event_followup",
|
|
216
|
-
"name": "Post-Event Follow-up (Non-Buyers, 72hr)",
|
|
217
|
-
"trigger": { "type": "contact_tag", "tagRef": "tag.completed_dbr_appt" },
|
|
218
|
-
"stopOnResponse": true,
|
|
219
|
-
"actions": [
|
|
220
|
-
{ "type": "send_email", "emailRef": "email.post_event_non_buyer" }
|
|
221
|
-
]
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
"ref": "workflow.sold_out_waitlist",
|
|
225
|
-
"name": "Sold Out - DBR Waitlist",
|
|
226
|
-
"trigger": { "type": "contact_tag", "tagRef": "tag.event_sold_out" },
|
|
227
|
-
"stopOnResponse": false,
|
|
228
|
-
"actions": [
|
|
229
|
-
{ "type": "add_contact_tag", "tagRef": "tag.dbr_waitlist" },
|
|
230
|
-
{ "type": "send_sms", "smsRef": "sms.sold_out_waitlist" }
|
|
231
|
-
]
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
"ref": "workflow.reply_stop_dnd",
|
|
235
|
-
"name": "Replied STOP - DND",
|
|
236
|
-
"trigger": { "type": "inbound_keyword", "keyword": "STOP" },
|
|
237
|
-
"stopOnResponse": false,
|
|
238
|
-
"actions": [
|
|
239
|
-
{ "type": "internal_notification", "to": "{{operator.userId}}", "title": "Opt-out", "body": "{{contact.first_name}} replied STOP" }
|
|
240
|
-
]
|
|
241
|
-
}
|
|
242
|
-
],
|
|
243
|
-
"handoffs": [
|
|
244
|
-
{
|
|
245
|
-
"ref": "handoff.add_staff",
|
|
246
|
-
"owner": "OPERATOR-UI",
|
|
247
|
-
"title": "Add staff users (you, your coordinator, the client)",
|
|
248
|
-
"trigger": "always",
|
|
249
|
-
"instruction": "Add the event team as users in Settings > My Staff. The event calendar needs assignable staff and GHL Command cannot add users.",
|
|
250
|
-
"produces": null,
|
|
251
|
-
"successCheck": "Staff users present",
|
|
252
|
-
"blocks": ["calendar.event"]
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
"ref": "handoff.stripe_products",
|
|
256
|
-
"owner": "OPERATOR-EXT",
|
|
257
|
-
"title": "Connect Stripe + create products and payment links",
|
|
258
|
-
"trigger": "always",
|
|
259
|
-
"instruction": "Connect Stripe, create the deposit, balance, and package tier products, and generate payment links. Paste the links back so they fill the deposit_link / balance_payment_link / package_tier_*_link custom values.",
|
|
260
|
-
"produces": "cv.deposit_link, cv.balance_payment_link, cv.package_tier_1_link, cv.package_tier_2_link, cv.package_tier_3_link",
|
|
261
|
-
"successCheck": "Products exist; each payment link resolves",
|
|
262
|
-
"blocks": ["cv.deposit_link", "cv.balance_payment_link", "cv.package_tier_1_link", "cv.package_tier_2_link", "cv.package_tier_3_link"]
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
"ref": "handoff.calendar_config",
|
|
266
|
-
"owner": "OPERATOR-UI",
|
|
267
|
-
"title": "Configure the event calendar (dates, hours, deposit) + connect it",
|
|
268
|
-
"trigger": "always",
|
|
269
|
-
"instruction": "Set the event window (event_start_date..event_end_date), hours, and the deposit amount on the event calendar, and authorize your Google/Outlook connection. Copy the booking link back to fill booking_link.",
|
|
270
|
-
"produces": "cv.booking_link",
|
|
271
|
-
"successCheck": "Calendar shows the event dates + connected account; booking link resolves",
|
|
272
|
-
"blocks": ["cv.booking_link"]
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
"ref": "handoff.phone_numbers",
|
|
276
|
-
"owner": "OPERATOR-UI",
|
|
277
|
-
"title": "Purchase phone numbers (1 per ~500 contacts, max 4)",
|
|
278
|
-
"trigger": "always",
|
|
279
|
-
"instruction": "Buy SMS-capable numbers sized to your list (roughly one per 500 contacts, up to four). Required before the DBR SMS lines can run.",
|
|
280
|
-
"produces": null,
|
|
281
|
-
"successCheck": "Numbers present and SMS-capable",
|
|
282
|
-
"blocks": ["workflow.dbr_line_1"]
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
"ref": "handoff.a2p_site",
|
|
286
|
-
"owner": "OPERATOR-EXT",
|
|
287
|
-
"title": "Build + deploy your A2P compliance website",
|
|
288
|
-
"trigger": "always",
|
|
289
|
-
"instruction": "Deploy the 6-page compliance site (index/about/services/contact/privacy/terms) from the provided template, filling your real business details. The consent HTML must be exact (two unchecked checkboxes, brand name in <strong> matching the Trust Center, no inline styles, clean URLs, privacy + terms with the full SMS clause set). It must be a real hosted site, not a GHL preview. A2P approval depends on this.",
|
|
290
|
-
"produces": null,
|
|
291
|
-
"successCheck": "Live site returns 200; consent + privacy + terms pass the 8/8 + 7-item checks",
|
|
292
|
-
"blocks": ["handoff.a2p_brand_campaign"]
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
"ref": "handoff.a2p_brand_campaign",
|
|
296
|
-
"owner": "OPERATOR-EXT",
|
|
297
|
-
"title": "Submit A2P brand + campaign",
|
|
298
|
-
"trigger": "always",
|
|
299
|
-
"instruction": "Submit the A2P brand (exact IRS legal name, EIN, address) and campaign (use-case description, two sample messages, opt-in description) in the Trust Center. Avoid the forbidden-words list (weight loss, revenue/income claims, 'operated by', reactivation/lead-gen language). Save the full submission before sending. 7-14 day review.",
|
|
300
|
-
"produces": null,
|
|
301
|
-
"successCheck": "Brand + campaign status submitted/approved",
|
|
302
|
-
"blocks": ["workflow.dbr_line_1", "workflow.send_booking_link", "workflow.balance_collection", "workflow.sold_out_waitlist", "sms.dbr_line_1", "sms.booking_link", "sms.balance_collect", "sms.sold_out_waitlist"],
|
|
303
|
-
"_blocksNote": "Lists the SMS-bearing WORKFLOW refs (so they stay DRAFT until A2P is met) plus the sms.* asset refs — only an explicit workflow.* ref gates a workflow's publish state."
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
"ref": "handoff.conv_ai",
|
|
307
|
-
"owner": "OPERATOR-UI",
|
|
308
|
-
"title": "Activate Conversation AI (normal + sold-out prompts)",
|
|
309
|
-
"trigger": "always",
|
|
310
|
-
"instruction": "Create the Conversation AI bot, paste the normal-mode and sold-out-mode prompts, and wire the sold-out swap to the event-sold-out tag.",
|
|
311
|
-
"produces": null,
|
|
312
|
-
"successCheck": "Bot active; sold-out prompt swap fires on event-sold-out",
|
|
313
|
-
"blocks": []
|
|
314
|
-
},
|
|
315
|
-
{
|
|
316
|
-
"ref": "handoff.sms_warming",
|
|
317
|
-
"owner": "OPERATOR-EXT",
|
|
318
|
-
"title": "SMS warming ramp (4 weeks, parallel with A2P)",
|
|
319
|
-
"trigger": "always",
|
|
320
|
-
"instruction": "Import the number pool and run the 4-week warming ramp so deliverability holds at launch volume. Runs in parallel with the A2P review window.",
|
|
321
|
-
"produces": null,
|
|
322
|
-
"successCheck": "Warming on track; deliverability healthy",
|
|
323
|
-
"blocks": []
|
|
324
|
-
},
|
|
325
|
-
{
|
|
326
|
-
"ref": "handoff.list_import",
|
|
327
|
-
"owner": "OPERATOR-EXT",
|
|
328
|
-
"title": "Receive + clean + split the contact list",
|
|
329
|
-
"trigger": "always",
|
|
330
|
-
"instruction": "Provide the contact list. It gets deduped, cleaned, and split per line (dbr-line-1..4). Test a batch of 5 before throttled mass enroll.",
|
|
331
|
-
"produces": null,
|
|
332
|
-
"successCheck": "Lists ready; test batch passes before mass enroll",
|
|
333
|
-
"blocks": ["workflow.dbr_line_1"]
|
|
334
|
-
}
|
|
335
|
-
]
|
|
336
|
-
}
|
|
337
|
-
}
|