Workflow Automation Blueprint
Complete automation specification for CJM's GHL (GoHighLevel) implementation. Every workflow contains triggers, filters, conditions, branches, waits, actions, notifications, exit criteria, re-entry policy, error handling, and duplicate prevention rules. This is an internal configuration document — not public content.
New Lead Captured
Trigger
Form submission on any CJM funnel, calculator, assessment, or worksheet page
Re-Entry Policy
Do not re-enter if same email submitted within 30 days; update existing opportunity instead
Filters
- •Form ID is not empty
- •Email is present and valid
- •Source field is populated
Conditions
- •Email is not already in active pipeline (opportunity not closed-won or closed-lost within 90 days)
Branches
Actions
- •Create Contact if not exists
- •Create Opportunity in appropriate pipeline
- •Set Lead Source = form source
- •Set Campaign = funnel slug or 'general'
- •Capture UTM parameters if present
- •Capture referrer URL
- •Timestamp record creation
Internal Notifications
- •Slack/email notification to assigned rep: 'New lead: [Name] — [Company] — [Funnel]'
Tag Changes
- + new-lead
- + funnel:[slug]
- + source:[source]
Field Updates
- Lead Source
- Campaign
- First Touch Date
- Last Touch Date
Email Actions
- •Trigger 'Lead Captured — Auto-Reply' email (if funnel landing form)
Task Creation
- •Create task: 'Qualify new lead — first response within 5 minutes' assigned to round-robin queue
Exit Criteria
- •Lead is qualified and moved to next stage
- •Lead is marked as spam or invalid
- •Lead unsubscribes
Error Handling
If form submission fails: log error, notify admin, do not lose form data (store in pending queue)
Duplicate Prevention
Match on email + company within 90 days; update existing record, do not create duplicate
Opportunity Movement
Enter New Lead Pipeline → Stage: New
Funnel Form Submitted
Trigger
Form submission with funnel field populated
Re-Entry Policy
One entry per funnel slug per contact; subsequent submissions of same funnel update existing record
Filters
- •Funnel slug matches one of 8 defined funnels
- •All required fields present
Conditions
- •Qualification stage not yet completed for this funnel
Actions
- •Tag contact with funnel slug
- •Create or update Opportunity in funnel-specific pipeline stage
- •Log funnel form submission timestamp
- •Set funnel stage = 'form-submitted'
Internal Notifications
- •Notify funnel owner: 'New funnel submission: [Funnel Name] — [Contact Name]'
Tag Changes
- + funnel:[slug]
- + stage:form-submitted
Field Updates
- Funnel
- Funnel Stage
- Funnel Entry Date
Email Actions
- •Trigger funnel-specific thank-you email sequence
Task Creation
- •Create task: 'Funnel follow-up — send resource within 1 business day'
Exit Criteria
- •Contact moves to qualification stage
- •Contact opts out
Error Handling
Retry form processing up to 3 times; escalate to manual review on failure
Duplicate Prevention
Match contact email + funnel slug; update existing opportunity stage
Assessment Completed
Trigger
Assessment result submitted (Growth Index, Revenue Leak Assessment, etc.)
Re-Entry Policy
Re-entry allowed after 90 days for same assessment type (re-assessment permitted)
Filters
- •Assessment type is recognized
- •Score field is numeric
- •Email is present
Branches
Waits
- ⏱Wait 5 minutes after assessment completion before sending email (allows for reflection)
Actions
- •Store assessment score, score band, and key findings
- •Store top 3 strengths and top 3 weaknesses
- •Tag with assessment type and score band
Internal Notifications
- •Notify rep: 'Assessment completed — [Type] — Score: [Score] — [Contact Name]'
Tag Changes
- + assessment:[type]
- + score-band:[band]
Field Updates
- Assessment Type
- Assessment Score
- Assessment Date
- Top Strengths
- Top Weaknesses
Email Actions
- •Trigger 'Assessment Results' email with personalized recommendations
Task Creation
- •If qualified: create task 'Reach out for Strategy Call within 24 hours'
Exit Criteria
- •Contact engages with follow-up email
- •Contact books Strategy Call
- •60 days without engagement → move to nurture
Error Handling
Store assessment data locally before sending; retry on failure
Duplicate Prevention
Latest assessment of each type overwrites previous score and recommendations
Calculator Completed
Trigger
Calculator form submitted with result data
Re-Entry Policy
Re-entry allowed after 30 days (user may re-calculate with updated numbers)
Filters
- •Calculator type is recognized
- •Result fields are populated
Waits
- ⏱Wait 2 minutes before sending results email
Actions
- •Store calculator inputs and results
- •Tag with calculator type
- •Map calculator type to recommended next resource
Internal Notifications
- •Log: 'Calculator completed — [Type] — [Email]' (no immediate rep action required)
Tag Changes
- + calculator:[type]
- + result:[band]
Field Updates
- Calculator Type
- Calculator Result
- Calculator Date
Email Actions
- •Trigger calculator-specific follow-up email with results summary
Task Creation
- •If annual loss > $50k: create task 'High-value calculator result — prioritize follow-up'
Exit Criteria
- •Email delivered
- •Contact clicks CTA in follow-up email
Error Handling
Queue results email; retry up to 5 times over 24 hours
Duplicate Prevention
Store latest result; append to calculation history
Worksheet Accessed
Trigger
Worksheet page view (or print action)
Re-Entry Policy
Per-worksheet: new access resets follow-up timer
Filters
- •Worksheet slug is recognized
- •Visitor is not a bot
Actions
- •Log worksheet access
- •Increment worksheet engagement counter
Internal Notifications
- •Daily aggregate report: 'Worksheet activity — [count] accesses across [N] worksheets'
Tag Changes
- + resource:worksheet:[slug]
Field Updates
- Last Worksheet Access
- Worksheet Access Count
- Worksheets Accessed (multi-select)
Email Actions
- •If known contact: trigger 'Worksheet Follow-Up' sequence after 24 hours
Task Creation
None
Exit Criteria
- •Follow-up email sent
- •Contact unsubscribes
Error Handling
Non-critical; log failures, do not retry
Duplicate Prevention
Deduplicate within 24-hour window per worksheet per contact
Qualification Completed
Trigger
Funnel qualification step submitted
Re-Entry Policy
One qualification per funnel slug per contact; re-qualify only if significant data changes
Filters
- •Qualification answers recorded
- •Outcome assigned
Branches
Actions
- •Store qualification outcome and reasoning
- •Store all qualification answers as contact fields
- •Update contact stage based on outcome
Internal Notifications
- •If qualified: notify rep immediately
- •If not-suitable: log for weekly review
Tag Changes
- + qual-outcome:[outcome]
- + qual-date:[date]
Field Updates
- Qualification Outcome
- Qualification Date
- Qualification Answers (JSON)
- Decision Authority
- Lead Volume
- CRM Status
- Response Time
- Revenue Objective
Email Actions
- •Trigger outcome-specific email sequence
Task Creation
- •If qualified: create task 'Strategy Call outreach — 24-hour SLA'
Exit Criteria
- •Strategy Call booked
- •Email sequence delivered
- •Contact unsubscribes
Error Handling
Store qualification data before processing; escalate incomplete qualifications for manual review
Duplicate Prevention
Match on contact + funnel slug; update existing qualification record
Opportunity Movement
Qualified → enter Qualified Lead Pipeline stage 1; Education → enter Nurture Pipeline; Resource → enter Nurture Pipeline
Strategy Call Booked
Trigger
Calendly webhook: event created with CJM event type
Re-Entry Policy
Re-book allowed after 14 days from last booking; updates existing opportunity
Filters
- •Event type = Strategy Session
- •Email is present
- •Date is in the future
Conditions
- •No existing Strategy Call booked for this contact within 14 days
Actions
- •Create or update Contact
- •Update Opportunity stage to 'Strategy Call Scheduled'
- •Store call date, time, and Calendly event URI
- •Cancel any pending callback tasks
Internal Notifications
- •Notify Cecil: 'Strategy Call booked — [Name] — [Date] [Time] — [Funnel/Source]'
Tag Changes
- + strategy-call-booked
- + call-date:[date]
Field Updates
- Strategy Call Date
- Strategy Call Time
- Calendly Event URI
- Booking Source
Email Actions
- •Immediately: 'Strategy Call Confirmation' with calendar invite
- •24 hours before call: 'Strategy Call Reminder' with preparation link
- •1 hour before call: 'See You Soon' brief reminder
Task Creation
- •Create task: 'Prepare for Strategy Call — review qualification and calculator results' due 2 hours before call
Exit Criteria
- •Call occurs (attended or no-show)
- •Contact cancels
- •Contact reschedules
Error Handling
If Calendly webhook fails, check for new bookings hourly via Calendly API polling
Duplicate Prevention
Match on Calendly event URI; ignore duplicate webhooks
Opportunity Movement
Move to Strategy Call Pipeline → Stage: Scheduled
Strategy Call Reminder
Trigger
24 hours before scheduled Strategy Call (scheduled automation)
Re-Entry Policy
N/A — scheduled automation, one-time execution
Filters
- •Call status = Scheduled
- •Contact has not cancelled
Actions
- •Send reminder email with strategy call preparation link
Internal Notifications
Tag Changes
Field Updates
- Last Reminder Sent
Email Actions
- •Trigger 'Strategy Call Reminder — 24 Hours' email
Task Creation
None
Exit Criteria
- •Email sent
Error Handling
Log delivery failure; do not resend
Duplicate Prevention
Check 'Last Reminder Sent' timestamp; do not send if within 23 hours
Strategy Call Attended
Trigger
Post-call action: rep marks call as 'Attended'
Re-Entry Policy
Contact may re-enter after 90 days with new Strategy Call booking
Filters
- •Call outcome = Attended
- •Notes field populated
Branches
Actions
- •Update Opportunity stage based on outcome
- •Store call notes and recommendations
- •Reset contact touch timer
Internal Notifications
- •Notify Cecil: 'Strategy Call completed — [Name] — Outcome: [Outcome]'
Tag Changes
- + call-attended
- + call-outcome:[outcome]
- - strategy-call-booked
Field Updates
- Strategy Call Outcome
- Call Notes
- Recommended Next Step
- Last Call Date
Email Actions
- •Trigger outcome-specific follow-up sequence
Task Creation
- •Create task based on outcome: send proposal / send resources / send referral
Exit Criteria
- •Next action completed
- •Contact unresponsive after 3 follow-ups
Error Handling
Require manual confirmation before automated follow-up; rep verifies notes and outcome
Duplicate Prevention
One 'Attended' outcome per Strategy Call booking
Opportunity Movement
Move based on outcome branch
Strategy Call No-Show
Trigger
30 minutes after scheduled call time with no attendance marker
Re-Entry Policy
Contact may rebook; second no-show triggers manual review
Filters
- •Call status = Scheduled
- •30+ minutes past scheduled time
Conditions
- •Contact has not rescheduled
- •This is the first no-show for this contact
Branches
Waits
- ⏱Wait 30 minutes past scheduled time before triggering
Actions
- •Update opportunity stage to 'No-Show'
- •Log no-show count
- •Send recovery email
Internal Notifications
- •Notify rep: 'Strategy Call No-Show — [Name] — [Scheduled Time]'
Tag Changes
- + no-show
- + no-show-count:[N]
Field Updates
- No-Show Count
- Last No-Show Date
Email Actions
- •Trigger 'Missed Appointment — Rebook' email with direct booking link
Task Creation
- •Create task: 'Reach out personally — missed Strategy Call' due within 2 hours
Exit Criteria
- •Contact rebooks within 72 hours
- •Contact explicitly declines to reschedule
- •72 hours without response → move to nurture
Error Handling
Check for Calendly cancellation webhook before marking no-show (avoid race condition)
Duplicate Prevention
Only trigger no-show once per scheduled call
Opportunity Movement
Move to Strategy Call Pipeline → Stage: No-Show
Strategy Call Rescheduled
Trigger
Calendly webhook: event rescheduled
Re-Entry Policy
Each reschedule updates the existing opportunity
Filters
- •Event type = Strategy Session
- •New date/time differs from original
Actions
- •Update opportunity with new call date/time
- •Cancel existing reminder automation for old time
- •Schedule new reminders for new time
- •Send reschedule confirmation email
Internal Notifications
- •Notify rep: 'Strategy Call rescheduled — [Name] — Old: [Old Time] → New: [New Time]'
Tag Changes
- − call-date:[old-date]
- + call-date:[new-date]
Field Updates
- Strategy Call Date
- Strategy Call Time
- Reschedule Count
Email Actions
- •Trigger 'Strategy Call Rescheduled' confirmation email
Task Creation
- •Update existing preparation task with new due date
Exit Criteria
- •Reminders rescheduled
Error Handling
If cancellation of old reminders fails, manual cleanup task created
Duplicate Prevention
Match on Calendly event URI; this is an update to existing, not a new booking
Paid Session Booked
Trigger
Paid Strategy Session booking event (manual or payment-linked)
Re-Entry Policy
New paid session allowed after previous session completed
Filters
- •Session type = Paid Strategy Session
- •Payment confirmed (if applicable)
Conditions
- •Contact has completed a free Strategy Call
- •Paid session was recommended
Actions
- •Update opportunity to Paid Session Pipeline
- •Send paid session confirmation with preparation requirements
- •Schedule reminders
Internal Notifications
- •Notify Cecil and operations: 'Paid Session booked — [Name] — [Date] [Time] — [Amount]'
Tag Changes
- + paid-session-booked
- + paid-session-date:[date]
Field Updates
- Paid Session Date
- Paid Session Amount
- Paid Session Type
Email Actions
- •Trigger 'Paid Strategy Session — Confirmation & Preparation' email
Task Creation
- •Create task: 'Prepare paid session deliverables — due 48 hours before session'
Exit Criteria
- •Session occurs
- •Contact cancels
- •Contact reschedules
Error Handling
Manual verification of payment before triggering workflow
Duplicate Prevention
Match on contact + session type; one active paid session booking per contact
Opportunity Movement
Move to Paid Session Pipeline → Stage: Booked
Proposal Sent
Trigger
Proposal document sent to contact (manual trigger by rep)
Re-Entry Policy
Revised proposal may be sent for same opportunity; resets follow-up timer
Filters
- •Proposal document ID is populated
- •Contact email is valid
Conditions
- •Opportunity is in Proposal Pipeline
Actions
- •Update opportunity stage to 'Proposal Sent'
- •Start proposal follow-up timer
- •Log proposal send date and document reference
Internal Notifications
- •Log: 'Proposal sent — [Contact Name] — [Proposal Value]'
Tag Changes
- + proposal-sent
- + proposal-date:[date]
Field Updates
- Proposal Send Date
- Proposal Value
- Proposal Document ID
- Proposal Status
Email Actions
- •Schedule proposal follow-up sequence (if no response)
Task Creation
- •Create task: 'Proposal follow-up #1 — 48 hours after send'
- •Create task: 'Proposal follow-up #2 — 5 days after send'
- •Create task: 'Proposal follow-up #3 — 10 days after send'
Exit Criteria
- •Proposal accepted
- •Proposal declined
- •Proposal expires (30 days without response)
Error Handling
Rep manually confirms proposal was delivered before marking stage
Duplicate Prevention
One active proposal per opportunity; revised proposal supersedes previous
Opportunity Movement
Move to Proposal Pipeline → Stage: Sent
Proposal Accepted
Trigger
Proposal acceptance received (manual trigger by rep)
Re-Entry Policy
N/A — terminal state for this opportunity
Filters
- •Opportunity is in Proposal Pipeline, stage = Sent
- •Acceptance confirmed
Actions
- •Update opportunity to Closed-Won
- •Create onboarding project
- •Send onboarding kickoff email
- •Cancel all proposal follow-up tasks
Internal Notifications
- •Notify Cecil: 'Proposal accepted — [Contact Name] — [Value]'
- •Notify operations: 'New client onboarding — [Contact Name]'
Tag Changes
- + client
- + proposal-accepted
- - proposal-sent
Field Updates
- Close Date
- Deal Value
- Client Since
- Onboarding Status
Email Actions
- •Trigger 'Welcome to CJM — Client Onboarding' email sequence
Task Creation
- •Create onboarding project with milestone checklist
Exit Criteria
- •Onboarding project created
Error Handling
Double-confirm acceptance before moving to Closed-Won (prevent accidental closure)
Duplicate Prevention
N/A — terminal state
Opportunity Movement
Move to Proposal Pipeline → Stage: Closed-Won
Proposal Declined
Trigger
Proposal declined (manual trigger by rep)
Re-Entry Policy
Contact may re-enter via new lead or referral path; minimum 90-day cooling period
Filters
- •Decline reason recorded
Branches
Actions
- •Update opportunity to Closed-Lost
- •Store decline reason
- •Schedule re-engagement if appropriate
Internal Notifications
- •Notify Cecil: 'Proposal declined — [Contact Name] — Reason: [Reason]'
Tag Changes
- + proposal-declined
- + decline-reason:[reason]
- - proposal-sent
Field Updates
- Close Date
- Decline Reason
- Re-engagement Date (if applicable)
Email Actions
- •Trigger 'Proposal Declined — Thank You' email
Task Creation
- •If re-engagement scheduled: create task for future follow-up date
Exit Criteria
- •Post-decline email sent
- •Re-engagement task created
Error Handling
Require decline reason before marking Closed-Lost
Duplicate Prevention
N/A — terminal state
Opportunity Movement
Move to Proposal Pipeline → Stage: Closed-Lost
Proposal Stale
Trigger
30 days after proposal sent with no response
Re-Entry Policy
Contact may re-enter via new inquiry or referral
Filters
- •Opportunity stage = Sent
- •No contact activity in 14 days
Conditions
- •3 follow-up attempts completed
Waits
- ⏱Wait 30 days from proposal send date
Actions
- •Update opportunity to Closed-Lost — No Response
- •Move contact to long-term nurture
- •Send final follow-up email
Internal Notifications
- •Notify rep: 'Proposal stale — [Contact Name] — 30 days no response'
Tag Changes
- + stale-proposal
- + moved-to-nurture
Field Updates
- Close Date
- Close Reason = 'No Response'
Email Actions
- •Trigger 'Checking In — One Last Time' email
Task Creation
None
Exit Criteria
- •Email sent
- •Contact re-engaged
Error Handling
Rep must confirm follow-ups were completed before auto-closing
Duplicate Prevention
Only auto-close once per opportunity
Opportunity Movement
Move to Proposal Pipeline → Stage: Closed-Lost
Client Onboarding Started
Trigger
Onboarding project created (from Proposal Accepted workflow)
Re-Entry Policy
N/A — one-time per client
Filters
- •Onboarding checklist template assigned
- •Client contact is active
Actions
- •Create onboarding project from template
- •Assign onboarding milestones with due dates
- •Send welcome package
Internal Notifications
- •Notify operations team: 'Onboarding started — [Client Name]'
Tag Changes
- + onboarding-started
- + onboarding-date:[date]
Field Updates
- Onboarding Start Date
- Onboarding Status = 'In Progress'
- Client Since
Email Actions
- •Trigger 'Client Onboarding — Welcome' email sequence
Task Creation
- •Create milestone tasks with dependencies
- •Create 7-day check-in task
- •Create 30-day review task
Exit Criteria
- •All onboarding milestones completed
- •Client cancels during onboarding
Error Handling
Manual onboarding kickoff call with client before automated sequence begins
Duplicate Prevention
One active onboarding per client
Opportunity Movement
Move to Client Onboarding Pipeline → Stage: Started
Client Onboarding Completed
Trigger
All onboarding milestones marked complete
Re-Entry Policy
N/A — terminal onboarding state
Filters
- •Onboarding checklist 100% complete
- •Client confirmed satisfaction
Actions
- •Move client to Active Client Pipeline
- •Schedule first monthly review
- •Assign ongoing success manager
Internal Notifications
- •Notify Cecil and ops: 'Onboarding complete — [Client Name] — Active'
Tag Changes
- + active-client
- + onboarding-complete
- - onboarding-started
Field Updates
- Onboarding Status = 'Complete'
- Onboarding Completion Date
- Success Manager
Email Actions
- •Trigger 'Onboarding Complete — What's Next' email
Task Creation
- •Create recurring monthly review task
- •Create quarterly business review task
Exit Criteria
- •N/A — ongoing state
Error Handling
Require client satisfaction confirmation before marking complete
Duplicate Prevention
One completion per onboarding project
Opportunity Movement
Move to Active Client Pipeline → Stage: Active
Referral Requested
Trigger
Manual trigger: rep sends referral request
Re-Entry Policy
Re-request after 90 days
Filters
- •Client is active
- •Client NPS ≥ 7 (or known satisfaction)
Conditions
- •No referral request sent within 90 days
Waits
- ⏱Wait until 90 days after onboarding complete or last referral request
Actions
- •Send personalized referral request email
- •Generate referral link for client
Internal Notifications
- •Log: 'Referral requested — [Client Name]'
Tag Changes
- + referral-requested
- + referral-request-date:[date]
Field Updates
- Last Referral Request Date
- Referral Request Count
Email Actions
- •Trigger 'Referral Request' email with client-specific referral link
Task Creation
- •Create task: 'Follow up on referral request — 14 days'
Exit Criteria
- •Referral received
- •Client declines to refer
- •14 days without response
Error Handling
Ensure referral link is trackable and works before sending
Duplicate Prevention
One referral request per client per quarter
Dormant Opportunity Reactivation
Trigger
90 days after last contact engagement with no activity
Re-Entry Policy
After 180 days of continued dormancy following a failed reactivation sequence
Filters
- •Contact is not a client
- •Contact has not unsubscribed
- •Last engagement > 90 days
Conditions
- •At least 3 prior touchpoints exist
Waits
- ⏱Wait 90 days from last engagement
Actions
- •Add to dormant reactivation sequence
- •Send re-engagement email #1
Internal Notifications
- •Weekly report: 'Dormant contacts entering reactivation — [Count]'
Tag Changes
- + dormant
- + reactivation-sequence:started
Field Updates
- Dormant Date
- Reactivation Sequence Start Date
Email Actions
- •Trigger 'Dormant Lead Reactivation' email sequence (3 emails over 30 days)
Task Creation
None
Exit Criteria
- •Contact engages (opens, clicks, replies)
- •Contact unsubscribes
- •Full sequence delivered with no engagement → mark inactive
Error Handling
Remove bounced emails from dormant list immediately
Duplicate Prevention
One active reactivation sequence per contact
Quarterly Review
Trigger
90 days after last quarterly review (scheduled automation)
Re-Entry Policy
Recurring every 90 days
Filters
- •Client is active
- •Client has been active for > 90 days
Waits
- ⏱Align to calendar quarter (Jan, Apr, Jul, Oct)
Actions
- •Generate quarterly performance report
- •Schedule review call
- •Send pre-review questionnaire
Internal Notifications
- •Notify success manager: 'Q[#] review due — [Client Name]'
Tag Changes
- + quarterly-review:[quarter]
Field Updates
- Last Quarterly Review Date
- Next Quarterly Review Date
Email Actions
- •Trigger 'Quarterly Business Review — Schedule Your Call' email
Task Creation
- •Create task: 'Prepare Q[#] review deck for [Client]' due 7 days before review
Exit Criteria
- •Review call completed
Error Handling
Auto-generate report from dashboard data; flag if data is incomplete
Duplicate Prevention
One active quarterly review per client per quarter
Annual Review
Trigger
365 days after client onboarding or last annual review
Re-Entry Policy
Recurring annually
Filters
- •Client is active
- •Client tenure ≥ 12 months
Actions
- •Generate comprehensive annual report
- •Calculate year-over-year metrics
- •Schedule annual strategy session
- •Send client satisfaction survey
Internal Notifications
- •Notify Cecil: 'Annual review due — [Client Name] — Tenure: [Years]'
Tag Changes
- + annual-review:[year]
Field Updates
- Last Annual Review Date
- Next Annual Review Date
- Annual Review Year
Email Actions
- •Trigger 'Annual Strategy Review — Let's Plan Your Next Year' email
Task Creation
- •Create task: 'Prepare annual review — comprehensive performance analysis' due 14 days before review
Exit Criteria
- •Annual review completed
- •Annual strategy plan delivered
Error Handling
Pre-review: verify all data integrations are current
Duplicate Prevention
One annual review per client per year
