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
    • job_id → never present. Use work_order_id.
    • Full object vs delta → delta only. Subscribe to work_order.updated if you need full object.
    • Previous status → not in contract. Do not rely on it.

    Environment inconsistency: prod is on v2.1, most sandboxes still on v2.0. technician_ids vs assigned_to is the version delta.

    Docs are wrong here: Setting Up Webhooks shows v2.0 structure. Engineering ticket #4421 to update.

  • defensive is the way to go — I just normalize both:

    const technicianIds = Array.isArray(payload.data.technician_ids) 
      ? payload.data.technician_ids 
      : [payload.data.assigned_to].filter(Boolean);

    re: docs — lol no idea on ETA. the actual OpenAPI spec is more reliable than the help articles: api.fieldpulse.com/.../openapi.json

    pro tip: if you need photo-complete guarantees, poll GET /work_orders/{id} with ?include=attachments after getting the completed event. not elegant but it works. until that attachments_complete event ships anyway.

Reply Children
No Data