# Hero 1 - Storm-to-Roofer-Pitch Pipeline

**Stack:** n8n workflow + NOAA storm endpoint + top-roofers data + Instantly send + dashboard log.

## Flow

1. Cron every 15 min: poll NOAA / NWS for new hail >= 1" events.
2. For each event: get state + zip + storm date + hail size.
3. Intersect with `top-roofers/data/` filtered to within 50 miles of impact zip.
4. Personalise email (storm date + hail size + city) using template.
5. Send via Instantly (campaign ID from `.env`).
6. Log to ops-dashboard via webhook.

## Files

- `workflow.json` - n8n workflow definition (import into n8n)
- `email-template.md` - personalisation template (Instantly variables)
- `run.py` - Python harness for `--dry-run` (simulates one storm event end to end)

## Run (dry run)

```bash
python3 run.py --dry-run
```

Prints planned actions: storm fetched, roofers matched, email body rendered, send target, log entry. No external calls.

## Live run (after Donal approval)

```bash
python3 run.py --live --storm-event-id <id>
```

Requires: `INSTANTLY_API_KEY`, `OPS_DASHBOARD_WEBHOOK` in `.env`.

## Env vars

- `INSTANTLY_API_KEY` (existing)
- `INSTANTLY_HERO1_CAMPAIGN_ID` (TODO: provision new campaign)
- `OPS_DASHBOARD_WEBHOOK` (TODO: create endpoint)
- `NOAA_API_BASE` (default: `https://api.weather.gov`, free, no key)

## Status

Stub. Workflow JSON imports cleanly; `run.py --dry-run` works. Live wiring pending storm endpoint validation by blocker sprint.
