How to Create and Use Custom Values in GoHighLevel (Emails, SMS & Funnels)

by Fahim

Hardcoding a client’s business phone number, booking links, and promo copy across 40 emails and a dozen funnel steps is an absolute nightmare. The second that client changes their primary phone line or shifts an offer from 20% off to $50 off, you’re stuck spending your entire afternoon hunting down broken text blocks across sub-accounts.

Think of Custom Values in GoHighLevel as location-level environment variables. You define a key-value pair once at the sub-account level—like a review URL, a support email, or a seasonal promo hook—and reference it across marketing emails, SMS workflows, funnel builders, and custom tracking scripts. When the client updates their info, you change it in one central spot, and it propagates everywhere.

Close-up of a developer setup configuring custom values and variables in GoHighLevel
Close-up of a developer setup configuring custom values and variables in GoHighLevel

Custom Values vs Custom Fields: Stop Mixing Them Up

I constantly see devs and snapshot builders mix these two up. Both use Liquid-style merge tags in HighLevel, but their scopes are fundamentally different:

  • Custom Fields: Contact-level variables. Every contact gets their own value stored on their individual record (e.g., contact.pet_name, contact.quote_amount, or contact.vin_number).
  • Custom Values: Location-level global constants. Every contact in the sub-account resolves the exact same string (e.g., custom_values.business_name, custom_values.booking_url, or custom_values.support_phone).

If you’re mapping form inputs, survey answers, or incoming lead webhooks, use custom fields. If you’re building reusable agency snapshots where every email template and landing page needs to inherit the client’s business details automatically, use custom values.

How to Create Custom Values in GoHighLevel

Creating these in the sub-account dashboard takes about thirty seconds:

  1. Head into your GoHighLevel sub-account.
  2. Click Settings (bottom-left gear icon) > Custom Values.
  3. Click + New Custom Value at the top right.
  4. Give it a descriptive Name (e.g., Offer Headline).
  5. Set the Value (e.g., Get 50% Off Your First AC Tune-Up).
  6. Hit Create.

HighLevel converts the name into a lowercase slug automatically. Naming your value Support Email generates this merge tag:

{{ custom_values.support_email }}

I stick to clean, predictable names using standard words so the generated slugs are easy to remember when I’m typing them straight into raw HTML or API payloads without copying from the picker every time.

Using Custom Values in Emails and SMS Workflows

Once your keys exist, you can drop them anywhere merge tags work in HighLevel—workflow builders, email designs, trigger emails, and canned SMS responses.

In Email Campaigns and Templates

In the drag-and-drop builder or code editor, click Merge Tags on the toolbar, head down to Custom Values, and pick your key. If you’re working directly in a code element, you don’t even need the UI picker—just paste the double-curly tag right into the HTML markup.

Here’s a standard footer block I drop into raw HTML email templates:

In SMS Workflow Actions

You can type the tag directly into your SMS action body or select it from the custom value dropdown. One gotcha here: keep an eye on your character limits.

If a custom value resolves to a massive scheduling URL, it can quietly shove your SMS past the 160-character boundary into multiple segments, doubling your Twilio or LC Phone costs. Also, make sure you know how to set fallback default values for merge fields in GoHighLevel so an empty custom value doesn’t leave an awkward blank gap in the middle of a live text.

Injecting Custom Values into Funnels and Website Builders

You aren’t restricted to emails and SMS. HighLevel lets you inject custom values directly into text blocks and button actions in the page builder. When a visitor loads the live page, the server swaps the tag for the actual value.

Using Custom Values in Headlines and Paragraphs

Open the Funnel Builder, pick a headline or paragraph element, and type {{ custom_values.primary_offer_title }} right into the text editor. You’ll see the raw curly-bracket string inside the builder canvas, but hitting Preview or loading the published page will render the real string.

Dynamic Button Links and Calendars

You can also use custom values inside button actions. Click a button element, set Button Actions to Go to Website URL, and drop in your tag:

{{ custom_values.booking_page_url }}

This is a massive time-saver for multi-step funnels. You define the booking link once in settings, and every CTA button across all 5 funnel steps points to the right calendar immediately without manual linking.

Injecting Values into Custom JavaScript

If you’re running dynamic pixel IDs, analytics containers, or third-party chat widgets, you can pass custom values straight into the header or footer tracking code. Here’s an example injecting a per-account Google Tag Manager container ID:

(function(w,d,s,l,i){ w[l]=w[l]||[]; w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'}); var f=d.getElementsByTagName(s)[0], j=d.createElement(s), dl=l!='dataLayer'?'&l='+l:''; j.async=true; j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl; f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','{{ custom_values.gtm_container_id }}');

Just make sure the custom value actually exists and isn’t empty before publishing, or the script will try to fetch an invalid ID and throw a 404 console error.

Managing Custom Values Across Agency Snapshots

Custom values are the secret sauce behind scalable, bulletproof snapshots. When you build an industry-specific snapshot (like dental, real estate, or auto repair), convert every client-specific data point into a custom value first.

Here’s my standard baseline checklist of custom values for every snapshot:

  • company_name: Legal business name
  • company_phone: Primary office/dispatch line
  • company_email: Customer support email
  • company_address: Physical address for CAN-SPAM email compliance
  • booking_calendar_url: Primary appointment link
  • lead_magnet_url: Hosted link for the downloadable PDF guide
  • core_offer_text: The primary promo headline
  • review_link: Google Business direct review shortlink

When you spin up a new client sub-account from that snapshot, you never touch the workflows, funnels, or email templates. You open Settings > Custom Values, paste in those 8 values, and the entire marketing machine is live. If you ever update the master template, check out our guide on how to push snapshot updates to existing sub-accounts without wiping out your client’s existing settings.

Updating Custom Values via the GoHighLevel API v2

If you automate client onboarding through webhooks or an external intake portal, you don’t need to manually type these into the UI. You can update custom values programmatically using the HighLevel API v2.

You’ll need your sub-account Location ID first. If you don’t have it handy, read up on how to find and use GoHighLevel Location ID in API calls. You can reference the full auth flow in the official GoHighLevel API v2 Documentation.

Here’s how to update an existing custom value via cURL using a Private Integration Token:

curl --request PUT  --url https://services.leadconnectorhq.com/locations/LOC_ID_HERE/customValues/CUSTOM_VALUE_ID_HERE  --header 'Accept: application/json'  --header 'Authorization: Bearer YOUR_API_KEY_OR_BEARER_TOKEN'  --header 'Content-Type: application/json'  --header 'Version: 2021-07-28'  --data '{ "name": "Offer Headline", "value": "Spring Special: 30% Off All Services" }'

You can also send custom values outbound inside your workflow webhooks to Zapier, Make, or custom backends. Check out our tutorial on sending custom values and contact fields in GoHighLevel webhooks for payload patterns.

Gotchas and Common Setup Errors

I’ve run into a few edge cases over the years that will save you hours of debugging:

1. Whitespace and Casing Inside Curly Braces

HighLevel’s template parser can be finicky. A tag like {{custom_values.business_name}} (without the internal spaces) or {{ Custom_Values.business_name }} (wrong casing) will occasionally fail to resolve, sending the raw merge tag text straight to a lead’s inbox.

2. Funnel CDN Caching Delays

Updating a custom value in Settings takes effect immediately in outgoing emails and SMS because those render dynamically on dispatch. But funnel pages run through edge caching. If you change a custom value used on a landing page, hard-refresh the live URL (Ctrl + F5 or Cmd + Shift + R) or re-save the page in the builder to purge the cache.

3. Deleting a Custom Value Still in Use

If you delete a custom value from Settings > Custom Values, HighLevel won’t warn you if active funnels, emails, or workflows are still referencing it. Those templates will just output an empty string or the raw unparsed tag. Check where a key is deployed before trashing it.

Frequently Asked Questions

Can I use Custom Values inside workflow conditional logic?

Yes. When building an If/Else branch in HighLevel workflows, you can compare incoming form answers, contact tags, or webhook data against a Custom Value by picking it from the field selector.

How many Custom Values can I create per sub-account?

There isn’t a hard system limit, but I recommend keeping your list organized and under 50 values per account so onboarding stays manageable for your team.

Do Custom Values transfer when I clone a funnel between accounts?

The merge tags stay intact inside the text blocks, but the destination sub-account must have a Custom Value with the exact same name and slug. If it’s missing in the target account, the tag won’t resolve.

Can I store HTML inside a Custom Value?

Yes. You can store raw HTML snippets—like dynamic disclaimer blocks with active links or embed code—inside a custom value. When rendered inside a code element or raw HTML email block, HighLevel executes the markup properly.

Next Steps for Your Setup

Once you’ve got your global agency variables running smoothly, make sure your automations handle empty fields gracefully. Check out our walkthrough on how to set fallback default values for merge fields in GoHighLevel so your workflows never send broken, empty tags to customers.

Official resources

all_in_one_marketing_tool