Skip to main content
ECM
Step-by-Step Setup 10-15 minutes

Email Campaigns Setup

Content & Email Intermediate
Need more detail? Read the full guide for config deep-dives and best practices.

Email Campaigns Setup

List and retrieve email marketing campaigns from your GoHighLevel sub-account. This endpoint gives you programmatic access to campaign data including status, statistics, and configuration. This quick-start covers authentication, fetching campaigns, and interpreting the results.

Prerequisites

Before making your first Email Campaigns call, confirm you have:

  • A GoHighLevel sub-account with the Email Marketing feature enabled
  • At least one email campaign created (draft or sent) under Marketing > Emails
  • Access to Settings > Integrations > Private Integrations in your sub-account
  • A REST client such as Postman, Insomnia, or curl in your terminal
  • Your sub-account’s locationId (found in Settings > Business Profile)

If you do not have any campaigns yet, create one through Marketing > Emails in the GHL dashboard before testing the API.

Set Up Authentication

The Email Campaigns endpoint requires a Private Integration Token (PIT) with the marketing scope.

Navigate to Settings > Integrations > Private Integrations. Click Create New Integration, name it “Email Campaigns API,” and enable the marketing scope. Click Save and copy the generated token.

Pass this token in the Authorization header as a Bearer token. Set your base URL to https://services.leadconnectorhq.com. Include the Version: 2021-07-28 header with each request.

Make Your First Call

List all email campaigns for your sub-account:

GET /marketing/campaigns?locationId=your-location-id
Authorization: Bearer {your-pit-token}

This returns all campaigns across all statuses: draft, scheduled, sending, sent, and paused. Each campaign object includes the id, name, status, type, and basic statistics.

You can filter results by adding query parameters:

  • status — filter by "draft", "scheduled", "sent", "sending", or "paused"
  • limit — number of results per page (default 20)
  • offset — pagination offset for fetching additional pages

To retrieve a single campaign with full details, use GET /marketing/campaigns/{campaignId} with the campaign ID from the list response.

Handle the Response

A successful call returns a 200 status with campaign data:

{
  "campaigns": [
    {
      "id": "camp-001",
      "name": "March Newsletter",
      "status": "sent",
      "type": "email",
      "sentAt": "2026-03-01T09:00:00Z",
      "stats": {
        "sent": 1250,
        "delivered": 1230,
        "opened": 487,
        "clicked": 98,
        "bounced": 20,
        "unsubscribed": 3
      }
    }
  ],
  "total": 15
}

The stats object provides delivery and engagement metrics. Use delivered, opened, and clicked to calculate open rates and click-through rates. High bounced counts may indicate list quality issues.

Common errors: 401 means your token is invalid or the marketing scope is not enabled. 404 on a single campaign lookup means the campaign ID does not exist. An empty campaigns array means no campaigns have been created for this location.

Test Your Setup

Run through this checklist to confirm everything works:

  1. List all campaigns with GET /marketing/campaigns and verify results appear
  2. Filter by status — add status=sent and confirm only sent campaigns return
  3. Get a single campaign with GET /marketing/campaigns/{id} using an ID from the list
  4. Check stats — verify the stats object contains delivery and engagement numbers
  5. Cross-reference the results with Marketing > Emails in the GHL dashboard

If campaigns are not returning, verify your locationId is correct and that campaigns exist in the dashboard. Newly created draft campaigns should appear immediately.

Next Steps

Read the full Email Campaigns Guide for advanced reporting patterns and campaign analysis workflows. From here, explore Email Template CRUD for managing reusable email templates and Media Library for uploading email assets.

Stay sharp. New guides and playbooks as they drop.