Subscribe to RunTight events and receive real-time HTTP POST notifications. Ideal for connecting to Zapier, Make, n8n, or your own integration services.
Go to Settings → Webhooks in your RunTight dashboard (admin role, Pro plan required). Click Add Webhook, enter a name and URL, optionally set a secret for HMAC verification, and check the events you want to receive.
wo.createdA new work order is created (via the app, API, or cron PM generation).
wo.completedA work order's status transitions to completed.
wo.overdueAn open or in-progress work order crosses its due date. Fires once per WO.
pm.dueA PM template auto-generates a new work order via the daily cron.
asset.createdNew equipment is added to your tenant.
Every webhook delivers a JSON body with four top-level fields.
{
"event": "wo.completed",
"tenant_id": "tenant-uuid",
"timestamp": "2026-04-11T18:45:12.123Z",
"data": {
"work_order_id": "wo-uuid",
"title": "Weekly Hydraulic Press Inspection",
"priority": "high",
"due_date": "2026-04-11",
"completed_at": "2026-04-11T18:45:10.567Z",
"time_spent_minutes": 35,
"asset_id": "asset-uuid"
}
}The data field varies by event type:
Content-Type: application/json User-Agent: RunTight-Webhooks/1.0 X-Webhook-Event: wo.completed X-Webhook-Signature: sha256=HEX_HMAC (only if secret configured)
If you configure a secret on a webhook, every request includes an X-Webhook-Signature header containing an HMAC-SHA256 hex digest of the raw request body.
Node.js example
import crypto from "crypto";
function verifySignature(body, signatureHeader, secret) {
const expected = "sha256=" + crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}
// In your webhook handler:
const rawBody = await request.text();
const signature = request.headers.get("x-webhook-signature");
if (!verifySignature(rawBody, signature, process.env.WEBHOOK_SECRET)) {
return new Response("Invalid signature", { status: 401 });
}
const payload = JSON.parse(rawBody);