Pushing an updated snapshot to active client sub-accounts is terrifying if you just click through the confirmation modal. You spend days fine-tuning a client’s custom SMS follow-up or calendar booking flow, push a snapshot refresh to ship a quick tweak, and suddenly their domain mappings and trigger links vanish back to default.
Here is how I set up snapshot update workflows to isolate master templates from client edits, resolve conflicts cleanly, and keep custom values intact.

The Snapshot Collision Problem: How HighLevel Handles Overwrites
When you refresh a master snapshot in GoHighLevel and push it down to linked sub-accounts, HighLevel checks for asset identifier matches across workflows, funnels, custom fields, pipelines, and tags. If an asset in the client account shares an internal origin ID with something in your snapshot, GHL flags it as a match.
If you pick “Overwrite”, HighLevel bulldozes the sub-account version with your master template. That wipes custom copy, modified wait times, and webhook URLs. If you pick “Skip”, your new updates won’t deploy to accounts that tweaked those assets.
Getting this right is the difference between a clean 30-second deploy and spending your entire weekend manually restoring client workflows from scratch.
Step 1: Separate Master Assets with Strict Naming Conventions
HighLevel matches assets under the hood via origin IDs, but none of us read UUIDs when scanning a client’s workflow list at 4 PM on a Friday. The moment someone on your team edits a base workflow directly inside a client sub-account instead of cloning it, you lose your safety net.
We enforce a strict naming standard across our accounts:
- Master Snapshot Assets:
[SYS] Lead Intake - V2 - Client-Customized Assets:
[CUSTOM] Lead Intake - ClientName - Archived/Draft Assets:
[OLD] Lead Intake - 2023
When a client wants custom logic inside an automation, open the [SYS] workflow, duplicate it, publish the copy as [CUSTOM], and turn off the [SYS] version. When you push a snapshot update later, HighLevel updates the dormant [SYS] workflow without touching your live [CUSTOM] automation.
Step 2: Use Custom Values as Shields for Dynamic Data
Hardcoding phone numbers, calendar IDs, review links, or business names directly into funnel pages and workflows is asking for pain. If you drop a hardcoded calendar ID into an email action and later push a snapshot update, you just blew away the client’s booking link.
Shunt every single dynamic string into Agency or Sub-Account Custom Values before you ever build a master asset. You can check the official GoHighLevel Help Center if you need to look up specific merge key syntax.
Here is a sample schema of Custom Values I set up in my master account before packaging anything into a snapshot:
{ "custom_values": [ { "name": "agency_brand_name", "key": "{{custom_values.agency_brand_name}}", "value": "Master Template Default" }, { "name": "client_booking_calendar_id", "key": "{{custom_values.client_booking_calendar_id}}", "value": "" }, { "name": "sms_notification_phone", "key": "{{custom_values.sms_notification_phone}}", "value": "+10000000000" }, { "name": "external_lead_webhook_url", "key": "{{custom_values.external_lead_webhook_url}}", "value": "https://api.example.com/webhooks/incoming" } ]
}When you push snapshot updates, Custom Value keys are preserved. HighLevel won’t overwrite existing populated values in a client sub-account unless you explicitly tell it to overwrite the Custom Values category during the deployment modal.
Step 3: Refresh the Master Snapshot in Agency Settings
Before pushing anything down to clients, you have to capture your changes into the Master Snapshot container. If you tweak things in your staging account but forget to hit refresh on the snapshot record itself, you’ll end up deploying stale config.
- Head to your HighLevel Agency Dashboard.
- Go to Settings > Snapshots.
- Find your Master Snapshot and click the three dots on the right.
- Hit Refresh Snapshot.
- Pick your staging/master sub-account from the dropdown and confirm the refresh.
GHL processes the refresh in the background—give it 30 to 60 seconds. If your staging setup relies on webhooks or external tools, make sure to find the sub-account location ID to verify you’re pulling from the right environment.
Step 4: Push the Update with Selective Conflict Resolution
This is the step where people wreck their client accounts. Never hit “Select All” without expanding every single asset category to review conflict statuses first.
- Under Settings > Snapshots, click the three dots on your refreshed snapshot and choose Push Update to Linked Accounts.
- Pick the sub-accounts you’re updating. Always push to an internal test or staging account first before rolling it out to live clients.
- Click Proceed to open the Asset Selection screen.
You’ll see an asset breakdown with three statuses: New, No Conflict, and Conflict Found.
Here is how to handle each category:
- Custom Fields: Hit Skip if the client added or tweaked dropdown options. Use Overwrite only if you just updated helper text or field labels on your master fields.
- Custom Values: Always choose Skip for existing keys. You want new snapshot keys added, but you must not wipe the actual data stored in existing keys.
- Workflows: If you stuck to the
[SYS]naming convention, select Overwrite for master workflows and leave unlinked custom workflows alone. If a client is actively running an un-cloned[SYS]workflow, select Skip or duplicate it first. - Funnels and Websites: Almost always choose Skip on existing funnels if the client modified pages, tracking scripts, or domains. Pushing a funnel update can overwrite custom page code. If you have custom domains attached, check our guide on how to connect custom domains to GoHighLevel funnels to keep your DNS mappings intact.
- Pipelines: Choose Skip if clients have custom stages, or the push will rearrange stages and drop opportunity cards into limbo.
Step 5: Verify Workflow Enrolments and Webhook Triggers
After the push finishes, jump into one of the updated sub-accounts immediately to test the state. The sneakiest issue I run into is updated workflows dropping their trigger configurations or parameter mappings.
If an updated workflow has an outbound webhook, fire a test lead through it right away. A bad URL or missing auth header in a snapshot push will silently kill outbound events. If things stall, check our guide on fixing GoHighLevel webhooks not firing.
Quick post-push audit checklist:
- Check Automations > Workflows to make sure active workflows didn’t flip to Draft mode.
- Check Settings > Custom Values to verify client-specific data (phone numbers, hours, review links) didn’t revert to placeholder text.
- Check Calendars > Calendar Settings to ensure the push didn’t assign unlinked team members or reset working hours.
Handling Schema Drift in Large Agency Deployments
When managing dozens of sub-accounts, clicking through manual conflict menus gets risky. Schema drift happens naturally over time as clients tweak things in their accounts. To keep your sanity, split up monolithic snapshots into modular layers:
- Base Core Snapshot: Foundational tags, global custom fields, default pipelines, and baseline Custom Values. Updated rarely.
- Feature Module Snapshots: Small, focused snapshots with just one funnel, two workflows, and matching templates (e.g., “Database Reactivation” or “Review Request Flow”).
- Niche/Vertical Snapshots: Industry-specific copy and landing pages deployed once during client onboarding.
Modular snapshots cut down conflict risk by at least 80% because you only touch the specific workflows or fields you’re updating.
Frequently Asked Questions
What happens to active contacts inside a workflow when a snapshot overwrites it?
If a contact is sitting on a “Wait” step when a workflow gets overwritten, they usually remain at that step index. But if your update changed the step order (like deleting a step or inserting a new SMS step before it), the contact might fire the wrong action or fail entirely. I always pause critical workflows or test on staging first before overwriting anything running live contacts.
Will pushing a snapshot update overwrite custom CSS in client funnels?
Yes. If you set a Funnel asset to “Overwrite”, HighLevel completely replaces page HTML, custom CSS in the page settings, and header tracking code with the master template. If you want to update global styling across funnels safely, host your CSS externally and load it via a stylesheet link tag in the funnel tracking header.
Why did my Custom Values reset to blank after a snapshot push?
You selected “Overwrite” on the Custom Values category during the conflict resolution screen. GHL treated the master snapshot’s empty or default strings as the source of truth and wiped out whatever the client had saved. Keep Custom Values set to “Skip” unless you deliberately want to reset an account to clean defaults.
Can I roll back a snapshot update in GoHighLevel?
No. There’s no “Undo” button for snapshot pushes. Once you overwrite an asset, the previous version is gone. To recover an overwritten workflow, you’ll have to rebuild it by hand—which is why keeping a [CUSTOM] duplicated backup before any big push is a lifesaver.
Next Steps
Keeping sub-account customizations safe boils down to clean naming conventions, proper Custom Value usage, and never rushing the conflict resolution screen. Once you have this workflow dialed in, look into setting up API monitoring to track config changes across client accounts automatically.

