epic-ghl-subaccount

n8n community node for Epic Dashboards — GoHighLevel SUB-ACCOUNT scoped. Authenticates directly into a single sub-account (location) via its own OAuth2 credential, with NO agency→location token exchange. Contacts, opportunities, notes, users, pipelines, c

Package Information

Released: 1 mo ago
Downloads: 0 weekly / 0 monthly
Latest Version: 0.3.1
Author: Epic Tech Software

Documentation

n8n-nodes-epic-ghl-subaccount

Open in Obsidian: obsidian://open?vault=Epic%20Tech%20Software&file=projects/epic-dashboards/n8n-nodes-epic-ghl-subaccount/README

An Epic Dashboards–owned n8n community node for the GoHighLevel API, scoped to a single sub-account (location).

It authenticates directly into one sub-account via its own OAuth2 credential — the user picks one location on GHL's "Choose Location" consent screen, and the returned token is already location-scoped. There is no agency → location token exchange.

This is the ED-owned recreation of the internal n8n-nodes-boomerang-subaccount node, rebranded so the Epic Dashboards spinout does not depend on the agency package. Same GHL logic, Epic identifiers:

Internal (agency) This package (ED-owned)
npm name n8n-nodes-boomerang-subaccount n8n-nodes-epic-ghl-subaccount
Node type boomerangSubaccount epicSubaccount
Node label "Boomerang Subaccount" "Epic Subaccount"
Credential boomerangSubaccountOAuth2Api epicSubaccountOAuth2Api
Credential label "Boomerang Subaccount OAuth2" "Epic Subaccount OAuth2"

Resources

Appointment · Calendar · Contact · Custom Field · Custom Value · Funnel · Invoice ·
Media · Note · Opportunity · Pipeline · Template · Trigger Link · User · Workflow.

For the founding-cohort funnel the relevant piece is Contact → Create or Update (upserts by email; matches the GHL contact-identity model the funnel relies on) plus Custom Field for reading the location's field IDs.

Added in 0.2.0 — marketing-asset surfaces

Added so the marketing command center can reach GHL through this node rather than
raw HTTP calls. Everything GHL-facing goes through here; if an endpoint is missing,
add it to this node rather than hand-rolling an HTTP Request node.

Resource Operations Endpoint Notes
Trigger Link list · create · update · upsert · delete /links/ Native GHL trigger links — per-contact click tracking + "Link Clicked" workflow triggers. upsert with no ID matches on name, so a repeated push updates instead of duplicating.
Custom Value list · get · create · update · upsert · delete /locations/{id}/customValues The {{custom_values.*}} tokens. upsert matches on name when no ID is given.
Media list · upload /medias/files, /medias/upload-file Upload takes a hosted URL (GHL fetches it) or an n8n binary property.
Funnel list · listPages /funnels/funnel/list, /funnels/page Read-only — GHL exposes no funnel/page create; building stays visual-builder-only.
Template list · get · create · update · upsert /locations/{id}/templates (list) · /emails/locations/{id}/templates[/{id}] Email templates take the full HTML (editorType html), subject line and preview text. upsert matches by exact name when no ID is given. Scopes emails/templates.* (0.3.0).
Calendar list · get /calendars/ Uses the older 2021-04-15 Version header.

0.2.0 also adds funnels/funnel.readonly + funnels/page.readonly to the credential's
scope list. Re-authorize the credential after upgrading — an existing token was minted
without the funnel scopes and will 401 on the Funnel resource until reconnected.

Credential setup (GHL Marketplace OAuth app)

Unlike a Private Integration Token, this node uses OAuth2, so it needs a GHL Marketplace app:

  1. In the GHL Marketplace developer area, create an app (or reuse one) and enable the scopes the node uses (contacts, opportunities, custom fields, etc. — see dist/credentials/EpicSubaccountOAuth2Api.credentials.js).
  2. Add n8n's OAuth2 redirect URL as an allowed redirect on the app:
    https://epic-tech-software-n8n-u70487.vm.elestio.app/rest/oauth2-credential/callback
  3. In n8n → Credentials → New → "Epic Subaccount OAuth2", paste the app's Client ID and Client Secret, then Connect. On the GHL "Choose Location" screen, pick the sub-account this credential should operate on.
  4. The location ID is auto-read from the token. Only fill the Location ID (Override) field if n8n reports it can't determine the location.

Install into n8n (self-hosted, elestio)

Community nodes install by npm package name once the package is published. Until then, install it locally.

Option A — publish, then install by name (recommended once stable):

cd projects/epic-dashboards/n8n-nodes-epic-ghl-subaccount
npm publish --access public
# then in n8n: Settings → Community Nodes → Install → n8n-nodes-epic-ghl-subaccount

Option B — local install onto the elestio n8n (no npm publish):
Copy this folder into the n8n instance's custom-nodes directory (~/.n8n/custom/ or the N8N_CUSTOM_EXTENSIONS path) and restart n8n. The package ships prebuilt dist/, so no build step is required.

Building from source

This package ships prebuilt dist/ only — there is no TypeScript source in this folder. The canonical .ts source lives in the internal node repo (theCamArsenault-Boomerang/node-construction-site). If you need source-level maintenance, fork that repo and re-apply the Boomerang→Epic rebrand (node type, credential name, display names, icon), then npm run build.

Where this fits in the founding funnel

The founding-application n8n workflow (ED — Founding Application Intake, id 8aICHL2lBRHelEwS) currently writes to GHL via a raw HTTP Request node using a Private Integration Token — that path works today and needs no OAuth app.

This node is the reusable, typed alternative: once the OAuth app above is set up, the workflow's HTTP node can be swapped for an Epic Subaccount → Contact → Create or Update node, and the same credential is then reusable across every future ED ↔ GHL workflow (opportunities, notes, pipelines, etc.). Swapping is optional — do it when you want the OAuth-app path instead of the PIT.

0.3.1 (2026-09-06)

  • Template create/get/update/upsert send Version: v3 — the email templates endpoints are API v3 and answer 404 "Cannot GET/POST" to the default 2021-07-28 header.

0.3.0 (2026-09-06)

  • Template: create, update, upsert, get for email templates on the documented Emails API (/emails/locations/{locationId}/templates).
  • Credential scopes: emails/templates.readonly, emails/templates.write, emails/campaigns.readonly, emails/campaigns.write, emails/stats.readonly, locations/templates.readonly.
  • Re-authorize the credential after upgrading. A token minted before 0.3.0 does not carry the new scopes and every template write returns 404/401 until the credential is reconnected.

Discussion