Top Rep Training. Course Enrollment Automation
Live reference for the GHL Payments to LearnWorlds enrollment chain. When a customer purchases the PROVEN for Home Services course on GHL, this chain runs automatically and enrolls them in the LearnWorlds course within 30 to 60 seconds.
The 4-piece chain. Each box is an independent system that must be configured. The tag string is the single shared key that connects all 4 pieces.
Every ID, URL, and location needed to debug, audit, or modify the chain.
| Field | Value |
|---|---|
| Top Rep GHL Location ID | dTYhTEq6MOhUBvzfpCyp |
| White-label host | app.scalingengine.com (canonical: app.gohighlevel.com) |
| GHL Payments Product (PROVEN) | 6a06288607823902120abb50 |
| GHL Workflow ID | 5262f353-39a4-45f1-8fd6-f5d601b9685d |
| GHL Workflow Name | [3.3.7] PROVEN for Home Services Purchased |
| Workflow Deep Link | app.gohighlevel.com/location/dTYhTEq6MOhUBvzfpCyp/workflow/5262f353-39a4-45f1-8fd6-f5d601b9685d |
| Workflow Trigger | Payment Received |
| Workflow Trigger Filter | payment.global_product_ids is-in-array [6a06288607823902120abb50] AND payment.payment_status == succeeded |
| Workflow Status | Published |
| Field | Value |
|---|---|
| Catch-hook URL | https://hooks.zapier.com/hooks/catch/16934346/4yn06qn/ |
| Zapier Account | 16934346 (Top Rep Zapier workspace) |
| Zap Steps | 1. Catch Hook (Webhooks by Zapier) - 2. Create User (LearnWorlds) - 3. Add Tags to User (LearnWorlds 2.0.10) |
| Zap Status | Published / Live |
| Field | Value |
|---|---|
| School URL | school.topreptraining.com |
| School ID | 65e51ff4db8f6d74873a175a |
| Course ID (API path) | proven-for-home-service-clone |
| Course Slug (public URL) | proven-for-home-services |
| Course Title | PROVEN for Home Services |
| Course Access | private during testing, change to paid at launch |
| Automation Name | Enroll on Tag: PROVEN for Home Services |
| Automation Trigger Tag | [customer] proven for home services |
| Automation Action | Enroll in product PROVEN for Home Services |
| Automation Status | Enabled, Asynchronous |
[customer] proven for home services
[customer] is the namespace prefix.[customer] and the course name.| Place | Where it lives | Verify in |
|---|---|---|
| 1. GHL workflow Add Tag step | Step 5 of workflow [3.3.7], attributes.tags[] array |
Open workflow in GHL builder, click Add Tag step, see Tags list |
| 2. Zap Add Tags to User step | Zap Step 3 Configure tab, Tags input field | Zapier UI, open Step 3, Configure tab |
| 3. LW Automation Rule trigger tag | LW admin, Settings > User Roles > Automations > Enroll on Tag: PROVEN for Home Services | LW admin UI, click trigger block, see the tag chip on the right |
proven for home services (stripped of the [customer] prefix) even when you typed it in correctly. After saving, ALWAYS reopen the automation and check the trigger tag chip shows the full bracketed string. If it's missing brackets or the [customer] prefix, the rule will never fire. This pitfall delayed our launch by an hour on May 14, 2026.
Workflow has 9 sequential steps. All trigger off the payment_received event filtered to PROVEN product. Status: Published.
Message: "New Sale! [PROVEN for Home Services]" with revenue, contact, company, email, phone, and Scaling Engine conversation link.
Subject: New Sale! [PROVEN for Home Services] - {{contact.name}} ({{contact.company_name}}) | {{right_now.middle_endian_date}}
Body: Buyer info, order total, contact links, Scaling Engine conversation link.
Sets the field to today's date. Generic field, applies to any sales rep course purchase (Champion or PROVEN).
Cascades the contact into the post-sale follow-up workflow. Generic, no PROVEN-specific config.
Tags applied:
[customer] course (generic any-course-buyer tag)[customer] proven for home services (PROVEN-specific, downstream linchpin)Monetary Value: $997. Status: Won.
URL: https://hooks.zapier.com/hooks/catch/16934346/4yn06qn/
Buffer to let the Zap chain complete LW user creation + tag application + automation rule firing before sending the welcome SMS.
Body: Welcome message with 3 next steps. Points customer to Flight School dashboard at school.topreptraining.com/start.
Listens for the POST from GHL workflow Step 7. GHL sends a flat payload with contact fields at root (first_name, last_name, email, phone, etc.) plus payment context (total_amount, global_product_ids, etc.).
Required mappings:
email from trigger payload emailfirst_name from trigger payload first_namelast_name from trigger payload last_name (optional but recommended)Creates the LW user account if not already exists. Note: behavior on existing users (whether the action errors or upserts) depends on the LW Zapier app version. Test before launch.
Required mappings:
Email from trigger payload email (or from Step 2 output)Tags: [customer] proven for home services (literal, not mapped)Adds the tag to the LW user. This is what triggers the LW automation rule to enroll them.
[lw] Flight School Free automatically (school-level default automation). The PROVEN buyer ends up with both [lw] Flight School Free and [customer] proven for home services. If this is undesirable, add a separate Zap step to remove [lw] Flight School Free after Step 3.
| Setting | Value |
|---|---|
| Name | Enroll on Tag: PROVEN for Home Services |
| Status | Enabled |
| Mode | Asynchronous (recommended) |
| Trigger Event | Tag is added |
| Trigger Tag | [customer] proven for home services (full bracketed prefix required) |
| Run only if (filter conditions) | None (no extra conditions) |
| Action | Enroll in products: PROVEN for Home Services (course ID proven-for-home-service-clone) |
Located in LW admin: Settings > User Roles > Automations.
Fire a flat GHL-shaped payload directly at the Zap catch-hook. This bypasses GHL entirely and tests just Zap to LW.
// .mjs script, run with `node test.mjs`
const ZAP_URL = 'https://hooks.zapier.com/hooks/catch/16934346/4yn06qn/';
const TEST_EMAIL = `paul+proven-test-${Date.now()}@paulai.tech`;
const payload = {
contact_id: 'TEST_' + Date.now(),
first_name: 'Paul',
last_name: 'Test',
full_name: 'Paul Test',
email: TEST_EMAIL,
phone: '+15555550199',
company_name: 'Test Co.',
tags: '[customer] course, [customer] proven for home services',
total_amount: '997',
payment_status: 'succeeded',
global_product_ids: '6a06288607823902120abb50',
product_name: 'PROVEN for Home Services',
workflow_id: '5262f353-39a4-45f1-8fd6-f5d601b9685d',
workflow_name: '[3.3.7] PROVEN for Home Services Purchased',
location_id: 'dTYhTEq6MOhUBvzfpCyp',
};
const res = await fetch(ZAP_URL, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(payload),
});
console.log(res.status, await res.text());
Then verify enrollment in LW via API:
// Uses .scripts/learnworlds/ toolkit
import { apiFetch } from './auth.mjs';
const enrollees = (await apiFetch(
`v2/courses/proven-for-home-service-clone/users?items_per_page=100`
)).data;
console.log('PROVEN enrollees:', enrollees.length);
console.log(enrollees.find(u => u.email === TEST_EMAIL));
[3.3.7] PROVEN for Home Services Purchased.Most realistic test. Make an actual GHL Payments purchase using a $1 test SKU on the PROVEN product. Validates that GHL sends the exact webhook payload shape the Zap expects (versus a synthetic guess).
| Symptom | Likely Cause | Fix |
|---|---|---|
| Customer paid, no LW enrollment, no Slack alert | GHL workflow trigger filter doesn't match payment | Check workflow [3.3.7] trigger filter. Verify payment.global_product_ids still set to 6a06288607823902120abb50. |
| Slack + email fire, but no LW enrollment | Zap not receiving payload OR Zap step failing | Check Zapier Run history for the catch-hook. If no event, verify GHL workflow Step 7 webhook URL is correct. If event present but Zap failed, check error message on the failed step. |
| Zap runs successfully, LW user created and tagged, but NOT enrolled in PROVEN | LW automation rule trigger tag mismatch (most common) | Open the LW automation, click the trigger block. Verify the tag chip shows full [customer] proven for home services (with brackets and prefix). LW UI sometimes strips the prefix on save. |
| Zap Step 2 (Create User) errors with "user already exists" | Repeat purchaser already has an LW account | Verify Champion zap behavior for handling existing users. Likely needs "Continue on error" config OR a Find User step before Create User. |
| SMS Step 9 doesn't send | Contact has no phone number, OR GHL SMS provider misconfigured | Verify the contact has a valid phone number. Check GHL SMS settings for the location. |
| Internal email Step 2 has wrong recipients after team change | Hardcoded user list in workflow step | Edit Step 2 in workflow [3.3.7]. Update the Selected Users list (Jet, Noah, Chuck, Chris). |
.scripts/learnworlds/ toolkit)