Implementing Privacy-First Marketing Infrastructure: Removing Personal Identifiers from Public-Facing Email Campaigns
What Was Done
During this development session, we identified and systematically removed all personal name references from public-facing marketing materials across the JADA platform ecosystem. The work involved auditing email templates, website assets, and automation scripts, then redeploying cleaned versions to production infrastructure. This change reflects a broader privacy-first philosophy: marketing materials should represent the organization and team, not individual founders.
The Discovery: Name References in Production Materials
A code review of the SDCC (San Diego Comic-Con) hotel outreach email campaign revealed personal name references in task descriptions and email templates. Specifically, introductory copy stating "I'm C.B. Ladd, owner of JADA" appeared in the email preview stored in S3. While the core campaign mechanics were sound—boat imagery was live, SES bounce lists were clean, and suppression logic was functional—the marketing messaging needed to change.
This required a comprehensive audit across multiple repos:
/Users/cb/Documents/repos/tools/— Python automation and blast scripts/Users/cb/Documents/repos/sites/queenofsandiego.com/— Primary domain assets and Google Apps Script files/Users/cb/Documents/repos/sites/dangerouscentaur/— Demo and secondary brand sites/tmp/— Temporary staging files for email HTML
Technical Implementation: Audit and Remediation
Phase 1: Email Template Cleanup
The SDCC hotel outreach HTML email template was downloaded from S3 and reviewed. The problematic copy was replaced with team-focused language emphasizing JADA and the Queen of San Diego brand identity. The cleaned version was then:
- Validated for broken image links (all boat photos confirmed 200 OK)
- Re-uploaded to the S3 bucket:
s3://jada-assets/sdcc-hotel-outreach-2026.html - CloudFront cache invalidated using distribution ID to ensure immediate propagation
Command pattern for cleanup:
grep -r "C.B. Ladd" /tmp/sdcc-hotel-outreach-2026.html
# Replace with team/org references, validate links
aws s3 cp sdcc-hotel-outreach-2026.html s3://jada-assets/
aws cloudfront create-invalidation --distribution-id [DIST_ID] --paths "/*"
Phase 2: Codebase Audit Across Multiple Repositories
A recursive search was performed across all public-facing code and configuration files to identify remaining references:
Google Apps Script Files (GAS):
/Users/cb/Documents/repos/sites/queenofsandiego.com/FuneralOutreach.gs— Contact automation, 4 edits/Users/cb/Documents/repos/sites/queenofsandiego.com/CrewDispatch.gs— Crew assignment logic, 4 edits/Users/cb/Documents/repos/sites/queenofsandiego.com/CrewScheduler.gs— Scheduling automation, 1 edit/Users/cb/Documents/repos/sites/queenofsandiego.com/rady-shell-events/apps-script-replacement/WorshipRsvp.gs— RSVP processing/Users/cb/Documents/repos/sites/queenofsandiego.com/rady-shell-events/apps-script-replacement/ViatorApiFollowUp.gs— Third-party API integration
These scripts handle backend automation and are never rendered to users, but were still reviewed for consistency.
HTML/Demo Sites (Public-Facing):
/Users/cb/Documents/repos/sites/dangerouscentaur/demos/3028fiftyfirststreet.92105.dangerouscentaur.com/index.html/Users/cb/Documents/repos/sites/dangerouscentaur/demos/demo.dangerouscentaur.com/index.html/Users/cb/Documents/repos/sites/progress.queenofsandiego.com/index.html/Users/cb/Documents/repos/sites/queenofsandiego.com/managercandy/index.html
All references were removed and corrected versions deployed to S3 + CloudFront.
Phase 3: Python Tooling and Automation
The main blast tool at /Users/cb/Documents/repos/tools/jada_blast.py underwent multiple iterations (4 edits) to ensure:
- Template loading logic references cleaned email versions
- Personalization tokens use organization/team names, not personal names
- Default sender display names reflect brand identity
A new outreach orchestration script was created:
/Users/cb/Documents/repos/tools/send_hotel_outreach.py
This script coordinates the SDCC hotel campaign with proper cadence and suppression list integration.
Infrastructure and Deployment
launchd Automation
Four scheduled tasks were configured in ~/Library/LaunchAgents/ to run the hotel outreach campaign at controlled intervals:
com.jada.hotel-outreach-initial.plist— Initial contact blastcom.jada.hotel-outreach-followup1.plist— First follow-up sequencecom.jada.hotel-outreach-followup2.plist— Second follow-up sequencecom.jada.hotel-outreach-breakup.plist— Final non-responder cutoff
Each plist references the cleaned send script and uses SES suppression list data to avoid bounce addresses.
S3 and CloudFront Coordination
Assets were deployed to:
s3://jada-assets/— Email templates, HTML demos, static content- CloudFront distributions invalidated for immediate cache refresh
- Route53 DNS remained unchanged; all existing records point to CloudFront distributions
Key Decisions and Reasoning
1. Why Full Codebase Audit? Even internal GAS scripts were reviewed for consistency. While users never see these files, maintaining brand voice uniformity across all code reduces confusion during debugging and team handoffs.
2. Why Remove Names at All? Public criticism and brand perception concerns make personal identifiers in marketing liabilities. The JADA brand and Queen of San Diego team identity are stronger, more professional, and shield individual founders from unwanted attention.
3. Why Coordinate CloudFront Invalidation? Email campaigns reference HTML templates in S3. Without cache invalidation, cached versions could serve outdated copy for hours. Immediate invalidation ensures all new sends use corrected templates.