Integrations

Get your data out, in real time.

Here's exactly what adgamify connects to today — no more, no less. Two things ship now: signed outbound webhooks, and CSV export of your audience.

Live now
Outbound webhooks

Push entry and publish events to your own systems

Add an endpoint from any workspace's Webhooks page and adgamify will POST a signed JSON payload the moment either event happens — retried automatically if your endpoint is briefly down.

entry.created

Fires the moment a player submits an entry — the same event that counts against your plan’s entry cap.

campaign.published

Fires when a campaign is published and goes live for players.

Every delivery is signed

Each webhook gets its own secret, shown to you once at creation. Every delivery carries these headers so you can verify it actually came from adgamify before trusting the payload:

X-Adgamify-SignatureHMAC-SHA256 hex digest of `${timestamp}.${rawBody}`, signed with your webhook’s secret.
X-Adgamify-TimestampUnix seconds the delivery was sent — include it in the signed string.
X-Adgamify-EventThe event name, e.g. entry.created, as a convenience (also present in the JSON body).

Verifying the signature (Node.js)

Sign `${timestamp}.${rawBody}` with your webhook's secret using HMAC-SHA256, then compare it to X-Adgamify-Signature using a constant-time comparison. Use the raw request body — not a re-serialized copy — since re-serializing JSON can change the exact bytes and break the signature check.

import { createHmac, timingSafeEqual } from 'node:crypto';

function isValidSignature(secret, timestamp, rawBody, signatureHeader) {
  const expected = createHmac('sha256', secret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex');

  const a = Buffer.from(expected, 'utf8');
  const b = Buffer.from(signatureHeader, 'utf8');
  return a.length === b.length && timingSafeEqual(a, b);
}

// In your HTTP handler, using the RAW request body (not re-serialized JSON):
app.post('/webhooks/adgamify', (req, res) => {
  const timestamp = req.headers['x-adgamify-timestamp'];
  const signature = req.headers['x-adgamify-signature'];

  if (!isValidSignature(process.env.ADGAMIFY_WEBHOOK_SECRET, timestamp, req.rawBody, signature)) {
    return res.status(401).send('invalid signature');
  }

  const { event, data } = JSON.parse(req.rawBody);
  // event is "entry.created" or "campaign.published"
  res.status(200).send('ok');
});
Live now
CSV export

Export your audience whenever you need to

Every workspace's Audience page has a one-click CSV export of captured entries — names, emails, answers, scores, and timestamps — so you can hand a clean file to email tools, a CRM import, or a spreadsheet without waiting on us.

Wire up your first webhook in a couple minutes

Every workspace has a Webhooks page in your dashboard — add an endpoint, copy the secret, and start receiving signed events.

Start free Talk to us