GHL Tags on Contract Events
A contract goes through clear stages: it is sent, the client opens it, reads it, signs it — or the link expires, someone cancels it, it ends up abandoned. With GHL tags on events each of these stages can add or remove a tag on the GoHighLevel contact of the lead or client. And in GoHighLevel a tag can start your workflows: an SMS, a WhatsApp message, a reminder to the salesperson.
GHL tags on events are available on the Professional plan and above. They are managed by admins and by members with the “Can edit contract templates” permission.
What it is for
A few example rules:
- Contract opened → add
contract-opened: in GoHighLevel a workflow listening for that tag tells the salesperson the client is looking at it. - Contract sent → add
contract-to-sign, and Contract signed → removecontract-to-sign: a WhatsApp follow-up workflow stops by itself as soon as the client signs. - Signing link expired → add
contract-expired: the contact enters a sequence to pick the deal back up.
SalesControl only handles the tag: what happens next is up to the GoHighLevel workflows of your agency that listen for that tag.
What you need
- The GoHighLevel app connected, in Admin › Integrations › Calendars › GoHighLevel. With a pasted token instead of the app, tags are not written.
- Permission to write contacts. The app asks for it since 24/10/2026: if you connected it before, press Reconnect on the GoHighLevel card and accept the new permission.
- The agency’s GoHighLevel sub-account connected: that is where the contacts of your leads and clients live.
- A GoHighLevel contact linked to the lead or client of the contract.
You can prepare the rules beforehand: the section warns you with a banner and the Go to Integrations button. While something is missing the rules are saved, but no tag is written and the log marks the action as Skipped, with the reason.
Where to set it up
On the contract template, like webhooks: each template has its own rules. In Contracts › Templates, open a template and scroll to the GHL tags on events section, right after Webhooks after signing.
On a brand-new template that has never been saved, the section says “Save the template to add a rule.” Save once and the Add rule button lights up.
Creating a rule
Press Add rule: the New rule dialog opens.
The contract event that triggers the rule (the list is below).
Add the tag or Remove the tag.
Free text, up to 100 characters, saved in lowercase. To avoid typos, under Suggestions from the sub-account choose a sub-account and start typing: the tags it already uses appear.
Press Save. In the Rules list each row has a switch to turn it on or off, arrows to move it, Edit and Delete. The counter at the top tells you how many you have: at most 30 rules per template, and never two with the same event, the same action and the same tag.
The events
| Event | When it fires |
|---|---|
| Contract sent | Once per contract, when it is sent. |
| Contract opened | The first time the signing link is opened. Later openings do not repeat it. |
| Contract read | When the contract has been read for the template’s reading threshold, adding up the openings, or when the client reached the last page. |
| Contract signed | When the contract is signed and the post-signing steps are done, that is after the email with the signed PDF. |
| Signing link expired | When the link expires without the contract being signed. |
| Contract cancelled | When someone on the team cancels the contract. |
| Contract abandoned | When the contract is marked as abandoned. A Restore does not undo an event that already fired. |
Each event fires only once per contract. The tag usually reaches GoHighLevel within a couple of minutes of the event.
The reading threshold
The section has a Reading threshold (seconds) field: how many seconds of active reading it takes for the contract to count as read. It goes from 10 to 3600; left empty it means 60. It is saved with the template, so press Save on the template after changing it. Active reading means with the page in front of the reader: a tab forgotten open in the background does not count.
From when a rule applies
A rule applies to contracts sent while it is on. Creating it today puts no tags on contracts sent yesterday, not even on the ones the client opens tomorrow: no retroactive tags.
- Turning it off stops it right away, contracts already sent included.
- Turning it back on restarts it from that moment: it applies to contracts sent from now on, as the message “Rule on: it applies to contracts sent from now on” says.
- Deleting it stops it for good. Tags already set on contacts stay: if you want them gone, remove them in GoHighLevel.
Which contact gets the tag
The GoHighLevel contact of the lead or client the contract was sent to, in your agency’s sub-account (never in one of your clients’ sub-accounts). If a client has several contracts they are still one person, and the tag goes on their single contact.
SalesControl learns which sub-account the contact is in when it comes from GoHighLevel (leads from workflows, calendar appointments, events). If the agency has a single sub-account, it uses that one. When it cannot know, the log says “It is not known which GoHighLevel sub-account the contact is in.”
If a tag is used by a GoHighLevel tag events rule on the agency sub-account, it cannot be used here: when SalesControl set it, that rule would record an extra event in the client’s Timeline. Saving is refused with an explanation: choose another tag.
The “Automations” log
To see what happened on a specific contract, open the lead’s or client’s record: on the Contracts card, next to the contract, the Automations link opens the log. The link appears as soon as at least one action has been recorded.
For each action the log shows the event that triggered it, what it does (Add the tag or Remove the tag) with the tag, the outcome, and the day and time in your agency’s time zone (for example 24/10/2026 15:42).
| Outcome | What it means |
|---|---|
| Done | The tag was added or removed in GoHighLevel. |
| In progress | The action is queued (“Queued since …”) or waiting for another attempt (“Next attempt on …”). |
| Skipped | Something needed was missing: the contact, the sub-account, the app or its permission. The reason is written underneath. |
| Failed | GoHighLevel rejected the tag or did not answer even after the retries. The reason is written underneath. |
When GoHighLevel does not answer or asks to slow down, SalesControl retries by itself after 2 minutes, 10 minutes, 30 minutes and 2 hours; then the action is marked as failed. A skipped action is not repeated: once the reason is fixed (for example the app reconnected), it applies to the events that come after.
Duplicating the template
Duplicate copies the rules too, but turned off: that way the copy sets no tags until you decide which ones to turn on. If the rules cannot be copied a warning says so: the template is created anyway and you add them back from the section.
Good to know
- A team opening counts as a client opening. If someone on the team opens the signing link (for example copied from the record), SalesControl treats the contract as opened, and as read too if they stay long enough: the “opened” and “read” rules fire anyway.
- Signature from your CRM. A signature coming in through the inbound “contract signed” webhook does not go through a template, so it triggers no rules.
- The tag does not replace webhooks. If you need to send the contract data to a system other than GoHighLevel, use outbound webhooks.