14-day free trial on all paid plans — no card needed. Start free trial

Webhooks

Webhooks send a structured HTTP notification to your endpoint after ReviewPanel refreshes a connected business account.

Setup

  1. 1 Go to your dashboard settings → Webhooks.
  2. 2 Enter your endpoint URL (must be HTTPS).
  3. 3 Choose your payload detail level.
  4. 4 Set a signing secret for HMAC verification.

Event types

EventDescription
business_account.metrics.updatedBusiness-account review metrics were refreshed.
webhook.test.sentA test event triggered from the dashboard.

Current live payload

The live business_account.metrics.updated event includes:

  • Business account ID
  • Review count
  • Average rating
  • Weighted rating
  • Optional CRM-routing metadata when configured

Security

Every webhook request includes an HMAC-SHA256 signature in the X-Webhook-Signature header. The signature is computed over {timestamp}.{body} — the X-Timestamp header value, a literal dot, then the raw request body. Signing the timestamp makes it tamper-evident so you can reject replayed requests.

To protect against replay attacks: reject requests whose X-Timestamp is more than 5 minutes old, and reject any X-Request-ID (unique delivery ID) you have already processed.

Verification example (Node.js)

const crypto = require('crypto'); const seenDeliveryIds = new Set(); // back with Redis/TTL store in production const TOLERANCE_MS = 5 * 60 * 1000; function verifyWebhook(rawBody, headers, secret) { const timestamp = headers['x-timestamp']; const deliveryId = headers['x-request-id']; const signature = (headers['x-webhook-signature'] || '').replace('sha256=', ''); // 1. Reject stale requests (replay protection) const age = Date.now() - new Date(timestamp).getTime(); if (!timestamp || Number.isNaN(age) || Math.abs(age) > TOLERANCE_MS) { return false; } // 2. Reject duplicate delivery IDs (replay protection) if (!deliveryId || seenDeliveryIds.has(deliveryId)) { return false; } // 3. Verify the signature over `${timestamp}.${body}` const expected = crypto .createHmac('sha256', secret) .update(`${timestamp}.${rawBody}`) .digest('hex'); const sigBuf = Buffer.from(signature, 'hex'); const expBuf = Buffer.from(expected, 'hex'); if (sigBuf.length !== expBuf.length || !crypto.timingSafeEqual(sigBuf, expBuf)) { return false; } seenDeliveryIds.add(deliveryId); return true; }

You can rotate your signing secret at any time from the webhook settings. During rotation, deliveries include an X-Webhook-Signature-Previous header signed with the old secret so you can accept either while you roll over.

Retries & delivery

If your endpoint returns a non-2xx status code or times out, ReviewPanel retries with exponential backoff:

  • One initial attempt plus up to four retries. Nominal retry delays are 30 seconds, 2 minutes, 8 minutes, and 30 minutes, with jitter.
  • The initial delivery and each retry are recorded separately. The dashboard shows the 50 most recent attempts for the selected business account. Delivery-history records older than 30 days are removed by a daily retention job.
  • The endpoint is disabled after three consecutive delivery cycles exhaust all retries; it can be re-enabled after the endpoint is fixed.

Testing

Send a test event from your webhook settings to verify your endpoint is configured correctly. The test event uses the webhook.test.sent type and includes sample data.