Webhook payload structure for job status changes

Hey team — I'm building out a notification pipeline that needs to fire when work orders hit specific status transitions (Created → Assigned → In Progress → Completed, etc.).

I've got webhooks configured and hitting my endpoint, but the payload structure I'm receiving doesn't seem to match what's in the webhook setup guide. Specifically:

  • Is job_id always present, or only for certain event types?
  • Does the payload include the full work order object, or just the delta/changed fields?
  • Are status transition events (work_order.status_changed) supposed to include the previous status value somewhere? I'm seeing status but not previous_status or similar.

Also heads up — I'm seeing inconsistent behavior between the sandbox and prod environments. Sandbox payloads include a technician_ids array, but prod is sending assigned_to as a single string. YMMV warning here.

My use case: need to sync status changes to an external CMDB and trigger Slack notifications when jobs hit "Completed." The work_order.completed event seems to fire before photos finish uploading sometimes, which is... not ideal for our downstream workflow.

Anyone got a canonical payload example for work_order.status_changed? Or should I be subscribing to individual status events instead of the generic change event?

Parents
  • Update: implemented the defensive parsing and it's working well. The delayed queue approach for photo verification is solid — using 45s delay and checking attachments_complete via API before firing Slack notifications.

    One gotcha I ran into: the context.previous_status field is camelCase (previousStatus) in some payloads and snake_case in others. Normalizing to lowercase before comparison now.

    Thanks all for the help — this thread saved me a lot of debugging time. Also cross-posting my API rate limit findings since the bulk creation piece relates.

Reply
  • Update: implemented the defensive parsing and it's working well. The delayed queue approach for photo verification is solid — using 45s delay and checking attachments_complete via API before firing Slack notifications.

    One gotcha I ran into: the context.previous_status field is camelCase (previousStatus) in some payloads and snake_case in others. Normalizing to lowercase before comparison now.

    Thanks all for the help — this thread saved me a lot of debugging time. Also cross-posting my API rate limit findings since the bulk creation piece relates.

Children
No Data