Home/Help Center/Webhooks

Integrations

Configure Outbound Webhooks

Add a webhook endpoint, choose which events it receives, copy the signing secret shown once, and watch signed deliveries and retries in the delivery log.

By Chirag Darji · Updated 27 Aug 2026 · 7 min read

On this page
  1. Before you start
  2. Steps
  3. What you will see
  4. Settings and options
  5. Troubleshooting
  6. Why is my endpoint blocked even though the URL looks fine?
Outbound webhooks in VGraple CRM with the events each endpoint subscribes to and its delivery status

Configuring an outbound webhook means adding a URL under Settings > Webhooks, choosing which events it should receive, and copying the signing secret shown once, after which VGraple CRM POSTs a signed JSON payload to that URL the moment a chosen event happens. This walkthrough covers adding your first endpoint, testing it, and reading the delivery log when something goes wrong.

Webhooks: first 5 of 8 steps

  1. 1Open Settings and go to Webhooks
  2. 2Click Add Endpoint
  3. 3Enter your endpoint URL
  4. 4Add a description
  5. 5Choose your events
The steps on this page, in order.

Before you start

  • You need the organisation settings permission, included in Owner and Admin roles by default, or a custom role granted access to it.
  • Have a receiving URL ready: a server endpoint under your control that can accept an HTTP POST and return a 2xx status, or a webhook-catching step in a tool like Make, Pabbly Connect or n8n.
  • Decide which events you actually need before creating the endpoint; subscribing to everything is allowed but sends more traffic than most integrations use.

Steps

  1. Open Settings and go to Webhooks. From the sidebar, click Settings, then Webhooks. The page lists every endpoint your organisation has created, its subscribed events, whether it is active, and its delivery count. Endpoints created by a Zap turning on show a "Zapier" badge here.

API keys in VGraple CRM with prefix, creation date and last use

  1. Click Add Endpoint. A form opens for the URL, an optional description, and a checklist of events.

  2. Enter your endpoint URL. For example https://your-server.com/webhook. It is validated as soon as you save: it must use http or https, must not embed a username or password, and must not resolve to localhost, a private range (10.x, 172.16-31.x, 192.168.x), or a link-local or cloud-metadata address.

  3. Add a description (optional). A short label like "Production server" or "Make.com scenario" helps you tell endpoints apart once you have more than one.

  4. Choose your events. Tick any of the eleven checkboxes: message received, message sent, contact created, contact opted out, lead created, lead stage changed, broadcast completed, conversation assigned, resolved or reopened, and form submitted. At least one is required.

  5. Click Create Endpoint, and copy the secret immediately. A panel appears above the list with the signing secret, formatted whsec_..., shown exactly once. Copy it into your receiver's configuration; you will use it to verify the X-Signature-256 header on every incoming request. See verifying webhook signatures for the exact check.

  6. Send a test event. Click Test on the new endpoint's row. VGraple CRM fires a synthetic message.received payload (marked _test: true) at your URL immediately, so you can confirm your receiver accepts it before waiting for a real event.

  7. Watch real deliveries arrive. The next time a subscribed event happens, for example a new contact is created, the payload is sent within moments. Open the endpoint to see its delivery log: every attempt, its response status, and the first 500 characters of the response body.

What you will see

The endpoint list shows a green check for active endpoints and a grey cross for disabled ones, the URL, any description, its subscribed events as small pills, and a running delivery count. Opening an endpoint's delivery log shows every attempt with a timestamp, a status (delivered, pending, or failed), and the response your server sent back, useful for confirming a receiver actually returned 200 rather than an error page that happened to load.

Settings and options

Setting or fieldWhat it doesDefault
Endpoint URLWhere the signed payload is POSTedRequired, validated at save and again at every delivery
DescriptionA label to tell endpoints apartOptional
Subscribed eventsWhich of the 11 listed events this endpoint receivesAt least one required
Signing secret (whsec_...)Used to verify X-Signature-256 on your sideShown once at creation
Enable/DisablePauses or resumes deliveries without losing configurationEnabled on creation
TestSends a synthetic message.received event immediatelyAvailable on any endpoint
Retry scheduleWhen a failed delivery is retried1 minute, 5 minutes, 30 minutes after the first failure, then stops
API-created subscriptions capEndpoints created via the API (Zapier's mechanism)Up to 50 per organisation

Troubleshooting

SymptomLikely causeFix
"Webhook URLs must point to a public host" when savingThe URL resolves to localhost, a private IP range, or a similar internal addressPoint the endpoint at a public URL; for local development, use a tunnelling tool that exposes a public HTTPS address
An endpoint stopped receiving deliveries after working fine for weeksThe URL's DNS record started resolving to a private address (DNS rebinding), or your receiver started returning non-2xx responsesCheck the delivery log for the exact response; confirm the hostname still resolves publicly
The Test button sends an event but nothing arrivesYour receiver is down, behind a firewall, or the URL itself is wrongCheck the delivery log's response status and body for this specific test delivery; a network error shows there directly
I need broadcast.started, broadcast.paused, broadcast.failed or broadcast.reply, but they are not in the checkbox listThe Settings > Webhooks form currently exposes 11 of the platform's 15 catalog eventsSubscribe to these four directly with POST /api/v1/hooks using your API key; see the webhook payload reference
A delivery shows "failed" with no response bodyA network-level failure (timeout, connection refused) rather than an HTTP error responseConfirm your server is reachable from the public internet and responds within a reasonable time; VGraple CRM's request timeout is 10 seconds
Deleting an endpoint broke a ZapThe endpoint had the "Zapier" badge, meaning a Zap created itReconnect or recreate the Zap; a Zapier-managed endpoint and a Settings-created one are the same object, so deleting one always breaks the other's side

Why is my endpoint blocked even though the URL looks fine?

VGraple CRM's server makes the actual HTTP request to whatever URL you register, so an endpoint pointing at your own internal network, a cloud metadata service, or localhost would let a webhook configuration reach infrastructure that was never meant to be internet-facing. The check runs twice: once when you save the URL, and again through a DNS lookup at the exact moment of every delivery, because a hostname can resolve to a public address when you save it and a private one later. If your receiver later moves behind a VPN or a private load balancer, deliveries will start failing with this message until the hostname resolves publicly again.

Tip

If you are testing locally, expose your local server through a public HTTPS tunnel first (any tunnelling tool that gives you a public URL works), then paste that public URL into the endpoint field. A localhost or 127.0.0.1 URL is rejected outright, even for testing.

Once your endpoint is receiving events, the payload reference documents the exact JSON shape for every event type, and signature verification shows how to confirm a payload genuinely came from VGraple CRM in Node, Python and PHP.

Frequently asked questions

Who can create or manage a webhook endpoint?
Anyone with the organisation settings permission, included in Owner and Admin roles by default, or a custom role granted that access. Agents and viewers can see synced results elsewhere in the product but cannot open Settings > Webhooks.
Which events can I choose when creating an endpoint from Settings?
The endpoint form currently lists 11 events to pick from: message.received, message.sent, contact.created, contact.opted_out, lead.created, lead.stage_changed, broadcast.completed, conversation.assigned, conversation.resolved, conversation.reopened and form.submitted. See the full payload reference for the complete 15-event catalog and how to reach the remaining four.
What happens the moment I click Add Endpoint?
The URL is validated immediately (must be http or https, no embedded credentials, must not resolve to a private or loopback address), the endpoint is created, and a signing secret is shown exactly once in a panel above the endpoint list.
How do I confirm an endpoint is actually working without waiting for a real event?
Click Test on the endpoint's row. This fires a synthetic message.received event with a _test true flag in its payload, so you can confirm your receiver gets it and returns a 2xx status without needing to send a real WhatsApp message first.
My endpoint URL was rejected when I tried to save it. Why?
It resolved to localhost, a private IP range, or a similar internal address. Webhook URLs must point to a public host, since VGraple CRM's server makes the actual HTTP request to whatever URL you provide.
Can I disable an endpoint temporarily without deleting it?
Yes. Click Disable on its row. A disabled endpoint stops receiving new events but keeps its configuration, its subscribed events and its delivery history, so re-enabling it later needs no reconfiguration.
What happens to a Zapier-created endpoint if I delete it here?
The connected Zap breaks immediately and starts showing errors until reconnected, since a Zap's subscription and a Settings-created endpoint are the exact same underlying object, only tagged with a different source.

Run your WhatsApp on VGraple CRM

Free forever plan, official Meta WhatsApp Business API, set up in 15 minutes. No card needed.