
GoHighLevel Upsell Workflow After Job Completion (2026)
By Dr Priya Jaganathan, GoHighLevel Certified Admin · HL Growth Partner, Australia · Updated 11 September 2026 · 8 min read
Some links below are affiliate links — if you sign up through them, HL Growth Partner may earn a commission at no extra cost to you. It never changes what we recommend. Full disclosure.
A GoHighLevel upsell workflow only works when it fires off job completion rather than off the sale. That single distinction is what separates an offer that lands from one that makes your client's customers feel processed.
Most agency builds get this wrong. They hang the upsell on the payment event, the offer goes out while the technician is still packing the van, and the sub-account starts training customers to ignore your client's messages. This guide walks the build in order — trigger, wait window, branching, channel, tracking, tagging and suppression — so you can ship it into a client sub-account this week.
Quick Facts
| Primary trigger | Opportunity Status Changed → Won, filtered to the delivery pipeline (HighLevel help docs, 2026) |
| Alternative triggers | Appointment Status set to Showed, or the Invoice trigger on status Paid (HighLevel help docs, 2026) |
| Recommended wait | 7–30 days after completion, set by the service cycle — never same day |
| Channels | SMS for short, time-bound offers; email when the offer needs detail, images or pricing tiers |
| Where tracking lives | Trigger links — every click is logged on the contact timeline and can start a workflow |
| Plan requirement | Workflows, pipelines, invoices and trigger links appear on all HighLevel plans including Starter (HighLevel plan comparisons, 2026) |
| Compliance | Consent, sender identification and a working unsubscribe on every commercial message (ACMA, Spam Act 2003) |
Pick a trigger that proves the job is actually finished
The sale is a promise. Completion is proof. Your upsell should key off proof, because that is the only moment where the customer has experienced the thing you want to sell more of.
In a HighLevel sub-account there are three honest completion signals, and which one you choose depends entirely on how the client runs their operation. If you are still getting your head around how HighLevel triggers and actions fit together, start there before you build this one.
| Trigger | Use it when | Watch out for |
|---|---|---|
| Opportunity Status Changed → Won | The client runs a delivery pipeline and marks jobs Won only at handover | Teams that mark Won at quote acceptance — that is the sale, not completion |
| Appointment Status → Showed | Service is delivered in a booked slot — clinics, salons, mobile trades | Nobody updates the status; the workflow silently never fires |
| Invoice → Paid | Payment is collected on completion, not deposit-first | HighLevel's docs note the Invoice Paid trigger does not respond to invoices paid inside QuickBooks |
Filter the trigger, always
Bare triggers are how agencies get themselves in trouble. Add filters so the workflow only fires for the right pipeline and the right stage — HighLevel's Opportunity Status Changed documentation supports "Moved From Status" and "In Pipeline" filters for exactly this.
If the client's pipeline does not have a genuine completion stage, build that first and come back. A clean pipeline and opportunity structure is the load-bearing wall under this whole build.
Set the wait window so the offer arrives at the right moment
Same-day is the most common mistake I see in inherited sub-accounts. The job finished four hours ago; the customer has not yet formed an opinion; asking them to buy again reads as greed rather than service.
The right wait is the length of time it takes for the customer to experience the benefit and start noticing the next gap. That is service-specific, so set it deliberately with a Wait step rather than defaulting to something round.
| Service type | Suggested wait | Why |
|---|---|---|
| Cosmetic or treatment-based (skin, dental, physio) | 7–14 days | Results settle in a fortnight; that is when the next step feels obvious |
| Home services (clean, pest, gutters) | 14–30 days | Long enough to prove the work held, short enough to still feel connected |
| Trades and installs (solar, HVAC, electrical) | 21–30 days | Invoice pain fades and the adjacent job surfaces |
| Professional services (accounting, legal, consulting) | 30 days or the next cycle | The upsell is usually the next deliverable in their calendar |
Use a business-hours Wait step so nothing sends at 11pm on a Sunday, and add a Goal event if you want the workflow to exit early when the customer books anyway. Our guide to Wait steps and Goal events covers the timing edge cases in detail.
Branch on what they bought so the offer is actually relevant
One generic offer to every completed job is the fastest way to burn a list. The whole point of building this inside HighLevel rather than in a broadcast tool is that the sub-account already knows what the customer purchased.
After the Wait step, drop in an If/Else condition and branch on the pipeline, the opportunity value, a custom field like Service Type, or a tag applied at booking. Each branch then carries its own message and its own offer.
- Branch by service: gutter clean completed → offer roof inspection; initial consult completed → offer the programme.
- Branch by value: jobs above a threshold get a phone call task for the owner instead of an automated message.
- Branch by recency: repeat customers get a loyalty-framed offer, first-timers get an onboarding-framed one.
Keep it to two or three branches in version one. Every branch you add is another message to write, test and maintain, and clients abandon what they cannot understand. The If/Else conditions guide shows how to structure branches that stay readable six months later.
Not on HighLevel yet? Start with a free 30-day trial here — long enough to build everything in this guide before you pay a cent.
Choose SMS or email on the shape of the offer, not on habit
Agency owners tend to default to whichever channel they personally prefer. Choose on the offer instead: how much explaining does it need, and how time-bound is it?
| Channel | Best for | Avoid when |
|---|---|---|
| SMS via LC Phone or Twilio | One-line offers with a single link and a short window | The offer needs pricing tiers, photos or comparison |
| Anything needing explanation, before-and-after images or options | The client's domain authentication has never been set up | |
| SMS then email | Higher-ticket offers where you want a nudge and a detailed follow-up | The list is cold or consent is unclear |
Australian SMS compliance is not optional here
An upsell text is a commercial electronic message. The ACMA's guidance on avoiding sending spam sets three obligations under the Spam Act 2003: have consent, identify the sender, and provide an easy unsubscribe.
Two Australian specifics worth building into the sub-account. The ACMA's 2024 unsubscribe fact sheet requires opt-out requests to be honoured within five working days and unsubscribe facilities to work for at least 30 days after sending. And since 1 July 2026, the ACMA has required branded sender IDs to be registered — unregistered ones are over-stamped as "Unverified" (ACMA, 2026).
Store the client's legal name or ABN in a custom value and merge it into every SMS template so sender identification is never left to whoever writes the next message. Our Australian SMS compliance guide covers the sub-account settings in full.
Measure it with trigger links and stop double-offering with tags
If you cannot report on this workflow, the client will cancel it the first quiet month. Build the measurement into the message itself.
Create a trigger link for each branch's offer — not one shared link. Every click is logged on the contact's activity timeline and can fire its own workflow, so you get per-offer interest data without touching a reporting tool. The trigger links setup and tracking guide walks through naming them so the data stays legible.
Tag on send, not on click
The tag that prevents a repeat offer must be applied when the message goes out, not when someone clicks. Otherwise the customers who ignored you get offered the same thing again next quarter.
upsell-offered-roof-inspectionapplied immediately after the send action.upsell-accepted-roof-inspectionapplied by the trigger-link workflow on click.upsell-suppressedapplied by the complaint or low-review path.
Then add an If/Else at the very top of the workflow that exits anyone already carrying the "offered" tag. This one condition is the difference between a HighLevel upsell automation that compounds goodwill and one that generates complaints. Keep to a consistent tag naming structure or the suppression logic becomes unmaintainable across sub-accounts.
Suppress the workflow for customers who are not happy
Nothing damages a client relationship faster than an automated upsell landing in the inbox of someone who has just complained. Build the exit before you build the offer.
Add suppression conditions at the top of the workflow that check for a complaint tag, an open support opportunity, an unpaid invoice, or a review score below your threshold. Any match, and the contact exits without receiving anything.
Give the client a one-click way to add the suppression tag from the contact record, and make sure whoever answers the phone knows to use it. Automation only stays safe when a human can stop it in three seconds.
This is not a referral ask, and it is not database reactivation
These three campaigns get conflated constantly, and merging them produces a message that does none of the jobs well.
- Upsell after completion: a warm, recent customer, offered the next relevant service. Triggered by completion.
- Referral request: the same warm customer, but you are asking for their network rather than their wallet. It should run on a separate track, usually after a positive review.
- Database reactivation: cold contacts who have not transacted in months. Different consent posture, different copy, different volume controls entirely.
Run them as three distinct Workflows with mutually exclusive tags. If a contact is in the upsell sequence this month, they should not also be receiving a reactivation blast.
Common mistakes to avoid
- Triggering on the sale or deposit rather than a genuine completion event, so the offer lands before the work does.
- Sending same-day, which reads as a cash grab and trains customers to mute the client's number.
- Using one generic offer for every service, then blaming the channel when nobody responds.
- Tagging on click instead of on send, so non-responders get offered the same thing repeatedly.
- Skipping suppression, so complainants and unpaid-invoice customers receive a sales message.
- Shipping it without a trigger link, leaving you unable to prove the workflow earned anything.
If you want this upsell engine built and tested in your sub-accounts instead of sitting half-finished in a draft Workflow, book a strategy call with the HL Growth Partner team.
Or if you just need the software first: grab the 30-day HighLevel trial and book us when you're ready to scale it.
Frequently asked questions
Should the upsell fire the same day the job is completed?
No. Same-day offers arrive before the customer has experienced the benefit, which makes the message feel transactional. Use a Wait step of at least seven days, and longer for services with a slow payoff. The only same-day message worth sending is a thank-you or a care instruction, with no offer attached.
Which trigger should I use if the client does not run Opportunities?
Use the Appointment Status trigger set to Showed if the service is delivered in a booked slot, or the Invoice trigger on status Paid if payment is collected at completion. Both are documented HighLevel triggers. Check that someone actually updates appointment statuses before you rely on that path, otherwise the workflow will never fire.
How long should the wait window be?
Between seven and thirty days for most service businesses, set by how long the customer needs to feel the result. Treatment-based services sit at the short end, installs and trades at the long end. Pick the window from the client's own repeat-purchase pattern rather than a rule of thumb, then review it after a quarter of data.
Is SMS or email better for an upsell offer?
It depends on the offer, not the channel. SMS suits a single time-bound offer with one link, while email suits anything requiring images, pricing options or explanation. For higher-ticket offers, a short SMS nudge followed by a detailed email works well. Never use SMS where consent is unclear.
How do I stop a customer being offered the same thing twice?
Apply an offer-specific tag at the moment the message sends, not when the contact clicks. Then add an If/Else condition at the top of the workflow that exits anyone already carrying that tag. Keep the tag names consistent across sub-accounts so the suppression logic stays readable.
Is this the same as a referral request workflow?
No. An upsell asks an existing customer to buy the next service; a referral request asks them to introduce someone else. They have different timing, different copy and different success measures. Build them as separate Workflows with mutually exclusive tags so a customer never receives both in the same week.
Do Australian SMS rules apply to an upsell text to an existing customer?
Yes. An upsell SMS is a commercial electronic message under the Spam Act 2003, so the ACMA's consent, sender identification and unsubscribe obligations all apply. Opt-out requests must be honoured within five working days and unsubscribe facilities must work for at least 30 days after sending. Since 1 July 2026, branded sender IDs must also be registered with the ACMA.
Related Articles on HL Growth Partner
Core workflow mechanics
- GoHighLevel Workflows, Triggers and Actions Explained
- Setting Up Pipelines and Opportunities in GoHighLevel
Follow-up campaigns that pair with this one
- Build a Quote Follow-Up Workflow in GoHighLevel
- Service Reminder Workflow Setup Guide
- Run a Database Reactivation Campaign
