Removing Personal Identity from Public Marketing Infrastructure: A Multi-System Approach
This post documents the technical implementation of a critical business requirement: eliminating personal name references from all customer-facing marketing assets across JADA's distributed infrastructure. The directive came from a straightforward business reality—public marketing shouldn't carry the baggage of individual identity. Instead, we branded around organizational identity (JADA, Queen of San Diego, the team concept) and technical infrastructure patterns that allowed us to execute this change comprehensively across email templates, web properties, and automation tools.
The Problem: Scattered Personal References
A routine audit of email campaign content (task card t-f4b3c880) revealed personal name references embedded across multiple systems:
- Email templates in S3-backed CloudFront distributions
- HTML demo sites in the dangerouscentaur domain structure
- Google Apps Script files driving crew dispatch and event management
- Python automation tools for blast campaigns
- Internal progress dashboards exposed to external visibility
The challenge wasn't technical complexity—it was surface area. These references were distributed across heterogeneous systems with different deployment patterns, caching layers, and access controls. A naive find-and-replace would miss some instances while creating deployment inconsistencies.
Technical Approach: Layered Remediation
Phase 1: Email Infrastructure (S3 + CloudFront)
The SDCC hotel outreach campaign emails live in S3 and are delivered through CloudFront distributions. We:
- Downloaded the live email template HTML from S3 using standard AWS CLI tooling
- Performed targeted text replacement: personal name → "the JADA team" / "Queen of San Diego event team"
- Re-uploaded the sanitized HTML to the same S3 key
- Invalidated the CloudFront distribution cache to force edge re-fetch
The invalidation command pattern:
aws cloudfront create-invalidation \
--distribution-id [DISTRIBUTION_ID] \
--paths "/email-templates/*"
Why this approach: CloudFront caching is aggressive (TTL often 86400+ seconds). Without invalidation, users would see stale content for hours. The invalidation propagates across all 200+ edge locations within seconds.
Phase 2: Static Web Properties (dangerouscentaur Sites)
Three separate demo sites in the dangerouscentaur structure contained personal references:
/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
Process:
- Scanned each HTML file for name patterns using
grepwith case-insensitive matching - Hand-verified matches to avoid false positives (e.g., legitimate internal documentation)
- Edited files locally, replacing context-appropriate references
- Uploaded sanitized versions to their respective S3 buckets
- Invalidated CloudFront distribution caches
Key decision: We maintained internal proof-of-work documentation (internal-only wikis, README files) unchanged. The rule was simple—if a file is part of the deployment artifact served to customers, it gets sanitized. Internal repositories can retain full context.
Phase 3: Google Apps Script Automation
Apps Script files drive critical operational workflows:
FuneralOutreach.gs– manages funeral service event outreachCrewDispatch.gs– coordinates crew schedulingViatorApiFollowUp.gs– Viator API integration for tour follow-upsCrewScheduler.gs– crew availability and assignment
These files were modified in place (no deployment required—Apps Script auto-syncs) with name references replaced by role descriptions ("dispatch coordinator", "event team", etc.). The changes are effective immediately for new script executions.
Why Apps Script needed careful handling: These scripts generate emails and internal communications. References here affected both internal and external messages. We preserved functional references (email sender identification in logs) but removed personal branding.
Phase 4: Python Automation and Blast Tools
The primary blast tool /Users/cb/Documents/repos/tools/jada_blast.py went through multiple iterations during this session:
- Email template references were updated to point to sanitized versions
- Comments and internal documentation were revised
- The script itself is not customer-facing, but it generates customer-facing output, so this was a necessary layer
Companion tools like send_hotel_outreach.py (newly created for SDCC campaign) were built with the naming conventions pre-applied.
Infrastructure and Deployment Specifics
S3 Buckets and CloudFront Distributions
The hotel outreach email preview lives at a specific S3 key path. Direct uploads to that key trigger CloudFront invalidations. The workflow uses standard AWS SDK patterns—no custom infrastructure required.
CloudFront distribution invalidations create a task that completes within 1-2 minutes. During this window, some edge locations may serve stale content, but the eventual consistency is guaranteed.
LaunchAgents for Scheduled Campaigns
New plist files were created to orchestrate scheduled outreach campaigns:
/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-initial.plist/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-followup1.plist/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-followup2.plist/Users/cb/Library/LaunchAgents/com.jada.hotel-outreach-breakup.plist
These files reference the sanitized email templates and execute send_hotel_outreach.py on schedules. The plist format is macOS-specific, which aligns with JADA's current deployment architecture.
Verification and Edge Cases
A comprehensive sweep identified edge cases:
- SES Suppression Lists: Bounce/complaint records already anonymized in AWS SES; no action needed
- Email Headers: SMTP sender fields in automated emails were reviewed; operational identity maintained without personal branding
- Internal vs. External: Documentation and internal-use files were explicitly excluded from sanitization
- Comments in Code: Code comments containing references were updated for consistency and maintainability
Key Architectural Decisions
Why not use templating variables for all names? Some infrastructure doesn't support runtime templating (static HTML delivered via Cloud