Skip to main contentSkip to content
GHL Experts
How to Connect GoHighLevel to Google Sheets (4 Methods for 2026) — Guides
Guides

How to Connect GoHighLevel to Google Sheets (4 Methods for 2026)

Connect GoHighLevel to Google Sheets using workflows, webhooks, Google Apps Script, or Make/Zapier. Step-by-step guide with code examples for each method.

Anas Uddin
May 3, 2020
8 min read

Why Connect GoHighLevel to Google Sheets?

GoHighLevel is a powerful CRM and marketing automation platform, but sometimes you need your data in a spreadsheet. Whether you are building client reports, sharing lead data with a team that does not have GHL access, running custom analytics, or creating dashboards, Google Sheets remains one of the most flexible tools for working with data.

Here are the most common use cases for pushing GHL data to Google Sheets:

  • Lead tracking and reporting. Automatically log every new lead with their source, tags, and contact details for quick-glance reporting.
  • Client dashboards. Build shareable Google Sheets dashboards that clients can access without needing a GHL login.
  • Pipeline exports. Track opportunity movement and deal values in a spreadsheet for financial forecasting.
  • Appointment logs. Keep a running log of all booked appointments for staff scheduling or analysis.
  • Custom analytics. Combine GHL data with other data sources in Sheets for cross-platform reporting.
  • Data backups. Maintain a running backup of critical contact and transaction data outside of GHL.

In this guide, we will walk through four different methods to connect GoHighLevel to Google Sheets, starting with the simplest no-code approach and working up to the most flexible custom solution.

Method 1: GoHighLevel Workflow with Google Sheets Action (No Code)

This is the easiest and most recommended approach for most users. GoHighLevel's Workflow builder now includes native integration actions that can write data directly to Google Sheets without any external tools.

Step-by-Step Setup

  1. Create your Google Sheet.

Open Google Sheets and create a new spreadsheet. In Row 1, add headers for each data field you want to capture. For example:

1First Name | Last Name | Email | Phone | Source | Date Added

2. Connect your Google account in GHL.

Navigate to Settings > Integrations in your GHL sub-account. Find Google Sheets in the integrations list and connect your Google account by following the OAuth authentication flow. Grant the necessary permissions for GHL to write to your spreadsheets.

3. Build the Workflow.

Go to Automations > Workflows and create a new workflow. Choose your trigger based on when you want data sent to Sheets:

  • Contact Created -- Fires when a new contact is added
  • Opportunity Status Changed -- Fires when a deal moves stages
  • Appointment Booked -- Fires when someone books a calendar slot
  • Form Submitted -- Fires when a specific form is filled out
  • Tag Added -- Fires when a specific tag is applied to a contact

4. Add the Google Sheets action.

After your trigger, add a new action step. Select Google Sheets from the action list. Configure it:

  • Select your connected Google account
  • Choose the spreadsheet
  • Choose the specific sheet tab
  • Map your GHL fields to the corresponding column headers

5. Test the workflow.

Create a test contact or trigger the workflow manually. Check your Google Sheet to verify the data appears in the correct columns. Activate the workflow once confirmed.

Pros and Cons

Pros: No code required, built into GHL, reliable, easy to maintain, supports all standard GHL fields and custom fields.

Cons: Requires the Google Sheets integration to be available on your plan. Limited to the trigger and field options GHL provides natively.

Method 2: GHL Workflow with Webhook to Google Apps Script (No Third-Party Tools)

This method uses a GHL Workflow webhook action to send data to a Google Apps Script web app that writes to your spreadsheet. It requires no paid third-party tools -- just GHL and Google.

Step 1: Create Your Google Sheet

Create a new Google Sheet and add your column headers in Row 1. Use these field names exactly as they come from GHL's webhook payload:

Standard contact fields:

1contact_id, first_name, last_name, full_name, email, phone, tags,
2address1, city, state, country, postal_code, company_name, website,
3date_created, date_of_birth

Opportunity fields:

1opportunity_name, status, lead_value, opportunity_source,
2pipeline_stage, pipeline_id, pipeline_name

Appointment fields:

1calendar.title, calendar.calendarName, calendar.startTime,
2calendar.endTime, calendar.status

You only need to include the columns you want to capture. The script will match columns to data fields automatically.

Step 2: Add the Google Apps Script

In your Google Sheet, go to Extensions > Apps Script. Delete any existing code and paste the following:

1function doGet(e) {
2 return handleResponse(e);
3}
4
5function doPost(e) {
6 return handleResponse(e);
7}
8
9function handleResponse(e) {
10 var lock = LockService.getPublicLock();
11 lock.waitLock(30000);
12
13 try {
14 // Validate API key from query parameter
15 var apiKey = 'YOUR_SECRET_API_KEY_HERE'; // Change this to a unique string
16 var params = e.parameter;
17
18 if (!params.apiKey || params.apiKey !== apiKey) {
19 return ContentService
20 .createTextOutput(JSON.stringify({"error": "Invalid or missing API key"}))
21 .setMimeType(ContentService.MimeType.JSON);
22 }
23
24 // Configure your sheet name here
25 var sheetName = 'Sheet1'; // Change to match your sheet tab name
26 var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
27
28 if (!sheet) {
29 return ContentService
30 .createTextOutput(JSON.stringify({"error": "Sheet not found: " + sheetName}))
31 .setMimeType(ContentService.MimeType.JSON);
32 }
33
34 var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
35 var nextRow = sheet.getLastRow() + 1;
36 var row = [];
37 var data = JSON.parse(e.postData.contents);
38
39 // Nested object field mappings
40 var nestedFields = {
41 "location.": "location",
42 "calendar.": "calendar",
43 "user.": "user",
44 "note.": "note"
45 };
46
47 for (var i = 0; i < headers.length; i++) {
48 var header = headers[i];
49
50 if (header === "Timestamp") {
51 row.push(Utilities.formatDate(
52 new Date(),
53 Session.getScriptTimeZone(),
54 "yyyy-MM-dd HH:mm:ss"
55 ));
56 continue;
57 }
58
59 var matched = false;
60 for (var prefix in nestedFields) {
61 if (header.indexOf(prefix) === 0) {
62 var parentKey = nestedFields[prefix];
63 var childKey = header.split('.')[1];
64 if (data[parentKey] && data[parentKey][childKey] !== undefined) {
65 row.push(data[parentKey][childKey]);
66 } else {
67 row.push("");
68 }
69 matched = true;
70 break;
71 }
72 }
73
74 if (!matched) {
75 // Handle arrays (like tags) by joining them
76 var value = data[header];
77 if (Array.isArray(value)) {
78 row.push(value.join(", "));
79 } else {
80 row.push(value !== undefined ? value : "");
81 }
82 }
83 }
84
85 sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
86
87 return ContentService
88 .createTextOutput(JSON.stringify({"result": "success", "row": nextRow}))
89 .setMimeType(ContentService.MimeType.JSON);
90
91 } catch (err) {
92 Logger.log("Error: " + err.message);
93 return ContentService
94 .createTextOutput(JSON.stringify({"result": "error", "message": err.message}))
95 .setMimeType(ContentService.MimeType.JSON);
96 } finally {
97 lock.releaseLock();
98 }
99}

Step 3: Deploy as a Web App

  1. Click Deploy > New deployment in the Apps Script editor.
  2. Select Web app as the deployment type.
  3. Set Execute as to "Me" (your Google account).
  4. Set Who has access to "Anyone" (this allows GHL's servers to send data).
  5. Click Deploy and authorize the script when prompted.
  6. Copy the generated Web App URL. It will look something like https://script.google.com/macros/s/AKfycb.../exec.

Step 4: Create the GHL Workflow

  1. In GHL, go to Automations > Workflows and create a new workflow.
  2. Set your trigger (Contact Created, Form Submitted, etc.).
  3. Add a Webhook action.
  4. Set the method to POST.
  5. Set the URL to your Apps Script Web App URL with the API key appended:
1 https://script.google.com/macros/s/AKfycb.../exec?apiKey=YOUR_SECRET_API_KEY_HERE
  1. The webhook will automatically send the contact data as JSON in the request body.
  2. Test the workflow and verify data appears in your Google Sheet.

Pros and Cons

Pros: Free, no third-party subscriptions, highly customizable, handles custom fields automatically, API key provides basic security.

Cons: Requires some comfort with Apps Script, subject to Google Apps Script quotas (90 minutes of execution time per day on free accounts, which is more than enough for most use cases), you need to manage the script yourself.

Method 3: Using Make (formerly Integromat)

Make is an automation platform with native GoHighLevel and Google Sheets modules. It is a strong choice when you need to transform data between GHL and Sheets, or when you want a visual workflow builder for complex logic.

How to Set It Up

  1. Create a Make account at make.com. The free plan includes 1,000 operations per month, which is sufficient for testing and low-volume use.
  2. Create a new Scenario.
  3. Add a GoHighLevel trigger module. Choose the event you want to listen for (new contact, updated contact, new opportunity, etc.). You will need to connect your GHL account via API key or OAuth.
  4. Add a Google Sheets action module. Choose "Add a Row" and connect your Google account.
  5. Map the fields. Drag GHL data fields into the corresponding Google Sheets columns. Make's visual mapper makes this straightforward.
  6. Add any data transformations. This is where Make shines -- you can format dates, split full names into first and last, filter out certain records, or add conditional logic before writing to Sheets.
  7. Activate the Scenario.

Pros and Cons

Pros: Visual builder, powerful data transformation, error handling and retry logic built in, supports hundreds of other apps for multi-step workflows.

Cons: Free tier is limited to 1,000 operations/month. Paid plans start at $10.59/month. Adds another platform to manage.

Method 4: Using Zapier

Zapier is the most well-known automation platform and works similarly to Make for this use case.

How to Set It Up

  1. Create a Zapier account at zapier.com.
  2. Create a new Zap.
  3. Set GoHighLevel as the trigger app. Select your trigger event (New Contact, New Opportunity, etc.) and connect your GHL account.
  4. Set Google Sheets as the action app. Choose "Create Spreadsheet Row" and connect your Google account.
  5. Map the fields from GHL to your Sheet columns.
  6. Test and activate the Zap.

Pros and Cons

Pros: Simple setup, large user community, extensive documentation.

Cons: Free plan allows only 100 tasks/month (very limited). Paid plans start at $29.99/month. Less flexible than Make for complex transformations.

Which Method Should You Choose?

| Criteria | GHL Native | Apps Script | Make | Zapier |

|---|---|---|---|---|

| Cost | Included with GHL | Free | Free-$10.59+/mo | Free-$29.99+/mo |

| Difficulty | Easy | Moderate | Easy | Easy |

| Customization | Moderate | High | High | Moderate |

| Maintenance | Low | Moderate | Low | Low |

| Data Transformation | Basic | Full control | Strong | Basic |

| Volume Limits | GHL plan limits | Google quotas | Plan-based | Plan-based |

For most users, start with Method 1 (native GHL workflow). It is the simplest, most reliable, and does not require any external tools or subscriptions.

If you need more control over data formatting, want to avoid third-party costs entirely, or need to handle complex field mapping, go with Method 2 (Apps Script). It is free and gives you full control.

If you are already using Make or Zapier for other automations, use whichever platform you are already paying for. There is no reason to add another tool just for this integration.

Practical Tips for Maintaining Your Integration

Regardless of which method you choose, keep these best practices in mind:

  • Add a Timestamp column. Always include a timestamp so you know exactly when each row was added. This is invaluable for debugging and reporting.
  • Use a dedicated sheet tab. Do not mix manually entered data and automated data on the same tab. Create a separate tab for GHL data and reference it from other tabs with formulas.
  • Monitor for errors. Check your Google Sheet periodically to ensure data is flowing correctly. For the Apps Script method, check the Execution Log in the Apps Script editor. For Make/Zapier, check their built-in execution history.
  • Handle duplicates. If your workflow can fire multiple times for the same contact (for example, on every contact update), decide whether you want duplicate rows or if you need logic to update existing rows. The Apps Script method can be extended with a lookup function to update instead of append.
  • Archive old data. Google Sheets has a practical limit of around 10 million cells. If you are logging high-volume data, periodically archive older rows to a separate spreadsheet.
  • Secure your endpoints. For the Apps Script method, always use an API key in the URL. Do not share the Web App URL publicly. For Make/Zapier, your connections are secured through their platforms.

Wrapping Up

Connecting GoHighLevel to Google Sheets does not have to be complicated or expensive. The native workflow integration handles the majority of use cases with zero code. When you need more flexibility, the Google Apps Script webhook method gives you full control without any third-party subscriptions.

Pick the method that matches your technical comfort level and budget, set it up once, and you will have your GHL data flowing into Sheets automatically from that point forward.

Get Started

Ready to try GoHighLevel?

Pick between a 14-day standard trial or our 30-day extended trial on the same page. Full feature access, cancel anytime.

Start Your Free Trial

The 30-day extended trial is exclusive to GHL Experts referrals.