1333 lines
36 KiB
Markdown
1333 lines
36 KiB
Markdown
# 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
|
|
```sql
|
|
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
|
|
```php
|
|
// 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
|
|
```sql
|
|
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
|
|
1. **Email verification** - Confirm email address
|
|
2. **Profile completion** - Company name, address (for tax calculations)
|
|
3. **Payment method** - Add credit card or PayPal
|
|
4. **Plan selection** - Choose service and datacenter
|
|
5. **Service provisioning** - Automated provisioning begins
|
|
6. **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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
1. Customer requests deletion from account settings
|
|
2. System creates data deletion request (7-day waiting period)
|
|
3. Email confirmation: "Your account will be deleted in 7 days"
|
|
4. 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)
|
|
5. Email confirmation: "Your data has been deleted"
|
|
|
|
### Database Schema
|
|
```sql
|
|
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
|
|
```sql
|
|
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 | Email | SMS (Twilio) |
|
|
|------------|---------|-------|--------------|
|
|
| New order | ✓ | ✗ | ✗ |
|
|
| High-value order (>$500) | ✓ | ✓ | ✓ |
|
|
| Payment failure | ✓ | ✗ | ✗ |
|
|
| Provisioning failure | ✓ | ✓ | ✓ |
|
|
| System error | ✓ | ✓ | ✗ |
|
|
| Security alert (failed admin login) | ✓ | ✓ | ✓ |
|
|
| Service cancellation | ✓ | ✗ | ✗ |
|
|
|
|
### Configuration
|
|
```php
|
|
// 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
|
|
```sql
|
|
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
|
|
1. Abuse report received (email, web form, API)
|
|
2. Create abuse ticket (high priority)
|
|
3. Notify admin via Discord + email
|
|
4. Admin investigates, views customer history
|
|
5. Options:
|
|
- Warn customer (send abuse notice email)
|
|
- Suspend service immediately
|
|
- Request content removal (give customer X hours)
|
|
- Terminate account (severe violations)
|
|
6. Track abuse history per customer
|
|
7. Escalate repeat offenders automatically
|
|
|
|
### Database Schema
|
|
```sql
|
|
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
|
|
```php
|
|
// 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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```php
|
|
// 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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
1. **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
|
|
|
|
2. **Profit & Loss Statement**
|
|
- Revenue
|
|
- Refunds
|
|
- Payment gateway fees (Stripe, PayPal)
|
|
- Infrastructure costs (VirtFusion, Pterodactyl, etc.)
|
|
- Net profit
|
|
|
|
3. **Tax Report**
|
|
- Sales tax collected by region
|
|
- VAT collected (if applicable)
|
|
- Export for accountant (CSV, PDF)
|
|
|
|
4. **Aging Report**
|
|
- Outstanding invoices by age (0-30 days, 30-60, 60-90, 90+)
|
|
- Total amount overdue
|
|
- Customer list with overdue amounts
|
|
|
|
5. **Refund Report**
|
|
- All refunds issued
|
|
- Reason for refund
|
|
- Total refunded by period
|
|
|
|
6. **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
|
|
```sql
|
|
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
|
|
```sql
|
|
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.created`
|
|
- `invoice.paid`
|
|
- `service.provisioned`
|
|
- `service.suspended`
|
|
- `service.terminated`
|
|
- `bandwidth.threshold_reached`
|
|
|
|
### Webhook Security
|
|
- HMAC signature for verification
|
|
- Retry failed webhooks (3 attempts)
|
|
- Webhook delivery log
|
|
|
|
### Custom Domains (CNAME)
|
|
- Customer can point `billing.theirdomain.com` to `account.ezscale.cloud`
|
|
- SSL certificate auto-provisioned via Let's Encrypt
|
|
- Requires DNS verification (add TXT record)
|
|
|
|
### Database Schema
|
|
```sql
|
|
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
|
|
1. Customer completes checkout, payment succeeds
|
|
2. Provisioning job added to queue
|
|
3. Attempt to provision via API (VirtFusion, Pterodactyl, etc.)
|
|
4. **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
|
|
```sql
|
|
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
|
|
```sql
|
|
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)
|
|
|
|
### 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
|
|
```sql
|
|
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!**
|