✨ Start free.Add to Chrome — Free →
syncdo
← Help Center

Inbound webhooks

Give your website form, portal or automation tool a URL to post to, and the enquiry becomes a lead in Syncdo — assigned to whoever is next in your rotation.

Getting your URL

In Syncdo, go to Settings → Inbound Webhooksand create one. You will need to be an owner or an admin. Give it a name you will recognise later — “Website contact form”, “IndiaMART” — and Syncdo shows you the URL.

The URL is shown once, and only once.

Syncdo stores it hashed and cannot show it again. If the person who created it did not copy it, they can rotate the secret in the same screen to get a new one — the old URL keeps working for 7 days after a rotation, so you have time to swap it over without an outage.

Treat the URL like a password. There is no API key and no header to set — anyone who has the URL can create leads in that workspace. Keep it server-side. Do not put it in front-end JavaScript, where a visitor can read it.

What to send

A JSON POST. Only phone is required — everything else is optional.

POST https://api.syncdo.co/api/inbound/YOUR_SECRET
Content-Type: application/json

{
  "phone":   "919812345678",
  "name":    "Ravi Kumar",
  "email":   "ravi@example.com",
  "company": "Kumar Steels",
  "city":    "Meerut",
  "state":   "Uttar Pradesh",
  "message": "Need 200 tonnes of TMT bars",
  "country": "US",
  "id":      "form-submission-8842"
}
FieldLimitNotes
phoneRequiredThe customer's WhatsApp number. Digits only is safest; spaces, dashes and a leading + are stripped. A bare 10-digit Indian number has 91 added automatically.
name200 charactersThe contact's name. Left alone if the lead already exists and you send a blank.
email200 charactersStored on the lead as a custom field.
company200 charactersStored on the lead as a custom field.
city120 charactersStored on the lead as a custom field.
state120 charactersStored on the lead as a custom field.
message4,000 charactersThe enquiry text. Saved as a note on the lead — not as a WhatsApp message, because nothing was sent or received.
country2 lettersISO country code — IN, US, GB, AE, SG. Tells Syncdo how to read a number written in national format. Not needed if you send the number with a leading + and its country code.
id200 charactersYour own reference for this submission. Send it and a repeated delivery is recognised and ignored. See below for why it matters.

Values longer than the limit are trimmed to it rather than rejected — the lead is still created.

Send the phone number in international format

The safest thing you can do is send the number with a leading + and its country code — +1 551 024 6186. Syncdo takes that exactly as given and applies nothing to it. Spaces, dashes and brackets are fine.

If your form collects numbers in national format instead — a UK 07551 024618, a US (551) 024-6186 — send country alongside it so Syncdo knows which country code to add. If you send neither, Syncdo falls back to the workspace's default country, which may not be the right one for that customer.

When the number is already a lead

A second lead is never created. Syncdo finds the existing one and updates it, and the response comes back with "created": false.

  • Name, email, company, city and state are updated — but a blank value never overwrites something already stored.
  • The pipeline stage is left exactly as it is. A returning enquiry does not knock a lead back to New.
  • The owner is left exactly as it is. An existing lead does not change hands because an enquiry came in.
  • Existing WhatsApp history, notes and deals are untouched.
  • The message, if you send one, is added as a new note.

The id field, and why it matters

Form tools and portals retry. A timeout on your side does not mean the request did not arrive, so the same submission often gets sent twice. Sending your own reference in id lets Syncdo tell a redelivery from a new enquiry.

Same id sent twice

The second call is recognised as a redelivery. It returns 200 with duplicate: true, and does nothing at all — no second lead, no second note, no second entry in the lead's history, and the next lead still goes to the next person in the rotation. Syncdo remembers an id for 30 days.

No id sent

Syncdo falls back to the phone number, so two identical submissions from the same number within 24 hours are treated as the same one — the second returns duplicate: true and does nothing. After 24 hours the same number is treated as a fresh enquiry, because by then it probably is one.

Two different ids, same number

Two separate enquiries. Both are processed, the lead is updated twice, and both messages are added as notes. That is the point of sending an id: it is what lets someone enquire twice in a day and have both recorded.

Send an id if your tool has one. A retry is then free of side effects for as long as any tool would keep retrying.

What comes back

A new lead — 200

{
  "ok": true,
  "phone": "919812345678",
  "created": true
}

A redelivery — 200

{
  "ok": true,
  "duplicate": true,
  "phone": "919812345678"
}

Fields Syncdo did not recognise

{
  "ok": true,
  "phone": "919812345678",
  "created": true,
  "ignored_fields": ["budget", "utm_source"]
}

Anything outside the field list above is not stored — it is listed back in ignored_fields so you can see what did not land while you are wiring the form up. Storing a field Syncdo has no place to show would leave the data invisible, which is worse than telling you it was dropped. Up to 25 names are listed.

Errors

Every failure returns JSON with "ok": false and a machine-readable error string.

404not_found

The URL is wrong, the secret has been rotated and the old one has expired, or the webhook has been switched off in Syncdo.

What to do: Check the URL against the one in Settings → Inbound Webhooks. The same response is returned whether or not a webhook exists, so a 404 never confirms a guess.

400phone_required

No phone number was sent, or what was sent contained no digits.

What to do: Make the phone field required on your form. It is the only required field.

429rate_limited

More than 60 submissions were made to this webhook within a minute.

What to do: Wait and retry. The response carries a Retry-After header of 60 seconds.

503no_assignee

The workspace has nobody to give the lead to — everyone in the rotation is deactivated, and there is no active owner to fall back to.

What to do: Retry. Nothing is wrong with your request: someone in the workspace needs to add an active person in Settings → Inbound Webhooks.

503unavailable

Syncdo could not complete the request — a database read or write did not succeed.

What to do: Retry. Nothing was created, so a retry is safe. If you sent an id, a retry cannot create a duplicate even if the first attempt partly succeeded.

Retrying is safe

On any error the lead was not created, so a retry cannot produce a duplicate. If you send an id, that holds even for a request that timed out after Syncdo had already accepted it.

Rotating and switching off

If a URL is exposed — pasted in a shared document, committed to a repository — rotate it in Settings → Inbound Webhooks. You get a new URL, shown once, and the old one keeps working for 7 days so nothing breaks while you update it.

Switching a webhook off refuses new submissions but keeps everything else — its people, their shares, and its place in the rotation. It can be switched back on.

syncdo

Stuck wiring it up?

Send us the request you are making and the response you get back.

✓ Free plan   ✓ No credit card to start   ✓ Setup in 5 minutes