GHL Integration

Tenant-specific GHL location mapping, scopes, and read-only Contacts sync.

· ·Viewing as Owner
Connection

Not connected

Set a GHL location ID to map this workspace.

Disconnected

Maps this workspace to one GHL location. OAuth tokens stay server-side only.

Reuses the existing Properties custom object — never creates a duplicate.

GHL OAuth Connection
Scraper Import Webhook

Your scraper POSTs a CSV here. Rows upsert idempotently — re-imports update, never duplicate. No GHL write-back, no outbound messaging.

Endpoint URL

/api/import-listings

No secret configured

Generate a secret to enable scraper imports.

Inactive

Example scraper call

curl -X POST /api/import-listings \
  -H "Authorization: Bearer YOUR_WEBHOOK_SECRET" \
  -H "Content-Type: text/csv" \
  --data-binary @listings.csv

Headers: Authorization: Bearer <secret> or X-Webhook-Secret: <secret>. Body: raw CSV or JSON { "csv": "..." }. Up to 500 rows per request.

Sync Scopes

Read-only. GHL is the system of record — no records are overwritten or duplicated.

Contacts
Off
Opportunities
Off
Conversations
Off
Outbound SMS
Disabled
Read-only Contacts Sync

Live synchronization

Disabled — verify mapping + authorization before enabling.

Run Contacts sync now

Paginated, idempotent, retry-safe. No GHL writes; no automatic SMS.

Run Properties sync now

Read-only Properties custom-object pull. Idempotent on (tenant, ghl_property_id).

Recent sync jobs

Credentials stay server-side

GHL OAuth access and refresh tokens live in Vault on the server and are never exposed to the browser or stored in browser-accessible fields. Outbound SMS, automated outreach, and destructive CRM updates remain disabled until the integration mapping and authorization are verified.