$29 diagnostic playbook

GHL / Close.io two-way sync

A first-pass map for keeping appointments and contact changes synced without duplicate contacts, update loops, or silent webhook misses.

First map

Close event -> normalize contact key -> lookup GHL contact -> upsert appointment/contact -> write sync ledger. Reverse path mirrors the same ledger to prevent loops.

Conflict matrix

QuestionWhy it wins
What is the source of truth?Appointments may originate in Close while contact fields change in GHL; each object needs ownership rules.
What is the dedupe key?Email/phone can drift; use normalized phone + email + external ids where available.
How are loops blocked?Every write should stamp a sync ledger so webhook echoes do not trigger another update.
How is failure visible?Failed writes need a retryable queue and a human-readable error row.

$29 deliverable

Request diagnostic