I already had a resume download gate — email required, signed link, 15-minute expiry, presigned S3 URL good for two minutes. What it didn't have was a way for me to know it happened. Someone could download my resume and I'd never find out unless I went digging through ResumeDownloadRequest rows in the admin.

This is the short follow-up: one notification email, sent to me, the moment someone actually opens the PDF.

Where to Hook It

The gate has two views:

ResumeRequestDownloadView.post() — fires when someone submits their email and gets sent a link