When something happens on a call, we POST it to a URL you control
This is a direct HTTP request from GreetKeeper to your server. No connector sits in between, and no third-party account is involved.
Caller
“I need to move my delivery slot. Order reference is 40118. Can you sort it or do I need the website?”
What happened next
- Call ended and the call.completed event posted to your endpoint
- Your code read order 40118 in the reason for calling and opened a change request
- Your system replied 200, so no retry was needed
How GreetKeeper connects to Webhooks
Three states, and we publish the one that is true rather than the one that reads best.
| Tool | How it connects | What that means |
|---|---|---|
| Webhooks | Writes directly |
What a webhook is here
A webhook is one HTTP POST. GreetKeeper sends it to an address you give us, with a JSON body, each time one of four events happens. Your server reads the body and does whatever you wrote it to do.
Nothing has to sit between the two sides. A webhook needs no Zapier account and no automation tool, which is why it is marked as a direct write above. It is the path developers ask for first.
It is also what every Zapier and Make page in this section runs on. We have no app in either directory yet. Those tools catch this same POST with their own webhook trigger, and in Zapier that trigger needs a paid plan.
The endpoint can be anything that speaks HTTP. A small serverless function, a route in your existing app, or a queue consumer behind a gateway. If it can accept a POST and return a status code, it works.
What we send, and when
Four events, one JSON POST each, and the same set of facts in every body.
The events are call.completed, booking.created, message.taken and transfer.made. Each one is posted to the URL you set. Every event carries a call id, so events from the same call can be tied together on your side.
The body carries the event type, the call id and timestamps. It carries the caller's name and number and the reason for calling. Where a time was requested or booked, that is there too. It closes with the outcome and a link to the transcript.
Each request carries an HMAC-SHA256 signature header, so you can check it came from us. Verify that before you trust anything in the body. We expect a 2xx response, and we retry on anything else with a growing gap between attempts.
What we have not published yet is the field-level schema: the exact key names, their types and how they nest. So this page names what the payload holds and stops there. Ask for a demo and we'll fire a real payload at your endpoint, which is the exact answer.
Wiring it up
Ten minutes if you already have somewhere to put the endpoint.
Stand up an endpoint that accepts a POST
Return 200 quickly and do the slow work afterwards. If you hold the connection open while you write to three systems, you will start seeing retries you did not need.
Paste the URL into GreetKeeper and store the signing secret
Use HTTPS. Keep the secret where your code can read it and your repository can't. Treat it like any other credential.
Verify the signature on every request
Recompute the HMAC-SHA256 with your secret and compare it to the header. Reject anything that does not match, and log the rejection so you notice a misconfiguration.
Place a test call and read the body you received
Log the whole payload once. Field names you guessed from a document are a hypothesis. The body you actually received is the fact you should write your parser against.
What a webhook will not do for you
Questions about Webhooks and GreetKeeper
Does this need a Zapier account?
No. This is a direct POST from GreetKeeper to your URL. Zapier is one way to receive it if you would rather not run code, through Webhooks by Zapier and its Catch Hook trigger. That trigger needs a paid Zapier plan.
Which events can I receive?
Four: call.completed, booking.created, message.taken and transfer.made. Each arrives as its own POST with the event type in the body, so one endpoint can handle all of them.
How do I know a request really came from GreetKeeper?
Every request carries an HMAC-SHA256 signature header computed with your signing secret. Recompute it and compare. Anyone can POST to a public URL, so this check matters.
What happens if my endpoint returns a 500?
We retry with a growing delay between attempts. The call record itself is never affected by a failed delivery, so it stays in your GreetKeeper log whatever your endpoint returns.
Where is the full payload schema?
It isn't published yet. This page lists what the payload carries, and a demo shows you the exact keys against your own endpoint.
Point it at your staging endpoint
We will fire a real call payload at it. Two minutes.