n8n integration

Receive Jaina webhooks in n8n and trigger downstream automations.

The pattern

Jaina fires webhooks on record.created, record.updated, and record.deleted. n8n receives them and routes them to anywhere — Slack, Discord, GitHub Issues, Google Sheets, your custom HTTP service.

Step 1: an n8n webhook

In n8n, add a Webhook node:

  • HTTP method: POST
  • Path: jaina-records
  • Response: Last Node

Activate and copy the production URL (e.g., https://n8n.example.com/webhook/jaina-records).

Step 2: register the webhook in Jaina

Your project → Webhooks → New webhook:

  • URL: paste your n8n URL
  • Events: record.created, record.updated
  • Description: optional
  • Secret: auto-generated; copy it

Step 3: verify the signature

Add a Function node:

const crypto = require('crypto');
const secret = $env.JAINA_WEBHOOK_SECRET;
const signature = $request.headers['x-jaina-signature'];
const body = JSON.stringify($json);

const expected = 'sha256=' + crypto
  .createHmac('sha256', secret)
  .update(body)
  .digest('hex');

if (signature !== expected) {
  throw new Error('Invalid signature');
}

return $json;

Set JAINA_WEBHOOK_SECRET in n8n's env to the secret from step 2.

Step 4: route to anywhere

Common patterns:

  • Slack — post to a channel when a record is created with a specific tag.
  • GitHub Issues — open an issue when a record fails validation.
  • Google Sheets — append a row to a tracking sheet.
  • Custom HTTP — call your application backend to invalidate a cache.

Payload shape

{
  "id": "evt_01HXYZ...",
  "type": "record.created",
  "data": {
    "project": { "id": "...", "slug": "my-game" },
    "schema":  { "id": "...", "slug": "enemy" },
    "record":  {
      "id":   "rec_01HXYZ...",
      "data": { "name": "Goblin", "hp": 20 }
    }
  },
  "created_at": "2026-05-13T12:34:56.789Z"
}

Retries

Jaina retries failed deliveries up to 5 times with exponential backoff over ~15 minutes. Delivery attempts and outcomes are logged in your project's Webhooks → Delivery log.