RoyCo Roofing · Lead Form + Estimate + Reviews + A2P
0/ 0 done
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
What we need from RoyCo before launch
  • 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
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
RoyCo Roofing logo
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
Brand Voice + Copy Bank
Hero lineKansas City's Premium Roofing Experts
ProofOver 140 Google Reviews - 4.9 Stars. Confirm the live count before publishing new ad/email copy.
Why chooseHigher standard of service and craftsmanship, reliable personalized roofing solutions, quality and customer care.
TonePremium, certified, local, calm, direct, homeowner-first. Avoid hypey storm-chaser language.
Services to Use in Forms, Tags, and Copy
  • Roof Inspection / Free Inspections
  • Roof Repair
  • Roof Replacement
  • Hail / Storm Damage Inspection
  • Gutter Install & Repair
  • Tile Roofing: Concrete, Clay, Slate
Trust Proof + Certifications
Official Asset Library
PreviewAssetUseURL / Notes
Horizontal logo, dark transparentGHL Business Profile, email header, form headerhttps://static.showit.co/200/S8Mk5x9zTC5KUJRCIa4h_g/shared/royco-roofing_horizontal_dark-transparent.png
Circle light logo / faviconFavicon, small avatar, snapshot noteshttps://static.showit.co/200/b_8_r1oy3KguDYNT6P_oIA/310077/royco-roofing_circle-light.png
Share photo / OG imageSocial sharing reference, hero backuphttps://static.showit.co/1200/qsRlMu9FIpE6M9KVpcjLDg/310077/royco-share_photo.jpg
Hero / full-service roofing imageLanding pages, form thank-you pageshttps://static.showit.co/800/eteNm0qRDQhsnm-GQmvgFQ/310077/royco-roofing-kansas-city-best-roofing-contractor-4.jpg
Tile experts imageTile roofing service sectionhttps://static.showit.co/800/JzyBIz4e0mzYyktO_RbzaA/shared/royco-april-42.jpg
Contact page truck imageContact / get-estimate page referencehttps://static.showit.co/800/xItG9tECDC-qw9kq63DGLQ/shared/royco-april-48.jpg
Trusted by KC background imageProject/community proof sectionhttps://static.showit.co/800/MMlGbZV3EH9DipA2-WEzSQ/shared/royco-april-05.jpg
KC service area map graphicService area sectionhttps://static.showit.co/800/3fWagGVY8SuErHCvz_AUlA/shared/kansas-city-royco-roofing.png
Project card: Mission HillsProof/project galleryhttps://static.showit.co/400/fHcKY2NFmDjHKFMaUjVTDQ/shared/royco-april-52.jpg
Project card: LeawoodProof/project galleryhttps://static.showit.co/400/wrN64W26IJUkf86BTd3CVQ/shared/royco-april-04.jpg
Project card: Loch LloydProof/project galleryhttps://static.showit.co/400/C57Ryzx0xsW62WqVdJZ2tQ/shared/royco-april-35.jpg
Project card: Lee's SummitProof/project galleryhttps://static.showit.co/400/l7tscJ-N-vFyysLbqbA2XA/shared/royco-april-01.jpg
Gutter iconService listhttps://static.showit.co/200/60mELJWH8TBynRHNs0jo2A/310077/gutter-icon.png
Free inspection house iconService listhttps://static.showit.co/200/XjBdapsXqJXzuucgajv0OA/shared/house-icon.png
Roof repair iconService listhttps://static.showit.co/200/h2azjsiYJ5V5xvkuvt5_kg/shared/roof-icon.png
Roof replacement iconService listhttps://static.showit.co/200/_P-foGxK-wxDHoFcfV4DYg/shared/roof-replaced-icon.png
Concrete tile iconTile roofing sectionhttps://static.showit.co/200/XVXk2PwT8Yk3uky_nAtKDA/shared/concrete-tile.png
Clay tile iconTile roofing sectionhttps://static.showit.co/200/9U8xgJ_V1cd_bS77gpXPEg/shared/clay-tile.png
Slate tile iconTile roofing sectionhttps://static.showit.co/200/1-o-YtTcuDHb_AUPCJ8FJA/shared/slate-tile.png
Ludowici logoCertification striphttps://static.showit.co/200/VUdAOJHYaEOcdyEDumv_sw/shared/ludowici-logo.png
Better Business Bureau logoCertification striphttps://static.showit.co/200/riZYzOIlTeTEjzGy8Ek2qQ/shared/bbb-logo.png
GAF Authorized Commercial Roofing Contractor logoCertification striphttps://static.showit.co/200/vuZ488c8tpxJwN1BIj1L9w/shared/gaf-logo.png
TRI Manual Certified logoCertification striphttps://static.showit.co/200/1R7Nm4zgqoQKtd12Id3ssw/shared/tri-certified-logo.png
Home Builders Association of Greater KC logoCertification striphttps://static.showit.co/200/gBmeZMWCuWZlCJCAxXISEA/shared/home-builders-logo.png
Select ShingleMaster logoCertification striphttps://static.showit.co/200/zeid0Dp8HnQmcMqxabk_BQ/shared/select-shingle-logo.png
Cambria webfontHeading font sourcehttps://static.showit.co/file/0x_-vr6c85ckC1KSFECzLg/shared/cambria.woff
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.
  • TimezoneAmerica/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.
Phone & Calling
  • Provision a GHL number — voice only, no A2P needed for calls.
  • Forward to Royco's real line so calls still ring through.
  • Powers the WF03 Missed Call Follow-Up trigger.
Calendars
  • Sales – Roof Inspection Calendar · Sales – Estimate Appointment Calendar
  • 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:
  1. Go to Opportunities → Pipelines
  2. Click Create Pipeline
  3. Name: Sales Pipeline
  4. Add stages in exact order: New Lead → Contacted → Estimate Sent → Project Won → Project Completed → Closed Lost
  5. 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.
Figure — Active MVP Pipeline
Visible flowchart — Pipeline
New Lead Contacted Estimate Sent Accepted Project Won Job Done Project Completed Triggers WF01 Review Request Not Proceeding Closed Lost
Mermaid source (optional)
flowchart LR
ST1["New Lead"] --> ST2["Contacted"] --> ST3["Estimate Sent"]
ST3 -->|Accepted| ST4["Project Won"]
ST4 -->|Job Done| ST6["Project Completed"]
ST6 -->|Triggers WF01| ST7["Review Request"]
ST3 -->|Not Proceeding| ST5["Closed Lost"]
classDef oppStage fill:#001f3f,color:#ffffff,stroke:#001f3f,font-weight:bold;
class ST1,ST2,ST3,ST4,ST6 oppStage
04 · FOLDERS

Workflow folder structure — active build only

Where in GHL: Automation → Workflows → Folders

No orphan workflows. Only create folders needed for the 3-workflow MVP plus A2P readiness.

Sales Pipeline
  • Sales – New Lead Form Follow-Up Workflow – v1
  • Sales – Estimate Sent Follow-Up Workflow – v1
Missed Call Automation
  • Calls – Missed Call Capture + Alert Workflow – v1
Internal Notifications
  • Used inside WF03/WF04/WF02 as Send Internal Notification actions
A2P / SMS Readiness
  • A2P checklist lives in the console first. Build SMS workflows only after approval.
  • Future: Compliance – DND Opt Out Handler – v1 when SMS is turned on.
05 · NAMING

Naming convention — active build

Where in GHL: Automation → Workflows, Marketing → Emails, Sites → Forms

Use short names that tell the builder exactly what the asset does. Do not create review/reactivation assets in this first build.

  • Workflow: Calls – Missed Call Capture + Alert Workflow – v1
  • 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:
  1. Go to Settings → Tags
  2. Click Add Tag
  3. Copy-paste exact tag name
  4. Save
  5. Do not create duplicates
  6. 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 NameRequired or OptionalUsed InWhat Breaks If Missing
lead-source-website-formRequiredWF04 source attributionWebsite form leads lose source reporting
lead-source-missed-callFuture OptionalWF03 source attributionMissed-call leads lose source reporting
lead-source-database-reactivationFuture OptionalWF05 source attributionReactivation contacts lose source reporting
compliance-dnd-activeRequiredWorkflow guards, estimate tracking, reportingcompliance-dnd-active logic/reporting breaks if referenced
sequence-estimate-follow-up-activeRequiredWorkflow guards, estimate tracking, reportingsequence-estimate-follow-up-active logic/reporting breaks if referenced
sequence-estimate-follow-up-wonRequiredWorkflow guards, estimate tracking, reportingsequence-estimate-follow-up-won logic/reporting breaks if referenced
sequence-estimate-follow-up-lostRequiredWorkflow guards, estimate tracking, reportingsequence-estimate-follow-up-lost logic/reporting breaks if referenced
sequence-estimate-follow-up-no-replyRequiredWorkflow guards, estimate tracking, reportingsequence-estimate-follow-up-no-reply logic/reporting breaks if referenced
stage-new-leadRequiredWorkflow tagging and stage reportingstage-new-lead segment cannot be reported cleanly
stage-contactedRequiredWorkflow tagging and stage reportingstage-contacted segment cannot be reported cleanly
stage-estimate-sentRequiredWorkflow tagging and stage reportingstage-estimate-sent segment cannot be reported cleanly
stage-project-wonRequiredWorkflow tagging and stage reportingstage-project-won segment cannot be reported cleanly
stage-project-completedRequiredWF01 review request (Project Completed stage)WF01 cannot tag/segment completed jobs
review-leftRequiredWF01 Review Left? branchWF01 cannot detect a completed review
stage-closed-lostRequiredWorkflow tagging and stage reportingstage-closed-lost segment cannot be reported cleanly
lifecycle-prospectRequiredLifecycle segmentation and campaign targetinglifecycle-prospect segment cannot be targeted reliably
lifecycle-active-leadRequiredLifecycle segmentation and campaign targetinglifecycle-active-lead segment cannot be targeted reliably
lifecycle-customerRequiredLifecycle segmentation and campaign targetinglifecycle-customer segment cannot be targeted reliably
lifecycle-past-customerRequiredLifecycle segmentation and campaign targetinglifecycle-past-customer segment cannot be targeted reliably
lifecycle-lost-opportunityRequiredLifecycle segmentation and campaign targetinglifecycle-lost-opportunity segment cannot be targeted reliably
event-form-submittedRequiredWorkflow event audit trailevent-form-submitted cannot be audited by tag
event-missed-callFuture OptionalWorkflow event audit trailevent-missed-call cannot be audited by tag
event-estimate-sentRequiredWorkflow event audit trailevent-estimate-sent cannot be audited by tag
review-request-sentRequiredWF01 already-asked guard + statusWF01 can double-ask the same homeowner
event-review-reminder-sentRequiredWorkflow event audit trailevent-review-reminder-sent cannot be audited by tag
event-reactivation-sentFuture OptionalWorkflow event audit trailevent-reactivation-sent cannot be audited by tag
event-reactivation-replyFuture OptionalWorkflow event audit trailevent-reactivation-reply cannot be audited by tag
campaign-estimate-recoveryRequiredCampaign reportingcampaign-estimate-recovery performance cannot be segmented
campaign-past-customer-reactivationFuture OptionalCampaign reportingcampaign-past-customer-reactivation performance cannot be segmented
lead-source-google-businessOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
lead-source-referralOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
lead-source-manual-addOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
priority-urgentOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
priority-normalOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
priority-storm-damageOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
routing-sales-teamOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
routing-estimatorOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
routing-owner-follow-upOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
service-roof-repairOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
service-roof-replacementOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
service-storm-damageOptionalOptional reporting/routing only if usedNothing breaks unless a workflow or report references it
campaign-google-review-pushOptionalOptional reporting/routing only if usedNothing 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 TypeObjectField NameFolder NameDescriptionOptionsPlaceholder Text
DropdownContactPreferred Contact MethodRoyco – Contact ProfileHow the customer prefers to be contacted.Email, Phone Call, Text, Any— (dropdown)
Single lineContactLead Source DetailRoyco – Contact ProfileExtra detail on where the lead came from, beyond the source tag.e.g., Google - metal roof
Single lineOpportunityProperty Street AddressRoyco – Property DetailsStreet address of the property needing roofing work.e.g., 1142 Merriam Ln
Single lineOpportunityProperty CityRoyco – Property DetailsCity where the project is located.e.g., Kansas City
DropdownOpportunityProperty StateRoyco – Property DetailsState, for service-area filtering.KS, MO— (dropdown)
Single lineOpportunityProperty ZIP CodeRoyco – Property DetailsZIP / postal code of the project.e.g., 66103
Single lineOpportunityProperty CountyRoyco – Property DetailsCounty (optional - territory / permit reporting).e.g., Wyandotte
DropdownOpportunityService InterestRoyco – Roofing Job DetailsWhich roofing service the lead needs.Roof Inspection, Roof Repair, Roof Replacement, Hail / Storm Damage Inspection, Gutter Install & Repair, Tile Roofing, Not Sure— (dropdown)
Multi lineOpportunityRoofing IssueRoyco – Roofing Job DetailsThe customer's description of the roofing problem.e.g., Active leak over kitchen; shingles missing
DropdownOpportunityProject TypeRoyco – Roofing Job DetailsResidential, commercial, or multi-family / HOA.Residential, Commercial, Multi-Family/HOA— (dropdown)
NumberOpportunityRoof AgeRoyco – Roofing Job DetailsApprox. age of the current roof, in years.e.g., 18
DropdownOpportunityInsurance Claim StatusRoyco – Roofing Job DetailsClaim stage if insurance is involved.Not Applicable, Claim Started, Claim Approved, Claim Denied, Unknown— (dropdown)
DropdownOpportunityPreferred Inspection WindowRoyco – Roofing Job DetailsPreferred time of day for roof inspection scheduling.Morning, Afternoon, Evening, Flexible— (dropdown)
MonetaryOpportunityEstimate AmountRoyco – Estimate TrackingDollar value of the estimate sent.e.g., 12500
Date pickerOpportunityEstimate Sent DateRoyco – Estimate TrackingDate the estimate was sent (drives WF02).— (date picker)
Date pickerOpportunityInspection DateRoyco – Estimate TrackingScheduled roof inspection date.— (date picker)
Date pickerOpportunityProject Start DateRoyco – Project TrackingDate the crew is scheduled to start.— (date picker)
Date pickerOpportunityProject Completed DateRoyco – Project TrackingActive. Records when the job finished; the Project Completed stage move triggers WF01 review requests.— (date picker)
DropdownOpportunityGoogle Review StatusRoyco – Review TrackingReview 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 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 GHLName to TypeValue to TypeFolderExpected Merge KeyUsed InVerify Before PublishSnapshot Action
1Settings → Custom Values → Add Custom ValueBusiness NameRoyCo RoofingRoyco - Business Info{{custom_values.business_name}}Email copy, signatures, templatesSend test email and confirm RoyCo Roofing displays correctlyClear value before reusable snapshot
2Settings → Custom Values → Add Custom ValueBusiness Phone(913) 730-7663Royco - Business Info{{custom_values.business_phone}}Missed call follow-up, email body, signaturesConfirm phone number with RoycoClear value before snapshot
3Settings → Custom Values → Add Custom ValueBusiness Emailinfo@roycoroof.comRoyco - Business Info{{custom_values.business_email}}Email footer, contact info, templatesConfirm sender email and domain matchClear value before snapshot
4Settings → Custom Values → Add Custom ValueBusiness Address1142 Merriam Ln, Kansas City, KS 66103Royco - Business Info{{custom_values.business_address}}CAN-SPAM footer, email footerConfirm physical business addressClear value before snapshot
5Settings → Custom Values → Add Custom ValueWebsite URLhttps://roycoroof.comRoyco - Business Info{{custom_values.website_url}}Email templates, footer, linksClick test linkClear value before snapshot
6Settings → Custom Values → Add Custom ValueBusiness Hours24/7 Live AnsweringRoyco - Business Info{{custom_values.business_hours}}Email copy, customer expectationsConfirm hours with RoycoClear value before snapshot
7Settings → Custom Values → Add Custom ValueService AreaKansas City Metro, Lawrence / Topeka, Lake of the OzarksRoyco - Business Info{{custom_values.service_area}}Lead qualification copy, templatesConfirm service area with RoycoClear value before snapshot
8Settings → Custom Values → Add Custom ValueOwner Signature NameThe RoyCo Roofing Team (confirm if Drew / Andrew should sign)Royco - Business Info{{custom_values.owner_signature_name}}Email signatures, closing linesConfirm preferred sign-offClear value before snapshot
9Settings → Custom Values → Add Custom ValueReview LinkAdd Royco Google review URL hereRoyco - Links{{custom_values.review_link}}Review Request Workflow (WF01)Click test link; opens Google review pageClear value before snapshot
10Settings → Custom Values → Add Custom ValueBooking LinkAdd GHL calendar booking URL hereRoyco - Links{{custom_values.booking_link}}Lead Form / Estimate Follow-Up, appointment CTAsClick test link; opens calendarClear value before snapshot
11Settings → Custom Values → Add Custom ValueFacebook URLhttps://www.facebook.com/RoyCoRoof/Royco - Social Links{{custom_values.facebook_url}}Email footer, future campaigns, brand linksClick test linkClear value before reusable snapshot
12Settings → Custom Values → Add Custom ValueInstagram URLhttps://www.instagram.com/roycoroofing/Royco - Social Links{{custom_values.instagram_url}}Email footer, future campaigns, brand linksClick test linkClear value before reusable snapshot
13Settings → Custom Values → Add Custom ValueLinkedIn URLConfirm actual Royco LinkedIn URL before useRoyco - Social Links{{custom_values.linkedin_url}}Email footer, credibility links, future campaignsClick test linkClear value before reusable snapshot
14Settings → Custom Values → Add Custom ValueTikTok URLConfirm actual Royco TikTok URL before use; not found on official site in this scanRoyco - Social Links{{custom_values.tiktok_url}}Email footer, future campaigns, brand linksClick test linkClear 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.
GHL FORM
First Name
Contact field · required
Last Name
Contact field · required
Email
Contact field · required
Phone
Contact field · required
Preferred Contact
Phone Call, Text, Email, Any
Service Interest
Roof Inspection, Repair, Replacement, Hail / Storm, Gutter, Tile Roofing, Not Sure
Roofing Issue
Multi-line description of leak, storm damage, roof age, timing, or insurance context
Property Street Address
Opportunity field · project address
City
Opportunity field
State
KS or MO
ZIP Code
Opportunity field
Roof Age
Number / text
Insurance Claim
Not Applicable, Started, Approved, Denied, Unknown
Inspection Window
Morning, Afternoon, Evening, Flexible
How Did You Hear About Us?
Lead Source Detail · optional
Field Build Table
#Field LabelGHL Field / ObjectTypeRequiredOptions / Notes
1First NameContact standardTextYesNative GHL contact field
2Last NameContact standardTextYesNative GHL contact field
3EmailContact standardEmailYesUsed for Email-first MVP follow-up
4PhoneContact standardPhoneYesRequired for calls and future SMS only after consent/A2P
5Preferred Contact MethodContact custom fieldDropdownNoPhone Call, Text, Email, Any
6Service InterestOpportunity custom fieldDropdownYesRoof Inspection, Roof Repair, Roof Replacement, Hail / Storm Damage Inspection, Gutter Install & Repair, Tile Roofing, Not Sure
7Roofing IssueOpportunity custom fieldMulti lineNoAsk: “Tell us what is going on with the roof.”
8Property Street AddressOpportunity custom fieldSingle lineYesProject address, not contact mailing address
9Property CityOpportunity custom fieldSingle lineYesProject city
10Property StateOpportunity custom fieldDropdownYesKS, MO
11Property ZIP CodeOpportunity custom fieldSingle lineYesUsed for service-area reporting/routing
12Roof AgeOpportunity custom fieldNumberNoApproximate years old
13Insurance Claim StatusOpportunity custom fieldDropdownNoNot Applicable, Claim Started, Claim Approved, Claim Denied, Unknown
14Preferred Inspection WindowOpportunity custom fieldDropdownNoMorning, Afternoon, Evening, Flexible
15How did you hear about us?Lead Source Detail · Contact custom fieldSingle lineNoOptional free text or dropdown later
16SMS ConsentConsent checkbox / Contact record noteCheckboxFuture SMS onlyKeep present but do not activate SMS until A2P approval and consent handling are verified.
Hidden Values, Tags, and Submit Behavior
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.

WorkflowTriggerMandatory FilterExecutionStop on ResponseRe-enrollFolder
WF04 — New Lead Form Follow-UpForm SubmittedForm = Sales – Lead Capture FormExecute OnceONOFFSales Pipeline
WF02 — Estimate Sent Follow-UpPipeline Stage ChangedPipeline = Sales Pipeline AND Stage = Estimate SentExecute OnceONOFFSales Pipeline
WF01 — Future Completed Project Review RequestPipeline Stage ChangedPipeline = Sales Pipeline AND Stage = Project CompletedExecute OnceONOFFReviews

Parked / Future (not active — do not build now):

WorkflowTriggerMandatory FilterExecutionStop on ResponseRe-enrollFolder
WF03 — Missed Call Capture + Alert (PARKED)Call DetailsCall status contains any of no-answer AND Call direction is IncomingAlwaysONONFuture / 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 AreaUsed For
1. Top BarWorkflow name, Save, Test Workflow, Draft / Publish toggle, Settings
2. Trigger PanelClick Add Trigger, search trigger name, select trigger, add required filters
3. CanvasAdd actions in order from top to bottom, add If/Else branches, waits, emails, tags, opportunity actions
4. Right-Side Settings PanelConfigure each trigger/action, set branch conditions, select tags, fields, pipeline, stage, email templates, waits
5. Workflow SettingsExecution Type, Stop on Response, Re-enrollment
6. Testing / LogsTest 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

  1. On the canvas, click the blue + under the trigger.
  2. Search If / else and select it.
  3. In the right panel, set Action Name to Check Do Not Contact.
  4. For Scenario Recipe, choose Has tag. Do not choose Build your own for this guard.
  5. Under Branches, rename the first branch to Has DNC Tag.
  6. Select the tag compliance-dnd-active.
  7. 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 NameSelectOperatorValueYes branchNone branch
Check Do Not ContactContact TagHas Tag / Containscompliance-dnd-activeExit / Remove From WorkflowContinue
Opportunity Found?Find Opportunity resultExists / FoundUpdate OpportunityCreate Opportunity
Already In Estimate Follow Up?Contact TagHas Tag / Containssequence-estimate-follow-up-activeExitContinue
Won or Closed Lost?Opportunity StageIsProject Won OR Closed LostRemove sequence-estimate-follow-up-active + ExitContinue follow-up
Review Left?Opportunity Field: Google Review StatusIsReview LeftEndSend 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
Pipeline Is Sales Pipeline

WHEREWhere this goes

  1. Do not add this as a second trigger at the top of the workflow.
  2. For WF03, add it under the None branch of Check Do Not Contact.
  3. For WF04, add it under the None branch of Check Do Not Contact.
  4. 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.

Create / Update Opportunity — right-side panel values
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.
WF 03FUTURE / PARKED

Missed Call Capture + Alert — Future Expansion (parked)

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.
WF03 Missed Call Capture + Alert — exact GHL canvas order
Call Details 01 If/ElseDNC? 02 Yes Remove From WF 03 No / None FindOpportunity 04 OpportunityFound? 05 Found Create/UpdateOpportunity 06A Not Found Create/UpdateOpportunity 06B Add Contact Tag 07 Internal Notification 08 Add Task 09 Add To Notes 10 Captured +Alerted 11
WF03 — EXACT GHL SCREEN VALUES, IN ORDER
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
Action Name
Add Missed Call Tags
Tags
lead-source-missed-call event-missed-call stage-new-lead
Save
Click Save Action
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.
Notify followers
Keep Contact followers OFF. Keep Opportunity followers OFF.
Cc / Bcc
Leave Cc and Bcc blank.
Subject
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
StepBuilder ActionWhat to enter / settings
1Create WorkflowAutomation → Workflows → Missed Call Automation → Create Workflow → Start From Scratch → rename to Calls – Missed Call Capture + Alert Workflow – v1
2Trigger — Call DetailsFilters: Call status contains any of no-answer AND Call direction is Incoming
3Workflow SettingsExecution Type = Always; Stop on Response = ON; Re-enrollment = ON
4If / Else — Check Do Not ContactCondition: Contact Tag contains compliance-dnd-active. Yes → Remove From Workflow / End. None → continue.
5Find OpportunityRight panel: Action Name = Find Opportunity; Opportunity To Be Found = Most recently created opportunity; Fields = Pipeline | Is | Sales Pipeline.
6If / Else — Opportunity Found?Found branch → Update Opportunity. Not Found/None branch → Create/Update Opportunity.
7AFound branch — Create/Update OpportunityPipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Missed Call
7BNone branch — Create/Update OpportunityPipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Missed Call
8Add Contact Taglead-source-missed-call, event-missed-call, stage-new-lead
9Send Internal NotificationTo internal alert recipient. Subject: Missed roofing call — call back now. Body includes name, phone, source, and pipeline link.
10Add TaskTask title: Call back missed roofing lead. Due: today/immediate. Assigned to default owner.
11Add To NotesNote: Missed inbound call captured by WF03. Callback task created.
12SMS placeholderDo NOT add/publish Send SMS until A2P approval. Add a note in workflow description: SMS Phase 2 after A2P.
13Save → Test → PublishPublish 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.
WF03 exact GHL workflow-builder map
# on chartClick this inside GHLExact value / branch
00Create WorkflowAutomation → Workflows → Folder: Missed Call Automation → Create Workflow → Start From Scratch → Name: Calls – Missed Call Capture + Alert Workflow – v1
01Workflow Trigger = Call DetailsFilters: Call status contains any of no-answer AND Call direction is Incoming. Settings: Always | Stop on Response ON | Re-enrollment ON.
02If/ElseName it: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03Remove From WorkflowPut this on the Yes branch from step 02. This is the DNC exit.
04Find OpportunityPut 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.
05If/ElseName it: Opportunity Found?. Found path goes to 06A. None/Not Found path goes to 06B.
06ACreate/Update OpportunityFound branch. Pipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Missed Call.
06BCreate/Update OpportunityNone/Not Found branch. Same settings as 06A. This creates the missed-call opportunity.
07Add Contact TagAdd: lead-source-missed-call, event-missed-call, stage-new-lead.
08Send Internal NotificationRecipient = RoyCo internal alert email. Subject: Missed roofing call — call back now. Include {{contact.name}} and {{contact.phone}}.
09Add TaskTitle: Call back missed roofing lead. Due: Immediately / Today. Assigned to default owner.
10Add To NotesNote: Missed inbound call captured by WF03. Callback task created.
11No action neededThe 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
FormSubmitted 01 If/ElseDNC? 02 Yes Remove From WF 03 No / None FindOpportunity 04 OpportunityFound? 05 Found Create/UpdateOpportunity 06A Not Found Create/UpdateOpportunity 06B Add Contact Tag 07 Internal Alert 08 Send Email 09 New LeadCaptured 10
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
Action Name
Remove From Workflow — DNC Exit
Workflow
This workflow / current workflow
After saving
No more actions on this branch.

04None branch → Find Opportunity

Inside the None branch → 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

05Branch after Find Opportunity → Opportunity Found?

Directly below Find Opportunity → use the result branches
Found branch
Existing Sales Pipeline opportunity found.
Not Found / None branch
No Sales Pipeline opportunity found.
Found / Opportunity Found
Add Step 06A here.
Not Found / None
Add Step 06B here.

06AFound branch → Create/Update Opportunity

Inside 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 - Roofing Lead.
Opportunity Source
Click inside the field and type Website Form.
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.

06BNot Found branch → Create/Update Opportunity

Inside 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 - Roofing Lead.
Opportunity Source
Click inside the field and type Website Form.
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.

07After both opportunity paths → Add Contact Tag

After 06A and after 06B → Click + → Actions → Add Contact Tag
Action Name
Add New Lead Tags
Tags
lead-source-website-form stage-new-lead lifecycle-prospect
Save
Click Save Action

08Send Internal Notification

Click + → Actions → Send Internal Notification
Action Name
Internal Alert — New Roofing Lead
Recipient
Internal alert recipient / RoyCo owner/admin
Subject
New roofing lead submitted form
Body
Include {{contact.name}}, {{contact.phone}}, {{contact.email}}, service requested, address, and GHL contact/opportunity link.

09Send Email

Click + → Actions → Send Email
Action Name
Send New Lead Welcome Email
From Name
RoyCo Roofing
From Email
info@roycoroof.com or verified sender
Template
Email – New Lead Welcome
Subject
We received your roofing request
Footer
CAN-SPAM footer / unsubscribe enabled
SMS is still OFF until A2P. Email is the safe MVP auto-response.

10Workflow end / expected result

No more actions after welcome email and internal alert
Expected result
Form lead becomes a contact, fields are mapped, opportunity is in New Lead, tags are added, RoyCo is notified, welcome email is sent.
Publish rule
Submit the embedded form as a test lead before publishing.
Builder Steps — build top to bottom in the GHL canvas
StepBuilder ActionWhat to enter / settings
1Create WorkflowAutomation → Workflows → Sales Pipeline → Create Workflow → Start From Scratch → rename to Sales – New Lead Form Follow-Up Workflow – v1
2Trigger — Form SubmittedFilter: Form = Sales – Lead Capture Form
3Workflow SettingsExecution Type = Execute Once; Stop on Response = ON; Re-enrollment = OFF
4If / Else — Check Do Not ContactCondition: Contact Tag contains compliance-dnd-active. Yes → Remove From Workflow / End. None → continue.
5Find OpportunityRight panel: Action Name = Find Opportunity; Opportunity To Be Found = Most recently created opportunity; Fields = Pipeline | Is | Sales Pipeline.
6If / Else — Opportunity Found?Found branch → Update Opportunity. Not Found/None branch → Create/Update Opportunity.
7AFound branch — Create/Update OpportunityPipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Roofing Lead; Opportunity Source = Website Form
7BNone branch — Create/Update OpportunityPipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Roofing Lead; Opportunity Source = Website Form
8Add Contact Taglead-source-website-form, event-form-submitted, stage-new-lead, lifecycle-prospect
9Update Contact FieldLead Source Detail = Website Form; Last Contacted Date = current date if available
10Send Internal NotificationNotify internal alert recipient with name, phone, email, service interest, roofing issue, address, preferred window.
11Send EmailEmail template: Email – New Lead Welcome
12SMS placeholderSMS OFF until A2P approval and consent checkbox are live/tested.
13Save → Test → PublishSubmit 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.
WF04 exact GHL workflow-builder map
# on chartClick this inside GHLExact value / branch
00Create WorkflowAutomation → Workflows → Folder: Sales Pipeline → Create Workflow → Start From Scratch → Name: Sales – New Lead Form Follow-Up Workflow – v1
01Workflow Trigger = Form SubmittedFilter: Form = Sales – Lead Capture Form. Settings: Execute Once | Stop on Response ON | Re-enrollment OFF.
02If/ElseName it: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03Remove From WorkflowPut this on the Yes branch from step 02.
04Find OpportunityPut 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.
05If/ElseName it: Opportunity Found?. Found path goes to 06A. None/Not Found path goes to 06B.
06ACreate/Update OpportunityFound branch. Pipeline = Sales Pipeline; Stage = New Lead; Opportunity Name = {{contact.name}} – Roofing Lead; Opportunity Source = Website Form.
06BCreate/Update OpportunityNone/Not Found branch. Same settings as 06A. This creates the new website lead opportunity.
07Add Contact TagAdd: lead-source-website-form, stage-new-lead, lifecycle-prospect.
08Send Internal NotificationRecipient = RoyCo internal alert email. Subject: New roofing lead from website.
09Send EmailEmail template: Email – New Lead Welcome. From = RoyCo sender email. SMS remains OFF until A2P.
10No action neededThe 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
Pipeline StageChanged 01 If/ElseDNC? 02 Yes Remove From WF 03 No / None Already InFollow-Up? 04 Yes Remove From WF 05 No / None Add Contact Tag 06 Update ContactField 07 Send Email Day 0 08 Wait 2 Days 09 Won orLost? 10 Yes Remove ContactTag 10A End No Send Email Day 2 11 Wait 3 Days 12 Won orLost? 13 Yes Remove ContactTag 13A No Send Email Day 5 14 Wait 5 Days 15 Won orLost? 16 Yes Remove ContactTag 16A No Send Email Day 10 17 Add Task 18 Remove ContactTag 19 Estimate Chase End 20
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.

01Workflow Trigger screen — Pipeline Stage Changed

Automation → Workflows → Sales Pipeline → Create Workflow → Start From Scratch → Add New Trigger
Choose trigger
Pipeline Stage Changed
Workflow Trigger Name
Pipeline Stage Changed — Estimate Sent
Filter 1
Pipeline | Is | Sales Pipeline
Filter 2
Stage | Is | Estimate Sent
Save
Click Save Trigger
Both filters are mandatory. Without both, this can fire for the wrong pipeline or wrong stage.

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 In Follow-Up?
Has DNC Tag branch
Add Step 03 here.
None branch
Add Step 04 here.

03Has DNC Tag branch → Remove From Workflow

Inside Has DNC Tag branch → Click + → Actions → Remove From Workflow
Action Name
Remove From Workflow — DNC Exit
Workflow
This workflow / current workflow

04None branch → If / else: Already In Follow-Up?

Inside None branch after DNC check → Click + → Actions → If / Else
Action Name
Already In Estimate Follow-Up?
Scenario Recipe
Has tag
Branch Name
Already Open
Condition / Tag
sequence-estimate-follow-up-active
None branch
Continue to Add Contact Tag
Already Open branch
Add Step 05 here. This prevents duplicate estimate sequences.
None branch
Add Step 06 here. This starts the estimate chase.

05Already Open branch → Remove From Workflow

Inside Already Open branch → Click + → Actions → Remove From Workflow
Action Name
Remove From Workflow — Already In Estimate Follow-Up
Workflow
This workflow / current workflow
This is a duplicate-prevention exit. Do not send another estimate sequence if sequence-estimate-follow-up-active already exists.

06None branch → Add Contact Tag

Inside None branch after Already In Follow-Up? → Click + → Actions → Add Contact Tag
Action Name
Add Estimate Open Tag
Tag
sequence-estimate-follow-up-active
After this tag is added, do not immediately check for the same tag again or the workflow will exit itself.

07Update Contact Field

Click + → Actions → Update Contact Field
Action Name
Set Estimate Sent Date
Field
Estimate Sent Date
Value
Current date / today
Save
Click Save Action

08Send Email Day 0

Click + → Actions → Send Email
Action Name
Send Estimate Follow-Up Day 0
Template
Email – Estimate Sent Day 0
Subject
Your RoyCo Roofing estimate
Footer
CAN-SPAM footer / unsubscribe enabled

09Wait 2 Days

Click + → Actions → Wait
Action Name
Wait 2 Days
Wait Type
Wait for a specific amount of time
Duration
2 days
Timezone
Account timezone: America/Chicago

10If / else: Won or Lost?

After Wait 2 Days → Click + → Actions → If / Else
Action Name
Check Project Won or Closed Lost — Day 2
Branch Name
Won or Lost
Condition
Opportunity Stage is Project Won OR Opportunity Stage is Closed Lost
None branch
Continue to Send Email Day 2
Won or Lost branch
Add Step 10A here.
None branch
Add Step 11 here.

10AWon or Lost branch → Remove Contact Tag

Inside Won or Lost branch → Click + → Actions → Remove Contact Tag
Action Name
Remove Estimate Open Tag — Won/Lost Day 2
Tag
sequence-estimate-follow-up-active
After saving
No more actions on this branch.

11None branch → Send Email Day 2

Inside None branch after Day 2 won/lost check → Click + → Actions → Send Email
Action Name
Send Estimate Follow-Up Day 2
Template
Email – Estimate Follow-Up Day 2
Subject
Any questions about your roofing estimate?

12Wait 3 Days

Click + → Actions → Wait
Action Name
Wait 3 Days
Wait Type
Wait for a specific amount of time
Duration
3 days
Timezone
America/Chicago

13If / else: Won or Lost?

After Wait 3 Days → Click + → Actions → If / Else
Action Name
Check Project Won or Closed Lost — Day 5
Branch Name
Won or Lost
Condition
Opportunity Stage is Project Won OR Opportunity Stage is Closed Lost
None branch
Continue to Send Email Day 5
Won or Lost branch
Add Step 13A here.
None branch
Add Step 14 here.

13AWon or Lost branch → Remove Contact Tag

Inside Won or Lost branch → Click + → Actions → Remove Contact Tag
Action Name
Remove Estimate Open Tag — Won/Lost Day 5
Tag
sequence-estimate-follow-up-active
After saving
No more actions on this branch.

14None branch → Send Email Day 5

Inside None branch after Day 5 won/lost check → Click + → Actions → Send Email
Action Name
Send Estimate Follow-Up Day 5
Template
Email – Estimate Follow-Up Day 5
Subject
Following up on your RoyCo Roofing estimate

15Wait 5 Days

Click + → Actions → Wait
Action Name
Wait 5 Days
Wait Type
Wait for a specific amount of time
Duration
5 days
Timezone
America/Chicago

16If / else: Won or Lost?

After Wait 5 Days → Click + → Actions → If / Else
Action Name
Check Project Won or Closed Lost — Day 10
Branch Name
Won or Lost
Condition
Opportunity Stage is Project Won OR Opportunity Stage is Closed Lost
None branch
Continue to Send Email Day 10
Won or Lost branch
Add Step 16A here.
None branch
Add Step 17 here.

16AWon or Lost branch → Remove Contact Tag

Inside Won or Lost branch → Click + → Actions → Remove Contact Tag
Action Name
Remove Estimate Open Tag — Won/Lost Day 10
Tag
sequence-estimate-follow-up-active
After saving
No more actions on this branch.

17None branch → Send Email Day 10

Inside None branch after Day 10 won/lost check → Click + → Actions → Send Email
Action Name
Send Estimate Follow-Up Day 10
Template
Email – Estimate Follow-Up Day 10
Subject
Should we keep your roofing estimate open?

18Add Task

Click + → Actions → Add Task
Action Name
Create Final Estimate Follow-Up Task
Task Title
Final follow-up on open roofing estimate
Assigned To
Default owner / RoyCo owner/admin
Due Date
Today
Description
Estimate follow-up sequence completed. Call or manually review before closing/lost.

19Remove Contact Tag

Click + → Actions → Remove Contact Tag
Action Name
Remove Estimate Open Tag — Sequence Complete
Tag
sequence-estimate-follow-up-active

20Workflow end / expected result

No more actions after final cleanup
Expected result
Estimate follow-up completed, final task created, sequence-estimate-follow-up-active removed.
Manual next step
RoyCo decides whether to move opportunity to Project Won or Closed Lost.
Publish rule
Test Project Won, Closed Lost, and no-response paths before publishing.
Builder Steps — build top to bottom in the GHL canvas
StepBuilder ActionWhat to enter / settings
1Create WorkflowAutomation → Workflows → Sales Pipeline → Create Workflow → Start From Scratch → rename to Sales – Estimate Sent Follow-Up Workflow – v1
2Trigger — Pipeline Stage ChangedFilters: Pipeline = Sales Pipeline AND Stage = Estimate Sent
3Workflow SettingsExecution Type = Execute Once; Stop on Response = ON; Re-enrollment = OFF
4If / Else — Check Do Not ContactContact Tag contains compliance-dnd-active. Yes → Remove From Workflow / End. None → continue.
5If / Else — Already In Estimate Follow-Up?Contact Tag contains sequence-estimate-follow-up-active. Yes → End. None → continue.
6Add Contact Tagevent-estimate-sent, sequence-estimate-follow-up-active, stage-estimate-sent
7Update Contact FieldEstimate Sent Date = Current Date. Estimate Amount only if RoyCo enters amount manually.
8Send EmailEmail template: Email – Estimate Sent Day 0
9Wait2 days
10If / 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.
11Send EmailEmail template: Email – Estimate Follow Up Day 2
12Wait3 days
13If / Else — Won or Closed Lost?Yes → cleanup/end. None → Day 5.
14Send EmailEmail template: Email – Estimate Follow Up Day 5
15Wait5 days
16If / Else — Won or Closed Lost?Yes → cleanup/end. None → Day 10.
17Send EmailEmail template: Email – Estimate Follow Up Day 10
18Add TaskTask title: Manual final call on estimate. Assigned to default owner. Due today.
19CleanupRemove tag sequence-estimate-follow-up-active. Optional add lifecycle-lost-opportunity only if RoyCo marks Closed Lost manually.
20Save → Test → PublishPublish 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.
WF02 exact GHL workflow-builder map
# on chartClick this inside GHLExact value / branch
00Create WorkflowAutomation → Workflows → Folder: Sales Pipeline → Create Workflow → Start From Scratch → Name: Sales – Estimate Sent Follow-Up Workflow – v1
01Workflow Trigger = Pipeline Stage ChangedFilters: Pipeline = Sales Pipeline AND Stage = Estimate Sent. Settings: Execute Once | Stop on Response ON | Re-enrollment OFF.
02If/ElseName: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03Remove From WorkflowYes branch from 02.
04If/ElseName: Already In Estimate Follow-Up?. Condition: Contact Tag contains sequence-estimate-follow-up-active.
05Remove From WorkflowYes branch from 04. This prevents duplicate estimate chase enrollment.
06Add Contact TagNo/None branch from 04. Add sequence-estimate-follow-up-active.
07Update Contact FieldField = Estimate Sent Date. Value = current date / workflow enrollment date.
08Send EmailEmail template: Email – Estimate Follow-Up Day 0.
09WaitWait for 2 days.
10If/ElseName: Won or Closed Lost?. Condition: Opportunity Status = Won OR Pipeline Stage = Closed Lost.
10ARemove Contact TagYes branch from 10. Remove sequence-estimate-follow-up-active, then end.
11Send EmailNo/None branch from 10. Email template: Email – Estimate Follow-Up Day 2.
12WaitWait for 3 days.
13If/ElseName: Won or Closed Lost?. Same condition as 10.
13ARemove Contact TagYes branch from 13. Remove sequence-estimate-follow-up-active, then end.
14Send EmailNo/None branch from 13. Email template: Email – Estimate Follow-Up Day 5.
15WaitWait for 5 days.
16If/ElseName: Won or Closed Lost?. Same condition as 10.
16ARemove Contact TagYes branch from 16. Remove sequence-estimate-follow-up-active, then end.
17Send EmailNo/None branch from 16. Email template: Email – Estimate Follow-Up Day 10.
18Add TaskTitle: Manual follow-up on estimate. Due: today. Assigned to default owner/admin.
19Remove Contact TagRemove sequence-estimate-follow-up-active.
20No action neededThe estimate chase ends cleanly after cleanup.
WF 01REVENUE / REPUTATION

Future Completed Project — Review Request

Where in GHL: Automation → Workflows → Reviews
Name: Reviews – Future Completed Project Review Request Workflow – v1Folder: ReviewsTrigger: Pipeline Stage ChangedFilter: Pipeline = Sales Pipeline AND Stage = Project CompletedExecution: Execute OnceStop on Response: ONRe-enroll: OFF
Launch blocker: WF01 cannot go live until the Review Link custom value holds RoyCo's real Google review URL. It is drafted with a placeholder.
Flowchart first: Start with this map. Click any numbered node to jump to the matching exact GHL screen-value card below.
Numbered Flowchart — WF01. Match every number to the GHL action table below.
WF01 Future Completed Project Review Request — exact GHL canvas order
Stage ChangedProject Completed 01 If/ElseDNC? 02 Yes Remove From WF 03 No AlreadyAsked? 04 Yes Remove From WF 05 No Wait 2 Days 06 Send EmailReview Request 07 Add Tagreview-request-sent 08 Update FieldStatus=Requested 09 Wait 4 Days 10 ReviewLeft? 11 Yes Update FieldReview Left 12 ReviewCaptured 13 No Send EmailReview Reminder 14 Create TaskCall for review 15 Update FieldReminder Sent 16 ReviewRequested 17
WF01 — EXACT GHL SCREEN VALUES, IN ORDER
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.

01Workflow Trigger screen — Pipeline Stage Changed

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.

08Add Contact Tag

Click + → Actions → Add Contact Tag
Action Name
Tag Review Requested
Tags
review-request-sent stage-project-completed
Save
Click Save Action

09Update Contact Field — Google Review Status

Click + → Actions → Update Contact Field
Action Name
Set Review Status = Requested
Field
Google Review Status
Value
Requested
Save
Click Save Action

10Wait

Click + → Actions → Wait
Action Name
Wait — Reminder Gap
Wait Type
Time Delay
Duration
4 days
Why
Give the homeowner time to leave a review before any reminder.

11Add Action → If / Else: Review Left?

Click + → Actions → If / Else
Action Name
Review Left?
Scenario Recipe
Has tag
Branch Name
Review Left
Condition / Tag
review-left
None branch
Continue to Reminder
Review Left branch
Add Step 12 here.
None branch
Add Step 14 here.
RoyCo currently marks review-left manually (or via a future review integration). Until that exists, the None branch runs — that is expected.

12Review Left branch → Update Contact Field

Inside the Review Left branch → Click + → Actions → Update Contact Field
Action Name
Set Review Status = Review Left
Field
Google Review Status
Value
Review Left
Optional tag
review-left
Save
Click Save Action

13Review Left branch end — Review Captured

No more actions after the status update on this branch
Expected result
Homeowner left a review; status is recorded; no reminder is sent.

14None branch → Send Email — Review Reminder

Inside the None branch → Click + → Actions → Send Email
Action Name
Send Review Reminder Email
From Name
RoyCo Roofing
From Email
info@roycoroof.com or verified sender
Template
Email – Review Reminder Day 3
Subject
A quick favor about your new roof
Review link
Body must include {{custom_values.review_link}}
Footer
CAN-SPAM footer / unsubscribe enabled
SMS stays OFF until A2P is approved. The reminder is email only for now.

15Create Manual Task

Click + → Actions → Create Task
Action Name
Task — Personal Review Ask
Task Title
Call {{contact.name}} for a Google review
Assigned To
Default owner / RoyCo admin
Due
2 days from now

16Update Contact Field — Google Review Status

Click + → Actions → Update Contact Field
Action Name
Set Review Status = Reminder Sent
Field
Google Review Status
Value
Reminder Sent
Save
Click Save Action

17Workflow end / expected result

No more actions after the reminder and status update
Expected result
Completed-project contact receives a review ask, then a reminder if no review, with status tracked end to end.
Publish rule
Move a real test opportunity into Project Completed and confirm the email, tags, field, and reminder branch before publishing.
Builder Steps — build top to bottom in the GHL canvas
StepBuilder ActionWhat to enter / settings
1Create WorkflowAutomation → Workflows → Reviews → Create Workflow → Start From Scratch → rename to Reviews – Future Completed Project Review Request Workflow – v1
2Trigger — Pipeline Stage ChangedFilter: Pipeline = Sales Pipeline AND Stage = Project Completed
3Workflow SettingsExecution Type = Execute Once; Stop on Response = ON; Re-enrollment = OFF
4If / Else — Check Do Not ContactCondition: Contact Tag contains compliance-dnd-active. Yes → Remove From Workflow. None → continue.
5If / Else — Already Asked?Condition: Contact Tag contains review-request-sent. Yes → Remove From Workflow. None → continue.
6Wait2 days.
7Send EmailTemplate: Email – Review Request Day 0; body must contain {{custom_values.review_link}}.
8Add Contact Tagreview-request-sent, stage-project-completed
9Update Contact FieldGoogle Review Status = Requested
10Wait4 days.
11If / Else — Review Left?Condition: Contact Tag contains review-left. Yes → status update + end. None → reminder.
12Update Contact Field (Yes)Google Review Status = Review Left; optional review-left tag.
13Send Email (None)Template: Email – Review Reminder Day 3; include {{custom_values.review_link}}.
14Create TaskCall {{contact.name}} for a Google review; assign default owner.
15Update Contact FieldGoogle Review Status = Reminder Sent
16SMS placeholderSMS OFF until A2P approval.
17Save → Test → PublishMove 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.
WF01 exact GHL workflow-builder map
# on chartClick this inside GHLExact value / branch
00Create WorkflowAutomation → Workflows → Folder: Reviews → Create Workflow → Start From Scratch → Name: Reviews – Future Completed Project Review Request Workflow – v1
01Workflow Trigger = Pipeline Stage ChangedFilter: Pipeline = Sales Pipeline AND Stage = Project Completed. Settings: Execute Once | Stop on Response ON | Re-enrollment OFF.
02If/ElseName it: Check Do Not Contact. Condition: Contact Tag contains compliance-dnd-active.
03Remove From WorkflowPut this on the Yes branch from step 02.
04If/ElseName it: Already Asked?. Condition: Contact Tag contains review-request-sent. None path continues.
05Remove From WorkflowPut this on the Yes branch from step 04.
06Wait2 days on the None branch.
07Send EmailTemplate: Email – Review Request Day 0. Body merge {custom_values.review_link}.
08Add Contact TagAdd: review-request-sent, stage-project-completed.
09Update Contact FieldGoogle Review Status = Requested.
10Wait4 days.
11If/ElseName it: Review Left?. Condition: Contact Tag contains review-left. Yes → 12. None → 14.
12Update Contact FieldReview Left branch. Google Review Status = Review Left.
13No action neededReview Left branch ends after the status update.
14Send EmailNone branch. Template: Email – Review Reminder Day 3. SMS remains OFF until A2P.
15Create TaskCall {contact.name} for a Google review; assign default owner.
16Update Contact FieldGoogle Review Status = Reminder Sent.
17No action neededThe 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
  • Confirm legal address exactly matches registration documents
  • 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
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
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
  • Publish SMS versions only after live test passes
11 · MESSAGES

Ready-to-paste email copy — active build (WF04 · WF02 · WF01)

Where in GHL: Marketing → Emails → Templates

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.

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.

1 — Client + foundation
  • Verify client info, website/brand assets, sender domain, timezone, phone forwarding, internal alert owner
2 — GHL assets
  • Pipeline, folders, naming, tags, fields, custom values, lead form, email templates
3 — Workflows (active, in order)
  • WF04 New Lead Form Follow-Up
  • WF02 Estimate Sent Follow-Up
  • WF01 Future Completed Project Review Request
  • WF03 Missed Call Capture — parked in Future Expansion (not in this build)
5 — QA + handoff
  • Run every test, check logs, publish one workflow at a time, delete test data, record Loom/walkthrough
13 · QA

QA & testing checklist — active build (WF04 · WF02 · WF01)

Where in GHL: Automation → Workflows → Test Workflow / Enrollment History / Execution Logs; Contacts → Activity; Opportunities → Sales Pipeline
StepQA Step
1Confirm timezone = America/Chicago and sender domain/SPF/DKIM are verified
2Confirm Sales Pipeline stages exactly: New Lead, Contacted, Estimate Sent, Project Won, Project Completed, Closed Lost
3Confirm required tags exist with exact spelling and no duplicates
4Confirm contact and opportunity custom fields exist and are mapped on the form
5Submit Sales – Lead Capture Form as a test lead
6Confirm WF04 creates/updates opportunity, tags lead, sends internal notification, sends welcome email
7Move a test opportunity to Project Completed
8Confirm 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
9Move test opportunity to Estimate Sent
10Confirm WF02 sends Day 0 email, adds sequence-estimate-follow-up-active, updates Estimate Sent Date
11Test Project Won branch and Closed Lost branch cleanup
12Check Enrollment History and Execution Logs for all 3 active workflows (WF04, WF02, WF01)
13Confirm no duplicate opportunities were created
14Confirm SMS actions are not active/published
15Publish one workflow at a time only after test passes
16Delete 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.

Figure — Master Flow
Visible flowchart — Master RoyCo active build
⚡ Lead Form Submitted (WF04) Find Opportunity Opportunity Found? Found Update Opportunity Not Found Create Opportunity New Lead Contacted Estimate Sent WF02 Estimate Follow-Up Won or Lost? Won Project Won Lost Closed Lost No reply Final Call Task Job done ⚡ Project Completed WF01 Review Request Review Left / Reminder WF03 Missed Call parked (Future)
Mermaid source (optional)
flowchart TD
TR1(["⚡ Lead Form Submitted (WF04)"]) --> FO1["Find Opportunity"]
FO1 --> D1{"Opportunity Found?"}
D1 -->|Found| UO1["Update Opportunity"]
D1 -->|Not Found| CO1["Create Opportunity"]
UO1 --> ST1["New Lead"]
CO1 --> ST1
ST1 --> ST2["Contacted"]
ST2 --> ST3["Estimate Sent"]
ST3 --> WF02["WF02 Estimate Follow-Up"]
WF02 --> D2{"Won or Lost?"}
D2 -->|Won| ST4["Project Won"]
D2 -->|Lost| ST5["Closed Lost"]
D2 -->|No reply| M1["👤 Final Call Task"]
ST4 -->|Job done| ST6["Project Completed"]
ST6 --> WF01["WF01 Review Request"]
WF01 --> RV["Review Left / Reminder"]
P["WF03 Missed Call — parked (Future Expansion)"]
classDef oppStage fill:#001f3f,color:#ffffff,stroke:#001f3f,font-weight:bold;
classDef trigger fill:#4a90d9,color:#ffffff,stroke:#4a90d9,font-weight:bold;
classDef endNode fill:#2ecc71,color:#ffffff,stroke:#27ae60,font-weight:bold;
classDef manualAction fill:#e67e22,color:#ffffff,stroke:#d35400,font-weight:bold;
classDef parked fill:#2a2f37,color:#9aa3af,stroke:#7C8593,stroke-dasharray:5 4;
class ST1,ST2,ST3,ST4,ST5,ST6 oppStage
class TR1 trigger
class RV endNode
class M1 manualAction
class P parked
▣ · CHARTS

All charts — active build only

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.
Sales Pipeline
Visible flowchart — Pipeline
New Lead Contacted Estimate Sent Accepted Project Won Job Done Project Completed Triggers WF01 Review Request Not Proceeding Closed Lost
Mermaid source (optional)
flowchart LR
ST1["New Lead"] --> ST2["Contacted"] --> ST3["Estimate Sent"]
ST3 -->|Accepted| ST4["Project Won"]
ST4 -->|Job Done| ST6["Project Completed"]
ST6 -->|Triggers WF01| ST7["Review Request"]
ST3 -->|Not Proceeding| ST5["Closed Lost"]
classDef oppStage fill:#001f3f,color:#ffffff,stroke:#001f3f,font-weight:bold;
class ST1,ST2,ST3,ST4,ST6 oppStage
Workflow Coverage
Visible flowchart — Workflow Coverage
Lead Form WF04 New Lead Follow-Up New Lead Stage + first reply Estimate Sent WF02 Estimate Follow-Up Won / Lost / Final Task Project Completed WF01 Review Request Review Left / Reminder WF03 Missed Call Capture — parked in Future Expansion (not in active build)
Mermaid source (optional)
flowchart TD
C["Lead Form"] --> D["WF04 New Lead Follow-Up"] --> G["New Lead Stage + first reply"]
E["Estimate Sent"] --> F["WF02 Estimate Follow-Up"] --> H["Won / Closed Lost / Final Task"]
I["Project Completed"] --> J["WF01 Review Request"] --> K["Review Left / Reminder"]
P["WF03 Missed Call — parked (Future Expansion)"]
classDef trigger fill:#4a90d9,color:#ffffff,stroke:#4a90d9,font-weight:bold;
classDef endNode fill:#2ecc71,color:#ffffff,stroke:#27ae60,font-weight:bold;
classDef parked fill:#2a2f37,color:#9aa3af,stroke:#7C8593,stroke-dasharray:5 4;
class C,E,I trigger
class G,H,K endNode
class P parked