On this page

GoHighLevel Workflow Not Triggering After a Copy? How to Fix It

You copied a workflow into another account, switched it on, and new contacts never enrol. Nothing errors — it just sits there. Here are the checks that catch the cause fastest, and how to deploy so the trigger lands wired to the right records.

You copied a workflow into a new GoHighLevel account, switched it on, and nothing happens. New contacts arrive, match what the trigger should catch, and never enrol — nothing errors, nothing lands in the history. This is the single most common complaint after a workflow moves between accounts, and it almost always comes down to the trigger: the one part of a workflow that depends entirely on how the destination account is set up, which a raw copy carries none of. This guide walks the checks in the order that catches the most failures first, then shows how a cross-account deploy wires the trigger to real records instead of dead ids.

The top reason a copied workflow never fires

A workflow has two halves that fail differently. The actions — send an email, add a tag, move an opportunity — only run once a contact is already inside. The trigger is what puts a contact inside in the first place, and it is the part most likely to be quietly broken after a copy.

That is because a trigger is a filter, and a filter points at records specific to the account it was built in. A trigger that reads "Contact tag added: booked-call" is not looking for the word booked-call — it is looking for a tag id, and that id only exists in the source account. "Opportunity status changed in the New Leads pipeline" points at a pipeline id, a form trigger at a form id. Drop those into another account and the ids reference nothing, so no incoming contact matches and the workflow never fires. The actions downstream are fine — the door into the workflow is simply bricked up.

Is the trigger even published?

Before anything else, rule out the thing that catches most people: the publish state. Any workflow that arrives from a copy, a snapshot, or GoHighLevel's own cross-account tooling lands switched off — as a draft — so it cannot run before you have checked it. A draft enrols nobody, however perfect its trigger is.

Open the workflow in the destination account and look at the toggle in the top right; if it says Draft, flip it to Publish. Then confirm the trigger itself has not been left inactive — a workflow can be published while an individual trigger inside it is switched off, and both have to be on before a single contact can enter. If your copied workflow does nothing at all, this is the first thing to check, and often the only thing wrong.

Filters pointing at tags, stages or forms that don't exist here

If the workflow is published and still dead, the trigger is almost certainly filtering on a record the destination account does not have — or has under a different id. The usual culprits:

  • Tag triggers — "tag added" pointing at a tag that was never created in this account.
  • Pipeline and stage triggers — "opportunity status changed" pointing at a pipeline or stage id from the source.
  • Form and survey triggers — "form submitted" tied to a specific form that lives only in the original account.
  • Calendar triggers — "appointment booked" tied to a calendar the destination does not have.
  • Custom field conditions — a trigger filter comparing a custom field that is not present here.

In every case the symptom is the same, and the symptom is nothing: the workflow is live, contacts arrive, and none match, because what the trigger watches for does not exist here. GoHighLevel will not warn you: the trigger looks complete in the builder, often still showing the original record's name, while underneath it points at an id that resolves to nothing.

This is the gap that makes a copied workflow look fine yet behave as if it is switched off. The fix is not to rebuild every trigger by hand — it is to rewrite those references to the destination's own records as you deploy, which is exactly what ExportGHL Workflows does with cross-account remap.

How to test enrolment with a fresh matching contact

Do not test a trigger on a contact already in the account — re-entry rules and existing enrolment history muddy the result. Create a brand-new test contact and make it match the trigger cleanly.

  1. Add the exact tag, submit the exact form, or move an opportunity into the exact stage the trigger is watching — using the destination account's own records.
  2. Open the workflow's Enrolment History (or the Contacts tab inside the workflow) and watch for the contact to appear.
  3. If it appears, the trigger is wired correctly and you can move on to checking the actions.
  4. If it does not, the trigger is still pointing at the wrong record — go back and reselect the tag, stage, form or calendar from the destination account's list so it binds to a real id.

A fresh, unambiguously matching contact is the fastest way to tell a trigger problem from an action problem: if the contact enrols but later steps misbehave, that is an action pointing at a missing record, not the trigger.

Why remap keeps triggers wired to real destination objects

The manual fix works, but you repeat it for every trigger in every account you copy into, and it is easy to miss one. Deploying with ExportGHL Workflows instead of a raw copy rewrites the trigger's references for you as part of the import.

Cross-account remap runs automatically on a cross-account deploy: ExportGHL reads every account-scoped reference in the workflow — including the ones inside triggers and filters — and matches each by name against the destination. The tag named booked-call is matched to the destination's booked-call tag and its id substituted; pipelines and stages, forms, users, calendars and custom fields are rematched the same way. The trigger that arrives is already looking at records that exist here, so a matching contact enrols on the first try. The deeper version is in the cross-account remap guide, and the full move is covered in copy between accounts.

Draft-on-unmapped: why a safe import beats a broken live one

Remap cannot invent a record that is not there. If the destination has no tag, form or stage with a matching name, ExportGHL does not guess or point the trigger at the nearest thing — it flags the unmatched reference and imports the workflow as a draft rather than publishing it.

That is deliberate, and it is the opposite failure mode to a raw copy. A raw copy goes live with dead references and fires on nobody. A remapped import that could not resolve everything stays a draft and tells you exactly which reference needs attention: you create or rename the missing record, point the flagged item at it, and publish when it is ready. The worst case is a minute of cleanup on a draft — never an automation switched on and silently enrolling no one. If you only copy within one account the records already exist and this rarely bites — see clone a workflow for that simpler case.

Frequently asked questions

Why won't my copied workflow trigger on new contacts?
Almost always one of two things. Either the workflow is still a draft — copies and imports arrive switched off on purpose, and a draft enrols nobody — or the trigger is filtering on a tag, pipeline stage, form or calendar that does not exist in the destination account, so no incoming contact matches it. Check the publish toggle first, then reselect the trigger's records from the destination account's own lists. A cross-account deploy rewrites those references for you so the trigger binds to real records.
Do copied triggers stay published or revert to draft?
They arrive as a draft. Whether the copy comes from GoHighLevel's native tooling, a snapshot, or an ExportGHL deploy, the new workflow lands switched off so it cannot run against live contacts before you have checked it. You have to publish it deliberately, and confirm the individual trigger inside it is active too. This is a safety default, not a bug — but it does mean a freshly copied workflow does nothing until you turn it on.
Why does a tag or pipeline-stage trigger silently fail after a copy?
Because the trigger stores an id, not a name. A tag trigger points at a tag id that only exists in the source account; a stage trigger points at a pipeline-stage id from the source. Copied raw into another account, those ids resolve to nothing, so no contact ever matches and nothing errors — the workflow just sits there. Cross-account remap fixes this by matching each reference by name in the destination and substituting the destination's own id before the workflow goes live.
How does ExportGHL stop triggers breaking on import?
On a cross-account deploy, ExportGHL Workflows automatically matches every account-scoped reference in the workflow — tags, pipelines, stages, forms, calendars, users and custom fields, including the ones inside triggers — by name against the destination and rewrites the ids. Anything it cannot match is flagged and the workflow is imported as a draft rather than published broken. So a matching contact enrols on the first try, and you are never left with a live workflow that fires on nobody. See the remap guide for the detail.

Copy a workflow that fires on day one

No credit card. Deploy across accounts and remap lands the trigger wired to the destination's own records — or as a draft, never broken-and-live.

Start free