Was deep-linking ?name={{QueryEscape company}} which (a) risked the @TrackLink
per-subscriber 404 bug and (b) QueryEscape isn't a guaranteed Listmonk template
func + company names have commas/spaces that break the query. Now a clean static
?state=CT link (pre-selects CT, @TrackLink-safe) and the body names the company
in text so the recipient knows to look it up. Funnel verified live end-to-end.
- create_ct_annual_report_campaign.py: personalized CT annual-report overdue
email (company/due_date/days_overdue attribs), from filings.* subdomain, soft
free-compliance-check CTA. HTML+plaintext, List-Unsubscribe, @TrackLink.
- pw-mta-warmup.sh: when the rotation pool is a single IP, write plain
transport_maps (no catch-all randmap) + default_transport, so the filings
sender_dependent map (-> outfilings/.90) survives the daily warmup run.
Previously randmap:{out05:} clobbered filings routing every day at 07:17 UTC.
Verified end-to-end: Listmonk CT test egresses .90 (outfilings), DKIM
d=filings.performancewest.net s=filings, multipart HTML+plaintext, attribs
render (Riverside Landscaping LLC / due 2026-06-15 / 16 days ago), 0 stray
tokens, real per-subscriber unsubscribe link.