Highrise
Highrise gives GoHighLevel agencies analytics they can actually read. I built the integration layer behind it: authentication, data sync, real-time updates, and billing.
Overview
Highrise is an analytics platform built for GoHighLevel agencies. It connects to an agency's CRM account and turns raw operational data — deals, conversations, calendar activity into dashboards agencies can actually use.
That depends on a reliable connection to GoHighLevel. I was brought in to build that connection: authentication, historical data import, real-time synchronization, and eventually billing and access control.
Key Responsibilities
Designed and built the GoHighLevel integration layer end-to-end
Built OAuth authentication and long-term token lifecycle management
Built the historical data sync pipeline covering 12+ CRM entity types
Built real-time webhook processing for live updates
Integrated Stripe subscription billing and access control
Designed the permissions system across trial, billing, and team roles
The Challenge
GoHighLevel's API is under-documented and inconsistent in ways that make OAuth easy to get wrong token lifecycles that aren't clearly spec'd, endpoints that behave differently under load, pagination that isn't stable. That was the starting point. From there, the scope grew into everything needed to keep a production analytics product fed with accurate, current data:
- Authentication
Connect agency accounts securely, and keep the connection alive indefinitely without manual reauthorization.
- Historical import
Pull years of CRM history across 12+ entity types without timing out or losing data.
- Real-time sync
Keep dashboards current as new activity happens in GoHighLevel.
- Billing & access
Control who can pay for and access each connected account, across multiple team members.
Architecture
Four systems sit behind Highrise's dashboards: an auth layer that keeps every agency connection alive, a background sync engine for historical data, a webhook listener for live updates, and a billing layer that gates access per location.
What I Built
OAuth & Token Management
problem
GoHighLevel connections can't just authenticate once and be forgotten. Tokens expire, refreshes occasionally fail, and a broken connection means the analytics platform silently stops receiving new data often without anyone noticing until an agency asks why their dashboard looks stale.
solution
Built an OAuth flow with encrypted token storage and proactive refreshing tokens renew well before they expire for background jobs, and just before use for real-time webhook calls, so a long-running sync never dies mid-run. If a refresh ever fails outright, the system falls back to a full reconnect automatically, so most connection issues resolve themselves without the client needing to manually reauthorize.
Historical Sync
problem
When an agency first connects, Highrise needs their full CRM history not just new activity going forward to power meaningful analytics. That means pulling years of contacts, deals, conversations, and more, for accounts that can have tens of thousands of records, without timing out or overwhelming the database.
solution
Built a background sync pipeline that pulls 12+ CRM entity types contacts, opportunities, conversations, calendars, invoices, products, and more without blocking onboarding. Each entity tracks its own sync status, so a failure in one doesn't block the rest, and nothing already synced gets pulled again on the next run.
Real-Time Sync
problem
A one-time historical import isn't enough agencies need their dashboards to reflect what's happening in GoHighLevel right now, not what happened when they first connected. That means catching every new contact, deal, message, and appointment as it happens, without re-importing data that's already synced.
solution
Built a webhook endpoint that listens for contact, opportunity, appointment, and message events from GoHighLevel, fetches the full record, and syncs it in real time. The endpoint acknowledges GoHighLevel's webhook instantly and processes the update asynchronously, avoiding timeout-triggered duplicate deliveries. Deletes are handled as soft deletes records are flagged, not removed so historical analytics stay accurate even after data is deleted upstream.
Billing & Access Control
problem
Highrise isn't billed per user it's billed per connected GoHighLevel location, and any team member with the right role can be the one paying for it. That creates real-world scenarios most billing integrations don't account for: two team members trying to subscribe to the same location at once, a payer's card failing on renewal, or billing responsibility needing to shift from one team member to another without disrupting the team's access.
solution
Built Stripe subscription billing with per-location pricing, a 30-day free trial, and role-based access across Agency, Admin, and Viewer roles. If two team members start checkout for the same location at once, the losing session is automatically canceled. If the current payer cancels, access continues until the paid period actually ends. If a renewal payment fails, the location locks, but any team member gets a window to resume billing before the subscription is fully canceled. Payer succession is handled automatically, with the old subscription superseded the moment a new one takes over.
Outcome
What started as a short, focused engagement to prove the OAuth connection could work grew into a seven-month build covering the full integration layer behind Highrise authentication, historical sync, real-time updates, and the billing and access-control system running the product today.
In production, the sync pulled in over 1 million message records for a single agency account alone, alongside 100,000+ opportunities and the rest of the 12+ synced entity types a real test of the historical import pipeline under real data volume, not a synthetic benchmark.
Ilies is one of the best back-end programmers I've worked with in over two decades.Chris, Founder of Highrise
Stack
Working with GoHighLevel and hitting integration issues of your own?
Get in touch