```html

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.

```