RoyCo Roofing · Lead Form + Estimate + Reviews + A2P
0/ 0 done
CONSOLE BUILD STANDARD
What this RoyCo console must always contain
This is the standard for the console itself. It is not a patch diary. Use it to check whether the build instructions are clear enough to follow inside HighLevel without extra guessing.
1 · All automations must mirror the exact GHL screen
Every automation section must show Exact GHL Screen Values, In Order. The wording must match the HighLevel workflow builder panel: trigger, filters, action name, scenario recipe, branch name, operator, value, save action, and where the next step goes.
2 · Every numbered canvas/action step needs a matching screen card
If the flowchart has node 07, there must be a matching 07 screen-value card and a matching action-table row. No grouped summaries that skip the exact panel values.
3 · Flowchart nodes must be clickable
Clicking a numbered flowchart node must jump to the matching GHL screen card or action-table row. The clicked target should flash so the builder knows exactly where they landed.
4 · Add-only patch rule
New improvements should add clarity without removing existing scaffolding. Do not remove the screen-value canvas, branch helper cards, numbered flowchart, action table, QA steps, or rationale blocks unless the operator explicitly asks to remove them.
5 · Teach while building
The PLAN pane should explain why each step exists: why the trigger is used, why the filter is mandatory, why Find Opportunity comes before Create/Update Opportunity, why each branch exists, and what breaks if skipped.
6 · Current RoyCo scope
Three workflows are active now, sequenced by dependency: WF04 New Lead Form Follow-Up, WF02 Estimate Sent Follow-Up, and WF01 Future Completed Project Review Request. The active Sales Pipeline is New Lead → Contacted → Estimate Sent → Project Won → Project Completed → Closed Lost — Project Completed is active because it triggers WF01. WF03 Missed Call Capture is parked in Future Expansion (content preserved, not deleted). A2P is included as a checklist, but customer SMS stays inactive until approval.
7 · Opportunity panel fields must be included
Create/Update Opportunity steps must include the full GHL panel values: Action Name, In Pipeline, In Pipeline Stage, Opportunity Name, Opportunity Source, Opportunity Value, Status, both duplicate/move toggles, and Save Action. Green tag pills must jump to the Tags section so names can be verified.
3 active workflows · A2P-ready · sequenced by dependency
The Build
RoyCo client info + website/brand pull + exact GHL build SOP. Expand each item for the no-sweat step list · click any title to see it in the plan →
0% completeStart with Phase 1
00 · CURRENT SCOPE
RoyCo Roofing — 3 active workflows
Where in GHL: Settings + Opportunities + Sites + Automation
This console is the full no-sweat build SOP for RoyCo Roofing. It preserves the deep dropdown checklist, client details, website/brand pull, fields, tags, form, workflow steps, QA, and A2P readiness — but only 3 workflows are active now.
Build only these now, in this order: WF04 New Lead Form Follow-Up, WF02 Estimate Sent Follow-Up, WF01 Future Completed Project Review Request. WF03 Missed Call Capture is parked in Future Expansion — content preserved, not deleted.
Email-first MVP. Customer SMS/Text stays OFF until A2P 10DLC is approved. The active workflows run on email + internal alerts + tasks. WF01 review requests fire when an opportunity reaches the Project Completed stage.
Every trigger must have a filter. Form Submitted must include Form = Sales – Lead Capture Form (WF04). Pipeline Stage Changed must include BOTH Pipeline = Sales Pipeline AND Stage = Estimate Sent (WF02), or BOTH Pipeline = Sales Pipeline AND Stage = Project Completed (WF01).
Client facts to verify
Client
RoyCo Roofing
Website
roycoroof.com
Email
info@roycoroof.com
Phone
(913) 730-7663
Address
1142 Merriam Ln, Kansas City, KS 66103
Timezone
America/Chicago (Central Time)
Current MVP
Lead form follow-up, estimate follow-up sequences, and review requests for future completed projects (WF04 · WF02 · WF01)
Verified business profile details: legal/business name, address, phone, website, business hours
Business email sender + access to DNS for SPF/DKIM on roycoroof.com
GHL phone number forwarding destination — the real RoyCo line
Internal alert recipient email(s) and default opportunity owner
Website edit access or embed destination for Sales – Lead Capture Form
Owner/signature preference: “The RoyCo Roofing Team” unless RoyCo confirms a named signer
A2P documents for SMS phase: EIN/CP-575 or tax document, legal name/address, authorized representative, Privacy Policy, Terms, consent language
00b · BUILDER ORIENTATION
How to use this console while learning HighLevel
Use this before building workflows. The left side is your checklist. The right side teaches why each piece exists and gives the exact right-panel values to enter inside GHL.
You can rely on this console even if you have not finished your HighLevel module yet. Do not try to memorize GHL first. Build one numbered step at a time: click the chart node, read the screen-value card, enter the values in GHL, save, then check it off.
TriggerThe event that starts the workflow. Example: a call is missed, a form is submitted, or an opportunity enters Estimate Sent.
FilterThe guardrail that stops the workflow from firing on the wrong event. Every trigger in this console has filters.
ActionThe thing GHL does after the trigger: find an opportunity, create/update a pipeline card, send an email, create a task, add a note, or wait.
If / ElseA branch point. GHL checks a condition, then sends the contact down one path or the None path.
Why every trigger has filters
A trigger without filters is too broad. For example, Call details could fire for answered calls, outbound calls, voicemails, or unrelated calls unless you filter it. That is why WF03 uses Call status contains any of no-answer and Call direction is Incoming. Same logic for Form Submitted and Pipeline Stage Changed.
Why Find Opportunity comes before Create/Update Opportunity
Find Opportunity checks whether the person already has an open card in the Sales Pipeline. Without it, returning leads can create duplicate pipeline cards. The rule here is: find first, then update if found, create/update if not found.
How to read every workflow section
Each active workflow follows the same learning order: purpose → settings → exact GHL screen values → clickable chart → action table → QA test. If the flowchart has number 07, there must be a matching 07 card or table row with the exact GHL panel fields.
Do not improvise inside GHL
If a field label in your account looks slightly different, pause and match the closest visible GHL label. Do not add extra filters, extra waits, or extra branches unless the console tells you to. Extra logic can stop leads from entering the pipeline or can make automations silently miss people.
The mental model for RoyCo
WF04 protects web form leads. It creates/updates the pipeline, sends the first email response, and alerts the team.
WF02 protects estimates. Once RoyCo moves someone to Estimate Sent, the workflow follows up until the estimate is won, lost, or completed.
WF01 protects reputation + repeat revenue. When a job hits Project Completed it asks the homeowner for a Google review, then reminds once if none is left.
A2P protects SMS compliance. Until it is approved, customer SMS stays off and email/internal alerts carry the build.
WF03 (Future) missed-call capture is parked in Future Expansion — fully documented, not active in this build.
01b · ROYCO BRAND KIT
Royco web brand pull
Source: roycoroof.com + contact-us page source. Use this as the working brand reference for GHL emails, forms, calendars, and handoff notes.
Royco presents as a premium Kansas City roofing and exteriors company: boutique service, high craftsmanship, reliable homeowner care, and certified roofing expertise. Keep the build clean, direct, and service-forward.
Positioning
Kansas City's Premium Roofing Experts
Core Offer
Full Service Roofing & Exteriors
Tile Proof
50+ years of tile roofing experience; hundreds of tile roofs installed in Kansas City
Service Area
Kansas City Metro, Lawrence / Topeka, Lake of the Ozarks; examples include Leawood, Mission Hills, Overland Park, Olathe, Lee's Summit, Loch Lloyd
Color Tokens
Primary Navy#131A49 · rgba(19,26,73,1)
CTA Gold#BF985A · rgba(191,152,90,1)
White#FFFFFF · clean surface / dark hero text
Black#000000 · body text in source
Typography
Heading font
Cambria from Showit-hosted cambria.woff. Source uses serif display titles around 54px desktop / 36px mobile and 34px section headings / 26px mobile.
Body font
Montserrat regular. Source uses body around 17px desktop / 14px mobile with 1.6 line height.
Certification / association logos found in source: Ludowici, Better Business Bureau, GAF Authorized Commercial Roofing Contractor, TRI Manual Certified, Home Builders Association of Greater Kansas City, Select ShingleMaster
Video asset referenced in source: Royco Roofing expert roofer Kansas City MP4 key IF14rb1SEZ1kbK_S3Zz3IQ/310077/royco-roofing-expert-roofer-kansas-city.mp4. Confirm direct media URL before using in GHL or ads.
Social Links Found
Facebook
https://www.facebook.com/RoyCoRoof/
Instagram
https://www.instagram.com/roycoroofing/
LinkedIn
Confirm before use. Source shows a LinkedIn-style footer icon but the href observed pointed to Instagram.
TikTok
Not found on the official site in this scan. Confirm directly with Royco before adding.
02 · SETTINGS
Account settings & the easy-to-forget pieces
Where in GHL: Settings → Business Profile / Phone Numbers / Calendars / My Staff
Business profile, timezone, phone, calendars, team, and compliance footer. Skip these and emails hit spam, alerts go nowhere, and timers fire at the wrong time.
Business Profile
Business info — name, address, phone, website (Settings → Business Profile). Address feeds the email footer.
Timezone → America/Chicago (Central Time). Set before building workflows.
Business hours — keep automated emails in working hours.
Logo — email headers + booking pages.
Enable Contact Timezone — for Wait Until time-based steps; prevents timing issues if Royco expands beyond one timezone.
Business Profile Details — Verify Before Client Handoff
Verify before launch. These details should be manually verified before client presentation. Do not label ratings, license details, address, phone, social links, or business claims as verified unless source links are attached.
Provided / research draft — verify before launch
Name
RoyCo Roofing
Website
roycoroof.com
Email
info@roycoroof.com
Phone
(913) 730-7663
Address
1142 Merriam Ln, Kansas City, KS 66103
Hours
24/7 Live Answering (official contact page). Confirm office hours if needed for calendars.
Owner
Confirm preferred owner/signature name with Royco before publish
Reputation
Official site says Over 140 Google Reviews - 4.9 Stars. Confirm live Google count before publishing.
Set availability + buffers, confirmation & reminder emails; save link as Custom Value Booking Link.
Team & Notifications
Add Royco staff as users.
Set the internal-alert recipient (where missed-call / new-lead alerts land) and the default opportunity owner.
Compliance & Deliverability
CAN-SPAM footer on every template: physical address + one-click unsubscribe.
Without it, emails land in spam and hurt the sending domain.
03 · PIPELINE
Sales Pipeline — active stages
Where in GHL: Opportunities → Pipelines
One sales pipeline that captures leads, tracks follow-up, gives estimates a clear won/lost destination, and marks finished jobs so review requests can fire. Project Completed is an active stage because moving an opportunity into it triggers WF01. Reactivation stages can be added later.
Build steps:
Go to Opportunities → Pipelines
Click Create Pipeline
Name: Sales Pipeline
Add stages in exact order: New Lead → Contacted → Estimate Sent → Project Won → Project Completed → Closed Lost
Save. Copy these names exactly into workflow filters.
Critical: Workflow filters must match the pipeline and stage names exactly. Pipeline Stage Changed triggers must include BOTH Pipeline Name and Stage Name.
New Lead — auto-created/updated by WF04 after Find Opportunity
Contacted — RoyCo manually moves after first successful conversation
Estimate Sent — RoyCo manually moves after estimate is sent; this fires WF02
Project Won — RoyCo manually moves when job is accepted/booked
Project Completed — RoyCo manually moves when the roof is finished; this fires WF01 review requests
Closed Lost — RoyCo manually moves when the lead or estimate is not proceeding
Workflow: Sales – New Lead Form Follow-Up Workflow – v1
Workflow: Sales – Estimate Sent Follow-Up Workflow – v1
Form: Sales – Lead Capture Form
Email: Email – New Lead Welcome
Email: Email – Estimate Sent Day 0
Email: Email – Estimate Follow Up Day 2
Email: Email – Estimate Follow Up Day 5
Email: Email – Estimate Follow Up Day 10
Future naming after A2P: duplicate tested workflows, add SMS actions, and save as v2. Never edit live production workflows directly.
06 · TAG TAXONOMY
Tags SOP — exact names, usage, and blockers
Where in GHL: Settings → Tags
Tags are case-sensitive. Copy-paste exact names and do not create duplicate variations.
Build steps:
Go to Settings → Tags
Click Add Tag
Copy-paste exact tag name
Save
Do not create duplicates
Tags are case-sensitive
Active pipeline + review tags: New Lead, Contacted, Estimate Sent, Project Won, Project Completed, and Closed Lost are active now. review-request-sent, review-left, and stage-project-completed are active because WF01 review requests run off the Project Completed stage. WF03 / missed-call tags remain only as Future references.
Tag Name
Required or Optional
Used In
What Breaks If Missing
lead-source-website-form
Required
WF04 source attribution
Website form leads lose source reporting
lead-source-missed-call
Future Optional
WF03 source attribution
Missed-call leads lose source reporting
lead-source-database-reactivation
Future Optional
WF05 source attribution
Reactivation contacts lose source reporting
compliance-dnd-active
Required
Workflow guards, estimate tracking, reporting
compliance-dnd-active logic/reporting breaks if referenced
sequence-estimate-follow-up-active
Required
Workflow guards, estimate tracking, reporting
sequence-estimate-follow-up-active logic/reporting breaks if referenced
sequence-estimate-follow-up-won
Required
Workflow guards, estimate tracking, reporting
sequence-estimate-follow-up-won logic/reporting breaks if referenced
sequence-estimate-follow-up-lost
Required
Workflow guards, estimate tracking, reporting
sequence-estimate-follow-up-lost logic/reporting breaks if referenced
sequence-estimate-follow-up-no-reply
Required
Workflow guards, estimate tracking, reporting
sequence-estimate-follow-up-no-reply logic/reporting breaks if referenced
stage-new-lead
Required
Workflow tagging and stage reporting
stage-new-lead segment cannot be reported cleanly
stage-contacted
Required
Workflow tagging and stage reporting
stage-contacted segment cannot be reported cleanly
stage-estimate-sent
Required
Workflow tagging and stage reporting
stage-estimate-sent segment cannot be reported cleanly
stage-project-won
Required
Workflow tagging and stage reporting
stage-project-won segment cannot be reported cleanly
stage-project-completed
Required
WF01 review request (Project Completed stage)
WF01 cannot tag/segment completed jobs
review-left
Required
WF01 Review Left? branch
WF01 cannot detect a completed review
stage-closed-lost
Required
Workflow tagging and stage reporting
stage-closed-lost segment cannot be reported cleanly
lifecycle-prospect
Required
Lifecycle segmentation and campaign targeting
lifecycle-prospect segment cannot be targeted reliably
lifecycle-active-lead
Required
Lifecycle segmentation and campaign targeting
lifecycle-active-lead segment cannot be targeted reliably
lifecycle-customer
Required
Lifecycle segmentation and campaign targeting
lifecycle-customer segment cannot be targeted reliably
lifecycle-past-customer
Required
Lifecycle segmentation and campaign targeting
lifecycle-past-customer segment cannot be targeted reliably
lifecycle-lost-opportunity
Required
Lifecycle segmentation and campaign targeting
lifecycle-lost-opportunity segment cannot be targeted reliably
event-form-submitted
Required
Workflow event audit trail
event-form-submitted cannot be audited by tag
event-missed-call
Future Optional
Workflow event audit trail
event-missed-call cannot be audited by tag
event-estimate-sent
Required
Workflow event audit trail
event-estimate-sent cannot be audited by tag
review-request-sent
Required
WF01 already-asked guard + status
WF01 can double-ask the same homeowner
event-review-reminder-sent
Required
Workflow event audit trail
event-review-reminder-sent cannot be audited by tag
event-reactivation-sent
Future Optional
Workflow event audit trail
event-reactivation-sent cannot be audited by tag
event-reactivation-reply
Future Optional
Workflow event audit trail
event-reactivation-reply cannot be audited by tag
campaign-estimate-recovery
Required
Campaign reporting
campaign-estimate-recovery performance cannot be segmented
campaign-past-customer-reactivation
Future Optional
Campaign reporting
campaign-past-customer-reactivation performance cannot be segmented
lead-source-google-business
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
lead-source-referral
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
lead-source-manual-add
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
priority-urgent
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
priority-normal
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
priority-storm-damage
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
routing-sales-team
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
routing-estimator
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
routing-owner-follow-up
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
service-roof-repair
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
service-roof-replacement
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
service-storm-damage
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
campaign-google-review-push
Optional
Optional reporting/routing only if used
Nothing breaks unless a workflow or report references it
Verification Checklist
Apply each workflow-used tag to a test contact
Confirm workflows using tags fire only when intended
Confirm no duplicate versions exist
07 · CUSTOM FIELDS
Custom fields — one row per field, in GHL screen order
Where in GHL: Settings → Custom Fields
Build each field top-to-bottom in this exact order: Field type → Object → Field name → Folder name → Description → Options → Placeholder. Contact = person data; Opportunity = job / property / estimate. Review Link is a Custom Value, not a field.
Path: Settings → Custom Fields → Add Field. Rule: Contact fields = person-level data; Opportunity fields = job / project / property / estimate / review data. Property Street Address, City, State & ZIP are Opportunity fields — they belong to the roofing job, not the person. Verify: create a test contact + test opportunity and confirm each field lands on the right object with exact dropdown options.
Field Type
Object
Field Name
Folder Name
Description
Options
Placeholder Text
Dropdown
Contact
Preferred Contact Method
Royco – Contact Profile
How the customer prefers to be contacted.
Email, Phone Call, Text, Any
— (dropdown)
Single line
Contact
Lead Source Detail
Royco – Contact Profile
Extra detail on where the lead came from, beyond the source tag.
—
e.g., Google - metal roof
Single line
Opportunity
Property Street Address
Royco – Property Details
Street address of the property needing roofing work.
The customer's description of the roofing problem.
—
e.g., Active leak over kitchen; shingles missing
Dropdown
Opportunity
Project Type
Royco – Roofing Job Details
Residential, commercial, or multi-family / HOA.
Residential, Commercial, Multi-Family/HOA
— (dropdown)
Number
Opportunity
Roof Age
Royco – Roofing Job Details
Approx. age of the current roof, in years.
—
e.g., 18
Dropdown
Opportunity
Insurance Claim Status
Royco – Roofing Job Details
Claim stage if insurance is involved.
Not Applicable, Claim Started, Claim Approved, Claim Denied, Unknown
— (dropdown)
Dropdown
Opportunity
Preferred Inspection Window
Royco – Roofing Job Details
Preferred time of day for roof inspection scheduling.
Morning, Afternoon, Evening, Flexible
— (dropdown)
Monetary
Opportunity
Estimate Amount
Royco – Estimate Tracking
Dollar value of the estimate sent.
—
e.g., 12500
Date picker
Opportunity
Estimate Sent Date
Royco – Estimate Tracking
Date the estimate was sent (drives WF02).
—
— (date picker)
Date picker
Opportunity
Inspection Date
Royco – Estimate Tracking
Scheduled roof inspection date.
—
— (date picker)
Date picker
Opportunity
Project Start Date
Royco – Project Tracking
Date the crew is scheduled to start.
—
— (date picker)
Date picker
Opportunity
Project Completed Date
Royco – Project Tracking
Active. Records when the job finished; the Project Completed stage move triggers WF01 review requests.
—
— (date picker)
Dropdown
Opportunity
Google Review Status
Royco – Review Tracking
Review request status for the completed job.
Not Requested, Requested, Reminder Sent, Review Left
— (dropdown)
Rule: Contact = person data. Opportunity = job / project / property / estimate data. Custom Value = reusable business info.
Opportunity field warning: Property ZIP Code, Street Address, City, State, County, Service Interest, Estimate Amount, Project Completed Date, and Google Review Status must be Opportunity fields because they belong to the roofing job, not the person.
Verification Checklist
Create a test contact
Create a test opportunity
Confirm Contact fields appear on Contact
Confirm Opportunity fields appear on Opportunity
Confirm dropdown options match exactly
Confirm Review Link is not created as a field
08 · CUSTOM VALUES
Custom Values — step-by-step (matches the GHL screen)
Where in GHL: Settings → Custom Values
Custom Values are account-wide reusable merge values. They are not tied to one contact or one opportunity. Use them for business info and links that repeat across emails, workflows, forms, and templates.
Path: Settings → Custom Values → Add Folder / Add Custom Value. Create the folder first, then add the values inside it.
Rules
Create the folder first.
Do not include the folder name inside the Custom Value name.
Use clean names like Business Name, not "Royco - Business Name." The folder organizes the value.
GHL auto-generates the merge key from the Name field.
After creating each value, copy the actual merge key from GHL and confirm it matches your templates.
Correct GHL merge format examples are {{custom_values.business_name}} and {{custom_values.review_link}}. Do not use the singular custom_value format.
If GHL generates a slightly different key, use the key shown inside GHL and update the templates to match.
Create these folders first
Folder
Royco - Business Info
Folder
Royco - Links
Folder
Royco - Social Links (optional)
Values to create
#
Where in GHL
Name to Type
Value to Type
Folder
Expected Merge Key
Used In
Verify Before Publish
Snapshot Action
1
Settings → Custom Values → Add Custom Value
Business Name
RoyCo Roofing
Royco - Business Info
{{custom_values.business_name}}
Email copy, signatures, templates
Send test email and confirm RoyCo Roofing displays correctly
Clear value before reusable snapshot
2
Settings → Custom Values → Add Custom Value
Business Phone
(913) 730-7663
Royco - Business Info
{{custom_values.business_phone}}
Missed call follow-up, email body, signatures
Confirm phone number with Royco
Clear value before snapshot
3
Settings → Custom Values → Add Custom Value
Business Email
info@roycoroof.com
Royco - Business Info
{{custom_values.business_email}}
Email footer, contact info, templates
Confirm sender email and domain match
Clear value before snapshot
4
Settings → Custom Values → Add Custom Value
Business Address
1142 Merriam Ln, Kansas City, KS 66103
Royco - Business Info
{{custom_values.business_address}}
CAN-SPAM footer, email footer
Confirm physical business address
Clear value before snapshot
5
Settings → Custom Values → Add Custom Value
Website URL
https://roycoroof.com
Royco - Business Info
{{custom_values.website_url}}
Email templates, footer, links
Click test link
Clear value before snapshot
6
Settings → Custom Values → Add Custom Value
Business Hours
24/7 Live Answering
Royco - Business Info
{{custom_values.business_hours}}
Email copy, customer expectations
Confirm hours with Royco
Clear value before snapshot
7
Settings → Custom Values → Add Custom Value
Service Area
Kansas City Metro, Lawrence / Topeka, Lake of the Ozarks
Royco - Business Info
{{custom_values.service_area}}
Lead qualification copy, templates
Confirm service area with Royco
Clear value before snapshot
8
Settings → Custom Values → Add Custom Value
Owner Signature Name
The RoyCo Roofing Team (confirm if Drew / Andrew should sign)
Royco - Business Info
{{custom_values.owner_signature_name}}
Email signatures, closing lines
Confirm preferred sign-off
Clear value before snapshot
9
Settings → Custom Values → Add Custom Value
Review Link
Add Royco Google review URL here
Royco - Links
{{custom_values.review_link}}
Review Request Workflow (WF01)
Click test link; opens Google review page
Clear value before snapshot
10
Settings → Custom Values → Add Custom Value
Booking Link
Add GHL calendar booking URL here
Royco - Links
{{custom_values.booking_link}}
Lead Form / Estimate Follow-Up, appointment CTAs
Click test link; opens calendar
Clear value before snapshot
11
Settings → Custom Values → Add Custom Value
Facebook URL
https://www.facebook.com/RoyCoRoof/
Royco - Social Links
{{custom_values.facebook_url}}
Email footer, future campaigns, brand links
Click test link
Clear value before reusable snapshot
12
Settings → Custom Values → Add Custom Value
Instagram URL
https://www.instagram.com/roycoroofing/
Royco - Social Links
{{custom_values.instagram_url}}
Email footer, future campaigns, brand links
Click test link
Clear value before reusable snapshot
13
Settings → Custom Values → Add Custom Value
LinkedIn URL
Confirm actual Royco LinkedIn URL before use
Royco - Social Links
{{custom_values.linkedin_url}}
Email footer, credibility links, future campaigns
Click test link
Clear value before reusable snapshot
14
Settings → Custom Values → Add Custom Value
TikTok URL
Confirm actual Royco TikTok URL before use; not found on official site in this scan
Royco - Social Links
{{custom_values.tiktok_url}}
Email footer, future campaigns, brand links
Click test link
Clear value before reusable snapshot
Launch blocker: Review Link missing = WF01 Review Request cannot launch. Booking Link missing = appointment CTAs cannot be used.
Snapshot: For reusable snapshots, keep the Custom Value names and folders, but clear the Royco-specific values before export.
Social links are optional for the Email-first MVP. Do not block launch if missing — unless the email templates use social links.
08b · LEAD FORM BUILD
Sales – Lead Capture Form
Where in GHL: Sites → Forms → Create New Form. This is the GHL form Royco needs before WF04 can be tested.
The official site currently uses a Showit contact form area. For the GHL build, create this form inside HighLevel, then embed or connect it to the website later. WF04 must filter to Form = Sales – Lead Capture Form.
Get a Roofing Estimate
Premium roofing help for Kansas City homeowners. Required fields are marked.
Create/update in Sales Pipeline → New Lead after Find Opportunity branch
Thank-you
Show: “Thanks — RoyCo Roofing received your request and will follow up shortly.” Optional redirect to booking link only after calendar is ready.
Test
Submit one real test form; confirm Contact fields, Opportunity fields, tags, internal notification, welcome email, and WF04 enrollment logs.
SMS consent wording for Phase 2: “I agree to receive text messages from RoyCo Roofing about my roofing request. Message and data rates may apply. Reply STOP to opt out.” Do not send SMS until A2P 10DLC is approved and opt-out handling is tested.
09 · WORKFLOW SETTINGS
Workflow settings at a glance — 3 active workflows
Where in GHL: Automation → Workflows → Settings
Every workflow must show name, folder, trigger, filter, execution type, stop-on-response, re-enrollment, guards, actions, and exits.
Workflow
Trigger
Mandatory Filter
Execution
Stop on Response
Re-enroll
Folder
WF04 — New Lead Form Follow-Up
Form Submitted
Form = Sales – Lead Capture Form
Execute Once
ON
OFF
Sales Pipeline
WF02 — Estimate Sent Follow-Up
Pipeline Stage Changed
Pipeline = Sales Pipeline AND Stage = Estimate Sent
Execute Once
ON
OFF
Sales Pipeline
WF01 — Future Completed Project Review Request
Pipeline Stage Changed
Pipeline = Sales Pipeline AND Stage = Project Completed
Execute Once
ON
OFF
Reviews
Parked / Future (not active — do not build now):
Workflow
Trigger
Mandatory Filter
Execution
Stop on Response
Re-enroll
Folder
WF03 — Missed Call Capture + Alert (PARKED)
Call Details
Call status contains any of no-answer AND Call direction is Incoming
Always
ON
ON
Future / Optional
SMS lock: Do not add or publish Send SMS actions until A2P approval is confirmed, consent is captured, and opt-out handling is tested.
Find Opportunity rule: WF03 and WF04 must run Find Opportunity before creating/updating the pipeline card. In the right-side GHL panel set Action Name = Find Opportunity, Opportunity To Be Found = Most recently created opportunity, and Fields = Pipeline | Is | Sales Pipeline. Found → Update Opportunity. Not Found → Create/Update Opportunity.
WF · BUILDER ORIENTATION
How to Build Workflows in GHL
Where in GHL: Automation → Workflows
Use this before touching any workflow canvas. The left checklist tells you what to finish; each Builder Steps table tells you the exact order to build inside HighLevel.
Builder Area
Used For
1. Top Bar
Workflow name, Save, Test Workflow, Draft / Publish toggle, Settings
Add actions in order from top to bottom, add If/Else branches, waits, emails, tags, opportunity actions
4. Right-Side Settings Panel
Configure each trigger/action, set branch conditions, select tags, fields, pipeline, stage, email templates, waits
5. Workflow Settings
Execution Type, Stop on Response, Re-enrollment
6. Testing / Logs
Test Workflow, Enrollment History, Execution Logs
When inside GHL, always build in this order: Trigger → Filter → Workflow Settings → Guard Conditions → Main Actions → Waits → If/Else → Cleanup → Save → Test → Publish.
Confirm exact label in this GHL account before publishing when a GHL trigger/action/operator label may vary by account.
WF · SCREEN-EXACT MODE
Match the exact GHL builder screen
Use this section when the canvas does not look like the chart. The chart is the logic. These cards tell you what to click in the right-side HighLevel panel.
What your screenshot shows
Trigger panel
Choose a Workflow Trigger → Call details
Trigger name field
Workflow Trigger Name = Call Details
Filters
Call status contains any of no-answer AND Call direction is Incoming
If / else panel
Action Name → Scenario Recipe → Branches → None branch
Important translation: in the console, “no-answer + Incoming” means the exact fields you see in your account: Call status contains any of no-answer and Call direction is Incoming.
AHow to add the first If / else guard
On the canvas, click the blue + under the trigger.
Search If / else and select it.
In the right panel, set Action Name to Check Do Not Contact.
For Scenario Recipe, choose Has tag. Do not choose Build your own for this guard.
Under Branches, rename the first branch to Has DNC Tag.
Select the tag compliance-dnd-active.
Leave the None branch as the continue path.
Has DNC Tag branch Add Remove From Workflow. This exits the contact.
None branch Add the next real action, normally Find Opportunity or Create/Update Opportunity.
No fake “End” action: HighLevel does not need an End box. Use Remove From Workflow only when you intentionally stop the contact. If the path is complete, simply stop adding actions.
WF · IF / ELSE
How to Fill Out GHL If/Else Conditions
Where in GHL: inside any workflow → Add Action → If/Else
Action Name
The question you are checking (e.g., Check Do Not Contact)
Branch Name
The Yes/condition result (e.g., Do Not Contact)
Select
The tag, field, stage, or result being checked
Operator
Is / Equals / Contains / Has Tag / Exists (use what GHL shows)
Value
The exact tag, stage, or field value
None branch
The No path — runs when the condition is NOT met
Every If/Else must have both a Yes/condition branch and a None/else branch. Every path must continue intentionally or end cleanly.
Filled examples
Action Name
Select
Operator
Value
Yes branch
None branch
Check Do Not Contact
Contact Tag
Has Tag / Contains
compliance-dnd-active
Exit / Remove From Workflow
Continue
Opportunity Found?
Find Opportunity result
Exists / Found
—
Update Opportunity
Create Opportunity
Already In Estimate Follow Up?
Contact Tag
Has Tag / Contains
sequence-estimate-follow-up-active
Exit
Continue
Won or Closed Lost?
Opportunity Stage
Is
Project Won OR Closed Lost
Remove sequence-estimate-follow-up-active + Exit
Continue follow-up
Review Left?
Opportunity Field: Google Review Status
Is
Review Left
End
Send reminder
Confirm exact operator labels in this GHL account before publishing — GHL wording for operators can vary by account/version.
WF · FIND OPPORTUNITY
How to fill out the Find opportunity panel
Where in GHL: Inside a workflow branch → click + → search Find opportunity → right-side panel opens.
Use this exact setup every time the console says Find Opportunity. This matches the right-side GHL panel you are seeing.
Find opportunity — exact right-panel values
FORight-side panel
Panel header
Find opportunity
Action Name
Find Opportunity
Opportunity To Be Found
Most recently created opportunity
Fields · Row 1
PipelineIsSales Pipeline
WHEREWhere this goes
Do not add this as a second trigger at the top of the workflow.
For WF03, add it under the None branch of Check Do Not Contact.
For WF04, add it under the None branch of Check Do Not Contact.
After this step, add the branch/condition that separates Found from Not Found / None, then create/update the Sales Pipeline opportunity.
Do not click Add field unless needed. For this MVP, one field is enough: Pipeline | Is | Sales Pipeline. Extra filters can make the workflow fail to find an existing lead.
WF · OPPORTUNITY PANEL
Create / Update Opportunity panel — build it field by field
Where in GHL: Inside a workflow branch → click + → Actions → Create/Update Opportunity.
Follow the fields below from top to bottom. Each instruction matches the order shown in RoyCo's HighLevel panel and tells you exactly what to enter for WF03 or WF04.
HighLevel notice shown on this screen: Create/Update Opportunity is being deprecated. Existing workflows remain unaffected, but HighLevel directs new builds toward its separate Create Opportunity and Update Opportunity actions. This card mirrors the panel currently open in RoyCo's account.
OPPComplete the panel from top to bottom
Panel header
Confirm the panel header says Create opportunity.
Action Name
Click the field and type Update Existing Opportunity → New Lead on a Found branch or Create Opportunity → New Lead on a Not Found branch.
In Pipeline
Open the dropdown and select Sales Pipeline.
In Pipeline Stage
Open the dropdown and select New Lead.
Opportunity Name
Click the tag-shaped merge-field picker → select Contact > Full Name. HighLevel inserts {{contact.name}}. Type - Missed Call immediately after it for WF03. For WF04, type - Roofing Lead.
Opportunity Source
Click inside the field and type Missed Call for WF03 or Website Form for WF04.
Opportunity Value
Leave this field blank. RoyCo has not supplied a default job value.
Status
Open the dropdown. Select Open.
Add field
Do not click Add field for this RoyCo MVP. No additional opportunity field is required here.
Allow opportunity to move to any previous stage in pipeline
Keep this toggle OFF.
Allow duplicate opportunities
Keep this toggle OFF. Find Opportunity checks for an existing Sales Pipeline card first.
Save
Click Save Action after checking every value above.
Builder check: Opportunity Name is dynamic because it uses the contact's Full Name merge field. Opportunity Source is fixed text for this workflow. The tag-shaped icon is a merge-field picker, not a Contact Tag control.
Tag matching rule: whenever the console shows a green tag pill, click it to jump to the Tags section and verify that the tag exists with the exact same spelling/case before using it in a workflow.
Not in the active build. WF03 is preserved here as a complete, ready-to-build reference. It is parked in Future Expansion (PHASE 8) and is not part of the active WF04 → WF02 → WF01 sequence. Build it later if RoyCo wants missed-call capture.
Where in GHL: Automation → Workflows → Missed Call Automation
Name: Calls – Missed Call Capture + Alert Workflow – v1Trigger: Call DetailsFilter: Call status contains any of no-answer AND Call direction is IncomingExecution: AlwaysStop on Response: ONRe-enroll: ON
Not a text-back yet. Until A2P is approved, this workflow captures the missed call, creates/updates the opportunity, alerts RoyCo, and creates a callback task. SMS action stays OFF.
Flowchart first: Start with this map. Click any numbered node to jump to the matching exact GHL screen-value card below.
Numbered Flowchart — WF03. Match every number to the GHL action table below.
Build rule: Every numbered canvas/action step below matches a numbered flowchart node. Click the node, then build the matching screen card. Do not skip branches; build the Yes branch and the None branch exactly where shown.
01Workflow Trigger screen — Call Details
Automation → Workflows → Missed Call Automation → Create Workflow → Start From Scratch → Add New Trigger
Choose trigger
Call details
Workflow Trigger Name
Call Details
Filter 1
Call status contains any of no-answer
Filter 2
Call direction is Incoming
Save
Click Save Trigger
This is the only trigger in WF03. Do not click Add New Trigger again inside the workflow.
02Add Action → If / else: Check Do Not Contact
Click + under the trigger → Actions → If / Else
Action Name
Check Do Not Contact
Scenario Recipe
Has tag
Branch Name
Has DNC Tag
Condition / Tag
compliance-dnd-active
None branch
Leave as the default None branch; this is where the workflow continues.
Has DNC Tag branch This branch means the contact should not be contacted. Add Step 03 here.
None branch This branch means no DNC tag was found. Add Step 04 here.
03Has DNC Tag branch → Remove From Workflow
Inside the Has DNC Tag branch → Click + → Actions → Remove From Workflow
Action Name
Remove From Workflow — DNC Exit
Workflow
This workflow / current workflow
After saving
Do not add more actions on this branch.
There is usually no separate End action in GHL. Removing from workflow is the clean stop for the DNC path.
04None branch → Find Opportunity
Inside the None branch after Check Do Not Contact → Click + → Actions → Find Opportunity
Action Name
Find Opportunity
Opportunity To Be Found
Most recently created opportunity
Fields
Pipeline | Is | Sales Pipeline
Save
Click Save Action
This is an action inside the None branch. Do not click Add New Trigger.
05Branch after Find Opportunity → Opportunity Found?
Directly below Find Opportunity → use the Find Opportunity result branches
Found branch
Use this path when the contact already has an opportunity in Sales Pipeline.
Not Found / None branch
Use this path when there is no matching opportunity yet.
Found / Opportunity Found Add Step 06A here.
Not Found / None Add Step 06B here.
06AFound branch → Create/Update Opportunity
Inside the Found / Opportunity Found branch → Click + → Actions → Create/Update Opportunity
Action Name
Click the field and type Update Existing Opportunity → New Lead.
In Pipeline
Open the dropdown and select Sales Pipeline.
In Pipeline Stage
Open the dropdown and select New Lead.
Opportunity Name
Click the tag-shaped merge-field picker → select Contact > Full Name. After {{contact.name}}, type - Missed Call.
Opportunity Source
Click inside the field and type Missed Call.
Opportunity Value
Leave this field blank. RoyCo has not supplied a default job value.
Status
Open the dropdown and select Open.
Add field
Do not click Add field for this action.
Allow opportunity to move to any previous stage in pipeline
Keep this toggle OFF.
Allow duplicate opportunities
Keep this toggle OFF.
Save
Click Save Action after checking every value above.
Use the same Create/Update Opportunity action GHL provides. This updates the existing opportunity instead of creating a duplicate card. The tag-shaped icons in the Opportunity panel are merge-field pickers, not Contact Tags.
06BNot Found branch → Create/Update Opportunity
Inside the Not Found / None branch → Click + → Actions → Create/Update Opportunity
Action Name
Click the field and type Create Opportunity → New Lead.
In Pipeline
Open the dropdown and select Sales Pipeline.
In Pipeline Stage
Open the dropdown and select New Lead.
Opportunity Name
Click the tag-shaped merge-field picker → select Contact > Full Name. After {{contact.name}}, type - Missed Call.
Opportunity Source
Click inside the field and type Missed Call.
Opportunity Value
Leave this field blank. RoyCo has not supplied a default job value.
Status
Open the dropdown and select Open.
Add field
Do not click Add field for this action.
Allow opportunity to move to any previous stage in pipeline
Keep this toggle OFF.
Allow duplicate opportunities
Keep this toggle OFF.
Save
Click Save Action after checking every value above.
This creates the pipeline card because no existing Sales Pipeline opportunity was found. The tag-shaped icons in the Opportunity panel are merge-field pickers, not Contact Tags.
07After both opportunity paths → Add Contact Tag
After 06A and after 06B, continue to the shared next action → Click + → Actions → Add Contact Tag
If GHL canvas keeps the two branches separate, add the same tag action on both branches or reconnect both branches to the shared next step if your builder supports it.
08Send Internal Notification
Click + → Actions → Send Internal Notification
Action Name
Click the field and type Internal Alert — Missed Roofing Call.
Type of Notification
Open the dropdown and select Email.
From Name
Leave this field blank.
From Email
Leave this field blank. Leave both fields blank to use RoyCo's Default Values.
To User Type
Open the dropdown and select Particular Users. In the user selector that appears, choose RoyCo's confirmed owner/admin alert recipient.
Click the field and type Missed roofing call — call back now. Subject is typed directly; it is not a saved asset. The tag-shaped icon beside Subject is the merge-field picker, not a Contact Tag.
Templates
Leave Select template blank. Use the custom Message below. WF03 does not require a saved email template.
Message
MISSED ROOFING CALL — CALLBACK NEEDED
Name: {{contact.name}} Phone: {{contact.phone}} Source: Missed Call Pipeline: Sales Pipeline Stage: New Lead
Open the contact and call back immediately.
Save
Click Save action.
Client-input blocker: replace “RoyCo's confirmed owner/admin alert recipient” with the exact HighLevel user before publishing. This email is the live MVP alert while customer SMS is blocked.
09Add Task
Click + → Actions → Add Task
Action Name
Create Callback Task
Task Title
Call back missed roofing lead
Assigned To
Default owner / RoyCo owner/admin
Due Date
Today / immediately
Description
Missed inbound call captured by WF03. Call back ASAP.
10Add To Notes
Click + → Actions → Add To Notes
Action Name
Log Missed Call Note
Note
Missed inbound call captured by WF03. Callback task created. SMS not sent because A2P is not approved yet.
Save
Click Save Action
11Workflow end / expected result
No more actions after Add To Notes
Do not add
Do not add Send SMS yet.
Expected result
Contact is captured, opportunity is in New Lead, RoyCo is notified, callback task exists, note is logged.
Publish rule
Test with a real missed call before publishing.
The workflow naturally ends when there are no more actions. This is normal inside GHL.
Builder Steps — build top to bottom in the GHL canvas
To internal alert recipient. Subject: Missed roofing call — call back now. Body includes name, phone, source, and pipeline link.
10
Add Task
Task title: Call back missed roofing lead. Due: today/immediate. Assigned to default owner.
11
Add To Notes
Note: Missed inbound call captured by WF03. Callback task created.
12
SMS placeholder
Do NOT add/publish Send SMS until A2P approval. Add a note in workflow description: SMS Phase 2 after A2P.
13
Save → Test → Publish
Publish only after the missed-call test passes.
Why WF03 is built this way
A missed call usually gives GHL a phone number first, not a full lead record with email. Because SMS is not live until A2P approval, this workflow is not a true text-back yet. Its job is to capture the caller, avoid duplicates with Find Opportunity, put the lead in New Lead, notify RoyCo, create a callback task, and leave a note so no missed call disappears.
Assets Required
GHL phone number, call forwarding, internal alert recipient, Sales Pipeline, New Lead stage, tags
If/Else Checks
Check Do Not Contact; Opportunity Found?
Exit Conditions
DND exits; both opportunity branches continue to alert/task; SMS remains OFF
Test
Call the GHL number from another phone and hang up; confirm workflow enrollment, opportunity, tags, internal notification, task
Filters: Call status contains any of no-answer AND Call direction is Incoming. Settings: Always | Stop on Response ON | Re-enrollment ON.
02
If/Else
Name it: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03
Remove From Workflow
Put this on the Yes branch from step 02. This is the DNC exit.
04
Find Opportunity
Put this on the No/None branch from step 02. Right panel: Action Name = Find Opportunity; Opportunity To Be Found = Most recently created opportunity; Fields = Pipeline | Is | Sales Pipeline.
05
If/Else
Name it: Opportunity Found?. Found path goes to 06A. None/Not Found path goes to 06B.
06A
Create/Update Opportunity
Found branch. Pipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Missed Call.
06B
Create/Update Opportunity
None/Not Found branch. Same settings as 06A. This creates the missed-call opportunity.
Recipient = RoyCo internal alert email. Subject: Missed roofing call — call back now. Include {{contact.name}} and {{contact.phone}}.
09
Add Task
Title: Call back missed roofing lead. Due: Immediately / Today. Assigned to default owner.
10
Add To Notes
Note: Missed inbound call captured by WF03. Callback task created.
11
No action needed
The workflow naturally ends after Add To Notes. Do not add Send SMS until A2P approval.
WF 04
New Lead Form Follow-Up
Where in GHL: Automation → Workflows → Sales Pipeline
Name: Sales – New Lead Form Follow-Up Workflow – v1Trigger: Form SubmittedFilter: Form = Sales – Lead Capture FormExecution: Execute OnceStop on Response: ONRe-enroll: OFF
Flowchart first: Start with this map. Click any numbered node to jump to the matching exact GHL screen-value card below.
Numbered Flowchart — WF04. Match every number to the GHL action table below.
WF04 New Lead Form Follow-Up — exact GHL canvas order
WF04 — EXACT GHL SCREEN VALUES, IN ORDER
Build rule: Every numbered flowchart node has a matching screen card. Build from 01 to 10. Do not publish until a real test form submission creates/updates the opportunity correctly.
01Workflow Trigger screen — Form Submitted
Automation → Workflows → Sales Pipeline → Create Workflow → Start From Scratch → Add New Trigger
Choose trigger
Form Submitted
Workflow Trigger Name
Form Submitted — Sales Lead Capture
Filter
Form | Is | Sales – Lead Capture Form
Save
Click Save Trigger
This must be filtered to the exact form. Do not leave Form Submitted unfiltered.
02Add Action → If / else: Check Do Not Contact
Click + under the trigger → Actions → If / Else
Action Name
Check Do Not Contact
Scenario Recipe
Has tag
Branch Name
Has DNC Tag
Condition / Tag
compliance-dnd-active
None branch
Continue to Find Opportunity
Has DNC Tag branch Add Step 03 here.
None branch Add Step 04 here.
03Has DNC Tag branch → Remove From Workflow
Inside the Has DNC Tag branch → Click + → Actions → Remove From Workflow
Lead Source Detail = Website Form; Last Contacted Date = current date if available
10
Send Internal Notification
Notify internal alert recipient with name, phone, email, service interest, roofing issue, address, preferred window.
11
Send Email
Email template: Email – New Lead Welcome
12
SMS placeholder
SMS OFF until A2P approval and consent checkbox are live/tested.
13
Save → Test → Publish
Submit real test form. Publish only after form, opportunity, alert, email, and logs pass.
Why WF04 is built this way
Form leads have more complete information than missed calls, so this workflow can create/update the Sales Pipeline and send the first email response immediately. The DND check stays first so opted-out contacts are protected. Find Opportunity prevents duplicate cards if the same homeowner submits the form twice.
Assets Required
Sales – Lead Capture Form, mapped fields, Sales Pipeline, New Lead stage, tags, Email – New Lead Welcome, internal alert recipient
If/Else Checks
Check Do Not Contact; Opportunity Found?
Exit Conditions
DND exits; both opportunity branches create/update New Lead intentionally
Test
Submit the actual embedded form and confirm contact, fields, opportunity, tags, alert, email, and logs
WF04 exact GHL workflow-builder map
# on chart
Click this inside GHL
Exact value / branch
00
Create Workflow
Automation → Workflows → Folder: Sales Pipeline → Create Workflow → Start From Scratch → Name: Sales – New Lead Form Follow-Up Workflow – v1
01
Workflow Trigger = Form Submitted
Filter: Form = Sales – Lead Capture Form. Settings: Execute Once | Stop on Response ON | Re-enrollment OFF.
02
If/Else
Name it: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03
Remove From Workflow
Put this on the Yes branch from step 02.
04
Find Opportunity
Put this on the No/None branch from step 02. Right panel: Action Name = Find Opportunity; Opportunity To Be Found = Most recently created opportunity; Fields = Pipeline | Is | Sales Pipeline.
05
If/Else
Name it: Opportunity Found?. Found path goes to 06A. None/Not Found path goes to 06B.
06A
Create/Update Opportunity
Found branch. Pipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Roofing Lead; Opportunity Source = Website Form.
06B
Create/Update Opportunity
None/Not Found branch. Same settings as 06A. This creates the new website lead opportunity.
Recipient = RoyCo internal alert email. Subject: New roofing lead from website.
09
Send Email
Email template: Email – New Lead Welcome. From = RoyCo sender email. SMS remains OFF until A2P.
10
No action needed
The workflow naturally ends after the welcome email and internal alert.
WF 02
Estimate Sent Follow-Up
Where in GHL: Automation → Workflows → Sales Pipeline
Name: Sales – Estimate Sent Follow-Up Workflow – v1Trigger: Pipeline Stage ChangedFilter: Pipeline = Sales Pipeline AND Stage = Estimate SentExecution: Execute OnceStop on Response: ONRe-enroll: OFF
Critical: Do not use Pipeline Stage Changed without BOTH filters. Do not re-check sequence-estimate-follow-up-active after adding it, or the workflow exits itself.
Flowchart first: Start with this map. Click any numbered node to jump to the matching exact GHL screen-value card below.
Numbered Flowchart — WF02. Match every number to the GHL action table below.
WF02 Estimate Sent Follow-Up — exact GHL canvas order
WF02 — EXACT GHL SCREEN VALUES, IN ORDER
Build rule: This workflow is longer. Every numbered flowchart node has a screen card. Build it exactly in order and keep every won/lost check so the workflow stops when RoyCo moves the opportunity to Project Won or Closed Lost.
Estimate Sent Date = Current Date. Estimate Amount only if RoyCo enters amount manually.
8
Send Email
Email template: Email – Estimate Sent Day 0
9
Wait
2 days
10
If / Else — Won or Closed Lost?
Condition: Opportunity Stage is Project Won OR Closed Lost. Yes → remove sequence-estimate-follow-up-active and End. None → continue.
11
Send Email
Email template: Email – Estimate Follow Up Day 2
12
Wait
3 days
13
If / Else — Won or Closed Lost?
Yes → cleanup/end. None → Day 5.
14
Send Email
Email template: Email – Estimate Follow Up Day 5
15
Wait
5 days
16
If / Else — Won or Closed Lost?
Yes → cleanup/end. None → Day 10.
17
Send Email
Email template: Email – Estimate Follow Up Day 10
18
Add Task
Task title: Manual final call on estimate. Assigned to default owner. Due today.
19
Cleanup
Remove tag sequence-estimate-follow-up-active. Optional add lifecycle-lost-opportunity only if RoyCo marks Closed Lost manually.
20
Save → Test → Publish
Publish after Day 0 and branch cleanup tests pass.
Why WF02 is built this way
Estimate follow-up starts only when RoyCo manually moves an opportunity to Estimate Sent. That keeps the workflow tied to the real sales process. The branch checks stop follow-up if the job becomes Project Won or Closed Lost, so RoyCo does not keep chasing someone who already accepted or declined.
Assets Required
Sales Pipeline, Estimate Sent stage, Project Won stage, Closed Lost stage, estimate email templates, sequence-estimate-follow-up-active, Estimate Sent Date field
If/Else Checks
Check Do Not Contact; Already In Estimate Follow-Up?; Won or Closed Lost?
Exit Conditions
DND exits; Already Open exits; Project Won/Closed Lost remove sequence-estimate-follow-up-active and end; final cleanup removes tag
Test
Move test opportunity to Estimate Sent; confirm Day 0, tags, field update, Project Won/Closed Lost cleanup path
Build rule: Every numbered flowchart node has a matching screen card. Build from 01 to 17. Do not publish until a real test opportunity moved into Project Completed sends the review request correctly.
Automation → Workflows → Sales Pipeline → Create Workflow → Start From Scratch → Add New Trigger
Choose trigger
Pipeline Stage Changed
Workflow Trigger Name
Stage Changed — Project Completed
Filter 1
Pipeline | Is | Sales Pipeline
Filter 2
Stage | Is | Project Completed
Save
Click Save Trigger
Both filters are mandatory. An unfiltered Pipeline Stage Changed fires on every stage move and will send review asks to the wrong people.
02Add Action → If / Else: Check Do Not Contact
Click + under the trigger → Actions → If / Else
Action Name
Check Do Not Contact
Scenario Recipe
Has tag
Branch Name
Has DNC Tag
Condition / Tag
compliance-dnd-active
None branch
Continue to Already Asked check
Has DNC Tag branch Add Step 03 here.
None branch Add Step 04 here.
03Has DNC Tag branch → Remove From Workflow
Inside the Has DNC Tag branch → Click + → Actions → Remove From Workflow
Action Name
Remove From Workflow — DNC Exit
Workflow
This workflow / current workflow
After saving
No more actions on this branch.
04None branch → If / Else: Already Asked?
Inside the None branch → Click + → Actions → If / Else
Action Name
Already Asked?
Scenario Recipe
Has tag
Branch Name
Already Requested
Condition / Tag
review-request-sent
None branch
Continue to Wait
Already Requested branch Add Step 05 here.
None branch Add Step 06 here.
This guard stops a homeowner from being asked twice if the opportunity re-enters Project Completed.
05Already Requested branch → Remove From Workflow
Inside the Already Requested branch → Click + → Actions → Remove From Workflow
Action Name
Remove From Workflow — Already Asked
Workflow
This workflow / current workflow
After saving
No more actions on this branch.
06None branch → Wait
Inside the None branch → Click + → Actions → Wait
Action Name
Wait — Settle Before Asking
Wait Type
Time Delay
Duration
2 days
Why
Give the crew time to finish cleanup before the review ask lands.
07Send Email — Review Request
Click + → Actions → Send Email
Action Name
Send Review Request Email
From Name
RoyCo Roofing
From Email
info@roycoroof.com or verified sender
Template
Email – Review Request Day 0
Subject
How did we do on your roof?
Review link
Body must include {{custom_values.review_link}}
Footer
CAN-SPAM footer / unsubscribe enabled
Launch blocker: if the Review Link custom value still holds a placeholder, the button goes nowhere. Confirm it is a real Google review URL before publishing.
Filter: Pipeline = Sales Pipeline AND Stage = Project Completed
3
Workflow Settings
Execution Type = Execute Once; Stop on Response = ON; Re-enrollment = OFF
4
If / Else — Check Do Not Contact
Condition: Contact Tag contains compliance-dnd-active. Yes → Remove From Workflow. None → continue.
5
If / Else — Already Asked?
Condition: Contact Tag contains review-request-sent. Yes → Remove From Workflow. None → continue.
6
Wait
2 days.
7
Send Email
Template: Email – Review Request Day 0; body must contain {{custom_values.review_link}}.
8
Add Contact Tag
review-request-sent, stage-project-completed
9
Update Contact Field
Google Review Status = Requested
10
Wait
4 days.
11
If / Else — Review Left?
Condition: Contact Tag contains review-left. Yes → status update + end. None → reminder.
12
Update Contact Field (Yes)
Google Review Status = Review Left; optional review-left tag.
13
Send Email (None)
Template: Email – Review Reminder Day 3; include {{custom_values.review_link}}.
14
Create Task
Call {{contact.name}} for a Google review; assign default owner.
15
Update Contact Field
Google Review Status = Reminder Sent
16
SMS placeholder
SMS OFF until A2P approval.
17
Save → Test → Publish
Move a real test opportunity into Project Completed. Publish only after email, tags, field, and reminder branch pass.
Why WF01 is built this way
Reviews are the cheapest lead-gen RoyCo has — social proof that compounds. The 2-day settle delay keeps the ask from landing before the job feels finished, the Already-Asked guard protects the relationship from double-asks, and the reminder branch recovers the homeowners who meant to leave a review but forgot. Email-only until A2P keeps it compliant. This is why Project Completed was promoted to an active stage.
Assets Required
Sales Pipeline, Project Completed stage, Review Link custom value (real Google URL), Google Review Status field, Email – Review Request Day 0, Email – Review Reminder Day 3, tags review-request-sent / review-left
If/Else Checks
Check Do Not Contact; Already Asked?; Review Left?
Exit Conditions
DND exits; already-asked exits; Review Left branch ends after status update; reminder branch ends after reminder + status
Test
Move a real test opportunity into Project Completed and confirm wait, email, link, tags, field, reminder branch, and logs
Name it: Review Left?. Condition: Contact Tag contains review-left. Yes → 12. None → 14.
12
Update Contact Field
Review Left branch. Google Review Status = Review Left.
13
No action needed
Review Left branch ends after the status update.
14
Send Email
None branch. Template: Email – Review Reminder Day 3. SMS remains OFF until A2P.
15
Create Task
Call {contact.name} for a Google review; assign default owner.
16
Update Contact Field
Google Review Status = Reminder Sent.
17
No action needed
The workflow naturally ends after the reminder and status update.
10 · A2P 10DLC
A2P checklist — inside the console
Where in GHL: Settings → Phone Numbers / Trust Center / A2P Registration
This is the SMS readiness checklist. It is included now so the future SMS version can launch without guessing, but it does not block the email-first MVP.
Do not publish Send SMS actions until approved. US business SMS from a 10DLC number requires A2P 10DLC registration. The campaign use case, opt-in explanation, opt-in message, sample messages, and website consent language must match.
Phase A — gather legal/business data
Confirm RoyCo legal business name exactly as on tax/EIN records
Collect EIN and CP-575 / 147C / W9 or equivalent tax document
Collect authorized representative name, title, phone, email, and address
Confirm website is live over HTTPS and business name is present
Phase B — website compliance
Publish or verify Privacy Policy page
Publish or verify Terms & Conditions page
Add SMS consent checkbox to forms before SMS launch
Checkbox must not be pre-checked
Consent language must say what messages they receive and include message/data rates + STOP opt-out
Form must not bury SMS consent inside generic marketing language
RoyCo SMS consent copy
I agree to receive text messages from RoyCo Roofing about my roofing request, inspection, estimate, or follow-up. Message and data rates may apply. Message frequency varies. Reply STOP to opt out.
Phase C — GHL registration
Go to Settings → Phone Numbers / Trust Center
Complete Business Profile and make sure details match legal documents
Submit Brand Registration
Submit Campaign Registration using the appropriate customer-care / mixed conversational use case
Describe how contacts opt in: website form checkbox, phone call follow-up, appointment/estimate request
Submit at least two distinct sample SMS messages with business name and opt-out language
Wait for brand/campaign approval before publishing SMS
Sample SMS messages for A2P submission
SAMPLE 1
Hi {{contact.first_name}}, this is RoyCo Roofing. We received your roofing request and will follow up shortly. Reply STOP to opt out.
SAMPLE 2
Hi {{contact.first_name}}, RoyCo Roofing here. Sorry we missed your call — what roofing issue can we help with? Reply STOP to opt out.
SAMPLE 3
Hi {{contact.first_name}}, RoyCo Roofing sent your estimate. Reply here if you want us to walk through it. Reply STOP to opt out.
After approval — SMS activation checklist
Duplicate WF03, WF04, WF02 before adding SMS
Add Send SMS action after internal guard checks
Keep first SMS compliant with opt-out language
Build and test Compliance – DND Opt Out Handler – v1
Test STOP → DND active → compliance-dnd-active tag → removed from active SMS workflows
Use these for the email-first build. WF04 welcomes new leads, WF02 chases estimates, and WF01 requests Google reviews once a job is Project Completed. Keep SMS copy in the A2P section until approval.
TemplateEmail – New Lead Welcome
We received your roofing request
Hi {{contact.first_name}},
Thanks for reaching out to RoyCo Roofing. We received your request and our team will follow up shortly.
If you have any extra details about the roof issue, reply to this email and send them over.
— The RoyCo Roofing Team
{{location.phone}}
Used in WF04
TemplateEmail – Estimate Sent Day 0
Your RoyCo Roofing estimate
Hi {{contact.first_name}},
Thank you for considering RoyCo Roofing. We sent your estimate over for review.
If you have questions or want us to walk through the options with you, reply here and our team will help.
— The RoyCo Roofing Team
{{location.phone}}
Used in WF02 immediately when Estimate Sent stage fires
TemplateEmail – Estimate Follow Up Day 2
Any questions on your roofing estimate?
Hi {{contact.first_name}},
Just checking in on the roofing estimate we sent. Do you have any questions about the scope, timing, or next steps?
Reply here and we’ll help.
— The RoyCo Roofing Team
Used in WF02 after 2-day wait
TemplateEmail – Estimate Follow Up Day 5
Still interested in moving forward?
Hi {{contact.first_name}},
Following up again on your RoyCo Roofing estimate. If you’d like to move forward, or if anything needs to be adjusted, reply here and we’ll help with the next step.
— The RoyCo Roofing Team
Used in WF02 after Day 5 branch
TemplateEmail – Estimate Follow Up Day 10
Should we keep your estimate open?
Hi {{contact.first_name}},
We wanted to check one last time on your roofing estimate.
Would you like us to keep this open, make an adjustment, or close it out for now?
— The RoyCo Roofing Team
Used in WF02 before final manual call task
TemplateEmail – Review Request Day 0
How did we do on your new roof?
Hi {{contact.first_name}},
Thank you for trusting RoyCo Roofing with your project. Now that the work is complete, we’d love to hear how it went.
If you have a moment, a quick Google review really helps our small team: {{custom_values.review_link}}
Thank you,
— The RoyCo Roofing Team
{{location.phone}}
Used in WF01 — first review request (after Project Completed + wait)
TemplateEmail – Review Reminder Day 3
A quick favor on your RoyCo roof
Hi {{contact.first_name}},
Just a gentle reminder — if you were happy with your new roof, a short Google review would mean a lot to us and helps other homeowners find a contractor they can trust.
Leave a review here: {{custom_values.review_link}}
Thanks again,
— The RoyCo Roofing Team
Used in WF01 — reminder branch (only if no review left)
12 · BUILD ORDER
Build order — no-sweat sequence
Where in GHL: Settings + Sites + Opportunities + Automation
Build in this exact order. Do not start workflows until the pipeline, fields, tags, values, form, and email templates exist.
Confirm WF01 enrolls, sends Review Request email with the live Review Link, tags review-request-sent, and the reminder branch fires only when no review is left
9
Move test opportunity to Estimate Sent
10
Confirm WF02 sends Day 0 email, adds sequence-estimate-follow-up-active, updates Estimate Sent Date
11
Test Project Won branch and Closed Lost branch cleanup
12
Check Enrollment History and Execution Logs for all 3 active workflows (WF04, WF02, WF01)
13
Confirm no duplicate opportunities were created
14
Confirm SMS actions are not active/published
15
Publish one workflow at a time only after test passes
16
Delete test contacts/opportunities before handoff
If workflow does not fire:
Check trigger filters first
Check if workflow is still Draft
Check execution settings and re-enrollment
Check if test contact already completed Execute Once workflow
Check Enrollment History and Execution Logs
14 · LAUNCH BLOCKERS
Launch blockers
If any of these are true, do not launch the affected piece.
SPF/DKIM not verified = emails may fail or land in spam
Lead form not connected = WF04 blocked
GHL phone / forwarding not set = WF03 blocked
Internal alert recipient missing = missed calls/new leads can be hidden
Pipeline stage names do not match workflow filters = WF02 may not fire
Closed Lost missing = lost estimates have no clean destination
A2P not approved = SMS blocked; email MVP still launches
SMS consent checkbox missing = do not activate SMS
Timezone wrong = waits and reporting fire at wrong time
No default owner = opportunities/tasks can be orphaned
15 · HANDOFF
Client handoff and future snapshot
Where in GHL: Settings + Automation + Opportunities
For this first build, hand off the working RoyCo sub-account. Snapshot only after QA is clean and RoyCo-specific values are documented.
Record a short Loom: pipeline, form, three workflows, how to move Contacted / Estimate Sent / Won / Closed Lost
Show where missed-call tasks appear
Show how estimate follow-up stops when lead replies or is moved to Project Won / Closed Lost
Document which SMS actions remain OFF until A2P approval
Export or screenshot custom fields/tags/custom values for future snapshot cleanup
Delete test contacts and opportunities
00 · MASTER FLOW
Master flow — active build (WF04 · WF02 · WF01)
Where in GHL: Opportunities + Automation → Workflows
The Lead Form creates/updates New Lead (WF04). Estimate Sent triggers the chase (WF02). When a job reaches Project Completed, WF01 requests a Google review. WF03 missed-call capture is parked in Future Expansion.
These charts are visual only. Build from each workflow’s Builder Steps table because that follows the actual HighLevel builder order. Full clickable step-by-step flowcharts for WF04, WF02, and WF01 live in their own sections; WF03 is parked in Future Expansion.