Commit graph

3 commits

Author SHA1 Message Date
justin
a433bf44d8 ct email: safe static corp-check CTA (no per-sub @TrackLink 404 risk)
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.
2026-07-01 11:32:17 -05:00
justin
b016caecea ct campaign: point CTA to the real /services/corporate/annual-reports page
Was pointing at the trucking DOT compliance-check tool (wrong audience). There's
a purpose-built 'Annual Report Filing & Maintenance' page (annual report +
registered agent + good standing, from $99) that fits CT overdue-annual-report
leads exactly. CTA now: 'File my Connecticut annual report'.
2026-07-01 08:18:13 -05:00
justin
3725374ade ct campaign + fix filings routing durability
- 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.
2026-07-01 08:14:12 -05:00