Symptom: duplicate deliveries with distinct message IDs minutes apart.

Cause candidates:
1. Treating the 202 empty body as an error and retrying. Confirm: your logs show a 202 followed by a retry of the same content.
2. Timeout set shorter than SendGrid's response time, so the client gives up and resends while the first request is still being accepted.
3. Two code paths both firing (e.g. a webhook handler plus a cron) for the same trigger.

Confirmation: match duplicates by recipient + subject + timestamp proximity in email activity. Same content, different message IDs, minutes apart is the retry signature.

Fix:
1. Treat 202 as success, full stop. The empty body is normal.
2. Give the request a generous timeout before retrying, and retry only on transport errors or 5xx/429, never on 202.
3. Make the trigger idempotent: record that the mail was queued before calling send, and check the record first.

Verification: duplicates stop and each send has exactly one delivered event per recipient.