36 KiB
FEATURES.md - EZSCALE Site Feature Specifications
Overview
This document details all feature decisions made during planning. Reference this when building specific features.
1. Coupon & Discount System
Coupon Types
- Percentage discount (e.g., 20% off)
- Fixed amount (e.g., $10 off)
- Free trial extensions (e.g., extend trial by 7 days)
Advanced Restrictions
- Expiry dates
- Maximum uses (total and per customer)
- First purchase only
- Specific plans/services
- Minimum order value
- Recurring vs one-time discounts
- Stackable coupons (allow multiple coupons per order)
- User groups (coupons for specific customer segments)
- Geographic restrictions (US-only coupons, EU-only, etc.)
- A/B testing support (track conversion by coupon)
Database Schema Addition
coupons table:
├── stackable (boolean - can be combined with other coupons)
├── user_group (nullable - admin, vip, new_customer, etc.)
├── allowed_countries (JSON array - e.g., ["US", "CA", "GB"])
├── blocked_countries (JSON array)
├── conversion_tracking (boolean - track for analytics)
├── variant_id (nullable - for A/B testing)
2. Plan Changes & Billing
Upgrade/Downgrade Logic
- Immediate proration for plan changes
- Calculate unused time credit on current plan
- Apply credit to new plan price
- Charge/credit difference immediately
- Update service resources immediately (VirtFusion/Pterodactyl API calls)
Example Calculation
Customer on $10/month VPS (30 days), used 10 days
Upgrades to $20/month VPS
Credit: $10 * (20 days / 30 days) = $6.67
New charge: $20 - $6.67 = $13.33
Implementation Notes
- Use Laravel Cashier's
swap()method for Stripe subscriptions - For PayPal, manually calculate and create new subscription
- Queue API calls to update VPS resources
- Send confirmation email with proration details
3. Payment Retry & Dunning
Strategy
- Use Stripe Smart Retries (built-in dunning management)
- Stripe automatically retries failed payments with ML-optimized timing
- Laravel webhooks listen for payment failure events
Our Enhancement
- On payment failure event:
- Send customer email with retry schedule
- Add grace period (7 days) before suspension
- Send reminder at 3 days before suspension
- Suspend service if still unpaid
- Discord webhook alert for high-value customer failures
Configuration
// config/billing.php
'dunning' => [
'grace_period_days' => 7,
'suspension_warning_days' => 3,
'termination_days' => 30, // 30 days after suspension
],
4. Datacenter & Location Management
Per-Plan Location
- Plans are tied to specific datacenters
- Example: "VPS-Basic-US-East", "VPS-Basic-EU-West"
- Different pricing per location (if applicable)
Database Schema
plans table:
├── datacenter_location (string - us-east, us-west, eu-west, ap-southeast)
├── datacenter_code (string - NYC1, LAX2, AMS1, SG1)
├── location_display_name (string - "New York, USA")
datacenters table (new):
├── id
├── code (NYC1, LAX2, etc.)
├── name (New York - US East)
├── location (city, country)
├── available_services (JSON - ['vps', 'dedicated', 'hosting'])
├── status (active, maintenance, full)
VirtFusion Integration
- Each datacenter maps to a VirtFusion region/hypervisor group
- Provisioning service selects appropriate hypervisor based on plan's datacenter
5. Customer Onboarding
Guided Onboarding Flow
- Email verification - Confirm email address
- Profile completion - Company name, address (for tax calculations)
- Payment method - Add credit card or PayPal
- Plan selection - Choose service and datacenter
- Service provisioning - Automated provisioning begins
- Welcome tour - Brief overlay tour of dashboard features
Implementation
- Use Laravel Multi-Step Forms or similar
- Store progress in session
- Allow skipping steps (except email verification)
- Show progress bar: "Step 2 of 5"
Post-Onboarding
- Redirect to service provisioning status page
- Email: "Your VPS is being provisioned" (ETA: 5 minutes)
- Email: "Your VPS is ready!" (includes credentials, getting started guide)
- Dashboard widget: "Next steps" (upload SSH key, configure firewall, install software)
6. Loyalty Rewards Program
Automatic Tenure-Based Discounts
| Tenure | Discount |
|---|---|
| 1+ years | 5% off recurring |
| 2+ years | 10% off recurring |
| 3+ years | 15% off recurring |
| 5+ years | 20% off recurring |
Implementation
- Scheduled job runs monthly to update customer discount tiers
- Apply discount as automatic coupon on renewals
- Display loyalty badge in dashboard: "Loyal Customer - 5% Discount"
- Email notification when customer reaches new tier
Database Schema
users table additions:
├── customer_since (timestamp - first paid invoice date)
├── loyalty_tier (integer - 0, 1, 2, 3, 5 years)
├── loyalty_discount_percent (decimal - calculated discount)
7. Dedicated Server Waitlist
Notify When Available Approach
- Customer signs up for email notifications
- No payment or reservation
- When inventory available, send email blast to waitlist
- First-come, first-served checkout
Waitlist Features
- Show estimated wait time (based on average turnover)
- Let customer specify desired specs (RAM, CPU, disk)
- Email when exact match available
- Email when close match available
Database Schema
server_waitlist table:
├── id
├── user_id
├── plan_id (nullable - if waiting for specific plan)
├── desired_specs (JSON - RAM, CPU, disk requirements)
├── datacenter_preference (nullable)
├── notified_at (nullable - when we sent availability email)
├── status (waiting, notified, fulfilled, cancelled)
├── created_at, updated_at
8. Custom Pricing for Enterprise
Admin Custom Plan Creation
- Admin can create one-off plans for specific customers
- Set custom pricing, billing cycle, features
- Plan is private (not visible in public catalog)
- Assigned to specific customer only
Implementation
plans table additions:
├── visibility (public, private, archived)
├── assigned_user_id (nullable - for private plans)
├── is_custom (boolean - marked as custom pricing)
Admin UI
- Button: "Create Custom Plan for Customer"
- Form: Base on existing plan, modify price and features
- Auto-generate plan name: "Custom VPS - John Doe - $45/month"
9. GDPR Data Deletion
Automated Process
- Customer requests deletion from account settings
- System creates data deletion request (7-day waiting period)
- Email confirmation: "Your account will be deleted in 7 days"
- After 7 days, automated job runs:
- Terminate all active services
- Anonymize personal data (name → "Deleted User #12345")
- Keep financial records (invoices, payments) with anonymized data
- Delete: email, phone, address, notes, login history
- Retain: subscription IDs, amounts, dates (for accounting/tax)
- Email confirmation: "Your data has been deleted"
Database Schema
data_deletion_requests table:
├── id
├── user_id
├── requested_at
├── scheduled_for (requested_at + 7 days)
├── completed_at (nullable)
├── status (pending, processing, completed, cancelled)
Compliance
- Compliant with GDPR "right to be forgotten"
- Retain minimum data required by law (7 years for tax records)
- Provide data export (download all data as JSON/PDF) before deletion
10. Uptime Monitoring
Built-In Monitoring System
- Platform pings customer services every 5 minutes
- HTTP/HTTPS checks for web hosting
- ICMP ping for VPS/dedicated
- Game server query for Pterodactyl services
Features
- Uptime percentage displayed in dashboard
- Incident log (downtime events with duration)
- Customer can set up alert preferences (email, Discord webhook)
- Public status page shows overall platform health
Database Schema
uptime_checks table:
├── id
├── service_id
├── check_type (http, ping, game_query)
├── check_url_or_ip
├── status (up, down, degraded)
├── response_time_ms
├── checked_at
uptime_incidents table:
├── id
├── service_id
├── started_at
├── ended_at (nullable - ongoing)
├── duration_seconds
├── notified (boolean - customer was alerted)
11. Real-Time Dashboard Updates
Combination Approach
-
Real-time (WebSockets) for:
- New orders/subscriptions
- Critical alerts (provisioning failures, payment failures)
- Customer support tickets
- Admin notifications
-
Periodic refresh (polling) for:
- Analytics charts (every 60 seconds)
- Service status (every 30 seconds)
- Bandwidth graphs (every 5 minutes)
Implementation
- Use Laravel Reverb (or Pusher) for WebSockets
- Channel:
admin.{admin_id}for personal admin notifications - Channel:
customer.{user_id}for customer notifications - Broadcast events:
OrderCreated,ServiceProvisioned,PaymentFailed
12. Multi-Channel Admin Alerts
Alert Routing
| Alert Type | Discord | SMS (Twilio) | |
|---|---|---|---|
| New order | ✓ | ✗ | ✗ |
| High-value order (>$500) | ✓ | ✓ | ✓ |
| Payment failure | ✓ | ✗ | ✗ |
| Provisioning failure | ✓ | ✓ | ✓ |
| System error | ✓ | ✓ | ✗ |
| Security alert (failed admin login) | ✓ | ✓ | ✓ |
| Service cancellation | ✓ | ✗ | ✗ |
Configuration
// config/alerts.php
'channels' => [
'discord' => env('DISCORD_WEBHOOK_URL'),
'email' => env('ADMIN_ALERT_EMAIL'),
'sms' => [
'enabled' => env('SMS_ALERTS_ENABLED', false),
'twilio_sid' => env('TWILIO_SID'),
'twilio_token' => env('TWILIO_TOKEN'),
'phone_numbers' => explode(',', env('ADMIN_PHONE_NUMBERS')),
],
],
13. Public Status Page
Built-In Status Page (status.ezscale.cloud)
-
System Status: All systems operational / Degraded / Major outage
-
Service Components:
- VirtFusion API
- Pterodactyl Panel
- SynergyCP
- Enhance
- Billing System
- Customer Portal
- ElastiFlow (Bandwidth Monitoring)
-
Incidents: Current and past incidents with updates
-
Scheduled Maintenance: Upcoming maintenance windows
-
Uptime Stats: 90-day uptime graph per component
Features
- Public page (no login required)
- RSS feed for status updates
- Customer can subscribe to status notifications
- Admin can post incidents and updates
- Auto-create incidents from monitoring (optional)
Database Schema
status_components table:
├── id
├── name (VirtFusion API, Billing System, etc.)
├── status (operational, degraded, outage)
├── description
├── group (Infrastructure, Billing, Control Panels)
├── sort_order
status_incidents table:
├── id
├── title
├── description
├── status (investigating, identified, monitoring, resolved)
├── severity (minor, major, critical)
├── affected_components (JSON array of component IDs)
├── started_at
├── resolved_at (nullable)
status_updates table:
├── id
├── incident_id
├── message
├── status_change (investigating → identified)
├── posted_at
14. Abuse Management System
Full Abuse Management Module
- Dedicated abuse ticket queue (separate from support)
- Abuse report submission form (public, for reporting abuse)
- Automated abuse detection (optional - DMCA API, spam blacklist checks)
- Service auto-suspension for severe abuse (CSAM, phishing)
Abuse Workflow
- Abuse report received (email, web form, API)
- Create abuse ticket (high priority)
- Notify admin via Discord + email
- Admin investigates, views customer history
- Options:
- Warn customer (send abuse notice email)
- Suspend service immediately
- Request content removal (give customer X hours)
- Terminate account (severe violations)
- Track abuse history per customer
- Escalate repeat offenders automatically
Database Schema
abuse_reports table:
├── id
├── service_id (nullable - may not know which service yet)
├── user_id (nullable - determined after investigation)
├── reporter_email
├── reporter_name (nullable)
├── abuse_type (spam, copyright, phishing, illegal_content, other)
├── description
├── evidence (JSON - URLs, headers, attachments)
├── status (new, investigating, resolved, dismissed)
├── assigned_admin_id (nullable)
├── resolved_at (nullable)
abuse_actions table:
├── id
├── abuse_report_id
├── action_type (warning, suspension, termination, content_removal)
├── taken_by_admin_id
├── notes
├── created_at
customer_abuse_history:
├── user_id
├── total_reports
├── resolved_reports
├── warnings_sent
├── suspensions
├── risk_score (calculated - higher score = more likely to abuse)
15. Fraud Detection
Automated Fraud Scoring
- Check on signup/checkout before provisioning
- Assign risk score 0-100
- Auto-reject if score > 90
- Flag for manual review if score 50-90
- Auto-approve if score < 50
Fraud Signals
- Email: Disposable email domains (mailinator, guerrilla mail), newly created Gmail/Outlook
- IP Address: VPN/proxy detection, high-risk countries, IP mismatch with billing address
- Payment: Prepaid cards, multiple failed attempts, card BIN country mismatch
- Behavioral: New account placing large order, unusual order patterns
- Velocity: Multiple accounts from same IP in short time
Third-Party Services
- MaxMind MinFraud - IP and transaction risk scoring
- Stripe Radar - Built-in fraud detection
- Email verification API - Validate email deliverability
Implementation
// app/Services/Fraud/FraudDetectionService.php
public function calculateRiskScore(User $user, Order $order): int
{
$score = 0;
// Disposable email +30
if ($this->isDisposableEmail($user->email)) $score += 30;
// VPN/proxy +20
if ($this->isVpnOrProxy($user->ip_address)) $score += 20;
// High-risk country +15
if ($this->isHighRiskCountry($user->country)) $score += 15;
// ... more checks
return min($score, 100);
}
16. Game Server Templates
Template Library
- Pre-configured templates for popular games
- One-click deployment from customer dashboard
- Admin can create/manage custom templates
Supported Games (Initial)
- Minecraft (Vanilla, Spigot, Paper, Forge, Fabric)
- ARK: Survival Evolved
- Rust
- Counter-Strike 2
- Palworld
- Valheim
- Terraria
- 7 Days to Die
- Team Fortress 2
- Garry's Mod
Template Features
- Default server configuration
- Recommended plugins/mods
- Startup parameters
- Port configurations
- Resource requirements (min RAM, CPU)
Database Schema
game_templates table:
├── id
├── game_name (Minecraft, ARK, etc.)
├── template_name (Vanilla 1.20, Spigot, etc.)
├── pterodactyl_egg_id
├── description
├── icon_url
├── default_config (JSON - startup params, server.properties, etc.)
├── min_ram_mb
├── recommended_ram_mb
├── min_cpu_cores
├── status (active, deprecated)
├── sort_order
17. Backups (Included in Plans)
Backup Features
- Daily automated backups for VPS/hosting
- Retention: 7 daily, 4 weekly, 3 monthly
- Customer can restore from dashboard (self-service)
- Backups stored on separate infrastructure (not same as service)
Backup Storage
- Use S3-compatible storage (Wasabi, Backblaze B2, MinIO)
- Encrypted backups
- Compression to save space
Implementation
- VirtFusion API: backup VPS snapshots
- Enhance API: backup hosting accounts
- Pterodactyl: backup game server files (via API or direct)
- SynergyCP: backup dedicated server config (customer responsible for data)
Database Schema
backups table:
├── id
├── service_id
├── backup_type (daily, weekly, monthly, manual)
├── size_bytes
├── storage_path (S3 URL or path)
├── status (pending, completed, failed, restoring)
├── created_at
├── expires_at (based on retention policy)
backup_restores table:
├── id
├── backup_id
├── service_id
├── requested_by_user_id
├── status (pending, in_progress, completed, failed)
├── created_at
18. Platform Backups
15-Minute RPO (Recovery Point Objective)
- MySQL binary logs replicated in real-time
- Transaction log backups every 15 minutes
- Full database backup daily
- Test restores weekly (automated)
Multi-Region Replication
- Master database in primary datacenter
- Read replica in secondary datacenter (async replication)
- Automatic failover to replica if master fails
Backup Retention
- 15-minute transaction logs: 7 days
- Daily full backups: 30 days
- Weekly full backups: 90 days
- Monthly backups: 1 year
Implementation
- Use MySQL Enterprise Backup or Percona XtraBackup
- Store backups in S3 with versioning enabled
- Encrypt backups at rest (AES-256)
19. IPv4 + IPv6 Dual-Stack
IP Allocation
-
All VPS and dedicated servers get:
- 1x IPv4 address (included)
- /64 IPv6 subnet (included)
-
Web hosting:
- Shared IPv4 (multiple sites per IP)
- Shared IPv6
-
Game servers:
- 1x IPv4 (included)
- IPv6 optional (most game clients don't support)
Additional IPv4 Addresses
- Customer requests additional IPs via ticket
- Must provide justification (SSL certificates, multiple services, etc.)
- Admin reviews and approves
- Pricing: $3-5/month per additional IPv4
IPAM (IP Address Management)
- Track IP allocation in database
- Prevent duplicate assignments
- RDNS (reverse DNS) management
- SWIP (Shared Whois Project) for larger allocations
Database Schema
ip_addresses table:
├── id
├── ip_address (IPv4 or IPv6)
├── ip_version (4 or 6)
├── type (dedicated, shared)
├── service_id (nullable)
├── datacenter_id
├── status (available, allocated, reserved)
├── rdns_hostname (nullable)
├── notes
ip_requests table:
├── id
├── user_id
├── service_id
├── ip_version (4 or 6)
├── quantity
├── justification
├── status (pending, approved, rejected)
├── reviewed_by_admin_id
├── created_at
20. Invoice Numbering
Sequential Format: INV-000001
- Simple incrementing counter
- Never resets
- Starts at INV-000001
- Auto-increments for each invoice
- Zero-padded to 6 digits
Implementation
// Generate next invoice number
$lastInvoiceNumber = DB::table('invoices')
->orderBy('number', 'desc')
->value('number');
$nextNumber = $lastInvoiceNumber
? intval(substr($lastInvoiceNumber, 4)) + 1
: 1;
$invoiceNumber = 'INV-' . str_pad($nextNumber, 6, '0', STR_PAD_LEFT);
// Result: INV-000001, INV-000002, ..., INV-123456
Database
invoices table:
├── number (unique, indexed - INV-000001)
├── stripe_invoice_id (nullable - for Stripe invoices)
├── paypal_invoice_id (nullable - for PayPal)
21. Team Accounts & Sub-Users
Full Team Support
- Primary account owner (billing access)
- Add team members with granular permissions
- Each team member gets own login (separate email)
Permission Levels
| Permission | Description |
|---|---|
| Owner | Full access (billing, services, team management) |
| Billing Manager | View and pay invoices, manage payment methods |
| Technical Admin | Manage services (reboot, reinstall, view credentials) |
| Read-Only | View services and billing, no modifications |
| Custom | Admin defines specific permissions |
Features
- Owner can invite team members via email
- Team members accept invitation, create account
- Audit log shows which team member performed actions
- Owner can revoke access anytime
Database Schema
team_members table:
├── id
├── account_owner_id (references users.id)
├── team_member_user_id (references users.id)
├── role (owner, billing_manager, technical_admin, read_only, custom)
├── permissions (JSON - for custom roles)
├── invited_at
├── accepted_at (nullable)
├── status (invited, active, revoked)
team_invitations table:
├── id
├── account_owner_id
├── email
├── role
├── token (unique invitation token)
├── expires_at
├── accepted_at (nullable)
22. Referral Credits
Referral Program
- Customer gets unique referral link:
ezscale.cloud/ref/ABC123 - When referred friend signs up and pays first invoice:
- Referrer gets $10 account credit
- New customer gets $5 account credit
- Credits apply to future invoices automatically
Tracking
- Referral link parameter stored in session/cookie
- When customer registers, store referrer ID
- When first invoice paid, trigger credit issuance event
Database Schema
referrals table:
├── id
├── referrer_user_id
├── referred_user_id
├── referral_code (unique - ABC123)
├── status (pending, completed, credited)
├── credit_amount_referrer
├── credit_amount_referred
├── referred_at
├── first_payment_at (nullable)
├── credited_at (nullable)
account_credits table:
├── id
├── user_id
├── amount
├── source (referral, loyalty, admin_granted, promotional)
├── description
├── applied_to_invoice_id (nullable)
├── expires_at (nullable - credits can expire)
├── created_at
23. Free Trial System
Free Trial Configuration
- Trial length: 7 days (configurable per plan)
- Requires payment method (but not charged)
- Full service access during trial
- Auto-convert to paid subscription after trial ends
- Customer can cancel during trial (no charge)
Trial Limitations (Optional)
- Email verification required
- One trial per email address
- Fraud score check (reject high-risk trials)
Implementation
- Use Stripe's built-in trial period functionality
- For PayPal: create subscription with trial period
- Email reminders:
- Day 1: Welcome email with getting started guide
- Day 5: "2 days left in your trial"
- Day 7: "Your trial has ended, subscription starts today"
Database Tracking
subscriptions table additions:
├── trial_ends_at (nullable - Cashier provides this)
├── trial_converted_at (nullable - when trial became paid)
├── trial_cancelled (boolean - cancelled during trial)
24. Chatbot for Marketing Site
Chatbot Features (Crisp, Tidio, or custom)
- Appears on ezscale.cloud (marketing site)
- Answers common questions:
- Pricing
- Service features
- Datacenter locations
- Billing questions
- Signup process
Bot Flows
- Initial greeting: "Hi! How can I help you today?"
- Quick reply buttons: "Pricing", "Features", "Sign Up", "Talk to Human"
- If "Talk to Human": Create support ticket or offer callback
Integration
- Use Crisp or similar (GDPR-compliant, affordable)
- Escalate to human support via SupportPal ticket API
- Track chatbot interactions in analytics
25. Comprehensive Financial Reports
Reports Needed
-
Revenue Report
- Total revenue by period (daily, monthly, yearly)
- Breakdown by service type (VPS, Dedicated, Hosting, Game)
- Breakdown by plan
- Growth percentage vs previous period
-
Profit & Loss Statement
- Revenue
- Refunds
- Payment gateway fees (Stripe, PayPal)
- Infrastructure costs (VirtFusion, Pterodactyl, etc.)
- Net profit
-
Tax Report
- Sales tax collected by region
- VAT collected (if applicable)
- Export for accountant (CSV, PDF)
-
Aging Report
- Outstanding invoices by age (0-30 days, 30-60, 60-90, 90+)
- Total amount overdue
- Customer list with overdue amounts
-
Refund Report
- All refunds issued
- Reason for refund
- Total refunded by period
-
Subscription Report
- New subscriptions this period
- Cancelled subscriptions
- Churn rate %
- MRR and ARR
Export Formats
- PDF (formatted reports)
- CSV (raw data for Excel)
- JSON (API access)
Scheduled Reports
- Admin can schedule email delivery (weekly/monthly)
- Auto-send month-end reports to accounting team
26. Login History & Security Audit
Full Audit Trail
- Track all customer and admin logins
- Log IP address, device type, user agent, location (GeoIP)
- Customer can view their own login history
- Admin can view any user's login history
Security Features
- Alert on login from new device/location
- Alert on multiple failed login attempts
- Option to enable "trusted devices" (require 2FA on new devices only)
- Admin can force logout all sessions
Database Schema
login_history table:
├── id
├── user_id
├── ip_address
├── user_agent
├── device_type (desktop, mobile, tablet)
├── browser (Chrome, Firefox, Safari, etc.)
├── location_country
├── location_city (from GeoIP)
├── success (boolean - failed vs successful)
├── two_factor_used (boolean)
├── created_at
active_sessions table:
├── id
├── user_id
├── session_id (Laravel session ID)
├── ip_address
├── user_agent
├── last_activity_at
├── created_at
27. Invoice Consolidation
Customer Preference
- Customer can choose in account settings:
- Consolidated: One invoice per billing cycle with all services
- Separate: Each service gets its own invoice
Implementation
- Default: Consolidated
- Setting stored in user preferences
- Billing job checks preference before generating invoices
- For consolidated: Group by billing date, create single invoice with line items
Example Consolidated Invoice
INVOICE #INV-001234
Due Date: February 15, 2026
Line Items:
- VPS Pro - us-east (Feb 15 - Mar 15) $20.00
- Web Hosting Basic (Feb 15 - Mar 15) $10.00
- Game Server - Minecraft (Feb 15 - Mar 15) $15.00
Subtotal: $45.00
Tax (8%): $3.60
Total: $48.60
28. Unified Communication Timeline
Timeline View (Customer & Admin)
- Shows all interactions with customer in chronological order
- Event types:
- Account created
- Service provisioned
- Invoice generated
- Payment received
- Email sent (with subject)
- Support ticket created
- Ticket reply
- Service suspended
- Service resumed
- Login activity
- Admin notes
- Service upgrade/downgrade
Features
- Filter by event type
- Search timeline
- Admin can add manual notes
- Export timeline as PDF (for records)
Database Schema
customer_timeline table:
├── id
├── user_id
├── event_type (account_created, invoice_generated, etc.)
├── event_description
├── related_model_type (Invoice, Service, Ticket, etc.)
├── related_model_id
├── metadata (JSON - full event data)
├── created_by_admin_id (nullable - for admin notes)
├── created_at
29. API Features
Full Control API
- Customers can create, modify, delete services via API
- Same capabilities as dashboard
- RESTful design
- Sanctum token authentication
Webhook System
- Customers can register webhook URLs
- Events trigger POST requests to customer's webhook
- Events:
invoice.createdinvoice.paidservice.provisionedservice.suspendedservice.terminatedbandwidth.threshold_reached
Webhook Security
- HMAC signature for verification
- Retry failed webhooks (3 attempts)
- Webhook delivery log
Custom Domains (CNAME)
- Customer can point
billing.theirdomain.comtoaccount.ezscale.cloud - SSL certificate auto-provisioned via Let's Encrypt
- Requires DNS verification (add TXT record)
Database Schema
api_tokens table (Sanctum provides):
├── id
├── tokenable_type
├── tokenable_id
├── name
├── token (hashed)
├── abilities (JSON - permissions)
├── last_used_at
├── created_at
customer_webhooks table:
├── id
├── user_id
├── url
├── events (JSON array - subscribed events)
├── secret (for HMAC signature)
├── status (active, disabled)
├── created_at
webhook_deliveries table:
├── id
├── webhook_id
├── event_type
├── payload (JSON)
├── response_code
├── response_body
├── attempts
├── delivered_at
├── created_at
custom_domains table:
├── id
├── user_id
├── domain (billing.theirdomain.com)
├── verification_token
├── verified_at
├── ssl_status (pending, active, failed)
├── created_at
30. VPS & Service Management
VPS Self-Service Reinstall
- Customer can reinstall OS from dashboard
- Choose from available OS templates
- Warning: "This will erase all data"
- Require confirmation (type service name)
- Queue reinstall job → VirtFusion API
Additional IP Requests
- Customer submits form with justification
- Admin reviews in admin panel
- Approve/reject with reason
- If approved: Assign IP from pool, add to invoice
DNS Integration
- Integrate with Cloudflare API for DNS management
- Customer adds Cloudflare API token in settings
- Auto-create DNS records when services provisioned
- A record for VPS:
vps1.customer.com → 1.2.3.4 - A record for hosting:
www.customer.com → hosting IP
31. Email Preferences & Notifications
Granular Email Control
Customer can toggle each notification type:
- ✓ Invoices (required)
- ✓ Payment receipts (required)
- ☐ Renewal reminders
- ☐ Service provisioned
- ☐ Bandwidth alerts
- ☐ Marketing emails
- ☐ Product updates
- ☐ Platform news
Renewal Reminder Schedule
- 30 days before renewal
- 14 days before renewal
- 7 days before renewal
- 1 day before renewal
Invoice Emails: Summary + PDF
Subject: Invoice #INV-001234 - $48.60 Due
Hi John,
Your invoice is ready:
Invoice #: INV-001234
Amount Due: $48.60
Due Date: Feb 15, 2026
Services:
- VPS Pro ($20.00)
- Web Hosting ($10.00)
- Game Server ($15.00)
View invoice: https://account.ezscale.cloud/invoices/001234
Download PDF: [attached]
Payment will be automatically charged on Feb 15.
32. Performance & Scalability
Analytics Dashboard: Hybrid Approach
- Real-time: Today's revenue, active orders
- Cached: Historical charts (updated every 15 min)
- Daily aggregation: Month/year totals (updated nightly)
Queue Configuration
-
Critical queue (priority: high)
- Service provisioning
- Payment processing
- Account suspension
-
Normal queue (priority: medium)
- Emails
- Notifications
- Backup jobs
-
Low queue (priority: low)
- Analytics aggregation
- Report generation
- Cleanup jobs
Laravel Horizon
- Monitor queue health
- Failed job tracking
- Retry failed jobs
- Queue metrics dashboard
Auto-Scaling Strategy
- Cloudflare CDN + WAF for DDoS protection
- Load balancer in front of app servers
- Auto-scale based on CPU/memory usage
- Scale up during traffic spikes (sales, launches)
- Scale down during low-traffic periods
33. Provisioning API Failure Handling
Queue and Retry Strategy
- Customer completes checkout, payment succeeds
- Provisioning job added to queue
- Attempt to provision via API (VirtFusion, Pterodactyl, etc.)
- If API fails:
- Log error
- Send Discord alert to admin
- Email customer: "Service provisioning in progress, may take longer than usual"
- Retry after 5 minutes
- Retry after 15 minutes
- Retry after 30 minutes
- If still failing after 3 retries:
- Create high-priority admin ticket
- Email customer: "Provisioning delayed, our team is investigating"
- Manual admin intervention required
Database Schema
provisioning_logs additions:
├── retry_count (integer - how many retries)
├── next_retry_at (nullable - scheduled retry time)
├── error_details (JSON - full error response)
34. Cryptocurrency Payments
Integration via Coinbase Commerce or BTCPay
- Add "Pay with Crypto" option at checkout
- Supported coins: Bitcoin, Ethereum, USDC, USDT
- Customer selects crypto, invoice generated
- Payment detected via webhook
- Auto-convert to USD for accounting
Implementation Notes
- Crypto payments are one-time (not recurring subscriptions)
- Customer must manually pay each invoice with crypto
- Or: Hold credit balance (customer pre-pays in crypto, drawn down monthly)
Database Schema
crypto_payments table:
├── id
├── invoice_id
├── user_id
├── provider (coinbase_commerce, btcpay)
├── crypto_currency (BTC, ETH, USDC)
├── crypto_amount
├── usd_amount
├── wallet_address (where customer sent payment)
├── transaction_hash (blockchain tx)
├── status (pending, confirmed, expired)
├── confirmed_at
├── created_at
35. Churn Prevention: Exit Survey + Win-Back
Exit Survey on Cancellation
- Modal appears when customer cancels subscription
- Questions:
- "Why are you cancelling?" (multiple choice + other)
- Too expensive
- Switching to competitor
- No longer need service
- Technical issues
- Poor support
- Other (text field)
- "What could we do better?" (optional text)
- "Would you consider returning?" (Yes / Maybe / No)
- "Why are you cancelling?" (multiple choice + other)
Win-Back Email Campaign
- Triggered 30 days after cancellation
- Email sequence:
- Day 30: "We miss you! Here's 20% off to come back"
- Day 45: "Customer spotlight - see what you're missing"
- Day 60: "Final offer: 30% off for 3 months"
- Stop sending if customer re-subscribes
Database Schema
cancellation_surveys table:
├── id
├── user_id
├── subscription_id
├── cancellation_reason
├── cancellation_feedback
├── would_return (yes, maybe, no)
├── created_at
win_back_campaigns table:
├── id
├── user_id
├── subscription_id (cancelled subscription)
├── campaign_started_at
├── emails_sent (integer)
├── last_email_sent_at
├── status (active, completed, unsubscribed, reactivated)
Summary
This comprehensive feature specification covers all aspects discussed during planning:
- ✅ Advanced coupon system with A/B testing
- ✅ Immediate proration for plan changes
- ✅ Stripe Smart Retries with grace periods
- ✅ Per-plan datacenter locations
- ✅ Guided customer onboarding
- ✅ Automatic loyalty rewards program
- ✅ Dedicated server waitlist system
- ✅ Custom enterprise pricing
- ✅ GDPR-compliant automated data deletion
- ✅ Built-in uptime monitoring
- ✅ Real-time dashboard (WebSockets + polling)
- ✅ Multi-channel admin alerts (Discord, Email, SMS)
- ✅ Public status page
- ✅ Full abuse management system
- ✅ Automated fraud detection
- ✅ Game server template library
- ✅ Backups included in plans (7/4/3 retention)
- ✅ 15-minute database backups with multi-region replication
- ✅ IPv4 + IPv6 dual-stack
- ✅ Sequential invoice numbering (INV-000001)
- ✅ Full team accounts with granular permissions
- ✅ Referral credit system
- ✅ Free trial periods
- ✅ Marketing chatbot
- ✅ Comprehensive financial reports
- ✅ Login history and security audit trail
- ✅ Customer choice: consolidated or separate invoices
- ✅ Unified communication timeline
- ✅ Full-control customer API with webhooks
- ✅ Custom domain support (CNAME)
- ✅ VPS self-service OS reinstall
- ✅ Additional IP address requests
- ✅ DNS integration (Cloudflare)
- ✅ Granular email preferences
- ✅ Multiple renewal reminders
- ✅ Hybrid analytics (real-time + cached)
- ✅ Multi-queue system with Laravel Horizon
- ✅ Auto-scaling for traffic spikes
- ✅ Provisioning API failure queue-and-retry
- ✅ Cryptocurrency payment support
- ✅ Exit survey and win-back campaigns
All features documented and ready for implementation!