Configuration
Organization admins configure webhooks in Organization → Integrations tab:
Endpoint URL — HTTPS URL that will receive POST requests.
Enabled — Toggle to enable/disable delivery without removing the URL.
Signing Secret (optional) — Shared secret for HMAC-SHA256 payload signature verification.
The webhook config is stored on the organization's settings.webhook field.
Events
Event | Trigger |
| A new job is created in the organization |
| A job's name, customer, or insurance details are modified |
| A job is deleted |
Only jobs linked to the organization (via sharing.organizationId) trigger webhooks.
HTTP Request
Method: POST
Headers:
Header | Description |
|
|
|
|
| Event type (e.g. |
|
|
Timeout: 30 seconds. Requests that take longer are aborted.
Payload Schema
{
"event": "job.created",
"timestamp": "2026-03-03T14:30:00.000Z",
"organizationId": "abc123",
"job": {
"id": "job-uuid",
"name": "Smith Residence - Fire Damage",
"status": "inventory",
"customer": {
"name": "John Smith",
"email": "[email protected]",
"phone": "555-1234"
},
"insurance": {
"claimNumber": "CLM-2026-001",
"company": "State Farm",
"lossType": "fire",
"policyNumber": "POL-123",
"agent": "Jane Doe",
"phone": "555-5678",
"email": "[email protected]"
},
"ownerUserId": "user-uuid",
"createdAt": "2026-03-01T10:00:00.000Z",
"updatedAt": "2026-03-03T14:30:00.000Z"
},
"changes": [
{
"field": "settings.customer",
"oldValue": { "name": "J Smith" },
"newValue": { "name": "John Smith", "email": "[email protected]", "phone": "555-1234" }
}
]
}
Field Details
Field | Type | Description |
| string | One of |
| string | ISO-8601 timestamp of when the event was dispatched |
| string | Organization UUID |
| string | Job UUID |
| string | Job name |
| string? | Job status (e.g. |
| object? | Customer details (name, email, phone) |
| object? | Insurance details (claimNumber, company, lossType, etc.) |
| string | UUID of the user who owns the job |
| string | Job creation timestamp |
| string | Job last-update timestamp |
| array? | Only present for |
Watched Fields (for job.updated)
jobName— The job's display namesettings.customer— Customer contact details (name, email, phone)settings.insurance— Insurance claim details (claimNumber, company, lossType, policyNumber, agent, etc.)
Verifying Signatures
If a signing secret is configured, verify the X-Webhook-Signature header:
const crypto = require('crypto');function verifySignature(body, secret, signatureHeader) {
if (typeof signatureHeader !== 'string') {
return false;
} const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(body, 'utf8')
.digest('hex'); const expectedBuffer = Buffer.from(expected, 'utf8');
const receivedBuffer = Buffer.from(signatureHeader, 'utf8'); if (expectedBuffer.length !== receivedBuffer.length) {
return false;
} return crypto.timingSafeEqual(expectedBuffer, receivedBuffer);
}
Error Handling
Webhooks are fire-and-forget. Failed deliveries (non-2xx responses, timeouts, network errors) are logged server-side but not retried.
Your endpoint should return a 2xx status code to acknowledge receipt.
Delivery is best-effort: events may occasionally be missed during outages or function cold starts.