Phil Sexton / HomeSmart • Real Estate
GHL System with Integrated Automations for Phoenix's Largest Brokerage
GoHighLevel CRM, Workflow Automation, A2P/10DLC Compliance, Email Templates, Blog Build, Training Documentation
What Phil had
Phil Sexton has been in real estate since before most CRM platforms existed. Former Director of Marketing at Realty One Group. Led a team of 88 agents with a best year of $392M in home sales. Now he runs NEXT, a team inside HomeSmart, teaching agents how to use technology and building the infrastructure around them.
He came to me via Upwork. He was on GoHighLevel Agency Pro with 10 sub-accounts set up. One agent was meaningfully active. The rest were empty or broken. The snapshot that was supposed to deploy a consistent branded system to every new agent had a Nigerian address and phone number sitting in it as placeholder data. Every agent onboarded before anyone caught it would have had “Crutech Make hostel” in their system.
The existing GHL help was a website designer from Upwork. Phil’s words on that arrangement: he wanted someone who could do strategy, not just pages. He knew the difference.
What he actually needed versus what he thought he needed
On the discovery call, Phil’s ask was clear: “I want to say yep, yep, nope, yep.” He wanted a feature menu, not a report. That is a reasonable thing to want when you have talked to a lot of vendors.
But what Phil described during that call was bigger than a feature checklist. He wanted 50 agents this year. He has talked to HomeSmart about training agents in other markets. His long-term number is 1,000. He also has a philosophy about agent ownership: agents keep their full tech system when they leave the team. Every domain, every contact, every workflow. The brokerage does not own their data.
That philosophy changed what the build had to be. A shared email domain was off the table. Every agent needed a dedicated domain. Every template had to be fully neutralized of one agent’s data before it could become another agent’s template. The system had to be built so it could hand off cleanly, not just function.
His billing model added another layer: agents pay through commission split, not a monthly invoice. That meant the SaaS payment flow had to work correctly at signup, because there is no clean way to collect a card from an agent who is already inside the system using a non-admin user role.
The snapshot problem
GoHighLevel’s snapshot system is supposed to make agent onboarding simple: build it once, push it to everyone. The reality was more complicated.
The original snapshot had three website templates, all broken. One was hardcoded with a specific agent’s name, headshot, and a real listing address. The funnels inside the snapshot were that same agent’s actual working funnels. Two of the templates had typos. One said “LUXERY.”
Cleaning these was not just a matter of replacing names. The templates needed to become merge-field driven: every agent-specific piece of information (license number, service area, tagline, social profiles, calendar booking URL, review link) had to pull from a Custom Value that gets populated during onboarding. I mapped 28 Custom Values across Agent Details, CTAs, Social, and compliance categories.
There was a structural problem I did not find in research. The snapshot sub-account had imported a third-party snapshot in 2023. That snapshot flagged dozens of its workflows, tags, and custom values as Restricted assets, which cannot be included in a new snapshot. That meant I could not just clean the existing snapshot and republish it. The architecture had to split: install the third-party snapshot directly into each agent sub-account, then apply the NEXT agency snapshot separately with only the custom-built items. Double the deployment steps per agent, but the only path that works.
A2P before I started
The agent compliance problem showed up before the engagement even started.
One of Phil’s agents had already been rejected on A2P registration, which is the FCC’s process for approving business text messaging. A2P rejection is not just a delay. A rejected brand creates a trust score in the TCR database that can take months to recover, and some carriers remember it permanently.
I spent part of the pre-call research week on this. The correct path for real estate agents without an existing EIN is Sole Proprietor registration, which uses identity verification (a Persona selfie) instead of IRS database lookup. Standard Brand registration requires an EIN that has been in the IRS system for 30 to 90 days to propagate correctly. Filing a new EIN and immediately registering creates rejection risk that does not recover cleanly.
That recommendation became the source-of-truth for the entire team’s A2P rollout. Every agent was registered as Sole Prop. All A2P registration was confirmed complete before the project reached handoff.
There is a sequencing problem I had to document in the onboarding SOP: A2P approval requires a live website with a working opt-in form and a privacy policy. But in the onboarding flow, A2P comes before the website is fully set up. The SOP has an explicit deferral note for this. You cannot just run through the steps in order.
The build
Workflows
13 workflows across three phases: simple (missed call text-back, birthday greeting, anniversary, referral request, stale opportunity alert), medium (appointment confirmation, no-show follow-up, post-closing review request, speed-to-lead, open house follow-up), and complex (buyer lead nurture with 15 steps and branching, cold lead reactivation with a 13-step drip, pipeline stage actions with a 5-branch if/else tree).
GoHighLevel’s API cannot create workflows. Every workflow was built through Playwright browser automation, opening the GHL interface and driving it the same way a human would, because that is the only path that exists. I built a reusable automation skill from this work that I now use on other GHL projects.
Email Templates
5 templates: Open House, General Marketing, Just Listed, Just Sold, and New Agent Introduction. All built inside the snapshot sub-account using the NEXT brand palette (navy #2C3345, crimson #C41230, white). The Just Sold template has a 3-column stats card for showing sale price, days on market, and list-to-sale ratio. All templates use Custom Values for agent-specific content so they deploy correctly without manual editing.
Blog
A full NEXT-branded blog with 5 categories, 5 published example posts, and the CSS customized to match the NEXT design system. GHL’s blog editor is built on TipTap, and injecting HTML directly into the editor is substantially faster than simulating keyboard input. The blog rename from “Test” to “Realty Updates” is still blocked by a GHL limitation: you cannot save blog settings without a domain connected, and there is no public API for blog metadata.
Long-Term Nurture Sequence
12 emails over 6 months, tag-triggered, with a two-tag design. Agents get a notification when a contact hits the long-term-nurture tag, then manually apply a second tag to actually start the sequence. That gives agents deliberate control over who enters the flow, rather than contacts getting enrolled automatically.
Privacy Policy and Terms of Service
Both pages built as merge-field templates based on Donna White’s A2P-approved pages, which had already cleared the compliance review. The logic was to use a page that passed as the reference rather than writing from scratch and guessing. 28 Custom Values total after adding the PP and ToS URL fields.
The AJ situation
Midway through the project, I learned Phil had a developer: AJ Baddley, who had been building a custom enterprise system on a VPS for the team. His stack included a bot called Viktor that could audit sub-accounts via the GHL API, and a Playwright-based automation pipeline that would auto-fill agent sub-accounts from a Google Form filled at signing.
This changed the deliverables significantly, and it was not in the proposal.
Instead of building for Phil to run manually, I was now building for AJ’s automation to interact with. Every Custom Value key had to match exactly what his Playwright scripts would populate. Template neutralization had to be more rigorous because automation needs predictable DOM structure, not just “looks right.” I built two versions of the onboarding SOP: one for manual use during live onboarding sessions, one as a technical reference for AJ’s automation mapping fields to GHL paths.
I also built an onboarding fields spreadsheet: 34 fields across 8 categories (Business Profile, Custom Values, User Account, Media, A2P, Website, Phone, Email Setup, Database) formatted as a TSV for Google Sheets import. AJ used this to build his Google Form.
The scope shifted substantially from the original proposal. The retrospective notes it plainly: the project was underpriced for the actual scope.
As of late May, Phil called me about AJ separately. His words were that AJ “can’t cross the finish line or show a finished product.” Phil asked me to document AJ’s entire system as a contingency, which I did: an ownership risk breakdown and a full architecture draft covering 10 system components and data flows. I flagged the Meta ads automation claim as the one most likely to not materialize, since it requires either a Meta Marketing API app approval or browser automation against active bot detection.
What I built that wasn’t in the scope
The contact importer. Phil mentioned wanting an AI tool to handle bulk contact uploads into GHL, which require a specific CSV format. I built it as an unscoped gift on my own infrastructure: a two-pass Haiku pipeline where the first model converts any contact spreadsheet into the correct format and the second verifies and fixes the output. Chunked at 1,000 rows for large files. Three audit rounds by code-review subagents caught 13 bugs before it went live, including one where dropped rows disappeared silently with no warning. Final accuracy: 2,987 valid out of 3,000 contacts, 5 correctly dropped, 0 field type errors. Live at https://phil-contact-importer.vercel.app. Cost to Phil: zero.
Honest accounting
I spent too many passes on the scope document. Nine audit rounds before sending it. The retrospective said 2-3 too many. The work was right; the process was slower than it needed to be.
The blog rename is still unresolved. GHL requires a domain to save blog settings, which creates a sequencing dependency that cannot be worked around from inside GHL. It is documented, but it is not done.
Where things landed
All 13 workflows built and audited. All 5 email templates live in the snapshot. Blog fully built. LTN sequence live. PP/ToS pages deployed as merge-field templates. SOPs in Google Drive. Per-agent cost breakdown delivered to Phil covering four usage tiers with scale projections to 1,000 agents. Snapshot loaded into all sub-accounts. A2P confirmed complete for all agents.
What is still open: three agent websites need custom value repopulation after a snapshot push overwrote them, two workflows need rebuilding or finishing, and the AJ contingency planning is ongoing.
Phil has a system now. It was not there when we started.