My goal is to create a workflow collecting data from my email webhook and to add a contact to go high level.
What is the problem & what have you tried?
I am repeatingly getting 2 errors with using the GHL module in make.com.
Error #1:
A 400 Timeout error. This just happens randomly for creating contacts or searching contacts. There has never been 1 explaination for the cause and ive been trying to use resume error moduels but not sure theyre completely working.
Error #2:
The [400] This location does not allow duplicated contacts Error. This seems pretty straightforward but is not… I am trying to take email replies from my cold email sequencer and add the contacts to GHL. now the first source it comes from is email and phone number information. This creates a contact in GHL for me. Now when a new reply comes in I want to search for that contact. I can use 2 options with make. Email or phone. Right now i search via email if thats not found i fall back with phone number but both pass and then it still gets a duplicate contact error. I can not figure out for the time of me why this keeps happening and sometimes just rerunning it fixed it. But i can deal with these errors each day or ignoring if errors happen since itll stop the workflow from running delaying data needed for clients. And ive throughly check and tested so its not the standard issue of “oh well maybe its a different phone number” if that makes sense.
Error messages or input/output bundles
The run couldn’t be completed
[400] This location does not allow duplicated contacts.
[400] Request Timeout after 30000ms
Code: RuntimeError
Origin: GoHighLevel
the duplicate error and the timeout are two different animals, and the duplicate one is the interesting one, because it isn’t really a duplicate problem. it’s a search problem.
ghl dedupes on email OR phone at the location level, and it normalizes both before it checks. your search doesn’t. so if the contact is stored with the phone as +14155551234 and your search sends 4155551234 or (415) 555-1234, the search comes back empty, you go ahead and create, ghl normalizes it, sees the collision, and throws duplicate. same story with emails that have different casing or a trailing space from the parse. both your searches genuinely “pass” because both genuinely found nothing, and the create still collides. that’s exactly the symptom you’re describing.
so the first thing i’d do is stop searching and then creating. ghl has an upsert endpoint that does the matching server side with their own normalization, so you just send the contact and it either updates the existing one or makes a new one, and this entire class of bug disappears. if the make module doesn’t expose upsert directly, hit it with an http module instead, it’s worth the extra step.
the other reason it “sometimes just works on a rerun” is a race. by default make can run the same scenario more than once at the same time, so if two replies from the same person land close together, both runs do their search before either one creates, both find nothing, and the second create blows up. turn on sequential processing in the scenario settings and that goes away. that probably explains a decent chunk of your failures on its own.
on the timeout, resume error isn’t really the right tool. what you want is a break directive on the ghl module with retries and an incremental interval, so a 400 just parks the bundle and tries again a few minutes later instead of killing the run. ghl’s api genuinely is flaky and no scenario logic fixes that, you just have to retry it properly.
what does your phone normalization look like before it hits the search, are you sending e164?
This looks like two symptoms of the same race. Both the email branch and the phone fallback can reach Create Contact before either search result is treated as authoritative, and a retry after the 30s timeout can create the contact even though Make never received the success response.
I’d make the path deterministic:
Normalize email and phone once.
Search by email. Only if the result count is exactly zero, search by phone.
If either search returns a contact ID, update that ID; do not continue to Create.
Create only when both searches are confirmed empty.
Store the source message/reply ID as an idempotency key and serialize processing per normalized email/phone.
Treat timeout as unknown outcome: search again before retrying Create.
If HighLevel exposes an upsert endpoint for your location, that is safer than separate search/create. Put timeout and 429/5xx failures on exponential backoff, but route duplicate-contact 400 back to search-and-update rather than blind resume.
We solved this same class of duplicate/race issue while building Atlantic’s CRM ingestion. Disclosure: I’m Ege, co-founder of Atlantic; this is our implementation experience, not an official Make or HighLevel answer.
TIMEOUT ERROR: Usually GHL’s API being slow, not
your scenario. Add a 1-2 second Sleep module
before your GHL search/create calls, and set
your error handler to retry the specific failed
module 2-3 times.
DUPLICATE CONTACT ERROR: This is likely a phone
number formatting mismatch. GHL stores numbers in
E.164 format (+1XXXXXXXXXX), but your webhook data
might come in differently (no country code, dashes,
spaces). Add a Text Parser module to standardize
phone numbers to E.164 before searching.
Also try switching to GHL’s “Upsert Contact”
module if available — it handles search+create
in one step and avoids the race condition causing
your duplicates entirely.