Integrations & Developers
Webhooks
Webhooks move events between Morev and your other tools, in both directions.
In short
- Outbound: Morev sends an event to a web address you give it.
- Inbound: a tool you use tells Morev about a sale or a booking.
- Find both in Integrations → Webhooks. If your plan does not include them, the page says so.
Send events out
1
Get a web address from your tool
In Zapier, add a Catch Hook trigger. In Make, add a Custom webhook. Copy the address it gives you.
2
Add it in Morev
Paste it under Outbound Webhooks, tick the events to send (Booking, Form Submit or VSL Complete), and choose Add.
3
Test it
Choose the test button next to your address. Morev sends a sample event, and you confirm it arrived.
What Morev sends
{
"morev_event": "booking_complete",
"site_key": "...",
"session_id": "...",
"visitor_id": "...",
"page_url": "https://yourfunnel.com/apply",
"timestamp": "2026-01-01T12:00:00.000Z",
"data": { "email": "lead@example.com", "source": "calendly" }
}Each event is sent once, to public addresses only, with an 8 second limit and no redirects. A slow or broken address never affects your tracking. For ready-made connections to CRMs and payments, start with Integrations.
Check it came from Morev
Every event carries three headers, and each webhook has its own signing secret that you can copy or replace.
| Header | What it holds |
|---|---|
X-Morev-Event-Id | A unique ID. Use it to ignore a repeat. |
X-Morev-Timestamp | When it was sent, in seconds. |
X-Morev-Signature | t=…,v1=…. The value after v1= is an HMAC-SHA256 of the time, a dot, and the exact body, made with your secret. |
Verify it (Node)
import crypto from "node:crypto";
export function isFromMorev(secret, rawBody, header) {
const p = Object.fromEntries(header.split(",").map((x) => x.split("=")));
const expected = crypto.createHmac("sha256", secret).update(p.t + "." + rawBody).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(p.t)) < 300; // reject old copies
return fresh && p.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(p.v1), Buffer.from(expected));
}Tip
Check the signature against the raw body, before you parse it as JSON.
Bring events in
Each tool gets its own address in the Inbound Webhooks card. Copy it, paste it into that tool's webhook settings, and choose the events to send.
| Tool | What it tells Morev |
|---|---|
| Stripe | Payments and checkouts. |
| Whop | Purchases and memberships. |
| Commas | Sales. |
| Calendly | Bookings and cancellations. |
| GoHighLevel | Pipeline stage changes. |
| Generic (Zapier, Make, n8n) | Anything, from any tool that can send a web request. |
Signing secrets and keys for each tool are set up in Integrations.
Was this page helpful?
Morev documentationNeed help? support@morev.io