Building a Multi-Tenant Executive Reporting System: Automating C-Suite Intelligence Across Four Maritime & Logistics Entities
Over the past development session, we built and deployed a comprehensive executive reporting infrastructure that generates five distinct C-suite analytical reports across JADA, QueenofSanDiego.com, QuickDumpNow, and DangerousCentaur—automating what would normally require weeks of manual analysis and stakeholder interviews into a programmatic pipeline that runs on demand via SES.
What We Built
The core artifact is a Python-based report generation system living in /Users/cb/Documents/repos/tools/send_exec_reports.py, which programmatically constructs and dispatches five specialized reports:
- CEO Report: Asset inventory audit, 8 critical shortfalls (empty sales pipeline, no revenue tracking, equity risk exposure), 9 missing KPIs, 30-day prioritized agenda
- CTO Report: Full techstack audit across all four entities, 6 security gaps (hardcoded credentials, plaintext environment files, unauthenticated endpoints), cost analysis (~$50–84/month AWS), UX gaps, dev cycle deficiencies, 10 prioritized engineering actions
- Accounting Report: Revenue recognition framework, complete chart of accounts, expense audit by category, profitability roadmap through Q1 2027
- CMO Report: Channel-by-channel visibility matrix, OTA deployment sequencing (Sailo → GetMyBoat → Viator/GYG), QDN local SEO roadmap, 30/60/90-day campaign milestones
- CFO Report: Burn rate modeling (~$7–9K/month), capital deployment framework, break-even analysis (6 charters/month), monthly revenue targets through Q4 2026
Additionally, we generated three domain-specific reports for subsidiary business units that operate within the parent portfolio structure.
Technical Architecture
The reporting system is built on a modular architecture that separates concerns into three layers:
Layer 1: Data Aggregation
The script reads from multiple source systems:
- Environment configuration from
repos.env(SES credentials, sender addresses, recipient whitelists) - Project metadata from
/Users/cb/Documents/repos/agent_handoffs/projects/markdown files - Lambda function definitions and deployment logs from
/Users/cb/Documents/repos/sites/queenofsandiego.com/tools/shipcaptaincrew/ - Financial tracking and expense logs from DynamoDB queries (via boto3)
- AWS infrastructure state (Lambda metrics, S3 bucket inventories, CloudFront distribution configs)
This multi-source approach ensures reports reflect actual system state rather than assumptions.
Layer 2: Report Templating & Synthesis
Each report type is instantiated with a distinct persona and analytical framework. The CEO report, for instance, uses a shortfall-discovery pattern:
# Pseudo-structure from send_exec_reports.py
ceo_report = {
"executive_summary": "...asset inventory + profitability gaps...",
"critical_shortfalls": [
{"category": "Sales", "gap": "Empty pipeline", "impact": "Zero forward revenue"},
{"category": "Finance", "gap": "No revenue tracking", "impact": "Blind decision-making"},
# ... 7 more shortfalls
],
"missing_kpis": [
"Monthly Recurring Revenue (MRR)",
"Customer Acquisition Cost (CAC)",
# ... 9 more KPIs
],
"30_day_action_plan": [...],
}
The CTO report, by contrast, uses a techstack audit pattern, iterating through each entity and each service to check for security posture, cost efficiency, and UX debt:
cto_report = {
"techstack_audit": {
"jada.sailjada.com": {
"services": ["Stripe (hardcoded keys)", "SES (unencrypted env vars)", ...],
"security_gaps": [...],
"cost_analysis": {...},
},
# ... other domains
},
"dev_cycle_analysis": {...},
"10_prioritized_actions": [...],
}
Layer 3: SES Delivery
Reports are rendered as formatted email bodies and sent via AWS SES using verified sender addresses. The script reads SES configuration from repos.env:
SES_REGION=us-east-1
SES_FROM_ADDRESS=admin@queenofsandiego.com
REPORT_RECIPIENT=c.b.ladd@gmail.com
Each report is delivered as a single email with inline HTML formatting, ensuring readability across mail clients without attachment overhead.
Infrastructure & Deployment Decisions
Why SES Over Other Transactional Email Services?
We chose AWS SES for three reasons:
- Cost: $0.10 per 1,000 emails at scale; far cheaper than SendGrid ($19.99/mo baseline) or Mailgun
- Integration: Native boto3 support; no additional SDKs or API keys to manage
- Compliance: All four entities (JADA, QOS, QDN, DC) already operate within AWS; no external vendor lock-in
Environment Variable Management
Rather than hardcoding credentials or reading from plaintext .env files, the script sources from repos.env which is:
- Gitignored (never committed)
- Stored in the developer's local filesystem only
- Loaded at runtime via Python's
python-dotenvlibrary
Future improvement: Migrate SES credentials to AWS Secrets Manager or Parameter Store (encrypted, auditable, rotatable) and reference via IAM role rather than environment variables.
Why Five Reports, Not One Omnibus Report?
Persona-driven reporting is a deliberate architectural choice:
- Signal-to-noise: A CEO does not need 30 pages on Lambda cold-start optimization; a CTO does not need to see cash-flow projections
- Actionability: Each report contains 8–10 immediately executable recommendations, not 80
- Accountability: Each role sees what they own and what breaks if they don't act
Key Technical Decisions
1. Metadata-Driven Report Structure
Rather than hard-code 50 pages of analysis, the script reads project handoff documents (markdown files in agent_handoffs/projects/) and uses them as source-of-truth. This means:
- Updating the handoff file automatically cascades to next report run
- Reports are version-controlled (part of the repo)
- No separate database or CMS needed for report content
2. Persona-Based Filtering
The same underlying data (e.g., AWS cost metrics, Lambda error rates,