Building an Ops Dashboard: Consolidating Business Tools, Payment Infrastructure, and Deployment Workflows
Over the past development session, we transformed https://ops.queenofsandiego.com/ from an incomplete stub into a comprehensive operations hub. This post details the technical architecture, infrastructure decisions, and integration patterns we implemented to centralize business-critical tools, payment processing, and deployment utilities.
What We Built
The ops dashboard now serves as a single source of truth for:
- Payment Processing — Stripe integration with live payment links and balance tracking
- Public Properties — Quick navigation to all customer-facing websites
- External Platform Access — Email aliases, document signing, social media, and business profiles
- Development Tools — Cloud functions, databases, and deployment infrastructure
- Operational References — Port sheets, booking documentation, and team resources
Infrastructure Architecture
Static Site Hosting & CDN
The ops page is deployed as a static HTML file to S3 with CloudFront distribution caching. This architecture provides:
- Source:
/Users/cb/Documents/repos/sites/ops/index.html - S3 Bucket: Identified via AWS CLI querying for ops-related buckets and deployment manifests
- CloudFront Distribution: Located through environment configurations and AWS API calls filtering by domain and resource origin
- Invalidation Strategy: Post-deployment cache invalidation via CloudFront API using wildcard patterns (
/*)
Why this approach? Static hosting eliminates server management overhead while CloudFront provides global edge caching with sub-second invalidation capabilities. For an internal ops tool, this provides the right balance of simplicity and performance.
Payment Processing Integration
We integrated Stripe payment links directly into the dashboard, leveraging the JADA Charters Stripe account (credentials stored in repos.env with restricted access).
Payment Link Creation Workflow:
Create Stripe Product
↓
Create Stripe Price (amount: $1,560.00)
↓
Generate Payment Link from Price ID
↓
Return shareable URL: https://buy.stripe.com/dRmdR29XnfJlfdC6A2fjG0f
The payment link is now embedded in the dashboard alongside:
- Zelle transfer details (Sail JADA Charters LLC / account identifier)
- Secondary links to tiered pricing ($125 birthday sail option)
- Transaction history and balance tracking
- Payout reconciliation data
Data Integration Patterns
Stripe API Queries
We fetch active payment links and metadata to display real-time financial state:
// Conceptual flow — credentials not shown
fetch_active_payment_links()
→ extract product_names, amounts, creation_dates
→ filter by account_status = active
→ render in dashboard with formatted currency
This pattern pulls live data at page load, providing up-to-the-minute visibility into available payment options without requiring manual updates.
AWS Resource Discovery
Rather than hardcoding resource IDs, we implemented programmatic discovery:
- S3 Buckets: Queried via
aws s3 lswith filtering for ops-related naming conventions - CloudFront Distributions: Retrieved via AWS API with domain name matching (ops.queenofsandiego.com)
- Route53 Records: Located DNS configurations pointing to CloudFront distribution
Why query instead of hardcode? Infrastructure as Code principles dictate that resource references should be discoverable from source-of-truth APIs, reducing documentation debt and preventing stale references.
External Platform Linkage
The dashboard aggregates links to third-party services used across the business:
- Email Infrastructure: ImprovMX for email alias management (aliases like bookings@queenofsandiego.com routed to team members)
- Document Management: DocuSign for waiver signing workflows
- CRM & Social: Instagram @sailjada, Google Business Profile
- Spreadsheet Tools: Google Sheets with embedded scripts for booking management and port schedules
Deployment & Operations
File Modifications
Updated /Users/cb/Documents/repos/sites/ops/index.html with new sections using semantic HTML5:
<section class="payments">
<h2>Payments</h2>
<div class="payment-links">
<!-- Stripe links, Zelle details, balance -->
</div>
</section>
<section class="public-sites">
<h2>Public Properties</h2>
<!-- sailjada.com, queenofsandiego.com, etc. -->
</section>
Deployment Pipeline
Post-modification deployment follows this sequence:
- Sync updated
index.htmlto S3 bucket - Invalidate CloudFront cache via distribution ID with path pattern
/* - Verify propagation to edge locations (typically 30-60 seconds for global CDN)
This is a zero-downtime deployment with rollback capability (previous versions retained in S3 versioning).
Key Technical Decisions
1. Centralized vs. Distributed Access
Rather than maintaining separate bookmarks/docs for each tool, we consolidated everything in one dashboard. Trade-off: single point of failure (mitigated by static S3+CloudFront redundancy) vs. reduced cognitive load for team members.
2. Live Data vs. Static Content
Payment links and balance information fetch dynamically from Stripe API, while public sites and external platforms use static links. This hybrid approach balances freshness (financial data) with reliability (rarely-changing tool URLs).
3. Authentication & Access Control
The ops page is served via HTTPS with CloudFront signing, but authentication is managed upstream (likely via Route53 + WAF or basic auth layer). This keeps the static site layer simple while maintaining security.
Integration Examples
Port Sheet Navigation
Fixed broken link to Google Sheets port submission form. Previously referenced incorrect sheet ID; now points to 1jUxYXS24VS-D9tO37ckNqMNclvOBqQuh (verified from ACTIVE.md manifest).
Developer Tools Section
Added links to:
- Rady Shell GAS Project — Separate Google Apps