Skip to main content

System Architecture

Detailed technical architecture of the FlowCampaign email campaign platform.

High-Level Architecture

Technology Stack

LayerTechnologyVersionPurpose
Frontend FrameworkReact18.xComponent-based UI
Build ToolVite5.xFast build and HMR
LanguageTypeScript5.xType safety across stack
StylingTailwind CSS3.xUtility-first CSS framework
UI ComponentsCustom Components-Apple Weather-style design
AnimationsFramer Motion12.xMicro-animations and transitions
RoutingReact Router6.xClient-side routing
State ManagementReact Context-Lightweight state management
HTTP ClientFetch API-Native browser fetch
Backend FrameworkHono4.xLightweight web framework
RuntimeCloudflare WorkersLatestServerless edge runtime
DatabaseSQLite3.xLocal/edge database
ORMDrizzle ORMLatestType-safe SQL queries
Database RuntimeCloudflare D1/Turso-Edge SQL database (optional)
Email ProvidersZeptoMail API-Primary email service
Email ProvidersSMTP-Fallback/custom SMTP
EncryptionWeb Crypto API-Credential encryption
Build Systemnpm workspaces-Monorepo management

Application Architecture

Monorepo Structure

email-campaign/
├── frontend/ # React SPA application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Page components
│ │ ├── features/ # Feature modules
│ │ ├── hooks/ # Custom React hooks
│ │ ├── contexts/ # React contexts
│ │ ├── layouts/ # Layout components
│ │ └── lib/ # Frontend utilities
│ └── public/ # Static assets
├── backend/ # Cloudflare Worker API
│ ├── src/
│ │ ├── routes/ # API route handlers
│ │ ├── services/ # Business logic services
│ │ ├── db/ # Database models and queries
│ │ └── middlewares/ # Request middleware
│ └── drizzle/ # Database migrations
└── shared/ # Shared code
├── types/ # TypeScript type definitions
├── utils/ # Shared utilities
├── constants/ # Shared constants
├── validators/ # Validation schemas
└── templates/ # Email templates

Frontend Architecture

Route Map

PathComponentPurposeAuth Required
/DashboardCampaign overview and KPIs
/loginLoginAuthentication page
/composeComposeCreate new email campaigns
/campaignsCampaignsView all campaigns
/contactsContactsManage contact lists
/providersProvidersEmail provider management
/templatesTemplatesEmail template library
/analyticsAnalyticsDetailed campaign analytics
/settingsSettingsPlatform configuration
/campaign/:id/statsCampaignStatsIndividual campaign stats
/campaign/:id/audienceCampaignAudienceCampaign recipient management
/campaign/:id/reviewCampaignReviewCampaign review before sending

Component Hierarchy

App (Root)
├── AuthProvider (Authentication context)
├── ThemeProvider (Light/dark theme)
├── Layout
│ ├── Sidebar (Navigation)
│ ├── Header (App header)
│ └── MainContent
│ └── Routes (Dynamic routing)
└── ToastProvider (Notifications)

Backend Architecture

API Layer (Hono on Cloudflare Workers)

Base URL: https://mails.nssoftwaresolutions.in

Route Groups:

Route GroupEndpointsPurpose
/api/campaignsGET, POST, PUT, DELETECampaign CRUD operations
/api/contactsGET, POST, PUT, DELETEContact management
/api/providersGET, POST, PUT, DELETEEmail provider management
/api/templatesGET, POST, PUT, DELETEEmail template management
/api/tracking/open/:idGETEmail open tracking pixel
/api/tracking/click/:idGETClick tracking redirect
/api/unsubscribe/:idGET, POSTUnsubscribe management
/api/webhooks/:providerPOSTEmail provider webhooks
/api/dashboardGETDashboard statistics
/api/settingsGET, PUTPlatform settings

Database Layer (Drizzle ORM)

Connection Strategy:

  • Development: Local SQLite file (local.db)
  • Production: Cloudflare D1 or Turso database
  • Migrations: Managed via Drizzle Kit

Type Safety:

  • Full TypeScript types for all tables
  • Schema validation at compile time
  • Type-safe queries with auto-completion

Email Tracking System Architecture

Open Tracking Flow

Click Tracking Flow

Tracking Implementation Details

Open Tracking Pixel:

<!-- Embedded in every email -->
<img
src="https://mails.nssoftwaresolutions.in/api/tracking/open/{{recipient_id}}"
width="1"
height="1"
style="display:none;"
alt=""
/>

Click Tracking Wrapper:

// URL transformation during email sending
function trackUrl(originalUrl, recipientId) {
const encodedUrl = encodeURIComponent(originalUrl);
return `https://mails.nssoftwaresolutions.in/api/tracking/click/${recipientId}?url=${encodedUrl}`;
}

Email Delivery Architecture

Multi-Provider Strategy

Provider Configuration

Credentials Encryption:

  • AES-256-GCM encryption for provider credentials
  • Unique initialization vector (IV) per provider
  • Encrypted credentials stored in database
  • Decryption only during email sending

Rate Limiting:

  • Daily and monthly email limits per provider
  • Automatic provider rotation when limits reached
  • Queue-based sending to respect provider limits
  • Real-time usage tracking

Database Schema Overview

Core Tables

  1. campaigns - Email campaign definitions
  2. campaign_recipients - Individual email recipients
  3. contacts - Contact information and metadata
  4. providers - Email provider configurations
  5. campaign_templates - Reusable email templates
  6. campaign_events - Tracking events (opens, clicks)
  7. activity_logs - Audit trail of system actions
  8. provider_usage - Provider usage statistics
  9. tags - Contact segmentation tags
  10. contact_tags - Contact-tag relationships
  11. settings - System configuration

Indexing Strategy

Performance Indexes:

  • idx_campaigns_status - Filter campaigns by status
  • idx_campaigns_created - Sort campaigns by creation date
  • idx_recipients_campaign - Fast recipient lookup by campaign
  • idx_recipients_status - Filter recipients by delivery status
  • idx_contacts_email - Unique email constraint
  • idx_providers_type - Filter providers by type
  • idx_usage_provider_date - Daily usage statistics

Security Architecture

Authentication & Authorization

JWT-based Authentication:

  • Edge-verified JWT tokens
  • Short-lived access tokens (15 minutes)
  • Secure token storage in memory
  • Automatic token refresh

Role-Based Access Control:

Data Protection

At Rest Encryption:

  • Provider credentials encrypted with AES-256-GCM
  • Unique IV per encryption operation
  • Encryption keys managed via environment variables

In Transit Security:

  • TLS 1.3 for all external communications
  • HTTPS-only API endpoints
  • Secure WebSocket connections for real-time updates

Input Validation:

  • Schema validation for all API inputs
  • SQL injection protection via parameterized queries
  • XSS prevention through output encoding
  • Rate limiting per IP and per account

Performance Optimization

Edge Caching Strategy

Cache Levels:

  1. Browser Cache: Static assets (JS, CSS, images)
  2. CDN Cache: API responses with appropriate headers
  3. Memory Cache: Frequently accessed data in Worker memory
  4. Database Cache: Materialized views for analytics

Cache Invalidation:

  • Time-based expiration (TTL)
  • Event-based invalidation
  • Manual cache clearing via admin interface

Database Optimization

Query Optimization:

  • Indexed queries for all common access patterns
  • Batch operations for bulk email sending
  • Connection pooling for database connections
  • Read replicas for analytics queries

Data Partitioning:

  • Campaign data partitioned by date
  • Contact data segmented by workspace
  • Event data sharded by campaign ID

Deployment Architecture

Cloudflare Workers Deployment

Continuous Deployment

Development Workflow:

  1. Local development with npm run dev
  2. Preview deployment via wrangler dev
  3. Production deployment via wrangler deploy
  4. Automatic rollback on failure

Monitoring & Observability:

  • Real-time error tracking via Cloudflare Analytics
  • Performance monitoring with Web Vitals
  • Email delivery tracking with provider webhooks
  • Custom dashboards for business metrics

Scalability Considerations

Horizontal Scaling

Stateless Workers:

  • Each request handled independently
  • No shared state between workers
  • Automatic load balancing across edge locations

Database Scaling:

  • SQLite → Turso for production scaling
  • Read replicas for analytics workloads
  • Connection pooling for high concurrency

Email Sending Scalability

Queue-Based Sending:

  • Asynchronous email delivery queues
  • Batch processing for efficiency
  • Retry logic with exponential backoff
  • Dead letter queue for failed deliveries

Provider Optimization:

  • Intelligent provider selection
  • Parallel sending to multiple providers
  • Dynamic rate limit adjustment
  • Cost optimization across providers