HL Dynamic Content System
Scalable location-based landing pages powered by intelligent data synchronization
What is it?
The HL Dynamic Content System is a proprietary marketing technology solution that enables the creation and management of unlimited location-specific landing pages from a single template. Instead of building hundreds of individual pages, you manage one smart page that dynamically renders content based on URL parameters.
How it works
The system connects GoHighLevel landing pages with Google Sheets data. When a visitor lands on yourpage.com?id=miami, the engine fetches Miami's data from your spreadsheet and instantly renders all location-specific contentโtext, images, phone numbers, maps, and tracking codes.
Key Components
- HL Engine: JavaScript that powers dynamic rendering
- Data Spreadsheet: Central source of truth for all locations
- Admin Tools: Scripts for image sync and reviews management
- Tracking Integration: Per-location GTM, GA4, and Hotjar injection
Key Features
- Dynamic text, images, and background replacement
- Automatic Google Maps directions links
- Click-to-call phone number handling
- Google Reviews auto-fetch (4-5 stars only)
- Image sync from Google Drive with fallbacks
- SEO meta tags with dynamic suffixes
- Per-location tracking code injection
Version History
Documentation Release
Complete documentation portal with Admin Guide, Production User Guide, ADS Specialist Guide, and Legal Terms. Full code commenting and system architecture documentation.
v31.0Production Deploy
System deployment with full feature set including dynamic meta titles, Google Reviews integration, image synchronization with fallbacks, and comprehensive tracking support.
v30.xDevelopment Phase
Core engine development including CSV parsing, dynamic content rendering, Google Drive image handling, directions URL generation, phone clickability, and FAQ support with MutationObserver.
v1.0 - v29.xGet Started
Select a guide from the navigation above based on your role:
Admin & Developer Guide
Technical documentation for system administrators and developers. Covers architecture, configuration, and code modification.
System Overview
The HL Dynamic Content System enables location-specific landing pages on GoHighLevel (GHL) by dynamically replacing content based on URL parameters and spreadsheet data.
Key Components
| Component | Purpose | Location |
|---|---|---|
HL Engine |
JavaScript that renders dynamic content | GHL Page Header Code |
Spreadsheet |
Data source for all locations | Google Sheets |
Spreadsheet Tools |
Admin scripts for data management | Google Apps Script |
Data Flow
URL (?id=miami) โ HL Engine โ Google Sheets โ Page Render
1. User visits landing page with ?id=location_id
2. Engine fetches spreadsheet data via CSV export
3. Engine finds matching row by ID
4. Engine replaces all .hl-* elements with data
5. Tracking tags (GTM/GA4/Hotjar) are injected
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ GOOGLE SHEETS โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Data Sheet (e.g., UrgentCare) โ โ
โ โ - Location data (clinic_name, address, phone...) โ โ
โ โ - Tracking IDs (gtmid, hotjar_id, ga4_id) โ โ
โ โ - Images (logo_url, picture, image_1...) โ โ
โ โ - Google Reviews (auto-populated) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโ โโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Config Sheet โ โ Google Apps Script โ โ
โ โ - Folder ID โ โ - Image Sync from Drive โ โ
โ โ - Sheet names โ โ - Google Reviews Fetch โ โ
โ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โ CSV Export (auto)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ GOHIGHLEVEL PAGE โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Header Code: HL Engine v31.0 โ โ
โ โ - Fetches spreadsheet via ?id= parameter โ โ
โ โ - Replaces .hl-* elements โ โ
โ โ - Injects tracking scripts โ โ
โ โ - Handles images, links, phones โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โ ?id=location_id
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ AD PLATFORMS โ
โ Google Ads / Facebook Ads / etc. โ
โ Each ad points to: page.com?id=location_id โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Setup & Configuration
Initial Setup Checklist
- Create Google Spreadsheet with required columns
- Add spreadsheet tools script to Apps Script
- Configure API key for Google Reviews
- Set up Google Drive folder for images
- Install HL Engine on GHL page
- Test with sample location
Google Spreadsheet Setup
- Create new Google Spreadsheet
- Name first sheet (tab) according to your project
- Add all required columns (see Spreadsheet Structure)
- Make spreadsheet publicly viewable: Share โ Anyone with the link โ Viewer
Google Apps Script Setup
- Open spreadsheet
- Extensions โ Apps Script
- Delete default code
- Paste entire
hl-spreadsheet-tools.gscontent - Save (Ctrl+S)
- Refresh spreadsheet
- Run "Setup Config Sheet" from Admin Tools menu
- Configure API key in script (line 24)
GHL Page Setup
- Open page in GHL editor
- Settings โ Tracking Code
- Paste entire
hl-engine-v31.0.jsin Header Code - Edit CONFIG section (lines 35-55):
sheetID: Your spreadsheet IDsheetName: Your sheet/tab name
- Save and publish
Spreadsheet Structure
Required Columns
| Column | Purpose | Example |
|---|---|---|
id | Unique location identifier | miami |
clinic_name | Business name | FastMed Urgent Care |
street_address | Street address | 123 Main St |
city_state | City and state | Miami, FL |
zip | ZIP code | 33101 |
Tracking Columns
| Column | Purpose | Format |
|---|---|---|
gtmid | Google Tag Manager | GTM-XXXXXXX |
hotjar_id | Hotjar | 1234567 (numeric) |
ga4_id | Google Analytics 4 | G-XXXXXXXXXX |
Formula Columns
map_url (builds from address):
="https://www.google.com/maps/search/?api=1&query=" & ENCODEURL(E2 & " " & F2 & " " & G2 & " " & H2)
booking_phone (formats raw phone):
=REGEXREPLACE(TO_TEXT(J2), "(\d{3})(\d{3})(\d{4})", "($1) $2-$3")
Engine Configuration
CONFIG Object
const CONFIG = {
sheetID: '1Yi-0B4lggjOz_vL0kSXv7-WFlwEddATSU_-B-5y2ffE',
sheetName: 'UrgentCare',
urlParam: 'id',
retries: [0, 350, 900]
};
| Property | Description | Default |
|---|---|---|
sheetID | Google Spreadsheet ID | Required |
sheetName | Sheet/tab name | Required |
urlParam | URL parameter for ID | id |
retries | Render timing (ms) | [0, 350, 900] |
From URL: https://docs.google.com/spreadsheets/d/1Yi-0B4lggjOz.../edit
The ID is between /d/ and /edit.
CSS Class Reference
Text Replacement
| Class Pattern | Usage | Example |
|---|---|---|
.hl-{column} | Replace text content | .hl-clinic_name |
<div class="hl-clinic_name">Placeholder</div>
<!-- Inline Span (in rich text) -->
Visit us at <span class="hl-city_state">City, ST</span> today!
Images
| Class Pattern | Usage |
|---|---|
.hl-img-{column} | Replace img src |
.hl-bg-{column} | Replace background-image |
Links & Phones
| Class | Usage |
|---|---|
.hl-booking-phone | Phone with tel: link |
.hl-directions-link | Auto directions link |
.hl-map-embed | Embeds Google Map |
Google Apps Script Tools
Admin Menu
โก Admin Tools
โโโ ๐ผ๏ธ Images
โ โโโ Sync Drive Images (w/ Fallback)
โ โโโ Setup Config Sheet
โโโ โญ Reviews
โ โโโ Fetch Google Reviews
โ โโโ Clear All Reviews
โโโ ๐ Help & Documentation
Image Sync
File Naming Convention:
{id}_{column}.{ext}โ Specific image0_{column}.{ext}โ Fallback image
Examples:
miami_logo_url.pngโ Row where id="miami", column "logo_url"0_picture.jpgโ All empty "picture" cells
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| Content not replacing | Class name mismatch | Check column name matches class |
| Images not loading | Drive permissions | Make file/folder public |
| Phone not clickable | Wrong class pattern | Use .hl-booking-phone |
| Reviews not fetching | API key invalid | Check API key, enable Places API |
Console Warnings
| Warning | Meaning |
|---|---|
[HL Engine] ID not found | URL param doesn't match any spreadsheet row |
[HL Engine] Error: | Network or parsing error |
Production User Guide
Operations guide for managing locations, images, and content. No coding required.
Introduction
What is this system?
The HL Dynamic Content System allows you to manage multiple location-specific landing pages from a single Google Spreadsheet. Instead of creating separate pages for each location, you manage one page template and one spreadsheet with all location data.
Key Benefits
- Single Source of Truth: All location data in one spreadsheet
- Instant Updates: Change spreadsheet โ Page updates automatically
- No Coding Required: Just edit cells in the spreadsheet
- Automatic Reviews: Google Reviews fetched automatically
- Image Management: Upload images to Drive, system syncs them
How It Works
You edit spreadsheet โ System reads data โ Landing page shows location info
When someone visits yourpage.com?id=miami, the system looks up "miami" in your spreadsheet, finds all the data for that location, and shows it on the page.
Daily Operations
Admin Tools Menu
After opening the spreadsheet, you'll see โก Admin Tools in the menu bar:
โก Admin Tools
โโโ ๐ผ๏ธ Images
โ โโโ Sync Drive Images (w/ Fallback)
โ โโโ Setup Config Sheet
โโโ โญ Reviews
โ โโโ Fetch Google Reviews
โ โโโ Clear All Reviews
โโโ ๐ Help & Documentation
Checking a Location
- Find the location row by ID
- Copy the ID value (e.g., "miami")
- Open the landing page with
?id=miamiat the end - Verify all information displays correctly
Adding New Locations
Step-by-Step Process
Step 1: Add Row to Spreadsheet
- Go to the last row with data
- Add a new row below
- Fill in the
idcolumn first (e.g., "newcity")
Step 2: Fill Required Fields
| Field | What to Enter | Example |
|---|---|---|
id | Unique identifier (lowercase, no spaces) | sandiego |
clinic_name | Full business name | FastMed Urgent Care |
street_address | Street address only | 456 Oak Avenue |
city_state | City, State format | San Diego, CA |
zip | ZIP code | 92101 |
RAW Phone | Phone number (digits only) | 6195551234 |
Step 3: Test the Page
- Open landing page with
?id=newlocation - Check all fields display correctly
- Test phone links (click to call)
- Test directions link
- Verify images load
Managing Images
Image Columns
| Column | Purpose | Recommended Size |
|---|---|---|
logo_url | Company logo | 200x200px |
picture | Main hero image | 1200x630px |
image_1 to image_10 | Gallery images | 800x600px |
Method 1: Direct Links
- Upload image to Google Drive
- Right-click โ Share โ Anyone with link
- Copy link
- Paste in spreadsheet column
Method 2: Image Sync (Recommended)
- Upload image to the Drive folder
- Name it:
{id}_{column}.png(e.g.,miami_logo_url.png) - Run Admin Tools โ Images โ Sync Drive Images
Name with 0_ prefix (e.g., 0_logo_url.png) to set a default for all locations missing that image.
Google Reviews
Automatic Fetch
- Go to Admin Tools โ Reviews โ Fetch Google Reviews
- Wait for process to complete (may take several minutes)
- Check the completion message for results
What Gets Fetched
- Only 4-5 star reviews
- Top 3 most recent reviews per location
- Review text and author name
When to Run
- After adding new locations
- Monthly refresh recommended
- After clearing reviews
Quality Assurance
Pre-Launch Checklist
- ID is unique (no duplicates)
- All required fields filled
- Phone number formats correctly
- Map link works
- Images load
- Reviews display (if available)
- Page title shows correctly
- Tracking IDs are correct
Testing a Page
- Open:
yourpage.com?id={location_id} - Check header/logo
- Check all text content
- Click phone number (should open dialer)
- Click directions (should open Maps)
- Check images loaded
- Check page title in browser tab
- Test on mobile device
FAQ
How long until changes appear?
Changes are instant. The page fetches fresh data on each load. You may need to clear browser cache or use incognito mode to see changes immediately.
Can I add custom columns?
Yes! Add any column to the spreadsheet. Then have the dev team add the matching .hl-{column} class to the GHL page.
What if I break something?
Spreadsheet changes can be undone: File โ Version history โ See version history, find a working version and restore.
Why isn't my image showing?
- Is the file shared publicly?
- Is the filename correct for sync?
- Try a direct Drive link instead
ADS Specialist Guide
Campaign setup guide for Google Ads, Facebook Ads, and tracking implementation.
Quick Start
The Core Concept
One landing page serves ALL locations. You just change the URL parameter.
Base URL:
https://yoursite.com/landing-page
Location-Specific URLs:
https://yoursite.com/landing-page?id=miami
https://yoursite.com/landing-page?id=dallas
https://yoursite.com/landing-page?id=sandiego
The ?id= parameter tells the page which location data to display.
What You Need
- The base landing page URL
- The list of location IDs (from spreadsheet)
- Your campaign tracking parameters
Building Campaign URLs
Basic Formula
{base_url}?id={location_id}&{utm_parameters}
Example URLs
Google Ads:
https://yoursite.com/urgent-care?id=miami&utm_source=google&utm_medium=cpc&utm_campaign=urgent_care_miami
Facebook Ads:
https://yoursite.com/urgent-care?id=miami&utm_source=facebook&utm_medium=paid_social&utm_campaign=urgent_care_miami
Location IDs are lowercase. ?id=miami works, ?id=Miami does not.
Google Ads Setup
Campaign Structure
Campaign: Urgent Care - Miami
โโโ Ad Group: Urgent Care Near Me
โโโ Ad: [Headlines + Descriptions]
โโโ Final URL: https://site.com/page?id=miami
Setting Up Final URLs
Option 1: Per Ad Group (Recommended)
- Create ad groups per location
- Set Final URL at ad group level:
https://yoursite.com/urgent-care?id=miami - UTM parameters added via tracking template
Tracking Template
Set at campaign or account level:
{lpurl}&utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_content={creative}
Facebook/Meta Ads Setup
Campaign Structure
Campaign: Urgent Care Awareness
โโโ Ad Set: Miami (Geo-targeted)
โโโ Ad: [Creative + Copy]
โโโ Website URL: https://site.com/page?id=miami
URL Parameters in Ads Manager
Website URL:
https://yoursite.com/urgent-care?id=miami
URL Parameters Field:
utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}
Dynamic Parameters
| Parameter | Inserts |
|---|---|
{{campaign.name}} | Campaign name |
{{adset.name}} | Ad set name |
{{ad.name}} | Ad name |
{{campaign.id}} | Campaign ID |
Match your geo-targeting to the location ID! Miami geo-targeting should use ?id=miami.
Tracking & Attribution
What's Automatically Tracked
The system injects these tracking scripts per location:
- Google Tag Manager (GTM)
- Google Analytics 4 (GA4)
- Hotjar
Set per location in spreadsheet columns.
UTM Parameters
| Parameter | Purpose | Example |
|---|---|---|
utm_source | Traffic source | google, facebook, bing |
utm_medium | Marketing medium | cpc, paid_social, email |
utm_campaign | Campaign name | urgent_care_miami |
utm_content | Ad identifier | ad_variant_a |
utm_term | Keyword (search) | urgent care near me |
Best Practices
Campaign Organization
Do:
- Create separate ad groups/ad sets per location
- Use consistent naming conventions
- Match geo-targeting to location data
Don't:
- Mix multiple locations in one ad group
- Use generic geo-targeting for location-specific ads
- Forget the
?id=parameter
Common Mistakes
| Mistake | Correct |
|---|---|
?ID=miami | ?id=miami (lowercase) |
?id=Miami | ?id=miami (lowercase) |
?id=miami fl | ?id=miami (no spaces) |
/page/miami | /page?id=miami (use parameter) |
Quick Reference
URL Formula
{base_url}?id={location_id}&utm_source={source}&utm_medium={medium}&utm_campaign={campaign}
Platform UTM Defaults
| Platform | utm_source | utm_medium |
|---|---|---|
| Google Ads | google | cpc |
facebook | paid_social | |
| Bing | bing | cpc |
linkedin | paid_social |
Testing Checklist
- URL includes
?id=parameter - ID matches spreadsheet exactly (lowercase)
- Page shows correct location name
- Page shows correct phone number
- Phone link works (tap on mobile)
- Directions link opens Maps
- UTM parameters in URL
- GTM/GA4 tracking fires
Legal & Terms of Use
Intellectual property rights, confidentiality requirements, and legal terms governing the use of this system.
Intellectual Property Rights
The HL Dynamic Content System, including all source code, documentation, methodologies, and associated materials, is the exclusive intellectual property of Nick The Marketer.
Copyright Notice
ยฉ 2025 Nick The Marketer. All Rights Reserved.
This software and accompanying documentation are protected by copyright law and international treaties. Unauthorized reproduction or distribution of this software, or any portion of it, may result in severe civil and criminal penalties, and will be prosecuted to the maximum extent possible under the law.
Trademark Notice
The following are trademarks or registered trademarks of Nick The Marketer:
- HL Dynamic Content Systemโข
- Nick The Marketerยฎ
- Associated logos and brand elements
Patent Pending
Certain aspects of the HL Dynamic Content System methodology and implementation may be subject to pending patent applications. The system incorporates proprietary algorithms and processes developed by Nick The Marketer.
Confidentiality Agreement
Confidential Information
All materials, including but not limited to:
- Source code (JavaScript, Google Apps Script)
- System architecture and design documents
- Technical documentation and guides
- Implementation methodologies
- Business processes and workflows
- Client data and configurations
are considered Confidential Information and must be treated as such.
Obligations
By accessing this documentation, you agree to:
- Non-Disclosure: Not disclose any Confidential Information to third parties without prior written consent from Nick The Marketer.
- Limited Use: Use Confidential Information solely for authorized business purposes related to your engagement with Nick The Marketer.
- Protection: Take reasonable measures to protect Confidential Information from unauthorized access, use, or disclosure.
- Return/Destruction: Upon request or termination of your engagement, promptly return or destroy all Confidential Information in your possession.
Survival
Confidentiality obligations survive indefinitely and remain in effect even after termination of any business relationship.
License Terms
Grant of License
Subject to your compliance with these terms, Nick The Marketer grants you a limited, non-exclusive, non-transferable, revocable license to:
- Access and use the HL Dynamic Content System for authorized business operations
- View this documentation for reference purposes
- Implement the system on approved client projects as specified in your service agreement
License Restrictions
This license does NOT include the right to:
- Modify, adapt, or create derivative works based on the software
- Reverse engineer, decompile, or disassemble the software
- Remove or alter any proprietary notices or labels
- Sublicense, sell, resell, transfer, or assign the software
- Use the software to provide services to third parties without authorization
- Copy or reproduce the software except as expressly permitted
Termination
This license terminates automatically if you breach any of these terms. Upon termination, you must cease all use of the software and destroy all copies in your possession.
Use Restrictions
Prohibited Uses
You may NOT use the HL Dynamic Content System to:
- Violate any applicable laws, regulations, or third-party rights
- Distribute malware, spam, or other harmful content
- Engage in fraudulent, deceptive, or misleading practices
- Infringe upon intellectual property rights of others
- Compete with Nick The Marketer's business offerings
- Train artificial intelligence or machine learning models
- Benchmark or performance test without written consent
Compliance
You are responsible for ensuring that your use of the system complies with:
- All applicable federal, state, and local laws
- Advertising platform terms of service (Google, Facebook, etc.)
- Privacy regulations (GDPR, CCPA, etc.)
- Industry-specific regulations applicable to your business
Audit Rights
Nick The Marketer reserves the right to audit your use of the system to ensure compliance with these terms. You agree to cooperate fully with any such audit upon reasonable notice.
Limitation of Liability
Disclaimer of Warranties
THE HL DYNAMIC CONTENT SYSTEM IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
Limitation of Liability
TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL NICK THE MARKETER BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, INCLUDING WITHOUT LIMITATION, LOSS OF PROFITS, DATA, USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM:
- Your access to or use of or inability to access or use the system
- Any conduct or content of any third party
- Any content obtained from the system
- Unauthorized access, use, or alteration of your transmissions or content
Indemnification
You agree to indemnify, defend, and hold harmless Nick The Marketer and its officers, directors, employees, agents, and affiliates from and against any claims, liabilities, damages, losses, and expenses arising out of or in any way connected with your use of the system or violation of these terms.
Contact Information
Nick The Marketer
265 Riverchase Pkwy East, Suite 204
Birmingham, AL 35244
For legal inquiries, intellectual property matters, or licensing questions, please contact us at the above address or email.
Governing Law
These terms shall be governed by and construed in accordance with the laws of the State of Alabama, without regard to its conflict of law provisions. Any disputes arising under these terms shall be subject to the exclusive jurisdiction of the state and federal courts located in Jefferson County, Alabama.
Entire Agreement
These terms, together with any applicable service agreements, constitute the entire agreement between you and Nick The Marketer regarding the use of the HL Dynamic Content System and supersede all prior agreements and understandings.
Modifications
Nick The Marketer reserves the right to modify these terms at any time. Continued use of the system after any modifications constitutes acceptance of the updated terms.
Last Updated: December 2025
Document Version: 1.0