Add start_date to issue webhook payload

What does this MR do and why?

The start_date column exists on the issues table but was missing from safe_hook_attributes in IssueBuilder, so it was never included in webhook payloads alongside due_date.

This MR adds start_date into webhook payloads for issues (work items) when adding and updating them. This should also work with epics and confidential work items too.

References

Screenshots or screen recordings

These webhook payloads will contain these keys:

  • object_attributes.start_date
  • changes.start_date
// Create issue payload
{"object_kind":"issue","event_type":"issue","user":{"id":1,"name":"Administrator","username":"root","avatar_url":"https://www.gravatar.com/avatar/15bbd3f9e9852c9d6f0e82619c57f34c26004189add66e481c8524d6394ea445?s=80&d=identicon","email":"[REDACTED]"},"project":{"id":38,"name":"issue-webhook","description":null,"web_url":"http://gdk.test:3000/features/issue-webhook","avatar_url":null,"git_ssh_url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","git_http_url":"http://gdk.test:3000/features/issue-webhook.git","namespace":"features","visibility_level":0,"path_with_namespace":"features/issue-webhook","default_branch":"main","ci_config_path":null,"homepage":"http://gdk.test:3000/features/issue-webhook","url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","ssh_url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","http_url":"http://gdk.test:3000/features/issue-webhook.git"},"object_attributes":{"author_id":1,"closed_at":null,"confidential":false,"created_at":"2026-05-27T02:32:43.920Z","description":"test","discussion_locked":null,"due_date":null,"start_date":"2026-05-20","id":725,"iid":2,"last_edited_at":null,"last_edited_by_id":null,"milestone_id":null,"moved_to_id":null,"duplicated_to_id":null,"project_id":38,"relative_position":null,"state_id":1,"time_estimate":0,"title":"test issue 2","updated_at":"2026-05-27T02:32:43.920Z","updated_by_id":null,"weight":null,"health_status":null,"type":"Issue","url":"http://gdk.test:3000/features/issue-webhook/-/work_items/2","total_time_spent":0,"time_change":0,"human_total_time_spent":null,"human_time_change":null,"human_time_estimate":null,"assignee_ids":[],"assignee_id":null,"labels":[],"state":"opened","severity":"unknown","customer_relations_contacts":[],"status":{"id":"gid://gitlab/WorkItems::Statuses::SystemDefined::Status/1","name":"To do","category":"to_do","description":null,"color":"#737278"},"action":"open"},"labels":[],"changes":{"author_id":{"previous":null,"current":1},"created_at":{"previous":null,"current":"2026-05-27T02:32:43.920Z"},"description":{"previous":null,"current":"test"},"start_date":{"previous":null,"current":"2026-05-20"},"id":{"previous":null,"current":725},"iid":{"previous":null,"current":2},"project_id":{"previous":null,"current":38},"title":{"previous":null,"current":"test issue 2"},"updated_at":{"previous":null,"current":"2026-05-27T02:32:43.920Z"}},"repository":{"name":"issue-webhook","url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","description":null,"homepage":"http://gdk.test:3000/features/issue-webhook"}}

// Update issue payload
{"object_kind":"issue","event_type":"issue","user":{"id":1,"name":"Administrator","username":"root","avatar_url":"https://www.gravatar.com/avatar/15bbd3f9e9852c9d6f0e82619c57f34c26004189add66e481c8524d6394ea445?s=80&d=identicon","email":"[REDACTED]"},"project":{"id":38,"name":"issue-webhook","description":null,"web_url":"http://gdk.test:3000/features/issue-webhook","avatar_url":null,"git_ssh_url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","git_http_url":"http://gdk.test:3000/features/issue-webhook.git","namespace":"features","visibility_level":0,"path_with_namespace":"features/issue-webhook","default_branch":"main","ci_config_path":null,"homepage":"http://gdk.test:3000/features/issue-webhook","url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","ssh_url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","http_url":"http://gdk.test:3000/features/issue-webhook.git"},"object_attributes":{"author_id":1,"closed_at":null,"confidential":false,"created_at":"2026-05-27T02:32:43.920Z","description":"test","discussion_locked":null,"due_date":null,"start_date":"2026-05-06","id":725,"iid":2,"last_edited_at":null,"last_edited_by_id":null,"milestone_id":null,"moved_to_id":null,"duplicated_to_id":null,"project_id":38,"relative_position":2565,"state_id":1,"time_estimate":0,"title":"test issue 2","updated_at":"2026-05-27T02:35:50.596Z","updated_by_id":1,"weight":null,"health_status":null,"type":"Issue","url":"http://gdk.test:3000/features/issue-webhook/-/work_items/2","total_time_spent":0,"time_change":0,"human_total_time_spent":null,"human_time_change":null,"human_time_estimate":null,"assignee_ids":[],"assignee_id":null,"labels":[],"state":"opened","severity":"unknown","customer_relations_contacts":[],"status":{"id":"gid://gitlab/WorkItems::Statuses::SystemDefined::Status/1","name":"To do","category":"to_do","description":null,"color":"#737278"},"action":"update"},"labels":[],"changes":{"start_date":{"previous":"2026-05-20","current":"2026-05-06"},"updated_at":{"previous":"2026-05-27T02:32:43.920Z","current":"2026-05-27T02:35:50.596Z"},"updated_by_id":{"previous":null,"current":1}},"repository":{"name":"issue-webhook","url":"ssh://antons@gdk.test:2222/features/issue-webhook.git","description":null,"homepage":"http://gdk.test:3000/features/issue-webhook"}}

How to set up and validate locally

  1. Setup a group webhook - I suggest using https://webhook.site/ as the target endpoint for this test
  2. Create a issue (work item) with a start date - you should see it populated in the webhook payload
  3. Update the issue with a different start date - you should see it populated in the webhook payload

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Merge request reports

Loading