TQ

GoHighLevel Integration

Overview

GoHighLevel (GHL) is the primary CRM platform. Gridlink syncs data from GHL at the Agency level, with each client represented as a GHL sub-account (Location).

Authentication

GHL uses OAuth2 via a Private Integration app.

Setup Steps

  • In GHL, go to Settings > Integrations > Private Integrations
  • Click Create App, name it "Gridlink Dashboard"
  • Select all *.readonly scopes (contacts, opportunities, calendars, conversations, campaigns, workflows, forms, surveys, locations, users, companies, invoices, payments, products, funnels, tags, custom fields, notes, tasks)
  • Save — GHL provides a Client ID and Client Secret
  • Click the install link to authorize against your agency
  • Copy the access_token and refresh_token
  • Enter all 4 values in Settings > Components > GoHighLevel in the Gridlink dashboard
  • Token Lifecycle

  • Access tokens expire every 24 hours
  • The sync engine refreshes tokens automatically using the refresh token
  • If the refresh token expires (~30 days of inactivity), the settings page shows "Reconnect Required"
  • Token refresh failures are logged and surfaced in the component status
  • Sync Behavior

    Direction

    Read-only. Gridlink pulls data from GHL but never writes back. To update data, use the GHL platform directly.

    Frequency

    Configurable per-component: 5 min, 15 min, 30 min, 1 hour, or daily. Default: 15 minutes.

    Incremental Sync

  • First sync: full pull of all records
  • Subsequent syncs: only records modified since sync_cursor (last modified timestamp)
  • Periodic full sync (daily) as a safety net to catch any missed changes
  • Rate Limits

    GHL API rate limit: 100 requests/minute per location. The sync engine:

  • Processes one location at a time
  • Includes automatic throttling (respects X-RateLimit-Remaining headers)
  • Backs off exponentially on 429 responses
  • Objects Synced

    GHL ObjectMirror TableKey Fields
    Locationsghl_locationsname, email, phone, address, timezone
    Contactsghl_contactsname, email, phone, tags, source, custom fields
    Opportunitiesghl_opportunitiesname, pipeline, stage, value, status
    Pipelinesghl_pipelinesname, stages
    Pipeline Stagesghl_pipeline_stagesname, order, pipeline_id
    Appointmentsghl_appointmentstitle, calendar, contact, start/end time
    Calendarsghl_calendarsname, type
    Conversationsghl_conversationscontact, type, last message
    Campaignsghl_campaignsname, status
    Formsghl_formsname, fields
    Form Submissionsghl_form_submissionsform, contact, data
    Usersghl_usersname, email, role
    Tagsghl_tagsname, location
    Custom Fieldsghl_custom_fieldsname, type, location
    Invoicesghl_invoicescontact, amount, status
    Paymentsghl_paymentscontact, amount, date
    Tasksghl_taskstitle, contact, due date, status
    Notesghl_notescontact, body

    Error Handling

  • Sync failures are logged to sync_log table with error details
  • 3 consecutive failures: component status changes to "Error" with red badge
  • Token expiry: status changes to "Reconnect Required"
  • Individual object failures don't block other objects from syncing
  • Troubleshooting

    ProblemCheck
    No data syncingVerify credentials in Settings > Components > GoHighLevel
    Stale dataCheck sync frequency and last sync timestamp
    Missing contactsVerify the location/sub-account has contacts in GHL
    Auth errorsToken may have expired — click "Reconnect" in settings
    Rate limit errorsReduce sync frequency or check if another integration is consuming API quota

    Viewing Sync Logs

    Sync history is available at Settings > Components > GoHighLevel > View Sync Log. Each entry shows:

  • Start/end time
  • Records fetched / created / updated
  • Error details (if any)
  • Last updated: 5/26/2026