Integrations (outbound webhooks)

When a lead qualifies, replies, books a call or is won, SiteRevive can post that lead to a tool you already use — your CRM, Zapier, GoHighLevel, or anything that accepts an HTTPS request. SiteRevive finds and proves; your receiver keeps the pipeline. Nothing here sends anything to a prospect.

You set it up under Settings → Integrations.

Adding an endpoint

An endpoint is the URL your tool gave you to receive posts — a Zapier "Catch Hook", a GoHighLevel inbound webhook, your own server. Give it a name and paste the URL.

Only an owner can add, rotate, disable or delete an endpoint. Anyone in the workspace can choose which events post, send a test event, or retry a failed post.

Choosing what posts

Each endpoint has four switches. Turn on the ones your tool should hear about:

Each switch posts a lead at most once per day for that event, however many times the event lands.

Send test event posts a lead.test with a made-up business so you can see the shape of a post without any real prospect's data leaving your workspace. It is signed and retried exactly like the real thing.

What a post contains

Every post is a JSON body with the lead's facts and links — never a prospect's message body, never a reply's text, never your notes, never your own email address.

A body is at most 16 KB.

Verifying a post

Every post carries these headers:

Reject a post whose signature does not match or whose timestamp is more than five minutes (300 seconds) old. In Node:

const { createHmac, timingSafeEqual } = require("node:crypto");

// rawBody: the request body as a string, exactly as received.
function verify(secret, headers, rawBody) {
  const timestamp = headers["x-siterevive-timestamp"];
  const signature = headers["x-siterevive-signature"] || "";
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");
  const presented = signature.startsWith("v1=") ? signature.slice(3) : "";
  if (!/^[0-9a-f]{64}$/.test(presented)) return false;
  if (presented.length !== expected.length) return false;
  return timingSafeEqual(Buffer.from(presented, "hex"), Buffer.from(expected, "hex"));
}

Sign the raw body exactly as received — do not parse and re-serialize it first. Answer with any 2xx status once you have stored the post; anything else is treated as a failure.

Retries and failures

If your receiver does not answer with a 2xx — a timeout, a 5xx, a redirect, or an address that has stopped being public — SiteRevive retries with a growing gap: after 1 minute, then 5 minutes, 30 minutes, 2 hours, and finally 12 hours. If that sixth attempt fails too, the post is marked Failed under Recent deliveries, with the last status code and the first part of the response kept, and you can press Retry now.

Redirects are never followed. A receiver that answers with a redirect is treated as failed.

If twenty posts in a row fail, SiteRevive disables the endpoint and says why on the page. Fix the receiver, then press Re-enable; a single successful post resets the count.

Recent deliveries shows the last 25 posts with their event, status, attempts, last code and time. The body itself is not shown there.

Removing an endpoint

Disable stops posting without losing anything. Delete asks you to type the endpoint's name, then removes it along with its switches and its delivery history.