← INDEX/WORK/GHL-RC-BRIDGE

№ 09 — SYSTEMS INTEGRATION

GHL×RC Bridge

The CRM couldn’t hear the phone system. So I built it an ear — in five serverless functions.

TYPEWork improvisation · PTC
YEAR2026
ROLESystems engineer (day-job improvisation)
STATUSDeployed · Netlify Functions
SCOPEWebhooks · APIs · Serverless

Why this exists

At Professional Travel Center, the phones live on RingCentral and the CRM lives in GoHighLevel — and out of the box, neither knows the other exists. Every customer text was invisible to the system of record; every agent reply lived in the wrong tool.

No vendor sold the fix, so I built it: a bidirectional SMS/MMS bridge. Inbound texts thread into the right GHL conversation with contact upsert; agent replies in GHL go out through RingCentral and log back into the thread; and campaign keywords — the cruise-expo finalist numbers from №10 — trigger an automatic confirmation MMS. A phone line became an automation surface.

What I engineered

INBOUND

RingCentral webhooks, handled properly

Message-store notifications with the RC validation-token handshake, full message fetch, phone-number contact matching with upsert, and conversation threading into GoHighLevel — rc-inbound.js.

OUTBOUND

Closing the loop without echo

GHL webhook → RingCentral SMS send → logged back to the same GHL thread, so agents work in one tool and customers see one number.

AUTOMATION

Keyword-triggered MMS

Finalist-number detection fires a confirmation MMS automatically — the integration hook that made the PTC Promotions giveaway funnel self-service.

SURFACES

Two zero-dependency consoles

A ~730-line inbox viewer and a ~500-line composer in plain HTML/JS, served from the same Netlify deploy — no framework, no build, no login walls between an agent and a reply.

ITERATION

v1 → v4

Four shipped revisions of auth handling (rcAuth.js), GHL API wrappers, and subscription management — the version trail of a tool that people actually used.

In the wild

RC Text Interface — the agent composer console, live against RingCentral
RC TEXT INTERFACE — THE AGENT COMPOSER CONSOLE, LIVE AGAINST RINGCENTRAL
5SERVERLESS FUNCTIONS
2-WAYSMS / MMS SYNC
v4SHIPPED REVISIONS
Node.jsNetlify FunctionsRingCentral APIGoHighLevel APIWebhooksOAuth / token authVanilla JS consoles

The improviser’s skillset: read two vendors’ API docs, find the seam, and ship a working bridge without asking permission or budget. Most of a marketer-engineer’s value lives in exactly this kind of unglamorous connective tissue.