On this page

Imported GoHighLevel Workflow Stuck in Draft and Won't Publish?

You imported a workflow, opened the destination account, and it is sitting there as a draft that will not go live. Before you hunt for a bug, know that this is usually the import working exactly as designed — and the draft is telling you something useful.

A draft feels like a failure, but in a careful import it is not an error state — it is a deliberate pause. Something in the workflow pointed at a record the destination account does not have yet, so rather than publish a broken automation, the import held it back and flagged what it could not resolve. This guide explains why that happens, how to read what is flagged, and how to publish once the build is wired to the right pieces.

Why imported workflows land in draft

A GoHighLevel workflow is wired to the account it was built in by internal ids, not by names. An "add tag" action stores the id of a tag, not the text "Hot Lead"; a "move to stage" action stores a pipeline id and a stage id. Those ids only exist in the source account. When you deploy that workflow into a different account with ExportGHL Workflows, cross-account remap reads each account-scoped reference, looks up its name, and finds the record with the same name in the destination — rewriting the id so the action points at the right thing. The mechanics of that match are covered in cross-account workflow remap.

Most references match cleanly, because the two accounts usually share the obvious names — a "Sales Pipeline", a "Lead Source" field, a "Hot Lead" tag. But when even one reference has no match — a tag that was never created there, a user who is not a member — there is nothing to rewrite the id to. Rather than publish a workflow with a dangling reference, the import holds it as a draft and flags the item. That is why it will not go live: it is waiting for you.

Draft-on-unmapped is a feature, not a bug

Consider the alternative: a workflow published anyway looks live but mis-fires the instant a contact reaches the unmatched step. GoHighLevel will often let a workflow run with a dangling reference — the action does nothing, or the wrong thing — and you do not find out until a real lead has slipped through.

Draft-on-unmapped flips that risk on its head: the workflow refuses to go live until every reference resolves, so the failure surfaces in your import review instead of in production. A draft you can see is safer than a published workflow you can't trust.

So a draft is not a failed import; it is the import pausing on something to decide. The structure — every trigger, action, wait and branch — came across intact; what is pending is a short list of references that could not be matched.

Reading the flagged references that can't be matched

When a deploy lands as a draft, it comes with a list of exactly what could not be matched. Each flag tells you three things:

  • The action. Which step in the workflow holds the reference — for example "Add tag" or "Create / update opportunity".
  • The reference type. What kind of record it is — a tag, a pipeline, a stage, a user, a custom field, a calendar, or an email or SMS template.
  • The name it looked for. The exact name from the source account that it tried, and failed, to find in the destination.

That last part saves the time: instead of "this workflow has a problem", you get "the Add tag step wanted a tag called Hot Lead, and there isn't one here." The flag is a precise instruction, not a vague warning, and the list is usually short — one or two items in a typical move, because everything else matched cleanly.

Fixing or matching each unmatched item

You have two clean ways to clear a flag, and which you choose depends on whether the destination should have that record at all:

  1. Create the missing record, then re-match. If the destination genuinely should have a "Hot Lead" tag or a "Booked" stage, create it in the destination account exactly as it is named in the source, then re-run the match. The flag clears and the id is rewritten.
  2. Map the action to an existing record. If the destination already has an equivalent under a different name — say "Qualified" instead of "Hot Lead" — point the flagged action at that existing record. Nothing new is created; the reference just resolves to what is already there.

One thing a workflow import does not carry is sending infrastructure. The domain, from-address, phone number and A2P registration are tied to the destination account, not to the workflow. Remapping rewires which tag or pipeline a step uses; it does not connect a sending domain or register a number for you. If the workflow sends email or SMS, set those up in the destination before you turn it on. The full end-to-end move is walked through in copy between accounts.

Publishing deliberately once the build is wired

When the flagged list is empty, the workflow is wired to the destination's own records and behaves the way it did in the source. At that point publishing is a deliberate act, not an automatic one — you review the build, confirm the sends are connected, and switch it on yourself. That is the point of the draft stage: it hands you the decision instead of making it blindly.

Remember too that the deploy created a new workflow in the destination — it never overwrote anything already running there unless you explicitly chose to update an existing workflow. So you can take your time clearing flags with no risk that a live automation was replaced.

How this differs from GHL imports that arrive inactive with no reason

GoHighLevel's own cross-account moves leave you in a much worse position. A snapshot copies a whole-account template and the workflows inside it land inactive; the agency-admin-only "copy workflow" — where it is available, same-agency only — also arrives as a draft and expects matching custom-field types on the other side. In both cases the workflow is inactive, but nothing tells you why, or which references failed to resolve. You are left opening each step hunting for the blanks, and a dangling reference that does not visibly break is easy to miss.

The difference is not that ExportGHL leaves workflows in draft and GoHighLevel doesn't — both end up inactive. It is that ExportGHL turns the draft into a readable checklist: every unmatched reference named up front, by action and by record. If you are comparing tools on this behaviour, the cloner comparison lays out which ones remap and flag, and which just dump the JSON and leave you to it.

Frequently asked questions

Why is my imported workflow stuck in draft?
Almost always because the import did its job. When ExportGHL deploys a workflow into a new account, it matches each reference — tags, pipelines, users, custom fields, calendars, templates — by name. If even one reference has no match in the destination, the workflow is held as a draft and the unmatched item is flagged, so nothing goes live pointing at something that does not exist. Clear the flagged items and you can publish.
What does a flagged or unmatched reference mean?
It means an action in the workflow points at a record — say a 'Hot Lead' tag or a 'Sales Pipeline' stage — that cross-account remap could not find by name in the destination account. The flag names the action and the exact record it looked for, so you are not guessing. Create that record in the destination, or map the action to an existing one, and the flag clears.
Is it safe to publish a workflow straight after import?
Yes — once the flagged list is clear. A workflow with no unmatched references is wired to the destination's own records and behaves as it did in the source. The one thing to check separately is sending infrastructure: the domain, from-address, phone number and A2P registration are per-account and do not travel with a workflow, so reconnect those in the destination before you rely on it sending.
Why won't GoHighLevel tell me what's blocking the publish?
GoHighLevel's native moves — snapshots, and the agency-admin-only cross-account copy where it exists — tend to land a workflow as a draft or inactive without explaining which references failed to resolve. You are left opening every step to find the blank ones. ExportGHL instead lists each unmatched reference by name up front, so the draft is a short checklist to clear rather than a hunt.

Move a workflow and see the flags for yourself

Deploy one workflow into another account free. Watch the references remap, read anything unmatched as a plain checklist, and publish only when it's wired right.

Start free