BrightLabCrew
Internal · 8 May 2026
Tier 2 — Growth

Growth tier workflows

Fifteen GHL workflows, six external n8n workers, seventeen pipeline stages. Everything Launch does plus AI quote generation, automatic Xero invoicing, contact sync, job reminders, and stage auto-advance on Xero events. The CRM stops nudging your team and starts doing the work.

Tier 2
Growth
Comms + money + stage gating fully automated.
15
GHL Workflows
17
Stages
6
External Workers

Icon key

Same icon vocabulary as the Launch page, plus the webhook icon (yellow lightning) which is what Growth uses to call out to n8n.

Trigger
Send email
Internal notification
Wait timer
Condition / branch
Update opportunity
Update contact field
Find contact / opp
Assign user
Remove assigned user
Custom webhook to n8n
Add task
Enable / disable DND
Number formatter
Manual step (your team)
END Workflow ends

Workflows identical to Launch

These workflows fire the same way in both tiers. Customer-facing and internal-facing comms are the same. Click through to see the full canvas on the Launch page.

WF01
New leads
Customer Booked Appointment → create/update opp → assign → reminders → advance to Assessor Visits
WF03
Quote yes or no
Branches on quote acceptance/rejection. Sends acceptance or follow-up email, tags lost opps with reason.
WF04
Job scheduling
Branches on Quote Given In Person. Notifies scheduler and either auto-advances (in-person) or waits for manual scheduling.
WF08
Quality check
Reassigns to QM team, notifies internally, emails customer. Quality Check Fail stage to be added to both tiers.
WF10
Handover review link
Sends "your project is now completed" email with Google review CTA at job finish.
WF12
Auto-win on follow up
Auto-marks opportunity Status = Won when payment lands and stage is Invoice Paid + Follow Up.
WF13
Long-tail follow up
1mo / 3mo / 6mo cadence with active-in-other-workflow checks. Cold version for rejected, warm version for won. Ends with Mark Successfully Resolved.
WF14
Email unsubscribed
Enables DND on Email channel when contact unsubscribes.

Workflows modified in Growth

Same core canvas as Launch, but each one is paired with a Growth-only external worker that does the actual quoting / invoicing / sync work. The GHL workflow notifies your team; the n8n worker drafts the document.

WF02

Prepare and send quote (Growth)

Opportunity Changed to stage Send Quote · paired with EXT-2 AI Quote Drafter
Workflow Canvas
Opportunity Changed
Pipeline stage is Send Quote
Random Number (Number Formatter)
Range 100-999
Update opportunity
Opp Name = {{contact.first_name}} {{contact.last_name}} - {{contact.job_address}} ({{number_formatter.1.result}})
Condition
on Quote Given In Person
Update contact field
Update opportunity
Stage Job Scheduling
END
Update contact field
Remove Assigned User
Distribution split
Configurable up to 8 paths per location
Assign to bookkeeper
Internal Notification
"Review and send quote" — AI has drafted it already
END
Assign to bookkeeper
Internal Notification
"Review and send quote"
END
END
Parallel: EXT-2 AI Quote Drafter fires on the same trigger (separate workflow). Waits 1 min for the random number + opp name to settle, then POSTs to n8n which drafts the quote PDF using Xero's price guide and emails the customer. Bookkeeper just reviews and confirms send.
WF05

Job scheduled (Growth)

Opportunity Changed to stage Job Scheduled · paired with WF06 + WF06b reminder hand-off
Workflow Canvas
Opportunity Changed
Stage Job Scheduled
Update contact field
Mirror scheduling params onto contact
Wait 1 minute
Race-condition guard
Confirmation email to lead
"Your job is confirmed"
Assign to Head Painter
Job booked internal notification
END
Parallel: WF06 fires on the same trigger. Sends an outbound webhook to n8n with the scheduling parameters. n8n schedules two callbacks: a reminder email 1 day before the job, and an opp-stage advance to Job Under Way on the job day. WF06b is the inbound webhook GHL workflow that catches the n8n callback to send the reminder.
WF07

Deposit invoice trigger (Growth)

Opportunity Changed to stage Approved + Deposit Paid · paired with EXT-3 Auto Deposit Invoice
Workflow Canvas
Opportunity Changed
Stage Approved + Deposit Paid
Internal Notification to Bookkeeper
"Review and send deposit invoice — already drafted by AI"
END
Parallel: EXT-3 Auto Deposit Invoice fires on the same trigger. Reads the quote total, calculates the 30-40% deposit (configurable per location), drafts the Xero invoice, populates customer details from contact sync, and saves as draft for bookkeeper review. Bookkeeper reviews and clicks send. On payment received, Xero webhook fires, opp auto-advances to Job Scheduling + Deposit Approved.
WF09

Final invoice trigger (Growth)

Opportunity Changed to stage Finished + Invoice Drafted · paired with EXT-4 Auto Final Invoice
Workflow Canvas
Opportunity Changed
Stage Finished + Invoice Drafted
Internal Notification to bookkeeper
"Review and send final invoice — already drafted by AI"
END
Parallel: EXT-4 Auto Final Invoice reads the quote total minus the deposit paid, drafts the remaining 60% in Xero with deposit reconciled, saves as draft. Bookkeeper reviews and sends. After send, opp auto-advances to Final Invoice Sent. On payment landing, Xero webhook auto-advances to Invoice Paid + Follow Up.

Growth-only workflows

These three workflows don't exist in Launch. They depend on n8n hand-offs that Launch can't perform.

WF06

Job reminder trigger

Opportunity Changed to stage Job Scheduled · outbound webhook to n8n
Workflow Canvas
Opportunity Changed
Stage Job Scheduled
Update contact field
Stamp "reminder pending" flag
Custom Webhook
POST to brightlab-crew.app.n8n.cloud/webhook/ghl-job-reminder with contact + opp IDs
END
What n8n does after this: reads the contact's job date, schedules two timers — one for 1 day before the job (reminder), one for the morning of the job (auto-advance). When each timer fires, n8n calls back into GHL via the inbound webhook (WF06b).
WF06b

Job reminder email sender

Inbound Webhook (premium) — n8n calls back into GHL
Workflow Canvas
Inbound Webhook
Triggered by n8n with contact_id + action type
Find Contact
By inbound contact_id
Branch on Find
Reminder Email
"Your painting job starts tomorrow"
Internal Notification
"Job tomorrow — readiness check"
END
END
WF15

Opportunity execution logs

Pipeline Stage Changed to Successfully Resolved · 91-day log + purge pattern
Workflow Canvas
Optional. Keep for admin/data hygiene, strip from snapshots that don't need GDPR-style retention.
Pipeline Stage Changed
Stage Successfully Resolved
Wait 85 days
Custom Webhook
POST to n8n.cloud/webhook/ghl-execution-logs with full opp + contact JSON
Wait 6 days
Remove Opportunity
Hard-delete from GHL
END
Currently DRAFT in BSP production. Decide whether each Growth customer wants this turned on. Useful for compliance / data retention discipline, optional otherwise.

The 6 n8n workers that run on Cloud

All workers run on the BLC n8n Cloud instance. Each one fires on a specific GHL pipeline stage change and POSTs to a webhook on n8n that handles the heavy lifting (Xero API calls, AI generation, scheduling).

EXT-1

Xero Contact Sync

Auto-syncs the GHL contact into Xero the moment the opp moves to Assessor Visits. Skip the "is this customer in Xero yet?" check.

Trigger: Stage 2 / Assessor Visits
EXT-2

AI Quote Drafter

Reads the assessor's notes, photos and parameters off the opportunity. Generates a quote PDF via Claude API using Xero's price guide. Emails it to the customer.

Trigger: Stage 3 / Send Quote (1 min wait)
EXT-3

Auto Deposit Invoice

Creates a Xero deposit invoice (default 30-40% of quote total, configurable per location). Drafted and ready for bookkeeper review.

Trigger: Stage 5 / Approved + Deposit Paid
EXT-4

Auto Final Invoice

Creates the Xero final invoice with deposit reconciled. Drafted and ready for bookkeeper review and send.

Trigger: Stage 10 / Finished + Invoice Drafted
WF06 reminder pair

Job Reminder Scheduler

Receives the WF06 outbound webhook on Job Scheduled. Reads the contact's job date custom field, schedules two callbacks: 1-day-before reminder and day-of stage advance. Calls back into GHL via WF06b's inbound webhook.

Trigger: Stage 7 / Job Scheduled
WF15 archive

Opportunity Execution Logger

Receives WF15's webhook 85 days after Successfully Resolved. Archives the opp + contact JSON to external storage (admin-only). Optional for GDPR-style retention discipline.

Trigger: Stage 14 / Successfully Resolved + 85d

Cloudflare Workers — init & end

These two Workers sit above the GHL layer. They orchestrate what happens when a customer first pays (init) and when they cancel (end). The GHL snapshot exists because the init Worker created it. Without these, the rest of the system doesn't have anything to wire up.

Why Cloudflare Workers, not n8n: the lifecycle layer needs strong webhook signature validation, low cold-start latency, and direct integration with Cloudflare Pages provisioning. n8n is great for inside-customer workflows; Workers are right for the BLC platform itself.
INIT

stripe-to-ghl — customer onboarding

HTTP webhook from Stripe on checkout.session.completed · deployed to blc-init.brightlabcrew.workers.dev
Endpoint POST /webhook/stripe
Auth Stripe HMAC X-Signature
Runtime Cloudflare Workers
Avg latency <200ms p95
Cloudflare Worker · stripe-to-ghl
HTTP Trigger
POST from Stripe with checkout session payload
Validate HMAC signature
Reject if Stripe-Signature doesn't verify against webhook secret
Read Stripe metadata
name, email, business name, optional ghl_account_id, tier
New customer or add-on?
Triple-match on name + email + GHL Account ID
Create GHL sub-account
POST /agency/locations with business name + owner email
Apply tier snapshot
Launch snapshot or Growth snapshot based on Stripe price ID
Provision Cloudflare Pages site
Create new Pages project from website template tier
Configure DNS / custom domain
CNAME on brightlabcrew.com or customer's own domain
Write to KV
Customer record: customer:{{stripe_customer_id}}
Send welcome email
Includes GHL login, custom domain, intake form link
Log lifecycle event
type=customer.created, tier, sub-account ID
Return 200 OK
Stripe expects ack within 5s or it retries
END
Find existing GHL location
By name + email + GHL Account ID
Enable add-on feature
Chatbot, photography pack, AI assistant — depending on Stripe price ID
Send confirmation email
"Your add-on is now active"
Log lifecycle event
type=customer.addon_purchased
Return 200 OK
END
Customer experience
Pays via Stripe checkout. Receives welcome email within 30 seconds with their GHL login, custom domain link, and intake form. Or for add-ons: receives "your add-on is active" within 30 seconds.
Internal experience
Zero touch. The lifecycle event lands in your KV log, ready to be queried for billing reconciliation, churn analysis, or support escalations. No manual sub-account creation, no manual snapshot apply.
END

stripe-cancel-handler — customer offboarding

HTTP webhook from Stripe on customer.subscription.deleted + 30-day cron cleanup · deployed to blc-end.brightlabcrew.workers.dev
Endpoint POST /webhook/stripe-cancel
Auth Stripe HMAC X-Signature
Grace period 30 days
Cron daily 02:00 NZT
Cloudflare Worker · stripe-cancel-handler · webhook flow
HTTP Trigger
POST from Stripe on subscription cancellation
Validate HMAC signature
Read customer + cancellation reason
Stripe customer ID, cancellation_details, current_period_end
Send offboarding email
"Sorry to see you go" + data export instructions + 30d grace period notice
Mark customer cancelled in KV
Set cancelled_at + delete_after = today + 30d
Log lifecycle event
type=customer.cancelled, reason
Return 200 OK
END
30 days later, the daily cron fires:
Cloudflare Worker · stripe-cancel-handler · cron cleanup flow
Cron Trigger
Daily at 02:00 NZT · 0 14 * * * UTC
Query KV for expired cancellations
Where delete_after ≤ today
For each cancelled customer
Log: skipped, customer reactivated
SKIP
Delete GHL sub-account
DELETE /agency/locations/{{id}}
Deactivate Pages site
Pause project, redirect domain to BLC offboarding page
Archive customer KV record
Move from customer: to archive: namespace
Send final goodbye email
Confirms data deletion + offers re-onboarding link
Log lifecycle event
type=customer.deleted
END
Customer experience
Cancels via Stripe customer portal or BLC dashboard. Gets immediate confirmation email with data export instructions and 30-day grace period. If they re-subscribe in 30 days, nothing changes. If they don't, gets a final goodbye email confirming deletion.
Internal experience
Zero touch on cancellation. Compliance-friendly retention pattern. KV record kept in archive for billing reconciliation and audit. Customer can reactivate within 30 days with no data loss.
Both Workers required for production launch. Without init, you're manually creating sub-accounts and applying snapshots for every paying customer. Without end, cancelled customers' data hangs around indefinitely (privacy and Cloudflare Pages quota issue). Build and deploy these before opening Stripe checkout to real customers.

The 17 stages in Growth

Two error-handling stages exist for the auto-drafter bounce-backs (Quote Draft Error and Invoice Draft Error). One new stage (Quality Check Fail) is to be added in both tiers.

Growth tier · 17 stages

01
New Lead
02
Assessor Visits
03
Send Quote
04
Quote Draft Error
05
Quote Sent
06
Approved + Deposit Paid
07
Job Scheduling + Deposit Approved
08
Job Scheduled
09
Job Under Way
10
Quality Check
NEW
Quality Check Fail
11
Invoice Draft Error
12
Finished + Invoice Drafted
13
Final Invoice Sent
14
Invoice Paid + Follow Up
15
Quote Rejected
16
Successfully Resolved

Quote Draft Error (stage 4) and Invoice Draft Error (stage 11) only exist in Growth — they're bounce-back targets when EXT-2 or EXT-4 fail to draft. The system pings the bookkeeper to fix the issue manually.

The 4 stage gates Growth auto-advances

These are the moments your team doesn't have to drag the card. The system does it for them when the underlying event fires.

Stage gate What fires it Result
Approved + Deposit Paid → Job SchedulingXero webhook on deposit invoice paymentAuto-advance, scheduler notified
Job Scheduled → Job Under Wayn8n day-of timer (set by WF06)Auto-advance on the job day
Finished + Invoice Drafted → Final Invoice Sentn8n marks after EXT-4 sends invoiceAuto-advance, no human step
Final Invoice Sent → Invoice Paid + Follow UpXero webhook on final invoice paymentAuto-advance, WF13 follow-up cadence kicks off
The pricing argument: these four gates are where Launch customers lose the most time (forgetting to advance, advancing the wrong card, advancing too early). Growth removes the human entirely from these handoffs. That's the upgrade pitch.