GrowPro OS
The web app the agency runs on. It turns a ClickUp task into a fully built HighLevel sub-account through a pipeline you can actually see, and gives the social-media team a monthly workspace that sends posts straight to HighLevel's Social Planner — while the client-success team rehearses tough client calls against an AI school owner.
The problem
New clients were onboarded by an n8n workflow that started at a webhook, read its agency token out of an Airtable cell, and left no record of what it had done. When it went red, someone had to open the execution and read six HTTP nodes to work out which one broke — and re-running it risked creating a second sub-account.
What I built
A real application where every build is a record: an intake, an ordered list of steps, and a log that outlives the run.
- ClickUp intake — moving a task into a chosen status fires a signed webhook; the app parses the description and lands a draft — a person confirms the fields before anything is created.
- A visible build pipeline — create sub-account → create users → authorise location → await snapshot → sync custom values → verify — each step tracked and logged on its own.
- Crash-safe by design — the worker claims a run under a lease and saves after every step, so a restart resumes where it stopped instead of building twice. One task can only ever produce one build.
- Mapping settings — admins map ClickUp labels to intake fields and intake fields to HighLevel custom values, matched against real recent tasks; anything unmapped is flagged, never silently dropped.
- SMM department — a monthly workspace per school that schedules posts — captions, media and dates — to HighLevel Social Planner, with a delivery ledger that prevents duplicate posts.
- CSM roleplay training — client-success managers call an AI school owner over OpenAI Realtime voice, work through levelled scenarios like a client threatening to cancel, and get graded on the agency's CSM rubric.
- Team & access — admins manage members, department access and per-department themes; every request is re-checked on the backend.
Under the hood
Each pipeline step is one file — adding automation means adding a file and a line to the step list, and the runner, API and dashboard all read the plan from it. The snapshot wait is scheduled and re-checked rather than a blind two-minute sleep, and one failed user no longer fails the whole build.
HighLevel tokens are encrypted and refreshed instead of living in a spreadsheet cell, and companyId always comes from the agency record, never from the request. Express + Joi + Pino on the backend, React with TanStack Query, Tailwind and shadcn on the front — sharing one UI kit with the AI Ads Platform — on Supabase and Render.
Outcome
Onboarding went from a black-box workflow to a build anyone on the team can open, follow, and resume. When something fails, the log says exactly which step and why — and the same app now runs the SMM and client-success teams too.