AI automation · GoHighLevel · Portfolio project

An AI tech VA that makes GoHighLevel changes from plain English, and checks its own work.

Ask in plain words: "block Friday", "turn off the AI setter for SMS", "move the account to Pacific time". The agent picks the right operation, asks a question when something's unclear, waits for your approval on anything sensitive, makes the change, reads it back to confirm, and logs the job.

Try the live demo  Hire us

My wife and I have run GoHighLevel hands-on for about 5 years. We built this to take repetitive sub-account tech work off our own plate. Client work is under NDA, so this demo shows the system, not client data.

Why we built it

Small GHL tech requests never stop: calendar hours, timezones, users, AI bot settings, FAQs, pipeline stages. Each one is quick, but they pile up, and a careless change on a live account means missed bookings or unanswered leads.

What it is

A serverless agent that takes requests from Slack, a Monday.com ticket board or a chat API. It runs about 55 registered operations against the GoHighLevel API, each with its own risk tier.

What makes it safe

A whitelist of operations, three risk tiers, human approval cards, a read-back check after every change, a guard that stops calendar edits from wiping other settings, and a job log with an ID for every change.

Live demo

Job log

JobOperationTierStatus
No jobs yet

In this demo, rule-based matching stands in for the LLM so it can run offline. The operations, tiers, approval flow, read-back and calendar guard follow the real system.

How it works

1 · TriggerSlack mention, Monday update or new ticket (webhook plus a once-a-minute check), chat API, scheduled jobs
2 · UnderstandThe LLM maps the request to exactly one registered operation, asks a clarifying question, or hands off to a person
3 · ResolveActs only when it's certain which sub-account is meant
4 · GateRead-only, routine or needs approval. Approvals happen with Slack buttons or a Monday status column
5 · Apply + verifyGHL API with per-location OAuth tokens, then a read-back. The calendar guard diffs before and after and restores anything that moved
6 · LogJob ID, warehouse log, dashboard, and a reply in the thread

Safety and guardrails

  • Only registered operations can run, never free-form API calls
  • Changes that grant access (users, notification recipients) need approval when they come from automated triage
  • When the account was matched by name or the request came from an AI chat, every change needs approval
  • Client replies are only ever drafts. A person sends them
  • Slack requests are signature-checked and write access can be limited to an allowlist. Webhooks are re-checked against the source before anything runs
  • Each event is claimed once, so a retried or late webhook never runs a change twice
  • Testing happens on a test sub-account, never the snapshot template

Stack

  • Cloudflare Workers, Durable Objects (background jobs up to 15 minutes), cron
  • Claude API for intent mapping and ticket triage
  • GoHighLevel API v2 through a Marketplace OAuth app
  • Slack Events and Interactivity, Monday.com GraphQL, Freshdesk
  • Supabase/Postgres for the job log
  • A regression suite for every release, with all outside calls mocked

What it handles

  • Calendars: hours, blocks, settings, team, holidays
  • Timezones: account, calendars, schedules, AI agents
  • Conversation AI: status, kill switch, channels, prompt, booking pathway
  • Contacts, users, knowledge-base FAQs, pipelines, custom values
  • Ticket triage, client-reply drafts, unanswered-message watch