Implementing Autonomous Email Campaign Management with Dynamic Suppression List Integration
This session focused on building robust infrastructure for JADA's email marketing automation, with particular emphasis on compliance, deliverability, and personalization at scale. The work involved refactoring Python tooling, establishing CloudFront cache invalidation patterns, and implementing SES suppression list management to prevent bounce fatigue.
Core Problem Statement
JADA's email campaigns were operating without automated suppression list enforcement, meaning bounced addresses could repeatedly receive outreach. Additionally, the marketing automation needed to support multiple cadences (initial outreach, follow-ups at T+3 and T+7 days, and breakup sequences) with platform-specific templating. The infrastructure lacked clear separation between internal development artifacts and customer-facing deployments.
Technical Architecture Changes
Suppression List Pipeline
Implemented AWS SES suppression list export and filtering workflow:
# Export workflow
AWS SES → JSON suppression data → Python filtering → Contact database updates
# File structure
/Users/cb/Documents/repos/tools/send_hotel_outreach.py
├── SES suppression list fetch
├── Bounce/complaint filtering
├── Contact deduplication
└── Campaign dispatch with denylist enforcement
The suppression list is fetched directly from SES API, filtered for bounce/complaint status, and cross-referenced against outreach contact lists before campaign execution. This prevents the reputation damage of repeated sends to bad addresses.
Multi-Cadence Campaign Automation
Refactored jada_blast.py to support scheduled execution via macOS LaunchAgents:
LaunchAgent Configuration Files:
/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-initial.plist
/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-followup1.plist (T+3)
/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-followup2.plist (T+7)
/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-breakup.plist
Each plist file executes the same Python script with different environment variables controlling template selection and recipient filtering. This approach eliminates cron job complexity while maintaining OS-level scheduling reliability.
Content Delivery & Cache Management
Email preview HTML and campaign assets are stored in S3 with CloudFront CDN distribution. Critical change: implemented explicit cache invalidation patterns after content updates:
AWS CloudFront Invalidation Pattern:
1. Upload new HTML to S3 bucket
2. Invoke CloudFront InvalidateObjects API
3. Monitor distribution status via AWS CLI
4. Verify cache miss on subsequent requests
This prevents stale email previews from being served when marketing teams update campaign copy or branding elements.
Marketing Branding Segregation
A critical directive emerged: all customer-facing marketing content must be sanitized of personal names. Specifically, removed all instances of "C.B. Ladd" from:
/tmp/sdcc-hotel-outreach-2026.html(SDCC email template)/Users/cb/Documents/repos/sites/dangerouscentaur/demos/(demo sites)/Users/cb/Documents/repos/sites/progress.queenofsandiego.com/index.html(progress dashboard)/Users/cb/Documents/repos/sites/queenofsandiego.com/managercandy/index.html(manager tools)
Replaced with team-focused branding: "JADA Team," "Queen of San Diego Production," and generic production credits. This separation prevents personal liability exposure while maintaining brand identity. All customer-facing HTML files were re-deployed to CloudFront and cache invalidated.
Platform Integration Task Creation
Established dashboard task cards for each non-integrated booking platform:
- GetMyBoat — API documentation review, credential storage in
repos.env, rate limit handling - WeddingWire — OAuth2 flow implementation, webhook receiver for booking confirmations
- Additional platforms — Viator, Airbnb Experiences, other charter-specific marketplaces
Each platform task includes discovery phase (API capability matrix), implementation phase (authentication + outreach scheduling), and validation phase (end-to-end test with sandbox environment).
Google Apps Script Migration Preparation
Reviewed existing Apps Script files for clasp deployment readiness:
Files reviewed:
/Users/cb/Documents/repos/sites/queenofsandiego.com/FuneralOutreach.gs
/Users/cb/Documents/repos/sites/queenofsandiego.com/CrewDispatch.gs
/Users/cb/Documents/repos/sites/queenofsandiego.com/CrewScheduler.gs
/Users/cb/Documents/repos/sites/queenofsandiego.com/rady-shell-events/apps-script-replacement/
These scripts handle webhook routing, RSVP processing, and crew scheduling. Verified clasp project configuration exists; next phase involves containerizing deployment to prevent local-only script dependencies and enabling CI/CD integration.
Key Architectural Decisions
Why LaunchAgents Over Cron
LaunchAgents provide better error logging, automatic restart on failure, and user-friendly on/off toggles via macOS System Preferences. For multi-cadence campaigns where timing precision matters, this reduces operational overhead compared to cron job debugging.
Why S3 + CloudFront for Email Previews
Email clients strip external assets from HTML (images, CSS). However, campaign stakeholders need to review HTML mockups in browsers. CloudFront enables rapid deployment and cache busting; S3 provides version history and cost-effective storage.
Why SES Suppression List Integration
Hard bounces (invalid addresses, domain rejections) damage sender reputation. Complaint bounces (spam reports) trigger SES account reviews. Integrating suppression list checks into the outreach pipeline prevents both issues before emails are queued. The cost of a suppression list query is negligible compared to reputation recovery.
What's Next
- Platform integrations: Implement GetMyBoat API client, WeddingWire OAuth2 handler, and webhook processors
- Cadence personalization: Add hyper-local messaging (beach names, seasonal events) to follow-up templates
- Analytics dashboard: Build Looker Studio reports on send rates, bounce rates, and platform conversion metrics
- Apps Script containerization: Move Google Sheets-dependent scripts to Node.js/TypeScript with clasp deployment
- A/B testing framework: Implement template variants with statistical significance tracking
Session execution summary: 47 file modifications across marketing, tools, and infrastructure layers. All customer-facing content sanitized and redeployed. LaunchAgent scheduling configured for 4-cadence outreach pipelines. SES suppression list integration complete. Next phase focuses on external platform connectivity and personalization at scale.
```