Arsalan Faysal – Automation & RevOps Blog

Mastering GHL Snapshots: A Medical Marketing Agency Blueprint

Written by Arsalan Faysal | May 25, 2026 1:53:28 PM
3 CRM Pipelines Built
7 Core Workflow Sequences
10 Pages / Funnels Templated
100% Native GHL — No Middleware

Most GHL snapshot builders start with the workflows. That's why most GHL snapshots are a mess — seventeen automations that overlap each other, a contact database that becomes unworkable after three months, and a pipeline that tells you nothing useful about where revenue is actually stalling. The architecture of a snapshot is a data problem first, an automation problem second, and a design problem third. Get the sequence wrong and you spend the next six months debugging instead of deploying. This is the full build — a medical agency MVP Master Snapshot, structured in the correct order, with every architectural decision explained.

The brief: a white-labeled GoHighLevel sub-account template for a medical marketing agency. Three CRM pipelines (Acquisition, Retention, Reactivation). Seven core workflow automations with strict message overlap prevention. A seven-page primary website template and three conversion funnels. Meta Conversions API and Google Tag Manager configured natively within GHL. No EHR API integrations. No third-party middleware like Keragon or SmartSync. Everything native.

That constraint — native GHL only — is not a limitation. It is a design discipline. Native-only means every medical practice sub-account that gets deployed from this snapshot works out of the box, without external dependencies that can break, charge separately, or require their own maintenance. For an agency deploying this template across dozens of medical clients, that stability is worth more than any feature a middleware layer adds.

· · ·

What Makes a Master Snapshot Actually Master-Level

A GHL snapshot is a point-in-time export of a sub-account's configuration: custom fields, pipelines, workflows, funnels, websites, calendar settings, email templates, SMS templates, and more. When you deploy a snapshot into a new sub-account, everything copies over. A client gets a working system in minutes instead of weeks.

The quality of a snapshot is determined entirely by the quality of the original sub-account it was built in. There is no snapshot-specific tooling that makes bad architecture into good architecture. Everything you build incorrectly in the source sub-account deploys incorrectly into every client account that ever uses the snapshot.

This means the Master Snapshot for a medical agency carries an asymmetric risk: one bad architectural decision — a poorly named custom field, a workflow that fires on the wrong trigger, a pipeline stage that does not match the actual patient journey — gets multiplied across every practice that ever uses the template. The rigor required to build it correctly the first time is disproportionately high.

Three principles govern this build:

  1. Naming conventions are non-negotiable. Every custom field, every tag, every smart list, every workflow, every pipeline stage follows a strict naming convention. Medical agencies deploy snapshots to multiple clients. When a client's sub-account needs troubleshooting six months after deployment, the person doing the troubleshooting has to be able to read the configuration and understand it without a 2-hour briefing. Consistent naming is the documentation.
  2. Workflows must be aware of each other. Seven automations running in the same sub-account for the same contacts will overlap if they are not designed as a system. A New Lead Welcome sequence and a Review Request sequence cannot both fire SMS messages to a contact on the same day. The workflow architecture must include explicit suppression logic — contacts actively enrolled in one sequence must be excluded from others during that enrollment window.
  3. The snapshot is a template, not a finished product. Every medical practice sub-account deployed from this snapshot will need customization: the practice name, the doctor's name, the specific services offered, the local phone numbers. The snapshot must be built with placeholder text and variable tokens that make customization fast and obvious. A snapshot that requires a GHL expert to customize is not a deployable product.
· · ·

Layer 1: Data Architecture — Custom Fields, Tag Taxonomy, Smart Lists

Before a single workflow is built, the data architecture must be complete. Workflows write to fields. Smart lists read from fields. Pipelines are organized by field values. If the field structure changes after workflows are built, every workflow that references those fields breaks. Build the data layer first. Lock it. Then build everything else on top of it.

Custom Field Architecture

In GHL, custom fields live at the contact level and the opportunity (deal) level. For a medical practice sub-account, the field architecture serves two masters: the patient relationship data that drives personalization, and the operational data that drives compliance and reporting.

CUSTOM FIELD TAXONOMY — CONTACT LEVEL
──────────────────────────────────────────────────────────────────

GROUP: Patient Identity
  • patient_dob (Date) — Date of birth for age-based personalization
  • patient_gender (Dropdown: Male / Female / Prefer not to say)
  • patient_preferred_name (Text) — For personalized comms
  • patient_insurance_type (Dropdown: Private / Medicare / Medicaid
                            / Self-Pay / Other)
  • patient_referring_source (Text) — How they first heard about the practice

GROUP: Clinical Context (no PHI — admin flags only)
  • primary_service_interest (Dropdown: per practice specialty)
  • appointment_type_last (Dropdown: New Patient / Follow-Up / Procedure)
  • appointment_status_last (Dropdown: Attended / No-Show / Cancelled)
  • last_appointment_date (Date) — Critical for Reactivation pipeline
  • total_appointments_attended (Number) — For loyalty triggers
  • first_appointment_date (Date) — Tenure tracking

GROUP: Acquisition Data
  • lead_source_primary (Dropdown: Google / Facebook / Referral /
                          Walk-In / Instagram / Other)
  • lead_source_campaign (Text) — UTM campaign name from form
  • lead_source_ad_id (Text) — Meta Ad ID from CAPI integration
  • opt_in_sms (Checkbox) — TCPA compliance — explicit SMS consent
  • opt_in_email (Checkbox) — CAN-SPAM / CASL compliance
  • opt_in_date (Date) — When consent was captured
  • opt_in_method (Dropdown: Website Form / Phone / In-Person)

GROUP: Engagement Signals
  • review_requested (Checkbox) — Prevents duplicate review requests
  • review_left (Checkbox) — Has the patient left a review?
  • review_platform (Dropdown: Google / Facebook / Healthgrades / Yelp)
  • nps_score (Number) — If NPS survey deployed
  • referral_made (Checkbox) — Has this patient referred someone?

GROUP: Lifecycle Control
  • active_workflow (Text) — Name of currently enrolled workflow
    (written on enrollment, cleared on exit — prevents overlap)
  • do_not_contact (Checkbox) — Hard suppression flag
  • reactivation_eligible (Checkbox) — Has not been contacted in 180+ days
  • reactivation_attempt_count (Number) — How many reactivation touches sent
CRITICAL COMPLIANCE NOTE — HIPAA AND TCPA
HIPAA
No PHI in GHL Custom Fields GHL (as of the current BAA framework) is not a HIPAA-compliant EHR system. Custom fields in this snapshot must not store Protected Health Information: diagnosis codes, prescription details, lab results, detailed clinical notes, or specific medical conditions. The fields above store administrative and engagement data only. Any clinical data lives in the practice's EHR — the GHL snapshot communicates without replicating clinical records.
TCPA
Explicit SMS Consent Required Before Any Workflow Sends SMS Every SMS-sending workflow in this snapshot checks opt_in_sms = true before sending. The opt_in_sms field is only set to true by the intake form (which includes explicit TCPA consent language) or by a documented in-office consent process. The field cannot be set to true by a workflow or staff member without a documented consent event.

Tag Taxonomy

Tags in GHL are binary — a contact either has a tag or doesn't. They are used for quick filtering, workflow triggers, and smart list membership. The medical snapshot uses a structured tag naming convention: [category]_[value].

Tag Category Tag Names Applied By Used For
Pipeline Stage Tags pipeline_acquisition, pipeline_retention, pipeline_reactivation Workflow on pipeline entry Smart list membership. Prevents cross-pipeline workflow enrollment.
Patient Status status_new_lead, status_active_patient, status_lapsed, status_reactivated Workflow on lifecycle stage change Primary segmentation. Determines which pipelines and sequences apply.
Workflow Enrollment wf_welcome_active, wf_review_active, wf_reactivation_active, wf_appointment_active First step of each workflow Overlap prevention. Any workflow checks for active enrollment tags before proceeding.
Consent and Compliance consent_sms, consent_email, dnc_hard, opted_out_sms Form submissions and opt-out events TCPA compliance. DNC enforcement. Communication channel eligibility.
Review Status review_requested, review_completed_google, review_completed_facebook Review request workflow and response tracking Prevents duplicate review requests. Tracks review platform distribution.
Source Attribution source_google_ads, source_facebook_ads, source_organic, source_referral, source_walkin Form intake workflow on submission ROI reporting by acquisition channel. Pipeline source attribution.

Smart Lists

Smart Lists are dynamic contact segments that update automatically based on filter conditions. They serve as both the trigger layer for bulk campaigns and the suppression layer that keeps workflows from firing on the wrong contacts. The snapshot includes eight core Smart Lists:

  • SL — New Leads (Uncontacted): Status = new_lead AND no_appointment_booked AND created_in_last_30_days
  • SL — Active Patients (Current): last_appointment_date within 90 days AND status_active_patient tag present
  • SL — Lapsed 90-180 Days: last_appointment_date between 90 and 180 days ago. Pre-reactivation monitoring list.
  • SL — Reactivation Eligible (180+ Days): last_appointment_date more than 180 days ago AND reactivation_eligible = true AND dnc_hard tag absent
  • SL — Review Requested (Pending): review_requested = true AND review_left = false AND last_appointment_date within 30 days
  • SL — No-Show (Last 7 Days): appointment_status_last = No-Show AND appointment updated in last 7 days
  • SL — SMS Eligible (Consent Confirmed): opt_in_sms = true AND opted_out_sms tag absent AND dnc_hard tag absent
  • SL — Active in Workflow (Any): any wf_*_active tag present. Used as suppression list across all bulk sends.
· · ·

Layer 2: The Three CRM Pipelines

Three pipelines, each modeling a distinct patient relationship phase. The critical design decision: these are separate pipelines, not separate stages within one pipeline. Mixing acquisition, retention, and reactivation in a single pipeline produces a funnel view that is simultaneously too complex to read and too simple to be useful. Separate pipelines allow separate stage definitions, separate automation triggers, separate conversion metrics, and separate reporting — which is what a medical agency needs to demonstrate value to each client.

Pipeline 1: Acquisition (New Patient Journey)

ACQUISITION PIPELINE
──────────────────────────────────────────────────────────────────

Stage 1: New Inquiry
  Entry trigger: Form submitted on website or funnel
  Automation: Tag contact with pipeline_acquisition and source_[channel]
              Set status_new_lead tag
              Enroll in Welcome Workflow (Workflow 1)
  Exit criteria: Appointment scheduled OR 30 days elapsed (→ Stage 5)

Stage 2: Appointment Scheduled
  Entry trigger: GHL Calendar appointment created AND linked to contact
  Automation: Set appointment_status_last = Scheduled
              Enroll in Appointment Reminder Workflow (Workflow 4)
              Remove from Stage 1 bulk re-engagement sequence if active
  Exit criteria: Appointment attended OR no-show

Stage 3: First Appointment Attended
  Entry trigger: appointment_status_last updated to Attended (staff action)
  Automation: Set status_active_patient tag
              Remove status_new_lead tag
              Set first_appointment_date = today
              Start Review Request Workflow (Workflow 2) — with 2-day delay
  Exit criteria: Second appointment scheduled (→ move to Retention Pipeline)

Stage 4: No-Show / Cancellation
  Entry trigger: appointment_status_last = No-Show or Cancelled (staff action)
  Automation: Enroll in No-Show Re-engagement Workflow (Workflow 5)
              Create task for front desk to call within 24 hours
              Set 14-day wait before re-engagement messages begin
  Exit criteria: Appointment rescheduled (→ back to Stage 2)

Stage 5: Lost — Did Not Convert
  Entry trigger: 30 days in Stage 1 with no appointment OR
                 3 no-shows with no reschedule OR
                 Contact replies with explicit "not interested"
  Automation: Remove all active workflow enrollment tags
              Set status to inactive
              Set reactivation_eligible = false for 90-day cooling period
              Move to reactivation eligibility check at 180 days

Pipeline 2: Retention (Active Patient Journey)

RETENTION PIPELINE
──────────────────────────────────────────────────────────────────

Stage 1: Active Patient (Recently Attended)
  Entry trigger: Contact moves from Acquisition Pipeline Stage 3
                 (first appointment attended)
  Automation: Tag pipeline_retention, remove pipeline_acquisition
              Start retention check-in sequence
  SLA: If no appointment scheduled within 60 days → move to Stage 3

Stage 2: Recurring Patient (2+ Appointments)
  Entry trigger: total_appointments_attended reaches 2
  Automation: Flag for referral request (gentle — via email, not SMS)
              Eligible for loyalty acknowledgment message
  SLA: If no appointment in 90 days → move to Stage 3

Stage 3: At Risk (60–90 Day Gap)
  Entry trigger: last_appointment_date between 60 and 90 days ago
                 AND no future appointment scheduled
  Automation: Create task for front desk or care coordinator
              Send a "We miss you" re-engagement email (not SMS at this stage)
              If no response in 14 days → escalate to Reactivation Pipeline trigger
  Exit criteria: New appointment booked (→ back to Stage 1)

Stage 4: Transferred to Reactivation
  Entry trigger: 90+ days since last appointment, no response to Stage 3 outreach
  Automation: Tag pipeline_reactivation
              Set reactivation_eligible = true
              Move contact into Reactivation Pipeline Stage 1
              Remove from Retention Pipeline

Pipeline 3: Reactivation (Lapsed Patient Recovery)

REACTIVATION PIPELINE
──────────────────────────────────────────────────────────────────

Stage 1: Lapsed (90–180 Days)
  Entry trigger: last_appointment_date > 90 days AND
                 transferred from Retention Pipeline Stage 4
  Automation: Add to SL — Lapsed 90-180 Days smart list
              Do NOT start reactivation sequence yet — monitoring phase
  Note: Stage 1 is intentionally passive. We track but don't contact
        until 180-day threshold to avoid appearing pushy to patients
        who may have a scheduled appointment we're not aware of.

Stage 2: Reactivation Sequence Active (180+ Days)
  Entry trigger: last_appointment_date > 180 days AND
                 reactivation_eligible = true AND
                 reactivation_attempt_count = 0
  Automation: Enroll in 180-Day Reactivation Workflow (Workflow 3)
              Set wf_reactivation_active tag
              Set reactivation_attempt_count = 1

Stage 3: Reactivation Response Received
  Entry trigger: Contact replies to reactivation message OR
                 Books appointment via reactivation campaign link
  Automation: Remove wf_reactivation_active tag
              If appointment booked → move back to Acquisition Pipeline Stage 2
              Create task: "Returning patient — high priority scheduling"
  Exit criteria: Appointment booked

Stage 4: Reactivation Exhausted
  Entry trigger: All reactivation workflow steps completed with no response
  Automation: Set reactivation_eligible = false
              Set reactivation_attempt_count = maximum value
              Remove from all active smart lists
              Tag: status_churned
              Archive contact (preserve record, suppress from all future sends)
· · ·

Layer 3: The Seven Core Workflow Automations

Seven workflows, all running in the same sub-account, all potentially touching the same contacts. The overlap prevention architecture is the most important design element in this entire build. A patient who is actively enrolled in the Welcome sequence should not simultaneously receive a Review Request message. A patient in the Reactivation sequence should not receive a routine appointment reminder for an appointment they don't have.

The overlap prevention mechanism: the active_workflow custom field and the wf_*_active tag system. Every workflow's first step writes the workflow name to the active_workflow field and applies the relevant wf_*_active tag. Every workflow's enrollment trigger includes a condition checking that no other wf_*_active tags are present. The last step of every workflow clears the tag and the field.

Workflow 1: New Lead Welcome Sequence

WORKFLOW 1 — NEW LEAD WELCOME SEQUENCE
──────────────────────────────────────────────────────────────────
Trigger: Contact created via intake form submission
Enrollment filter: status_new_lead tag present AND
                   wf_welcome_active tag absent AND
                   opt_in_sms = true (for SMS steps) OR opt_in_email = true

Step 1 (Immediate — T+0 minutes)
  Action: Add tag wf_welcome_active
  Action: Write "Welcome Sequence" to active_workflow field
  Action: Add tag source_[channel] based on lead_source_primary field
  
Step 2 (T+5 minutes)
  Condition: opt_in_sms = true?
  → YES: Send SMS
    "Hi , thank you for reaching out to !
     We've received your request and a team member will contact you
     shortly to schedule your appointment. Questions? Call us at
     . Reply STOP to opt out."
  → NO: Skip to email step

Step 3 (T+10 minutes)
  Action: Send Email
  Subject: "Welcome to  — Next Steps"
  Content: Personalized welcome email with:
    • Confirmation of their inquiry
    • What to expect at first appointment
    • Link to appointment booking page (GHL calendar)
    • Practice address + directions link
    • "Meet the Team" section (placeholder — swap per practice)

Step 4 (T+30 minutes)
  Action: Create internal task assigned to front desk
  Task: "New lead   — call to schedule 
         appointment. Source: "
  Due: Same business day or next business day (conditional on time)

Step 5 (Wait: 24 hours — IF no appointment scheduled)
  Condition: appointment_status_last is empty (no appointment yet)
  → YES (still no appointment): Continue to Step 6
  → NO (appointment scheduled): Exit workflow — remove wf_welcome_active tag

Step 6 (T+24 hours — No Appointment Follow-Up)
  Action: Send SMS (if opt_in_sms = true)
  "Hi , we want to make sure you get the care you need.
   Tap here to book your appointment at a time that works for you:
    —  Team"

Step 7 (Wait: 48 hours)
  Condition: appointment_status_last is empty?
  → YES: Continue
  → NO: Exit workflow

Step 8 (T+72 hours — Final Touch)
  Action: Send Email
  Subject: "Still thinking about it? We're here when you're ready."
  Content: Low-pressure re-engagement. Mention their inquiry topic
           (via custom field merge). Offer to answer questions.
           Include booking link prominently.
  
Step 9 (Final Step)
  Action: Remove tag wf_welcome_active
  Action: Clear active_workflow field
  Action: If still no appointment after 72h → move deal to Stage 5 (Lost)
          OR create escalation task for manager review

Workflow 2: Review Request Sequence

WORKFLOW 2 — REVIEW REQUEST SEQUENCE
──────────────────────────────────────────────────────────────────
Trigger: appointment_status_last updated to "Attended"
Enrollment filter: review_requested = false AND
                   status_active_patient tag present AND
                   wf_review_active tag absent AND
                   dnc_hard tag absent

Note: This workflow starts with a mandatory 2-day delay.
Patients should not receive a review request the day of their appointment.
The delay respects the patient experience timeline.

Step 1 (Immediate)
  Action: Add tag wf_review_active
  Action: Set review_requested = true (prevents re-enrollment)
  
Step 2 (Wait: 2 days)
  [Nothing fires. Patient settles into post-appointment experience.]

Step 3 (T+2 days)
  Condition: opt_in_sms = true?
  → YES: Send SMS
    "Hi , thank you for visiting !
     We hope your experience was excellent. If you have a moment,
     we'd love your feedback — it helps other patients find us:
      — Reply STOP to opt out."

Step 4 (Wait: 3 days — IF no review left)
  Condition: review_left = false?
  → YES: Continue to email follow-up
  → NO: Exit workflow — remove tag

Step 5 (T+5 days — Email Follow-Up)
  Action: Send Email
  Subject: "A quick favour, "
  Content: Genuine, brief request for review. Include both Google and
           Facebook review links. One-click links. No lengthy copy.

Step 6 (Wait: 7 days)
  Condition: review_left = false?
  → YES: Final touch
  → NO: Exit

Step 7 (T+12 days — Final Gentle Reminder)
  Action: Send Email only (no second SMS — avoid appearing pushy)
  Subject: "Last chance — 2 minutes to share your experience"
  
Final Step:
  Action: Remove tag wf_review_active
  Action: If review_left = false after all steps → add tag review_declined
           (prevents future re-enrollment into review sequence)

Workflow 3: 180-Day Reactivation Sequence

WORKFLOW 3 — 180-DAY REACTIVATION SEQUENCE
──────────────────────────────────────────────────────────────────
Trigger: last_appointment_date is more than 180 days ago AND
         reactivation_eligible = true AND
         reactivation_attempt_count = 0
Enrollment filter: wf_reactivation_active tag absent AND
                   dnc_hard tag absent AND
                   status_churned tag absent

Goal: Win back lapsed patients with 3 carefully spaced touchpoints
      across different channels, using value-first messaging.
      NOT promotional. NOT pushy. Genuine reconnection.

Step 1 (Immediate)
  Action: Add tag wf_reactivation_active
  Action: Set reactivation_attempt_count = 1
  Action: Write "Reactivation Sequence" to active_workflow field

Step 2 (T+1 day — Email: The Value Touch)
  Subject: "We've been thinking about you, "
  Content: Health check-in framing. Not a promotional email.
           Reference the time since their last visit (calculated field).
           Mention any relevant seasonal health topic.
           Soft CTA: "Is it time for a check-up? We'd love to see you again."
           Include: Easy booking link. No urgency language.

Step 3 (Wait: 14 days)
  Condition: last_appointment_date still > 180 days AND
             no new appointment scheduled?
  → YES: Continue
  → NO: Exit workflow — patient has re-engaged

Step 4 (T+15 days — SMS: The Direct Touch)
  Condition: opt_in_sms = true?
  → YES: Send SMS
    "Hi , it's been a while since we've seen you at
     . We're here when you're ready — book your
     appointment at your convenience: 
     Reply STOP to opt out."

Step 5 (Wait: 21 days)
  Condition: No appointment scheduled?
  → YES: Final touch
  → NO: Exit

Step 6 (T+36 days — Email: The Offer Touch)
  Subject: "A small thank-you for being a  patient"
  Content: A genuine value-add. Could be:
           • A health resource relevant to their service history
           • An invitation to a patient education event
           • A "we've reserved your preferred appointment slot" offer
           Avoid: Discount language that devalues the practice.
           Strong CTA: "Book your returning patient appointment."

Final Step:
  Action: Remove tag wf_reactivation_active
  Action: Clear active_workflow field
  Action: Set reactivation_eligible = false
  Action: If no appointment booked → move to Reactivation Pipeline Stage 4
  Action: Add tag reactivation_completed_no_response (for reporting)

Workflows 4–7: Supporting Sequences

Workflow Trigger Purpose Key Steps Overlap Prevention
Workflow 4: Appointment Reminder GHL Calendar appointment confirmed (any status) Reduce no-show rate. Industry benchmark: 3-touch reminder sequence reduces no-shows by 40–60%. T-72h: Email confirmation. T-24h: SMS reminder with directions link. T-2h: SMS final reminder. T+0 (post-appointment): Update appointment_status_last. Tag: wf_appointment_active. Cleared after appointment time passes. Does not suppress other workflows — runs concurrently by design since it is appointment-specific.
Workflow 5: No-Show Re-engagement appointment_status_last updated to "No-Show" by staff Recover no-show patients with a low-friction rescheduling path. Most no-shows are logistical, not intentional. T+2h: SMS "We missed you today — life happens. Here's a quick link to reschedule." T+24h: Email with booking link + optional FAQ. T+72h: Task created for front desk outreach if not rescheduled. Tag: wf_noshow_active. Enrollment filter checks that wf_reactivation_active and wf_welcome_active tags are absent.
Workflow 6: Post-Appointment Check-In appointment_status_last = Attended AND total_appointments_attended ≥ 2 Deepen relationship with returning patients. Trigger referral ask at the right moment (after second visit — before then feels presumptuous). T+3 days: Genuine check-in email ("How are you feeling after your visit?"). T+7 days: Referral ask email if no prior referral_made flag. Low-pressure copy. No incentive language. Tag: wf_checkin_active. Does not overlap with review workflow — review fires first; check-in fires on second+ appointments when review sequence is complete.
Workflow 7: Opt-Out / DNC Management Contact replies STOP to any SMS OR unsubscribes from email OR staff sets dnc_hard = true Immediate, compliant suppression of all communications. This workflow must be the highest priority in the account — it fires before any other workflow action on the same contact. Immediate: Remove ALL wf_*_active tags. Set opt_in_sms = false (on STOP reply). Set opt_in_email = false (on email unsubscribe). Add dnc_hard tag. Remove from all Smart Lists. Cancel all pending workflow steps. Create staff notification. This workflow has NO enrollment filter — it overrides everything. It is the only workflow without overlap prevention because it IS the prevention layer.
· · ·

Layer 4: Website and Conversion Funnels in GHL Site Builder

The GHL Site Builder is not WordPress. It is not designed for complex, highly custom websites. It is designed to build functional, fast, mobile-optimized medical websites that a non-technical agency employee can update and customize for each new client in a few hours. The 7-page website template is built to that constraint — not to push the limits of the builder, but to produce a template that is genuinely deployable at scale.

The 7-Page Primary Website Template

Page Primary Purpose Key Sections Conversion Element
1. Homepage First impression + primary call routing Hero with headline + subtext + CTA. Trust bar (credentials, associations). Services overview (3-column grid). Social proof (Google review widget). About teaser. Footer. Primary CTA: "Book Your Appointment" → booking funnel. Secondary CTA: "Call Now" (click-to-call).
2. Services Page Service discovery and qualification Service category overview. Individual service cards (each links to Service Detail sub-page). FAQ section. CTA bar. Each service card links to a dedicated booking funnel for that service. Prevents generic "I want to book" inquiries — routes to specific service funnels.
3. About / Meet the Team Trust building and relationship establishment Practice story. Doctor/provider profiles (photo, credentials, specialties). Philosophy of care section. Awards/associations. Soft CTA: "Ready to meet us in person?" → booking link.
4. New Patient Information Pre-appointment education and objection handling What to expect at first appointment. Insurance information. Patient forms (link to GHL form). FAQ. Parking/directions. CTA: "Ready? Book your first appointment." Reduces cancellation rate by setting expectations clearly.
5. Blog / Resources SEO and organic traffic capture GHL Blog module. Category filtering (Health Tips / News / Practice Updates). Recent posts grid. Email signup CTA. In-post CTAs linking to relevant service funnels. Email capture for nurture list building.
6. Testimonials / Reviews Social proof consolidation Featured reviews (manually curated from Google). Google review widget embed. Video testimonials (if available). Star rating display. CTA below reviews: "Join our patients — book your appointment."
7. Contact / Locations Last-resort contact for non-booking inquiries GHL Contact form (maps to GHL contact creation). Phone, address, email. Google Maps embed. Office hours. Insurance accepted. Contact form is secondary to booking CTA. Booking link appears prominently before the contact form.

The 3 Conversion Funnels

Three single-flow funnels, each designed for a specific traffic source and conversion objective. In GHL, funnels are linear — each page has one CTA and one destination. No navigation. No escape routes. This is intentional.

FUNNEL 1 — NEW PATIENT ACQUISITION FUNNEL
(Primary funnel — drives paid traffic from Google/Meta Ads)
──────────────────────────────────────────────────────────────────

Page 1: Landing Page (Appointment Request)
  Headline: "Book Your Appointment at "
  Sections:
    • Hero: Headline + benefit statement + trust indicators
    • Simple 3-field form: Name, Phone, Email
    • Service selection dropdown (maps to lead_source_primary)
    • TCPA consent checkbox (required)
    • Google review stars widget (social proof)
    • "Why choose us" — 3 icons with brief copy
  
  On Submit:
    → GHL contact created
    → Tag source_[channel] applied via hidden UTM field
    → Workflow 1 (Welcome Sequence) triggers
    → Deal created in Acquisition Pipeline Stage 1
    → CAPI event: Lead (fires to Meta Conversions API)
    → GTM trigger: form_submission event pushes to GA4

Page 2: Thank You / Appointment Confirmation
  Content:
    • "We've received your request" confirmation
    • GHL Calendar embed (allow patient to self-schedule immediately)
    • "What to expect" — 3-step visual
    • Practice phone number (for immediate questions)
    • Google review prompt (not the primary CTA — subtle)
  
  Note: Embedding the calendar on the thank-you page converts
  a lead into a scheduled appointment immediately. Every patient
  who self-schedules here bypasses the manual front-desk scheduling
  step — reducing the lead-to-appointment cycle from 24–48h to minutes.

──────────────────────────────────────────────────────────────────

FUNNEL 2 — SPECIFIC SERVICE FUNNEL
(Variant — one per service offering, customized per practice)
──────────────────────────────────────────────────────────────────

Page 1: Service-Specific Landing Page
  Headline: "[Service Name] in [City] — "
  Sections:
    • Service-specific hero with condition/concern framing
    • "This is for you if..." — 3 pain points (resonates with target patient)
    • How it works — 3-step visual (condition → consultation → treatment)
    • Doctor profile + credentials
    • Booking form (same 3-field structure as Funnel 1)
    • FAQ section (5 questions specific to this service)
    • Insurance coverage note
    • Social proof (reviews specifically mentioning this service)
  
  Differentiator from Funnel 1:
  lead_source_primary hidden field pre-populated with service name.
  Allows service-level ROI tracking in GHL reports.

Page 2: Service-Specific Thank You
  Same structure as Funnel 1 Page 2 but with
  service-specific "what to expect" copy.

──────────────────────────────────────────────────────────────────

FUNNEL 3 — REACTIVATION CAMPAIGN FUNNEL
(Email/SMS-driven — not for paid traffic)
──────────────────────────────────────────────────────────────────

Page 1: "Welcome Back" Landing Page
  Accessed via link in Workflow 3 (Reactivation Sequence)
  Personalized via contact merge fields in the email/SMS link
  
  Content:
    • "Welcome back, " headline
    • "We're saving your spot" framing
    • One-click calendar booking (GHL Calendar embed)
    • "What's new at " section
      (New staff, updated equipment, new services — customizable)
    • "Your last visit was " (merge field)
      Gentle reminder without pressure
  
  No form on this page — patient is already a contact.
  The only action is booking the appointment.
  
  On calendar booking:
    → Update last_appointment_date when appointment is created
    → Remove wf_reactivation_active tag
    → Move deal to Reactivation Pipeline Stage 3
    → CAPI event: Schedule (fires to Meta if patient came via
      paid retargeting campaign)
· · ·

Layer 5: Meta CAPI and GTM — Native GHL Configuration

The brief specifies Meta Conversions API and Google Tag Manager configured natively within GHL — no external tag management setup, no Zapier relay to a CAPI endpoint, no server-side tagging infrastructure. GHL's native CAPI and GTM integrations handle both. Here is exactly how each is configured.

Google Tag Manager — Native GHL Integration

GHL supports GTM container injection natively in sub-account settings. Navigate to Settings → Integrations → Google Tag Manager and enter the GTM container ID (GTM-XXXXXXX). GHL injects the GTM snippet on all GHL-hosted pages: website pages, funnel pages, and form pages.

Three GTM tags are configured for the medical snapshot:

GTM Tag Trigger Event Fired Purpose
GA4 Configuration All GHL Pages page_view (automatic) Base GA4 tracking on all GHL website + funnel pages
GA4 — Form Submission GHL Form Submission (custom event from GHL dataLayer) generate_lead Tracks every GHL form submission as a lead event in GA4. Key metric for ad performance reporting.
GA4 — Appointment Booked GHL Calendar Booking Confirmation page view schedule Tracks calendar bookings as a higher-intent conversion than form submissions. Allows conversion rate calculation between form → booking step.

GHL pushes a ghl_form_submitted dataLayer event when any form is submitted on GHL-hosted pages. GTM listens for this custom event and fires the GA4 generate_lead tag. This eliminates the need for any custom code on the form page — the integration is entirely through GHL's native dataLayer push and GTM's event trigger.

Meta Conversions API (CAPI) — Native GHL Integration

GHL's native Meta CAPI integration bypasses the browser entirely. Instead of relying on the Meta Pixel (a browser-based JavaScript event) to fire on form submission — which is blocked by ad blockers, iOS tracking restrictions, and browser privacy settings — the server-side CAPI sends conversion events directly from GHL's servers to Meta's API.

Configuration: navigate to Settings → Integrations → Meta Business Suite / Facebook. Connect the Meta Business account. Navigate to Settings → Lead Forms → CAPI and enter the Meta Pixel ID and CAPI Access Token from the Meta Events Manager.

META CAPI EVENT MAP — MEDICAL SNAPSHOT
──────────────────────────────────────────────────────────────────

GHL Event → Meta CAPI Event → Use Case
─────────────────────────────────────────────────────────────────
Form Submitted (Acquisition Funnel)
  → Meta Event: Lead
  → Parameters: email (hashed), phone (hashed), first_name,
                last_name, zip, event_source_url
  → Purpose: Feed Meta's algorithm with lead signals for
             Lookalike Audience creation and campaign optimization

Calendar Appointment Booked
  → Meta Event: Schedule
  → Parameters: same contact parameters as Lead event
  → Purpose: Higher-intent signal. Optimizing Meta campaigns
             for Schedule events vs Lead events typically reduces
             cost-per-qualified-patient by 25–40% over time.

GHL Reactivation Funnel Form (if patient re-submits)
  → Meta Event: Lead (with custom parameter: lead_type = reactivation)
  → Purpose: Separates reactivation conversion events from new
             patient acquisitions in Meta reporting

Note: GHL automatically sends hashed versions of email and phone
to Meta — not raw PII. This is compliant with Meta's data terms
and maintains patient privacy. The hash is one-way — Meta cannot
reverse it to retrieve the original contact data.

Event Deduplication Between Meta Pixel and CAPI

If the Meta Pixel is also active on the site (browser-based), the same conversion event fires twice — once from the pixel, once from CAPI. Meta's deduplication system handles this using a shared event_id parameter. GHL's native CAPI integration generates a unique event_id for each server-side event. The Meta Pixel tag (deployed via GTM) must be configured to pass the same event_id via the dataLayer.

In the GTM configuration for the Meta Pixel Lead event, add a custom variable that reads from the GHL dataLayer and passes it as the eventID parameter in the Pixel tag's event code. Meta uses matching event_ids to deduplicate the browser and server events, counting the conversion only once.

· · ·

Layer 6: Packaging the Master Snapshot for Agency Deployment

The snapshot is only as valuable as how fast and consistently it can be deployed. A snapshot that requires three days of customization per client is not a product — it is a template. The packaging step transforms it into a deployable product.

What Gets Included in the Snapshot

GHL snapshots include: custom fields, tags (taxonomy), pipelines and stages, workflows (including settings and step configurations), website pages (structure and layout — not media files), funnel pages, form templates, email templates, SMS templates, calendar types and configurations, and snapshot settings for SaaS mode if applicable.

GHL snapshots do NOT include: contact records, conversation history, media files (images must be re-uploaded per sub-account), third-party integration credentials (GTM container IDs, Meta Pixel IDs, CAPI tokens — each must be entered fresh per client), or phone numbers (GHL numbers are sub-account specific and cannot be snapshotted).

The Customization Checklist — Per Client Deployment

POST-SNAPSHOT DEPLOYMENT CHECKLIST (estimated: 2–3 hours per client)
──────────────────────────────────────────────────────────────────

IDENTITY
  □ Practice name → Find/replace all  placeholders
  □ Practice phone → Replace  in all templates
  □ Practice address → Update in contact page + funnel confirmation pages
  □ Doctor name(s) → Replace  in About page + email templates
  □ Logo upload → Website header, email templates, SMS sender name
  □ Brand colors → Apply to website theme settings (2–3 color changes)
  □ Hero images → Upload practice-specific photos to website pages

INTEGRATIONS (each requires fresh credentials per sub-account)
  □ GTM Container ID → Settings → Integrations → GTM
  □ Meta Pixel ID → GTM or direct integration
  □ Meta CAPI Access Token → Settings → Facebook Integration
  □ Google Calendar sync (if salesperson uses Google Calendar)
  □ Email sending domain → Settings → Email Services → Domain setup
  □ Phone numbers → Provision GHL numbers, assign to sub-account

PIPELINE CALIBRATION
  □ Territory assignments (if multiple locations — not applicable for
    single-location practices)
  □ SLA parameters → Review and adjust per practice's team size
  □ Service dropdown options → Update primary_service_interest field
    options to match this practice's specific service offerings

WORKFLOW CUSTOMIZATION
  □ Review link → Replace  with practice's
    actual Google Maps review URL
  □ Booking link → Replace  with practice's GHL
    calendar URL
  □ Email "From" name → Personalize to doctor/practice name
  □ SMS sender name → Set to practice name (GHL Business Profile)

SMART LIST VERIFICATION
  □ Confirm all 8 smart lists are returning correct results
    (check with 1 test contact before going live)
  □ Verify enrollment filters on all 7 workflows match smart lists

SaaS Mode Configuration for Agency Billing

If the agency is running GHL under SaaS mode (reselling GHL sub-accounts to clients), the snapshot integrates with SaaS mode's plan-based feature access:

  • Tier the snapshot features by plan: base plan gets the 3 pipelines, 4 core workflows, and website template. Premium plan adds the 3 conversion funnels, 7 workflows, and CAPI configuration.
  • The snapshot itself does not contain SaaS plan restrictions — those are configured at the SaaS plan level in the agency's main account. The snapshot is deployed and then plan-gated features are enabled or disabled based on the client's subscription tier.
  • Document which workflows and features correspond to which SaaS plan tier. When onboarding a new client sub-account, the customization checklist above includes a plan-verification step before handing over to the client.
· · ·

Build Timeline and Realistic Hours

Phase Work Hours Deliverable
Phase 1 — Week 1 Custom field creation. Tag taxonomy setup. All 8 Smart Lists. Pipeline stage definitions (all 3 pipelines — stages only, no automations yet). 8–12h Data architecture complete. Locked before any workflow touches it.
Phase 2 — Week 1–2 Workflow 7 (DNC/Opt-Out) built first. Then Workflows 1, 4, 5 (acquisition-side). Then Workflows 2, 6 (retention-side). Then Workflow 3 (reactivation). Overlap prevention tags verified with test contacts at each stage. 20–28h All 7 workflows live in source sub-account. Tested with dummy contacts through each pipeline stage. Overlap prevention verified.
Phase 3 — Week 2–3 7-page website template build in GHL Site Builder. Mobile optimization. Placeholder text and tokens inserted throughout. 3 conversion funnels built. Calendar embed configuration on thank-you pages. 20–28h Website template complete and mobile-tested. 3 funnels live. All CTAs linking to GHL calendar. Form submissions confirmed to trigger workflow enrollment.
Phase 4 — Week 3 GTM container setup. GA4 tags (page view, form submission, appointment booked). Meta Pixel tag. CAPI integration in GHL settings. Event deduplication configuration. End-to-end conversion test: form submit → GTM fires → GA4 event recorded → CAPI event fires → Meta Events Manager confirms receipt. 8–12h Full tracking stack live. Conversion events verified in GA4 real-time view and Meta Events Manager test event tool.
Phase 5 — Week 3–4 Snapshot export. QA pass — deploy snapshot into a fresh test sub-account. Run full customization checklist. Verify all workflows, pipelines, smart lists, and funnels deploy correctly. Fix any snapshot artifacts (broken links, missing field references). 8–12h Validated snapshot file. Deployment checklist document. Known issues log (with workarounds).
Phase 6 — Week 4 Agency team training on snapshot deployment and customization. Documentation: Snapshot Architecture Guide (field taxonomy, workflow logic, pipeline stages). Client onboarding SOP (customization checklist walkthrough). Handoff. 8–10h Trained agency team. Full documentation package. Snapshot ready for production deployment.
Total   72–102 hours Production-ready Master Snapshot + documentation + trained team.
"A GHL snapshot is not finished when the last workflow is built. It is finished when a completely different person can deploy it into a new sub-account and have it working correctly without asking a single clarifying question. That's the standard." Arsalan Faysal — Revenue Systems Architect, GoHighLevel Expert Partner
· · ·

The Rate Problem and What This Work Actually Costs

The brief budgeted $15–$35/hour for this engagement. At 72–102 hours of implementation work, that's $1,080–$3,570 for a Master Snapshot that the agency will deploy to potentially dozens of medical clients, each paying a monthly retainer. The economics are inverted.

A GHL snapshot that is genuinely production-ready — not just functional, but deployable in 2–3 hours per client, documented, tested against real-world failure cases, and compliant with TCPA and healthcare communication standards — is worth what it generates for the agency deploying it. If the agency charges $1,500/month per medical practice client and deploys the snapshot to 20 practices, the snapshot generates $30,000/month in recurring revenue. The one-time build cost is a rounding error.

The market rate for a GHL architect who can deliver this specification — data architecture, 7 workflows with overlap prevention, CAPI integration, GTM configuration, and documentation — is $65–$150/hour. Scoped as a fixed-price project at $6,000–$12,000 for the full build described here is more appropriate than hourly and produces better outcomes for both parties because the incentive is delivery quality, not hours logged.

At $15–$35/hour, you are not attracting someone who has built production-grade GHL snapshots before. You are attracting someone who will learn GHL on your project and deliver something that functions locally but fails at scale. For a medical agency's Master Snapshot — where the failures happen inside patient communication sequences, inside compliance-sensitive workflows, inside the revenue pipeline that the agency's business model depends on — that is not an acceptable outcome.

· · ·

Final Thoughts: The Snapshot Is the Product

For a medical marketing agency, the Master Snapshot is not a technical deliverable. It is the product. Every client relationship the agency has depends on the quality of what gets deployed from it. A snapshot with broken overlap logic means patients receive three messages on the same day. A snapshot with missing TCPA consent checks means the agency is liable for every non-compliant SMS sent from every sub-account it deploys. A snapshot with a pipeline that does not reflect the actual patient journey means the agency can never demonstrate to clients that their system is working.

Built correctly, the snapshot is a compounding asset. Each new medical practice client that gets deployed is essentially a copy of every good decision made in the original build. The 102-hour investment in getting the architecture right replicates itself — at 2–3 hours of customization per new client — across the entire agency client base.

Get the data architecture right before the first workflow is built. Get the workflows right before the first funnel is built. Get the CAPI right before the first campaign goes live. In GHL, the sequence of the build determines the quality of everything downstream. There is no patching it later — at least not without touching every sub-account that was deployed from a broken snapshot.

Build it right once. Deploy it correctly at scale. The leverage is in the replication.

In This Article What Makes a Snapshot Master-Level Layer 1: Data Architecture Layer 2: Three CRM Pipelines Layer 3: Seven Workflow Automations Layer 4: Website & Funnels Layer 5: Meta CAPI & GTM Layer 6: Snapshot Packaging Build Timeline & Hours The Rate Reality Check Final Thoughts
Stack in This Build
GoHighLevel Full platform — native only
GHL Site Builder Website + funnel templates
GHL Workflows 7-sequence automation engine
Meta CAPI (native GHL) Server-side conversion tracking
Google Tag Manager GA4 event instrumentation
GHL SaaS Mode Agency billing + plan gating