How do I delete unused custom fields in GoHighLevel without breaking anything?
GoHighLevel has no bulk delete for custom fields yet. Here is the routine we use on inherited accounts to remove dead fields without breaking workflows.
Learn moreGreen checkmarks in the workflow history do not mean the customer got the right text. Here is the exact spot where a wait step lets stale data through, and the fix.
Short answer: GoHighLevel's workflow history tells you a trigger fired, a wait step completed and an action sent. It does not tell you whether the data used at that final send was still true. The fix is to add an If/Else check right before the send action, not after the wait step, so the workflow reads the current appointment status or custom field at the moment it acts instead of the moment it started.
Open a workflow's execution history in GoHighLevel and you will see a clean line of checkmarks: trigger fired, wait step completed, SMS sent, opportunity updated. That history is a record of steps completing, not a record of correctness. A step can complete exactly as designed and still produce the wrong outcome, because the workflow acted on whatever data existed when that step ran, and nothing forced it to check again before the final action.
This matters most in workflows built around a delay: reminders, confirmations, rescheduling flows, follow-ups after a quote. Anything with a wait step longer than a few minutes has a window where the world can change without the workflow noticing, unless you built it to notice.
Picture a simple reminder workflow. A contact books an appointment, a tag gets applied, the workflow starts, it pauses for 24 hours, then it sends a reminder text with the appointment time. That time gets pulled into the message at whatever point GoHighLevel evaluates the merge field, and if your build pulls it early rather than right before send, the workflow is carrying a snapshot from hours ago.
If the customer reschedules during that 24 hour wait, nothing stops the workflow. It keeps running on its original schedule and sends a reminder for a time that no longer exists. The history shows a completed run. The customer gets a text for an appointment that was moved, and now calls confused or annoyed, which is exactly the kind of problem covered in our piece on reminders firing at the wrong time after a reschedule.
Here is the sequence, step by step, the way it happens on a live account. A customer books Tuesday at 2pm. The reminder workflow starts a 24 hour timer. Six hours later the customer calls and moves the job to Wednesday at 10am, and the calendar updates correctly. Eighteen hours after that, the original workflow wakes up from its wait step and sends the Tuesday 2pm reminder, because that value was cached in a custom field or merge tag when the workflow first ran, and nothing in the build told it to look again.
The same pattern shows up with cancellations. The wait step does not know the appointment was canceled unless you build in a check for it. It just knows the timer ran out, so it sends the reminder anyway, and the customer gets a confirmation for a job that no longer exists.
| Scenario | What the log shows | What actually happened | The fix |
|---|---|---|---|
| Reschedule during a wait step | Trigger fired, SMS sent | Reminder references the old time | If/Else check on current appointment start time right before send |
| Cancellation during a wait step | Email sent, no errors | Confirmation for a canceled job | If/Else check that appointment status is still booked or confirmed |
| Contact re-enters the same workflow | Workflow starts again cleanly | Second, stale message sent alongside the first | Turn off default re-entry, or filter for already in this workflow |
| Custom field overwritten mid-run | Workflow logs success | Message pulls a field value from a different context | Use a workflow-specific field, or re-read the value right before send |
The fix for almost every version of this problem is the same shape. Put an If/Else branch immediately before the send action, not somewhere earlier in the workflow, and have that branch check the live value of whatever the message depends on: appointment status, appointment start time, a custom field, an opportunity stage. If the value does not match what the message assumes, route the contact to a different branch, skip the send, or start a correction workflow instead.
This is a small change to make and an easy one to forget, because the workflow builder does not warn you that a wait step creates this gap. It just runs the steps in order. We rebuild this pattern often when we take over an account, alongside the re-entry setting, which decides whether a contact who gets re-tagged can start a second copy of the same workflow while the first one is still waiting. Default re-entry left on is one of the quieter causes of a duplicate or stale message, and it shows up in the same accounts covered in our article on duplicate text messages.
Accounts that grew over a couple of years tend to have several workflows watching the same tag, the same pipeline stage or the same custom field, each built by whoever was in the account at the time. A tag gets added, three workflows fire off it, and none of them know the other two exist. That is exactly how a system ends up with 160 workflows and no one able to say which one owns a given message, the kind of setup we describe in the 90-minute GoHighLevel audit checklist. The more workflows depend on the same trigger without talking to each other, the more likely a wait step somewhere is carrying stale data past a point where the real world already changed.
The test that actually catches this is simple and most teams never run it. Book a test appointment, let a reminder workflow start, then reschedule or cancel that test appointment while the wait step is still running. Watch what the contact actually receives. If the message still references the old time or the canceled job, you have found the gap, and it is the same gap a real customer will hit sooner or later.
On a new account we trace two or three of the highest-volume workflows end to end, including a forced reschedule mid-wait, before we touch anything else. That is the fastest way to find a stale-data gap without guessing which workflow is the culprit. If your account has grown past the point where anyone can say with confidence what each workflow does, the GoHighLevel account audit starts at $497 and gives you that map, plus the specific fixes, in writing. For accounts where the main symptom is wrong or duplicate reminders specifically, the Reminder and No-Show Rescue package, starting at $950, is built for exactly this problem.
The workflow log tracks whether each step ran, not whether the data it used was still accurate. If a wait step pauses while the appointment time, tag or field changes, the send action can fire with old information and still show a clean green history.
Add an If/Else filter step right before the send action that checks the current appointment status. If the status is not booked or confirmed at that exact moment, route the contact to a different path or end the workflow instead of sending.
Yes. Put an If/Else condition immediately before the SMS or email action, comparing a live custom field or appointment field, not the value that was true when the workflow started. This one step catches most reschedule and cancellation problems.
It often does. Each workflow has a re-entry setting, and leaving it on default for a contact who gets re-tagged or re-triggered can start a second run of the same workflow on top of the first one, sending an old message alongside a new one.
Yes, because a clean history does not mean a correct outcome. A short audit that traces two or three workflows end to end, including a forced mid-wait reschedule, usually surfaces the gap before a customer complains about it.
GoHighLevel has no bulk delete for custom fields yet. Here is the routine we use on inherited accounts to remove dead fields without breaking workflows.
Learn moreContacts getting the same text twice, texts from two different numbers, or a whole list blasted at once. The four causes and the fix for each.
Learn morePatients or customers getting reminders for the old appointment, the wrong day, or after they cancelled. What causes it and how to build reminders that cancel themselves.
Learn moreBook 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.