Hey everyone, I’m building an n8n automation that creates a contact and then an opportunity in GoHighLevel via the v2 API using a Private Integration Token. Both API calls return 201 success responses with valid IDs, but neither the contact nor the opportunity ever show up in the GHL dashboard.
ghl_nodes_sanitized.json (5.7 KB)
What I’m doing:
- Calling
POST /contacts/withfirstName,locationId, andemail - Then calling
POST /opportunities/withpipelineId,locationId,name,status, andcontactId - Both return 201 with full objects including IDs
- The contact briefly appeared in the “Restore contacts” (trash) section, suggesting GHL is auto-deleting it immediately after creation
What I’ve tried:
- Confirmed the token has
contacts.writeandopportunities.writescopes - Confirmed
locationIdmatches the subaccount I’m viewing in the dashboard - Tried searching by name in the contacts list — nothing shows
- Tried filtering to “All” contacts with no smart list — still empty
- Tried deleting and recreating the contact via API — same result
- The contact showed up briefly in the “Restore deleted contacts” section, meaning GHL created it and then auto-deleted it
Suspicion: GHL seems to require either a valid email or phone to persist a contact. I’m generating a placeholder email ([email protected]) but the contact still gets silently deleted. Could GHL be rejecting non-standard TLD emails and soft-deleting the record?
Attached: sanitized n8n node JSON for the relevant nodes (Create Contact, Create Opportunity, Resolve Opportunity ID, and the subsequent upload steps)
Has anyone successfully created contacts and opportunities via the v2 API with a Private Integration Token and had them show up in the dashboard? Any insight would be massively appreciated.