GoHighLevel's email architecture has two paths. LC Email routes through GHL's own Mailgun account on shared infrastructure — GHL composes the message, adds tracking, sends to Mailgun via API, and receives delivery webhooks back. Custom SMTP routes through your provider via SMTP protocol — GHL composes the message, adds tracking, connects to your SMTP server on port 587, transmits, and disconnects. The critical difference: with LC Email, GHL gets delivery feedback. With custom SMTP, GHL loses visibility after the SMTP handoff.
GoHighLevel Email Architecture Explained: How LC Email and Custom SMTP Actually Work
The Two Email Paths
GoHighLevel handles email through two completely different architectures. Understanding the difference explains nearly every deliverability question agencies have. For general email architecture, see our email infrastructure guide.
Path 1: LC Email (API-Based)
GHL Compose → Add Tracking → Mailgun API → Mailgun Sends → Recipient
↓
Webhooks back to GHL
(delivered, bounced, complained)
LC Email uses Mailgun's API integration — not SMTP. This is an important distinction.
API integration means:
- GHL sends the email payload to Mailgun via HTTPS POST
- Mailgun processes and delivers
- Mailgun sends webhook callbacks to GHL with delivery events
- GHL updates email status (delivered, bounced, complained)
The result: LC Email shows relatively complete delivery data inside GHL.
The problem: Everyone on LC Email shares Mailgun's infrastructure. GHL runs thousands of accounts through the same Mailgun sending pool. One agency blasting a purchased list damages the shared IP reputation for everyone.
Path 2: Custom SMTP (Protocol-Based)
GHL Compose → Add Tracking → SMTP Connect (port 587) → Your Server Accepts → GHL Disconnects
↓
Your Server Delivers → Recipient
(GHL has no visibility here)
Custom SMTP uses the SMTP protocol — a fundamentally different integration.
SMTP integration means:
- GHL opens a TCP connection to your SMTP server on port 587
- GHL sends EHLO, STARTTLS, authenticates with your credentials
- GHL transmits the email (MAIL FROM, RCPT TO, DATA)
- Your SMTP server responds with 250 OK (accepted into queue)
- GHL closes the connection
After step 5, GHL is done. Your SMTP server independently:
- Attempts delivery to the recipient
- Handles retries for temporary failures (deferrals)
- Processes bounces
- Receives spam complaints via feedback loops
None of this flows back to GHL.
Practitioner note: When I explain this architecture to agency owners, the light bulb moment is always the same: "So GHL doesn't actually know if the email was delivered?" Correct. With custom SMTP, GHL knows it was accepted by your SMTP server. Whether it reaches the inbox is between your server and the recipient — and GHL never finds out.
What GHL Adds Before Sending
Regardless of LC Email or custom SMTP, GHL processes the email before it leaves:
Tracking Pixel (Opens)
GHL injects a 1x1 transparent pixel image into every HTML email:
<img src="https://tracking.ghl.com/pixel/UNIQUE_ID" width="1" height="1" />
When the recipient's email client loads images, it fetches this pixel from GHL's tracking server. GHL records the open event.
This works with both LC Email and custom SMTP because GHL controls the pixel URL.
Link Rewriting (Clicks)
GHL rewrites every link in the email body:
Original: https://yourclient.com/offer
Rewritten: https://tracking.ghl.com/click/UNIQUE_ID
When someone clicks, GHL records the event and redirects to the original URL.
This works with both paths because GHL controls the redirect server.
Headers
GHL adds standard email headers:
- From: Your configured sending address
- Reply-To: Your configured reply address
- List-Unsubscribe: If configured
- X-Mailer: GoHighLevel identifier (with custom SMTP)
The Stats Gap in Detail
Here's exactly what each path tracks inside GHL:
| Metric | LC Email | Custom SMTP |
|---|---|---|
| Sent | Yes | Yes |
| Delivered | Yes (via webhook) | No |
| Opened | Yes (via pixel) | Yes (via pixel) |
| Clicked | Yes (via link rewrite) | Yes (via link rewrite) |
| Bounced | Yes (via webhook) | No |
| Soft Bounce | Yes (via webhook) | No |
| Deferred | Partial | No |
| Complained | Yes (via webhook) | No |
| Unsubscribed | Yes (GHL-level) | Yes (GHL-level) |
With custom SMTP, you're missing delivery confirmation, bounce detection, and complaint tracking inside GHL. These events still happen — they're just recorded at your SMTP provider's level, not in GHL.
For the full implications, see why SMTP stats are broken and tracking limitations.
How LC Email's Mailgun Works
GHL's LC Email isn't a separate email service. It's GHL's Mailgun account with a billing wrapper.
The Shared Pool
GHL maintains Mailgun sending infrastructure (IPs and domains) that all LC Email users share. When you enable LC Email:
- GHL provisions your sending domain within their Mailgun account
- Your emails route through GHL's Mailgun IPs
- You share IP reputation with every other LC Email sender
Billing
LC Email charges per email ($0.675/1K) — a markup over what GHL pays Mailgun. This is how GHL monetizes the integration.
Why Shared Infrastructure Is Risky
Shared IPs mean:
- You don't control your sending reputation
- Other senders' bad practices affect you
- You can't monitor or manage IP reputation
- You have no recourse when deliverability drops
This is the fundamental reason agencies switch to custom SMTP.
Practitioner note: I've seen LC Email deliverability fluctuate wildly — great one month, terrible the next — because the shared pool reputation shifts with whoever's sending on it. Custom SMTP eliminates this variable entirely. Your reputation is yours alone.
How Custom SMTP Authentication Works
When GHL connects to your SMTP server, the authentication exchange looks like this:
GHL → SMTP Server: EHLO gohighlevel.com
SMTP Server → GHL: 250-smtp.mailgun.org Hello
GHL → SMTP Server: STARTTLS
SMTP Server → GHL: 220 Ready to start TLS
[TLS handshake]
GHL → SMTP Server: AUTH LOGIN
SMTP Server → GHL: 334 VXNlcm5hbWU6
GHL → SMTP Server: [base64 username]
SMTP Server → GHL: 334 UGFzc3dvcmQ6
GHL → SMTP Server: [base64 password]
SMTP Server → GHL: 235 Authentication successful
After authentication, GHL sends the email content and disconnects. The SMTP server queues the message for delivery.
The Throttling Architecture
GHL's campaign and workflow systems queue emails internally. When a campaign sends:
- GHL generates all email messages
- Messages enter GHL's internal queue
- GHL processes the queue, connecting to SMTP for each message
- With LC Email: sent via Mailgun API (batch-capable)
- With custom SMTP: sent one-by-one via SMTP protocol
Why Custom SMTP Is Slower
Mailgun's API can accept batch sends (thousands at once). SMTP protocol sends one message per transaction. GHL must:
- Open connection
- Authenticate
- Send one email
- Close connection (or reuse for next)
This is why throttling problems are worse with custom SMTP than LC Email.
Why This Architecture Matters
Understanding GHL's email architecture informs every decision you make:
- Choosing LC Email vs SMTP — Stats vs control (detailed comparison)
- Monitoring strategy — Where to look for real data
- Throttling management — Why campaigns send slowly
- Bounce handling — Why bounces don't sync back
- Provider selection — API compatibility matters less than SMTP compatibility
Practitioner note: I wish GHL would add webhook consumption for custom SMTP providers. Mailgun, SendGrid, and SES all support delivery event webhooks. If GHL built endpoints for these, the stats gap would disappear. Until then, understanding the architecture tells you where to find your data: at the SMTP provider, not in GHL.
If you need help designing the right email architecture for your GHL agency — or want someone to handle the infrastructure entirely — book a consultation. I'll configure the setup that matches your needs and budget.
Sources
- Mailgun: API vs SMTP
- RFC 5321: Simple Mail Transfer Protocol
- SendGrid: Event Webhooks
- GoHighLevel: Email Services
- AWS: SES Sending Methods
v1.0 · April 2026
Frequently Asked Questions
How does LC Email work in GoHighLevel?
LC Email uses GHL's Mailgun account. GHL sends via Mailgun's API (not SMTP), which means Mailgun sends delivery webhooks back to GHL — delivered, bounced, complained events all flow back. This is why LC Email shows more stats. The downside: shared Mailgun infrastructure with every other GHL account.
How does custom SMTP work in GoHighLevel?
GHL connects to your SMTP server on port 587 with STARTTLS, authenticates with your credentials, transmits the email via SMTP protocol, and disconnects. Your SMTP server then handles delivery, retries, and bounces. GHL has no callback mechanism to receive delivery events from your provider.
Why does GHL lose tracking with custom SMTP?
SMTP is a fire-and-forget protocol from GHL's perspective. GHL transmits the message and the SMTP server accepts it into its queue. What happens next — delivery, bounce, deferral — occurs in a separate transaction between your SMTP server and the recipient. GHL would need webhook integration with each provider to close this gap.
Does GHL use Mailgun's API or SMTP for LC Email?
LC Email uses Mailgun's API, not SMTP. This is a key architectural detail — API integration supports bidirectional communication (send + receive webhooks), while SMTP is unidirectional from GHL's side. This is why LC Email has better stats than custom SMTP.
Can GHL add webhook support for custom SMTP providers?
Technically yes — Mailgun, SendGrid, and SES all support delivery webhooks. GHL would need to build webhook endpoints for each provider and map events to their internal tracking. As of April 2026, this feature hasn't been implemented.
Want this handled for you?
Free 30-minute strategy call. Walk away with a plan either way.