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_datechanges.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
- Setup a group webhook - I suggest using https://webhook.site/ as the target endpoint for this test
- Create a issue (work item) with a start date - you should see it populated in the webhook payload
- 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.