Webhooks
Event Catalog Complete list of all webhook events with payload examples.
All events that can trigger outbound webhooks, organized by category.
Event Trigger Key Fields user.createdNew user registered user_id, email, first_name, last_name, roleuser.loginUser signs in user_id, email, ip_address, device_type, session_iduser.logoutUser signs out user_id, email, session_id, session_duration_secondsuser.updatedUser profile updated user_id, email, changes (field diff)user.password_reset_requestedPassword reset requested user_id, email, reset_token_expires_atuser.password_changedPassword changed user_id, email, changed_byuser.deactivatedUser deactivated user_id, email, deactivated_by, reasonuser.reactivatedUser reactivated user_id, email, reactivated_by
{
"event" : "user.created" ,
"timestamp" : "2026-07-22T12:00:00Z" ,
"data" : {
"user_id" : 123 ,
"email" : "[email protected] " ,
"first_name" : "John" ,
"last_name" : "Doe" ,
"display_name" : "John Doe" ,
"role" : "user" ,
"is_active" : true ,
"created_at" : "2026-07-22T12:00:00Z" ,
"created_by" : 1
}
}
Event Trigger Key Fields employee.createdNew employee added employee_id, employee_number, department, job_titleemployee.onboardedEmployee onboarding completed employee_id, user_id, onboarding_statusemployee.linked_to_userEmployee linked to a user account employee_id, user_id, emailemployee.certification_expiringCertification nearing expiry employee_id, certification_type, expiry_date, days_until_expiry
Event Trigger Key Fields job.createdNew job created job_id, item_number, title, status, priority, customer_name, assigned_tojob.assignedJob assigned to a user job_id, assigned_to, assigned_by, previous_assigneejob.startedJob started job_id, status, started_by, started_at, locationjob.completedJob completed job_id, status, completed_by, actual_hours, signature_capturedjob.cancelledJob cancelled job_id, cancelled_by, cancellation_reason
{
"event" : "job.completed" ,
"timestamp" : "2026-07-22T14:30:00Z" ,
"data" : {
"job_id" : "job_550e8400" ,
"item_number" : "JOB-2026-0001" ,
"title" : "HVAC Installation - Building A" ,
"status" : "completed" ,
"completed_by" : "user_456" ,
"completed_at" : "2026-07-22T14:30:00Z" ,
"actual_hours" : 7.5 ,
"completion_notes" : "Installation successful. All units tested." ,
"signature_captured" : true ,
"photos_attached" : 3
}
}
Event Trigger Key Fields project.createdNew project created project_id, item_number, title, status, budget, project_managerproject.milestone_reachedProject milestone reached project_id, milestone_name, completion_percentageproject.status_changedProject status changed project_id, previous_status, new_status, changed_byproject.completedProject completed project_id, final_cost, budget_variance, total_tasks
Event Trigger Key Fields task.createdNew task created task_id, item_number, title, parent_id, parent_type, assigned_totask.completedTask completed task_id, completed_by, actual_hours
Event Trigger Key Fields appointment.createdNew appointment scheduled id, item_number, title, scheduled_start, scheduled_end, contact_name, location_name, location_address, location_idappointment.scheduledAppointment scheduled (from job) id, item_number, title, scheduled_start, scheduled_end, contact_name, location_name, location_address, location_idappointment.on_routeTechnician en route to appointment appointment, old_status, new_status, location (lat/lng)appointment.on_siteTechnician arrived on site appointment, old_status, new_status, location (lat/lng)appointment.checked_inTechnician checked in appointment, old_status, new_status, location (lat/lng)appointment.completedAppointment completed appointment, old_status, new_status, location (lat/lng)appointment.cancelledAppointment cancelled appointment, old_status, new_status
Appointment payloads include location fields resolved from the work item's location_id (referencing ta_locations) or the location_name/location_address stored directly on the work item. The appointment object in the payload is enriched with location_name, location_address, location_lat, and location_lng at dispatch time.
{
"event" : "appointment.created" ,
"timestamp" : "2026-07-22T09:00:00Z" ,
"data" : {
"id" : "apt_550e8400" ,
"item_number" : "APT-2026-0001" ,
"title" : "Service Call - HVAC Unit 3" ,
"scheduled_start" : "2026-07-22T10:00:00Z" ,
"scheduled_end" : "2026-07-22T11:00:00Z" ,
"assigned_to" : 456 ,
"contact_name" : "Acme Corporation" ,
"location_name" : "Building A - Server Room" ,
"location_address" : "123 Industrial Road, Johannesburg" ,
"location_id" : 42 ,
"status" : "scheduled" ,
"parent_job_id" : "job_abc123"
},
"metadata" : {
"item_type" : "appointment" ,
"item_id" : "apt_550e8400" ,
"user_id" : 1 ,
"client_id" : 5 ,
"client_name" : "Facility Services Ltd"
}
}
Event Trigger Key Fields route.createdNew route created route_id, driver_name, vehicle_registration, total_stops, total_distance_kmroute.startedRoute started route_id, started_at, driver_location, odometer_startroute.stop_completedRoute stop completed route_id, stop_number, customer_name, proof_of_delivery, remaining_stopsroute.completedRoute completed route_id, total_stops_completed, actual_distance_km, duration_hoursdelivery.completedDelivery completed delivery_id, customer_name, delivered_by, proof_of_delivery, items_delivered
Event Trigger Key Fields purchase_order.createdNew purchase order created purchase_order_id, supplier_name, grand_total, line_itemspurchase_order.approvedPurchase order approved purchase_order_id, approved_by, grand_totalpurchase_order.receivedPurchase order received (GRN) purchase_order_id, grn_number, items_received, warehouse
Events for finance documents (invoices, quotes, credit notes, etc.) follow the pattern {doc_type}.{action}. The available events depend on the document types included in the client's Total Finance subscription tier .
Event Trigger Key Fields invoice.createdInvoice created invoice_id, invoice_number, contact_name, grand_total, statusinvoice.updatedInvoice updated invoice_id, changes (field diff)invoice.paidInvoice marked as paid invoice_id, paid_amount, payment_method, paid_atinvoice.voidedInvoice voided invoice_id, voided_by, reasonquote.createdQuote created quote_id, quote_number, contact_name, grand_total, valid_untilquote.updatedQuote updated quote_id, changes (field diff)quote.acceptedQuote accepted by customer quote_id, accepted_by, accepted_atquote.expiredQuote expired quote_id, expired_at, valid_untilquote.convertedQuote converted to invoice quote_id, new_invoice_idcredit_note.createdCredit note created credit_note_id, credit_note_number, contact_name, grand_total, linked_invoice_idcredit_note.updatedCredit note updated credit_note_id, changes (field diff)credit_note.appliedCredit note applied to invoice credit_note_id, applied_to_invoice_id, applied_amountpurchase_order.createdPurchase order created purchase_order_id, supplier_name, grand_total, line_itemspurchase_order.approvedPurchase order approved purchase_order_id, approved_by, grand_totaldelivery_note.createdDelivery note created delivery_note_id, delivery_note_number, contact_name, linked_invoice_idproforma.createdProforma invoice created proforma_id, proforma_number, contact_name, grand_totalsales_order.createdSales order created sales_order_id, sales_order_number, contact_name, grand_totalsupplier_invoice.createdSupplier invoice created supplier_invoice_id, supplier_name, grand_totalsupplier_quote.createdSupplier quote created supplier_quote_id, supplier_name, grand_total, valid_untilexpense.createdExpense created expense_id, expense_number, supplier_name, amount, category
Tier-filtered events
The financial document events visible in the Outbound Webhook Modal are filtered by the client's Total Finance subscription tier . Only events for document types included in the client's tier are shown. See Finance Tier Restrictions for details.
{
"event" : "invoice.created" ,
"timestamp" : "2026-07-27T10:00:00Z" ,
"data" : {
"invoice_id" : "550e8400-e29b-41d4-a716-446655440000" ,
"invoice_number" : "INV-2026-0042" ,
"contact_name" : "Acme Corporation" ,
"contact_id" : 123 ,
"grand_total" : 15750.00 ,
"currency" : "ZAR" ,
"status" : "draft" ,
"issue_date" : "2026-07-27" ,
"due_date" : "2026-08-26" ,
"line_items" : [
{
"description" : "Consulting services — July" ,
"quantity" : 15 ,
"unit_price" : 1050.00 ,
"line_total" : 15750.00
}
]
},
"metadata" : {
"item_type" : "invoice" ,
"item_id" : "550e8400-e29b-41d4-a716-446655440000" ,
"user_id" : 15 ,
"client_id" : 5 ,
"client_name" : "Facility Services Ltd"
}
}
Event Trigger Key Fields audit.createdNew audit scheduled audit_id, audit_type, auditor_name, scheduled_dateaudit.completedAudit completed audit_id, score, max_score, pass_fail, findingsincident.reportedIncident reported incident_id, incident_type, severity, location, injuriesincident.resolvedIncident resolved incident_id, resolution, root_cause, preventive_measuresinspection.completedInspection completed inspection_id, inspection_type, pass_fail, checklist_completedcertification.expiringCertification nearing expiry certification_id, holder_name, certification_type, days_until_expiry
Event Trigger Key Fields contact.createdNew contact created contact_id, contact_type, name, email, phone, tax_numbercontact.updatedContact updated contact_id, changes (field diff)contact.deletedContact deleted contact_id, name, account_numbercontact.status_changedContact status changed contact_id, old_status, new_status, reasoncontact_person.createdContact person added contact_person_id, contact_id, first_name, last_name, job_titlecontact_person.updatedContact person updated contact_person_id, contact_id, changescontact_person.deletedContact person deleted contact_person_id, contact_idcontact_location.createdContact location added location_id, contact_id, location_type, address, latitude, longitudecontact_location.updatedContact location updated location_id, contact_id, changescontact_location.deletedContact location deleted location_id, contact_idcontact_document.linkedDocument linked to contact contact_id, work_item_id, item_type, item_number
Event Trigger Key Fields work_item.createdGeneric work item created work_item_id, item_number, item_type, title, statuswork_item.updatedGeneric work item updated work_item_id, item_type, changes (field diff)work_item.deletedGeneric work item deleted work_item_id, item_type, deleted_bywork_item.comment_addedComment added to a work item work_item, comment (id, comment_text, is_internal, comment_type, user_id, user_name)work_item.comment_updatedComment edited on a work item work_item, comment, changes (field diff)work_item.comment_deletedComment soft-deleted from a work item work_item, comment (id, comment_text, comment_type, user_id, user_name)work_item.comment_visibility_changedComment visibility toggled (internal ↔ public) work_item, comment, old_visibility (is_internal, comment_type), new_visibility (is_internal, comment_type)
The generic work_item.* events fire for custom work item types that don't have a specific event category (e.g. job.*, task.*).
{
"event" : "work_item.comment_added" ,
"timestamp" : "2026-07-27T08:00:00Z" ,
"data" : {
"work_item" : {
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"item_number" : "JOB-2026-0001" ,
"item_type" : "job" ,
"title" : "HVAC Installation - Building A"
},
"comment" : {
"id" : "c1a2b3c4-d5e6-7890-abcd-ef0123456789" ,
"comment_text" : "Unit 3 filter replaced, airflow restored." ,
"is_internal" : false ,
"comment_type" : "external" ,
"user_id" : 456 ,
"user_name" : "Jane Smith" ,
"created_at" : "2026-07-27T08:00:00Z"
}
}
}
{
"event" : "work_item.comment_visibility_changed" ,
"timestamp" : "2026-07-27T08:05:00Z" ,
"data" : {
"work_item" : {
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"item_number" : "JOB-2026-0001" ,
"item_type" : "job"
},
"comment" : {
"id" : "c1a2b3c4-d5e6-7890-abcd-ef0123456789" ,
"comment_text" : "Internal note about customer complaint." ,
"is_internal" : true ,
"comment_type" : "internal"
},
"old_visibility" : {
"is_internal" : false ,
"comment_type" : "external"
},
"new_visibility" : {
"is_internal" : true ,
"comment_type" : "internal"
}
}
}
All events use the same envelope format:
{
"event" : "<event_type>" ,
"timestamp" : "<ISO 8601>" ,
"data" : { ... }
}
The data object contains event-specific fields. See each event category above for the key fields included.