HTMLCorporate Website

ghl-agency-onboarding — HTML Business Template

By Derek-Bearman

A new-client onboarding template for marketing agencies using GoHighLevel: a single-file HTML form, a Cloudflare Worker relay, GHL custom fields, and two workflows, with full setup steps in the README.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

2 previews
Desktop homepage1 / 2
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 2

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-13View source

What stands out

A quick read of the recorded project description.

01

Single-file HTML form can be pasted into the Custom Code block of a GHL funnel page, with configurable brand colors and agency name

02

Cloudflare Worker acts as a relay holding the GHL API key, avoiding exposing the key on a public web page

03

Supports the hot path (tagged contacts automatically pre-fill 25 fields) and the cold path (linkless visitors first create a contact then pre-fill)

04

Per-client configuration stored in KV, with the template file __agency.example.json

05

README includes step-by-step guides for building the two GHL workflows and cold path deployment documentation

06

The repository contains no tests; the README states smoke testing is done only via curl

Template Details

This repository provides a reusable client onboarding solution for collecting more than 25 structured business fields from new clients and writing them into GoHighLevel (GHL) contact records. The README explains that it consists of three core parts: a single-file HTML form that can be pasted into a GHL funnel page, a Cloudflare Worker that holds the GHL API key and handles reading and writing contacts, and two workflows that are manually built in the GHL interface (sending the onboarding link and notifying on submission completion).

The flow has two paths. The tagged "hot path": apply the send-onboarding tag to a GHL contact, the workflow sends the link, the client opens the form and the Worker pulls the contact data and pre-fills 25 fields, and after submission the Worker writes the data back and applies the onboarding-complete tag, with a second workflow sending a summary email to the agency. The linkless "cold path": a visitor goes directly to the URL, first sees a name and email card, the Worker creates or updates the contact in GHL and returns an ID, and if the email matches an existing contact, full pre-fill is also triggered.

The README explicitly lists limitations: this is not SaaS and must be hosted on Cloudflare by the user; GHL has not opened a workflow creation API, so the two workflows still need to be manually built by clicking through the GHL interface; the Worker code in the repository assumes you are appending to an existing Worker, and if starting from scratch you need to add 5 minimal scaffolding files per EXISTING_FILES.md; the repository contains no tests and only provides curl smoke test instructions. The README states setup takes about 2 hours, and the Cloudflare Workers free tier can handle thousands of submissions per month, but no performance testing or production environment validation data is provided.

HTMLCorporate Website

Is it right for your project?

Use Cases

  • A solo or small marketing agency needs to collect more than 25 fields from new clients, such as legal name, EIN, services, business hours, brand colors, social links, and GMB status
  • Wants to avoid monthly-paid form and automation combinations such as Typeform + Zapier
  • Wants client-submitted data written directly into GoHighLevel contact records and to trigger follow-up notifications
  • Needs to send an onboarding link with pre-filled information to existing GHL contacts, reducing repeated client entry
  • Is willing to deploy the Worker on Cloudflare themselves and manually build the workflows in the GHL interface

Suitable For

  • Marketing agencies using GoHighLevel as their CRM and with control over sub-accounts
  • Developers or technical operations with Cloudflare Workers, wrangler, KV, and basic JavaScript deployment skills
  • Teams that accept self-hosting and do not require an out-of-the-box SaaS
  • Agencies that need an onboarding process template they can fork and customize to their own fields and branding

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Prerequisites: a GoHighLevel sub-account, a Cloudflare account, node, npm, and wrangler installed locally, and optionally a custom domain pointing to the funnel

  2. 2

    In GHL, create a private integration token (requires Contacts.read and Contacts.write permissions), record the locationId, and create a folder named Onboarding with 25 custom fields matching customFieldMapping

  3. 3

    Create a KV namespace, fill __agency.example.json with real values and upload it as the __agency key, and deploy the Worker to get a workers.dev address

  4. 4

    In the form HTML, modify WORKER_BASE, AGENCY_NAME, and brand colors, then paste it into the Custom Code block of the GHL funnel page

  5. 5

    Follow the two guides under ghl-workflows/ to manually build the two workflows in the GHL interface, and test by applying the tag, clicking the link, and submitting the form

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is the code of this version and does not mean external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution of this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • Use requires a GoHighLevel sub-account you control, which is an external service dependency.
  • A Cloudflare account (the free tier is sufficient) is required to host the Worker.
  • node, npm, and wrangler must be installed locally to complete deployment.
  • A private integration token must be created in GHL with Contacts.read and Contacts.write permissions.
  • 25 custom fields must be manually created in GHL, and the field names must match the configuration template.
  • The two GHL workflows must be manually built in the GHL interface according to the guides, each taking about 10–15 minutes.
  • This is not SaaS and must be hosted on Cloudflare yourself; it is not suitable for users who want a monthly-paid tool.
  • GHL has not opened a workflow creation API, so workflow setup still must be done manually.
  • The Worker code assumes you are appending to an existing Worker; starting from scratch requires adding the scaffolding files yourself.
  • The repository contains no tests and only provides curl smoke test instructions.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

- A GoHighLevel account with a sub-account you control

Original README

- A Cloudflare account (free tier is fine)

Original README

- `node`, `npm`, `wrangler` installed locally (`npm install -g wrangler`)

Original README

- Settings → Integrations → Private Integration → create a token with `Contacts.read` + `Contacts.write` + `Contacts.write` permissions

Original README

- Create 25 custom fields in a folder named "Onboarding" (the field names should match `__agency.example.json`'s `customFieldMapping`)

Original README

Follow the two guides in `ghl-workflows/`. Each takes 10–15 minutes to click through in the GHL UI.

Original README

- **Not a SaaS.** You host it yourself on Cloudflare. Good if you're technical and want zero vendor lock-in; not for you if you want a billable monthly tool.

Original README

- **GHL workflow setup is still manual.** GHL doesn't expose a public API for workflow creation, so you'll click through the guides once per workflow.

Original README

- **The included worker code assumes you're adding to an existing worker.** If you're starting fresh, see `EXISTING_FILES.md` for the 5 minimal scaffolding files you'll write.

Original README

- **No tests included.** This was built for a one-agency context; adding a test suite is left as an exercise. Smoke testing via `curl` is documented in `deploy/COLD-URL-DEPLOY.md`.

Original README
https://github.com/Derek-Bearman/ghl-agency-onboarding/blob/main/LICENSEhttps://github.com/Derek-Bearman/ghl-agency-onboarding/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-13. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 80 / 100
Technologies
HTML
Website type
Corporate Website
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-05-23
Screenshot last checked
2026-10-13

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies HTML as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: codex-user-requested-batch-review-20261015 · 2026-10-15

Inspect the recorded source material

SHA-256: aa176352888b69d3d630cfacb8462f4afd3e6bffed0cfa00b991f3e283c4f3e4

2026-10-13T23:40:20.371Z

Source file / repository
# Agency Onboarding for GoHighLevel

> One pre-filled form, a Cloudflare Worker as the trusted messenger, and GoHighLevel as the source of truth. End-to-end client onboarding for an agency that runs on GHL.

A reusable pattern for collecting 25+ structured business fields from a new agency client — without chasing them across a 12-email thread, without paying for a typeform/zap stack, and without exposing your GHL API keys to a public webpage.

Built originally for a one-person marketing agency. Forkable for any agency that uses GoHighLevel as their CRM.

---

## What problem this solves

Every new client engagement starts with the same painful information-gathering: legal business name, EIN, services, hours, brand colors, social URLs, GMB status, lead-magnet copy, on and on. The typical solutions:

- **Typeform + Zapier** — works, but pays $50+/month for plumbing
- **GHL native forms** — limited pre-fill, no smart routing, ugly
- **PDF/email back and forth** — chaos, retypes, no data ends up in your CRM cleanly

This system:

- One **branded form** that pre-fills everything you already have on file
- A **Cloudflare Worker** that holds the GHL keys safely (the form doesn't)
- Two **GHL workflows** that automate the "send the link" and "tell me when they submit" loops
- Cost: **$0** (Cloudflare Workers free tier handles thousands of submissions/month)
- Setup time: **~2 hours** end-to-end

[See the visual architecture](./docs/architecture.html) (open the file in a browser).

---

## How it works

```
┌──────────┐         ┌─────────────────┐         ┌──────────────┐
│  Form    │   ←→    │  Worker         │   ←→    │  GoHighLevel │
│  (HTML)  │         │  (Cloudflare)   │         │  (your CRM)  │
└──────────┘         └─────────────────┘         └──────────────┘
                            +
                       ┌──────────┐
                       │ KV store │
                       │ (config) │
                       └──────────┘
```

**Warm path** (you tagged the contact):
1. Tag a GHL contact `send-onboarding` → workflow emails them their link
2. They click → form loads → fetches their contact via Worker → pre-fills 25 fields
3. They submit → Worker writes everything back → tags `onboarding-complete`
4. Second workflow emails you a summary

**Cold path** (walk-up visitor with no link):
1. They hit the URL → see a small name + email card
2. Worker upserts a contact in GHL → returns ID
3. If their email matched an existing contact, full pre-fill kicks in (same as warm path)

---

## Repo tour

```
ghl-agency-onboarding/
├── worker/                          ← Cloudflare Worker
│   ├── src/
│   │   ├── index.js                  ← Router (adapt to your existing worker if you have one)
│   │   ├── ghl-additions.js          ← Append to your base ghl.js
│   │   └── handlers/
│   │       ├── agency-contact.js     ← GET /agency/contact?cid=
│   │       ├── agency-onboarding.js  ← POST /agency/onboarding
│   │       └── agency-intake.js      ← POST /agency/intake (cold-URL)
│   └── client-configs/
│       └── __agency.example.json     ← KV config template — fill in your own
│
├── form/
│   └── Onboarding-Form.html          ← Single-file HTML, paste into GHL funnel
│
├── ghl-workflows/                    ← Step-by-step GHL UI build guides
│   ├── Workflow-1-Send-Onboarding.md
│   └── Workflow-2-Onboarding-Complete.md
│
├── deploy/
│   ├── deploy-cold-url.sh            ← Adapt to your worker dir + run
│   └── COLD-URL-DEPLOY.md            ← Full deploy walkthrough
│
├── docs/
│   └── architecture.html             ← Visual one-pager you can share
│
├── .env.example                      ← Shape of values you'll need
├── EXISTING_FILES.md                 ← What's intentionally missing + why
└── LICENSE                           ← MIT
```

---

## Quick start

**Prerequisites:**
- A GoHighLevel account with a sub-account you control
- A Cloudflare account (free tier is fine)
- `node`, `npm`, `wrangler` installed locally (`npm install -g wrangler`)
- A custom domain pointing to your funnel (optional but nicer than the GHL default)

**1. Clone + scaffold the worker**

```bash
git clone https://github.com/Derek-Bearman/ghl-agency-onboarding.git
cd ghl-agency-onboarding/worker
npm init -y
npm install --save-dev wrangler
npx wrangler init  # creates wrangler.toml — adapt KV namespace
```

See `EXISTING_FILES.md` for the 5 minimal additions you need to make a complete worker.

**2. Get your GHL credentials**

In your GHL sub-account:
- Settings → Integrations → Private Integration → create a token with `Contacts.read` + `Contacts.write` + `Contacts.write` permissions
- Note your sub-account's `locationId` (visible in any URL: `/v2/location/<ID>/...`)
- Create 25 custom fields in a folder named "Onboarding" (the field names should match `__agency.example.json`'s `customFieldMapping`)

**3. Configure KV**

```bash
# Create your KV namespace
npx wrangler kv namespace create "CLIENTS"
# Note the ID it returns, paste into wrangler.toml

# Fill in worker/client-configs/__agency.example.json with your real values
# Then upload it to KV
npx wrangler kv key put "__agency" --path=worker/client-configs/__agency.json --namespace-id=YOUR_KV_NAMESPACE_ID --remote
```

**4. Deploy the worker**

```bash
cd worker
npx wrangler deploy
```

You'll get a `*.workers.dev` URL. That's your `WORKER_BASE`.

**5. Set up the form**

- Open `form/Onboarding-Form.html`
- Change `WORKER_BASE` to your worker URL
- Change `AGENCY_NAME` and brand colors at the top
- Create a funnel page in GHL → add a "Custom Code" block → paste the entire HTML

**6. Build the GHL workflows**

Follow the two guides in `ghl-workflows/`. Each takes 10–15 minutes to click through in the GHL UI.

**7. Test**

- Add a contact in GHL → tag with `send-onboarding`
- You should get an email with a link
- Click the link → fill the form → submit
- Check the contact in GHL — all 25 fields populated, `onboarding-complete` tag added
- You should get a summary email

---

## Customization

**Change the 25 fields** to fit your agency: edit `worker/client-configs/__agency.example.json`'s `customFieldMapping`, create matching GHL custom fields, and update the form's field IDs to match. The form's labels are easy to find via search.

**Change the form's look** by editing CSS variables at the top of the form HTML (`--brand-primary`, `--brand-accent`).

**Add a third workflow** (e.g., a 24-hour reminder if the form isn't submitted): the pattern is the same as Workflow #1 — tag + delay + email.

---

## Trade-offs and what this is NOT

- **Not a SaaS.** You host it yourself on Cloudflare. Good if you're technical and want zero vendor lock-in; not for you if you want a billable monthly tool.
- **GHL workflow setup is still manual.** GHL doesn't expose a public API for workflow creation, so you'll click through the guides once per workflow.
- **The included worker code assumes you're adding to an existing worker.** If you're starting fresh, see `EXISTING_FILES.md` for the 5 minimal scaffolding files you'll write.
- **No tests included.** This was built for a one-agency context; adding a test suite is left as an exercise. Smoke testing via `curl` is documented in `deploy/COLD-URL-DEPLOY.md`.

---

## Credit

Built by [Derek Bearman](https://github.com/Derek-Bearman) for [Arktos Marketing](https://arktosmarketing.com). Forks and improvements welcome.

The visual architecture diagram (`docs/architecture.html`) is built with Anthropic's `infographic-builder` skill — open and screenshot it for your own pitch decks if useful.

## License

MIT. Use freely. No warranty.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.