GHL Integration
Tenant-specific GHL location mapping, scopes, and read-only Contacts sync.
Not connected
Set a GHL location ID to map this workspace.
Maps this workspace to one GHL location. OAuth tokens stay server-side only.
Reuses the existing Properties custom object — never creates a duplicate.
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-listingsNo secret configured
Generate a secret to enable scraper imports.
Example scraper call
curl -X POST /api/import-listings \
-H "Authorization: Bearer YOUR_WEBHOOK_SECRET" \
-H "Content-Type: text/csv" \
--data-binary @listings.csvHeaders: Authorization: Bearer <secret> or X-Webhook-Secret: <secret>. Body: raw CSV or JSON { "csv": "..." }. Up to 500 rows per request.
Read-only. GHL is the system of record — no records are overwritten or duplicated.
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.