# Task 017 — Email Tracking

## Objective

Track email opens and link clicks for campaign sends using signed tokens and public tracking routes.

## Scope

- Tracking pixel and redirect endpoints per API spec
- Inject tracking into outgoing HTML in send engine
- Update `campaign_sends` with `openedAt`, `clickedAt` (or separate events collection)
- Campaign stats API

**Out of scope:** Advanced analytics dashboard (Task 020).

## Requirements

1. Tokens non-guessable and tied to `campaign_send` id.
2. Public routes do not leak PII in URLs.
3. Stats visible on campaign detail.

## Files to create or modify

| Path | Action |
|------|--------|
| `src/app/api/track/**` | Create |
| `src/services/tracking.service.ts` | Create |
| Update `email-send.service.ts` | Inject links/pixel |
| `docs/05-email-system.md` | Tracking |
| `docs/03-api-specification.md` | Track routes |
| `docs/11-security.md` | Token security |
| `docs/16-changelog.md` | Entry |

## Acceptance criteria

- [ ] Open pixel records open once per policy (document dedup)
- [ ] Click redirect logs click and forwards to real URL
- [ ] Campaign stats show sent/opened/clicked counts

## Documentation updates required

- `docs/05-email-system.md`
- `docs/03-api-specification.md`
- `docs/11-security.md`
- `docs/16-changelog.md`
