GoHighLevel Custom Objects: Approval Workflows Without Code
Some actions in your business should never happen on autopilot. A 30% discount, a refund, a piece of content going out under a client’s name — these need a human to say ‘yes’ first. The good news is you can build that human-in-the-loop checkpoint directly in GoHighLevel using Custom Objects and native Workflows, with no code at all.
This guide walks through GoHighLevel custom objects approval workflows step by step: what they are, when you need one, how to model the data, and how to wire up the workflow so it pauses, notifies an approver, and then proceeds or stops based on their decision.
What an approval workflow is — and when you need one
An approval workflow is an automation that pauses at a decision point and waits for a person to approve or reject before continuing. The system does the routing, notifying, and follow-up; the human just makes the call. It’s the classic ‘human in the loop’ pattern, and in GHL you can build it without touching the API.
Common cases where a GHL approval workflow with no code earns its keep:
- Quote or discount approval: a rep wants to offer more than the standard discount, so a manager signs off first.
- Content approval before send: an email, SMS campaign, or social post needs a client’s yes before it goes live.
- Refund approval: a support agent requests a refund; finance approves the amount.
- Onboarding sign-off: a new client’s setup is reviewed and accepted before the account goes active.
Step 1: Model the item with a Custom Object
Custom Objects let you create record types that aren’t contacts — each with its own fields and statuses — so your CRM mirrors the real thing you’re approving. As of 2025, Custom Objects are available on every GHL plan and are fully usable inside Workflows, including triggers for when a record is created or changed.
For a discount example, create a Custom Object called Discount Request with fields such as:
- Linked contact: who the discount is for.
- Requested by: the rep making the request.
- Discount amount: the percentage or value.
- Approval Status: a dropdown field with three options — Pending, Approved, Rejected.
The Approval Status field is the heart of the whole system. It’s the single value your workflow watches and your approver changes. If a full Custom Object feels heavier than you need, you can run the same pattern on a contact using a custom status field — but a Custom Object keeps approval records clean, searchable, and separate from your contact data.
Step 2: Build the workflow — trigger and notify
Now create a workflow that runs on the object. Here’s the build, in order.
1. Trigger on a new record
Set the trigger to fire when a new Discount Request record is created with Approval Status set to Pending. This is the moment a rep submits a request and the approval clock starts.
2. Notify the approver
Add an internal notification action — email, SMS, or both — to the manager who owns approvals. Include the key details in the message: who requested it, the contact, the amount, and a direct link to the record so the approver can review and act in one click.
3. Wait for the decision
Add a Wait action set to wait until custom conditions are met. The condition is simply: Approval Status is no longer Pending (or, more precisely, is Approved OR Rejected). The workflow now holds at this step and does nothing until a human changes that field. This is your no-code approval gate.
Step 3: Branch on the decision with If/Else
Once the status changes, the Wait step releases the record and the workflow continues. Add an If/Else action immediately after the Wait:
- If Approval Status is Approved: proceed — apply the discount, update the opportunity, notify the rep that they’re cleared to proceed, and move the deal forward.
- Else (Rejected): stop — notify the rep with the reason, and optionally log the outcome or trigger a follow-up conversation about an alternative offer.
That’s the entire loop: submit, notify, pause, decide, route. No webhooks, no custom code — just native workflow building blocks doing exactly what you’d expect.
How the approver actually acts
There are two clean, no-code ways for an approver to make the call:
- Update the field manually: the approver opens the record from the notification link and switches Approval Status to Approved or Rejected. Simple and visible.
- Update via a link: for one-click approvals, you can surface action links in the notification that route the approver to the record with the status pre-set, so they confirm without hunting through fields.
Either way, the field change is the signal — the Wait step is watching it, and the moment it flips, the workflow moves.
Don’t forget timeouts and escalation
Approvals stall when nobody acts. Build in a safety net so requests don’t sit in Pending forever:
- Reminder nudges: add a parallel branch or a wait-with-timeout that pings the approver again after, say, 24 hours of no decision.
- Escalation: if there’s still no response after a set window, route a notification to a second approver or a team lead.
- Auto-resolution: for low-risk items, you can decide that no response after a deadline defaults to Rejected, so nothing slips through silently approved.
These timeouts are what turn a fragile manual chase into a dependable process.
FAQ
Do I have to use a Custom Object, or can I use a contact field?
You can do either. A custom status field on a contact works for simple cases. A Custom Object is the better fit when approvals are their own ‘thing’ with multiple fields, history, and reporting — like discount requests, refunds, or content items.
Is this really no-code?
Yes. Triggers, internal notifications, Wait-for-condition, and If/Else are all native workflow actions. You configure them in the builder — no API calls and no scripts. For deeper, fully custom approval UIs we offer a code-based route, but it’s not required here.
Can one workflow handle multiple approval types?
It can, but we usually recommend one workflow per object or approval type. It keeps the logic readable, the notifications targeted, and troubleshooting fast.
What if an approver changes their mind?
Once the record passes the Wait step, the workflow has already branched. For reversals, build a separate ‘status changed’ workflow that handles a flip back to Pending or to a new decision, so corrections are controlled rather than chaotic.
Get your approval flow built right
A well-built approval workflow removes risk without adding friction — the right people sign off, and everything else runs itself. If you’d like this designed, tested, and tuned for your exact process, our team can help. Explore our automation and workflows service for native, no-code builds, or our Vibe Coding service when you need something fully custom. Ready to start? Get in touch and we’ll map your first approval flow.
Need help implementing this in GoHighLevel?
Our team builds, automates, and scales GoHighLevel systems for agencies every day. Book a free call and we'll map out exactly what to ship next.
Book a free call