The User Clicked The Link Three Days Later
The email arrived on Monday.
No alert.
No incident.
No reason to investigate.
It sat quietly in the inbox for three days.
Then somebody clicked the link.
The delivery was not the problem. The click was.
This Agent Foskett investigation explores how defenders can use Microsoft Defender XDR, EmailEvents, UrlClickEvents, NetworkMessageId and KQL to investigate suspicious links long after the original email was delivered.

Briefing summary
A delivered email may not become dangerous until the user clicks the link. UrlClickEvents helps defenders prove when the interaction happened and connect it back to the original message.
Why delayed clicks matter
First hunt: find recent URL clicks
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
UrlClickEvents | where Timestamp > ago(7d) | project ClickTime = Timestamp, AccountUpn, Url, ActionType, NetworkMessageId, IPAddress, ThreatTypes | order by ClickTime desc
Second hunt: connect the click back to the email
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
UrlClickEvents | where Timestamp > ago(7d) | project ClickTime = Timestamp, AccountUpn, Url, ClickAction = ActionType, NetworkMessageId | join kind=leftouter ( EmailEvents | project EmailTime = Timestamp, NetworkMessageId, SenderFromAddress, RecipientEmailAddress, Subject, DeliveryAction ) on NetworkMessageId | order by ClickTime desc
When a delayed click deserves deeper investigation
Third hunt: calculate the delay between delivery and click
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
EmailEvents | where Timestamp > ago(14d) | project EmailTime = Timestamp, NetworkMessageId, SenderFromAddress, RecipientEmailAddress, Subject | join kind=inner ( UrlClickEvents | project ClickTime = Timestamp, NetworkMessageId, AccountUpn, Url, ActionType ) on NetworkMessageId | extend DelayHours = datetime_diff("hour", ClickTime, EmailTime) | order by DelayHours desc
Fourth hunt: look for activity after the click
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
let Clicks = UrlClickEvents | where Timestamp > ago(7d) | project ClickTime = Timestamp, AccountUpn, Url, NetworkMessageId; Clicks | join kind=leftouter ( AADSignInEventsBeta | where Timestamp > ago(7d) | project SignInTime = Timestamp, AccountUpn, IPAddress, City, Country, Application ) on AccountUpn | where SignInTime between (ClickTime .. (ClickTime + 6h)) | order by ClickTime desc
What delayed click telemetry can prove
The Agent Foskett investigator mindset
How GEMXIT approaches URL click investigations
Final thought
Nothing happened on Monday.
Nothing happened on Tuesday.
Nothing happened on Wednesday.
Then the user clicked.
The old message became a new incident.
The delivery was history. The click was evidence.
It is: “When did the user interact with it, and what happened next?”
Continue the investigation with The Link Was Clicked After The Email Was Delivered, The Inbox Rule Hid The Evidence, The Disney Email Wasn’t From Disney, EmailEvents KQL Guide, Investigating EmailEvents in Microsoft Defender XDR, SpoofedDomain and EmailEvents in Microsoft Defender, Microsoft Defender KQL Threat Hunting Complete Guide, Microsoft Defender and the GEMXIT Security Review.
Develop IT. Protect IT.GEMXIT PTY LTD | GEMXIT UK LTD
