Founder Bonus: join or upgrade to the HighLevel Founder Plan through our link by Dec 31 and get 4 free bonuses from Yotomations.Founder Plan + 4 free bonuses until Dec 31. See the bonuses
The GoHighLevel practice of Yotomations LLCAI development, custom software and websites at yotomations.com
New to GHL? Start here

Why Is My GoHighLevel Pipeline Full of Duplicate Opportunities?

Same contact, five cards in the pipeline? Here is why GoHighLevel creates duplicate opportunities, how to stop it, and how to clean up without losing real deals.

Office worker checking an automated follow-up message on her phone
By Yaakov (Koby) Oranski, Certified GoHighLevel Admin and Partner | | 6 min read

Short answer: GoHighLevel duplicate opportunities appear when a workflow, form, calendar or integration creates a new opportunity every time it fires instead of checking for one that already exists. The fix is to turn off duplicates in the Create or Update Opportunity action, put a tag check in front of it so repeat triggers update the existing card, and then delete the extras. Do the cleanup last, or the pile grows back.

Why one lead becomes three cardsWHY ONE LEAD BECOMES THREE CARDSForm submittedSame person submits twiceBooking madeCalendar trigger fires tooWorkflowCreate opportunity stepGuardTag check, duplicates offDuplicate cardAppears when the guard ismissingOne opportunityStage moves, no new cardtriggertriggerno guardupdateThe guard has to sit before the create step, because every extra trigger reaches that step.

A pipeline full of the same name five times is one of the most common messes we see when we open an account. It makes your pipeline value meaningless, it hides which lead is actually hot, and it makes follow-up tasks fire on cards nobody is watching. A thread on r/gohighlevel today, about pipelines full of duplicate opportunities, shows other people are fighting it right now. Below is how we find the cause and fix it.

Where duplicate opportunities come from

It is almost never a bug in GoHighLevel. It is a workflow doing exactly what it was told, once per trigger, with nothing telling it that the contact already has a card. These are the causes we check, in the order we see them.

  • Duplicates allowed on the create step. The Create or Update Opportunity action has a setting for allowing duplicate opportunities. If it is on, every run makes a new card.
  • Two workflows reacting to one event. A form workflow creates an opportunity, and a booking workflow, a missed call workflow or an old snapshot workflow creates another for the same person within minutes.
  • Re-entry turned on. The workflow lets the same contact enter again, so a second form submission or a returning customer runs the create step again.
  • An outside tool with no lookup. A Zapier, n8n or API call that creates an opportunity without first searching for an existing one will add a card on every run.
  • Duplicate contacts upstream. If an integration makes a new contact for each lead because the phone or email format differs, each contact gets its own opportunity. That one looks like a duplicate opportunity problem but the cause is the contact record.

Most accounts we audit have more than one of these at once. Fixing only the first leaves the others quietly producing cards.

How to find which workflow is creating them

Before you change anything, find the source. Open one contact with duplicates and look at the timestamps on each opportunity. Cards created within seconds of each other point to two workflows reacting to the same trigger. Cards created days apart point to re-entry or a repeat form submission.

Then open the workflows that contain a create opportunity step and check the execution logs for that contact. You will see which workflow ran the step and when. If you cannot tell, put the workflow name in the opportunity source or name field of each create step for a week. The next duplicate will tell you who made it.

The two-step guard that stops new duplicates

This is our version of a guard, built from tags and the action setting. It works on any workflow that creates opportunities, and you can add it in under an hour per workflow.

  1. Gate with a tag. Before the create step, add an If/Else on a tag such as opp-open. If the contact has the tag, go down a path that only moves the existing opportunity to the right stage. If not, go down the path that creates it.
  2. Turn off duplicates on the action and tag the contact. On the create path, set the Create or Update Opportunity action so it does not allow duplicates, then add the opp-open tag right after it. Build a small second workflow on the opportunity status changing to won or lost that removes the tag, so a returning customer can get a fresh card later.

The tag gate catches the case where two workflows race each other. The action setting is the backstop when the tag was never added, for example on contacts that existed before you built the guard. Use both, because each covers the other's blind spot.

If you have several pipelines, use one tag per pipeline, such as opp-open-sales and opp-open-service. A single shared tag will block a legitimate second opportunity in a different pipeline. For a deeper pattern on stages that move themselves, see our guide to GoHighLevel pipeline automation.

Cleaning up the duplicates you already have

Deleting first and fixing later is how people end up deleting the same cards twice. Put the guard in, wait a day or two to confirm no new duplicates arrive, and then clean up.

  1. Export the pipeline to a CSV. This is your undo button for values, notes and sources.
  2. Filter the opportunity list to one pipeline and sort by contact name so duplicates sit together.
  3. Keep the card with the most activity or the furthest stage. If a deleted card holds a value or a note that matters, copy it over first.
  4. Delete the extras in small batches using bulk actions, and check the pipeline totals after each batch.

Be careful with opportunities that look like duplicates but are not. A customer with a roof repair and a gutter job has two real opportunities. If your business sells repeat or multi-part work, your guard should allow a second opportunity once the first is won or lost, which is why the tag removal step matters.

Duplicate opportunities, duplicate contacts and duplicate texts

These three problems get lumped together and they have different fixes. Use this table to tell them apart before you start changing settings.

SymptomLikely causeWhere to fix it
One contact, several cards in the same pipelineCreate step runs on every trigger, duplicates allowedThe workflow's opportunity action and a tag gate
Same person appears as two contactsIntegration creates a new contact, or duplicate contacts are allowedContact duplicate settings and the integration's lookup step
Customer gets the same text twiceTwo workflows or a re-entry loopSee why GoHighLevel sends duplicate text messages
Workflow says it ran fine but the message or card is wrongWrong branch, merge field or trigger filterSee why a workflow can say it worked and still send the wrong message

Often the three travel together. A messy integration creates two contacts, each contact gets an opportunity, and each opportunity triggers a reminder. Fix the contact layer first if you see that pattern, because every layer above it multiplies the mess.

When native behavior changes, what to keep

HighLevel adds workflow options regularly, and the duplicate handling on opportunity actions may change. When it does, keep the tag gate for any workflow that touches more than one pipeline, since it is also a readable signal for your team. Retire any custom lookup steps in outside tools only after you have tested the native behavior on a throwaway contact.

What we would do first

We would open the account and list every workflow that has a create opportunity step, because in most inherited accounts the duplicates come from two or three of them, not from all of them. Then we add the guard to those, watch for a few days, and clean up the pipeline in one pass with an export as the safety net. If the account also has dozens of workflows nobody can explain, that is a bigger job, and our GoHighLevel account audit (starting at $497) maps every workflow, tag and pipeline before anything is changed.

Yaakov (Koby) Oranski

Yaakov (Koby) Oranski, Founder and CEO of Yotomations

Certified GoHighLevel Admin and Partner. Koby designs CRM migrations, two-way integrations, billing systems and AI agents for service businesses, and writes from the engagements described on this site.

Published

Frequently asked

Why does GoHighLevel create a new opportunity every time a contact fills out a form?

Because the workflow behind the form runs a create opportunity step on every submission, and duplicates are allowed unless you turn that off. A returning contact is treated as a new event. Add a check for an existing opportunity or tag before the step, or switch to the update behavior.

Can I merge duplicate opportunities in GoHighLevel?

Not as a single click merge that we would rely on. The practical method is to keep the opportunity with the most history, copy any value or notes you need from the others, then delete the extras. Export the pipeline to CSV before deleting so nothing is lost.

Are duplicate opportunities the same problem as duplicate contacts?

No. Duplicate contacts are two records for one person, usually caused by different emails or phone formats from an integration. Duplicate opportunities are several cards on one contact. You can have either one without the other, and each has its own fix.

Will turning off duplicates break my existing workflows?

It should not, but test with a throwaway contact first. With duplicates off, a repeat trigger updates the existing opportunity instead of creating a new one, so check that your stage and value settings still do what you expect on an update.

Keep reading

Is this happening in your account?

Book a 30-minute call. We look at the account live and tell you what is broken, what we would fix first and what it would cost.

No pitch deck. We look at your current setup and tell you what we would do and what it would cost.

Need more than GoHighLevel? Yotomations, our parent company, also builds AI agents, custom software and websites.